Show More
@@ -1,174 +1,174 b'' | |||||
1 | """Module containing single call export functions.""" |
|
1 | """Module containing single call export functions.""" | |
2 |
|
2 | |||
3 | # Copyright (c) IPython Development Team. |
|
3 | # Copyright (c) IPython Development Team. | |
4 | # Distributed under the terms of the Modified BSD License. |
|
4 | # Distributed under the terms of the Modified BSD License. | |
5 |
|
5 | |||
6 | from functools import wraps |
|
6 | from functools import wraps | |
7 |
|
7 | |||
8 |
from IPython.nbformat. |
|
8 | from IPython.nbformat.current import NotebookNode | |
9 | from IPython.utils.decorators import undoc |
|
9 | from IPython.utils.decorators import undoc | |
10 | from IPython.utils.py3compat import string_types |
|
10 | from IPython.utils.py3compat import string_types | |
11 |
|
11 | |||
12 | from .exporter import Exporter |
|
12 | from .exporter import Exporter | |
13 | from .templateexporter import TemplateExporter |
|
13 | from .templateexporter import TemplateExporter | |
14 | from .html import HTMLExporter |
|
14 | from .html import HTMLExporter | |
15 | from .slides import SlidesExporter |
|
15 | from .slides import SlidesExporter | |
16 | from .latex import LatexExporter |
|
16 | from .latex import LatexExporter | |
17 | from .pdf import PDFExporter |
|
17 | from .pdf import PDFExporter | |
18 | from .markdown import MarkdownExporter |
|
18 | from .markdown import MarkdownExporter | |
19 | from .python import PythonExporter |
|
19 | from .python import PythonExporter | |
20 | from .rst import RSTExporter |
|
20 | from .rst import RSTExporter | |
21 | from .notebook import NotebookExporter |
|
21 | from .notebook import NotebookExporter | |
22 |
|
22 | |||
23 | #----------------------------------------------------------------------------- |
|
23 | #----------------------------------------------------------------------------- | |
24 | # Classes |
|
24 | # Classes | |
25 | #----------------------------------------------------------------------------- |
|
25 | #----------------------------------------------------------------------------- | |
26 |
|
26 | |||
27 | @undoc |
|
27 | @undoc | |
28 | def DocDecorator(f): |
|
28 | def DocDecorator(f): | |
29 |
|
29 | |||
30 | #Set docstring of function |
|
30 | #Set docstring of function | |
31 | f.__doc__ = f.__doc__ + """ |
|
31 | f.__doc__ = f.__doc__ + """ | |
32 | nb : :class:`~{nbnode_mod}.NotebookNode` |
|
32 | nb : :class:`~{nbnode_mod}.NotebookNode` | |
33 | The notebook to export. |
|
33 | The notebook to export. | |
34 | config : config (optional, keyword arg) |
|
34 | config : config (optional, keyword arg) | |
35 | User configuration instance. |
|
35 | User configuration instance. | |
36 | resources : dict (optional, keyword arg) |
|
36 | resources : dict (optional, keyword arg) | |
37 | Resources used in the conversion process. |
|
37 | Resources used in the conversion process. | |
38 |
|
38 | |||
39 | Returns |
|
39 | Returns | |
40 | ------- |
|
40 | ------- | |
41 | tuple- output, resources, exporter_instance |
|
41 | tuple- output, resources, exporter_instance | |
42 | output : str |
|
42 | output : str | |
43 | Jinja 2 output. This is the resulting converted notebook. |
|
43 | Jinja 2 output. This is the resulting converted notebook. | |
44 | resources : dictionary |
|
44 | resources : dictionary | |
45 | Dictionary of resources used prior to and during the conversion |
|
45 | Dictionary of resources used prior to and during the conversion | |
46 | process. |
|
46 | process. | |
47 | exporter_instance : Exporter |
|
47 | exporter_instance : Exporter | |
48 | Instance of the Exporter class used to export the document. Useful |
|
48 | Instance of the Exporter class used to export the document. Useful | |
49 | to caller because it provides a 'file_extension' property which |
|
49 | to caller because it provides a 'file_extension' property which | |
50 | specifies what extension the output should be saved as. |
|
50 | specifies what extension the output should be saved as. | |
51 |
|
51 | |||
52 | Notes |
|
52 | Notes | |
53 | ----- |
|
53 | ----- | |
54 | WARNING: API WILL CHANGE IN FUTURE RELEASES OF NBCONVERT |
|
54 | WARNING: API WILL CHANGE IN FUTURE RELEASES OF NBCONVERT | |
55 | """.format(nbnode_mod=NotebookNode.__module__) |
|
55 | """.format(nbnode_mod=NotebookNode.__module__) | |
56 |
|
56 | |||
57 | @wraps(f) |
|
57 | @wraps(f) | |
58 | def decorator(*args, **kwargs): |
|
58 | def decorator(*args, **kwargs): | |
59 | return f(*args, **kwargs) |
|
59 | return f(*args, **kwargs) | |
60 |
|
60 | |||
61 | return decorator |
|
61 | return decorator | |
62 |
|
62 | |||
63 |
|
63 | |||
64 | #----------------------------------------------------------------------------- |
|
64 | #----------------------------------------------------------------------------- | |
65 | # Functions |
|
65 | # Functions | |
66 | #----------------------------------------------------------------------------- |
|
66 | #----------------------------------------------------------------------------- | |
67 |
|
67 | |||
68 | __all__ = [ |
|
68 | __all__ = [ | |
69 | 'export', |
|
69 | 'export', | |
70 | 'export_html', |
|
70 | 'export_html', | |
71 | 'export_custom', |
|
71 | 'export_custom', | |
72 | 'export_slides', |
|
72 | 'export_slides', | |
73 | 'export_latex', |
|
73 | 'export_latex', | |
74 | 'export_pdf', |
|
74 | 'export_pdf', | |
75 | 'export_markdown', |
|
75 | 'export_markdown', | |
76 | 'export_python', |
|
76 | 'export_python', | |
77 | 'export_rst', |
|
77 | 'export_rst', | |
78 | 'export_by_name', |
|
78 | 'export_by_name', | |
79 | 'get_export_names', |
|
79 | 'get_export_names', | |
80 | 'ExporterNameError' |
|
80 | 'ExporterNameError' | |
81 | ] |
|
81 | ] | |
82 |
|
82 | |||
83 |
|
83 | |||
84 | class ExporterNameError(NameError): |
|
84 | class ExporterNameError(NameError): | |
85 | pass |
|
85 | pass | |
86 |
|
86 | |||
87 | @DocDecorator |
|
87 | @DocDecorator | |
88 | def export(exporter, nb, **kw): |
|
88 | def export(exporter, nb, **kw): | |
89 | """ |
|
89 | """ | |
90 | Export a notebook object using specific exporter class. |
|
90 | Export a notebook object using specific exporter class. | |
91 |
|
91 | |||
92 | Parameters |
|
92 | Parameters | |
93 | ---------- |
|
93 | ---------- | |
94 | exporter : class:`~IPython.nbconvert.exporters.exporter.Exporter` class or instance |
|
94 | exporter : class:`~IPython.nbconvert.exporters.exporter.Exporter` class or instance | |
95 | Class type or instance of the exporter that should be used. If the |
|
95 | Class type or instance of the exporter that should be used. If the | |
96 | method initializes it's own instance of the class, it is ASSUMED that |
|
96 | method initializes it's own instance of the class, it is ASSUMED that | |
97 | the class type provided exposes a constructor (``__init__``) with the same |
|
97 | the class type provided exposes a constructor (``__init__``) with the same | |
98 | signature as the base Exporter class. |
|
98 | signature as the base Exporter class. | |
99 | """ |
|
99 | """ | |
100 |
|
100 | |||
101 | #Check arguments |
|
101 | #Check arguments | |
102 | if exporter is None: |
|
102 | if exporter is None: | |
103 | raise TypeError("Exporter is None") |
|
103 | raise TypeError("Exporter is None") | |
104 | elif not isinstance(exporter, Exporter) and not issubclass(exporter, Exporter): |
|
104 | elif not isinstance(exporter, Exporter) and not issubclass(exporter, Exporter): | |
105 | raise TypeError("exporter does not inherit from Exporter (base)") |
|
105 | raise TypeError("exporter does not inherit from Exporter (base)") | |
106 | if nb is None: |
|
106 | if nb is None: | |
107 | raise TypeError("nb is None") |
|
107 | raise TypeError("nb is None") | |
108 |
|
108 | |||
109 | #Create the exporter |
|
109 | #Create the exporter | |
110 | resources = kw.pop('resources', None) |
|
110 | resources = kw.pop('resources', None) | |
111 | if isinstance(exporter, Exporter): |
|
111 | if isinstance(exporter, Exporter): | |
112 | exporter_instance = exporter |
|
112 | exporter_instance = exporter | |
113 | else: |
|
113 | else: | |
114 | exporter_instance = exporter(**kw) |
|
114 | exporter_instance = exporter(**kw) | |
115 |
|
115 | |||
116 | #Try to convert the notebook using the appropriate conversion function. |
|
116 | #Try to convert the notebook using the appropriate conversion function. | |
117 | if isinstance(nb, NotebookNode): |
|
117 | if isinstance(nb, NotebookNode): | |
118 | output, resources = exporter_instance.from_notebook_node(nb, resources) |
|
118 | output, resources = exporter_instance.from_notebook_node(nb, resources) | |
119 | elif isinstance(nb, string_types): |
|
119 | elif isinstance(nb, string_types): | |
120 | output, resources = exporter_instance.from_filename(nb, resources) |
|
120 | output, resources = exporter_instance.from_filename(nb, resources) | |
121 | else: |
|
121 | else: | |
122 | output, resources = exporter_instance.from_file(nb, resources) |
|
122 | output, resources = exporter_instance.from_file(nb, resources) | |
123 | return output, resources |
|
123 | return output, resources | |
124 |
|
124 | |||
125 | exporter_map = dict( |
|
125 | exporter_map = dict( | |
126 | custom=TemplateExporter, |
|
126 | custom=TemplateExporter, | |
127 | html=HTMLExporter, |
|
127 | html=HTMLExporter, | |
128 | slides=SlidesExporter, |
|
128 | slides=SlidesExporter, | |
129 | latex=LatexExporter, |
|
129 | latex=LatexExporter, | |
130 | pdf=PDFExporter, |
|
130 | pdf=PDFExporter, | |
131 | markdown=MarkdownExporter, |
|
131 | markdown=MarkdownExporter, | |
132 | python=PythonExporter, |
|
132 | python=PythonExporter, | |
133 | rst=RSTExporter, |
|
133 | rst=RSTExporter, | |
134 | notebook=NotebookExporter, |
|
134 | notebook=NotebookExporter, | |
135 | ) |
|
135 | ) | |
136 |
|
136 | |||
137 | def _make_exporter(name, E): |
|
137 | def _make_exporter(name, E): | |
138 | """make an export_foo function from a short key and Exporter class E""" |
|
138 | """make an export_foo function from a short key and Exporter class E""" | |
139 | def _export(nb, **kw): |
|
139 | def _export(nb, **kw): | |
140 | return export(E, nb, **kw) |
|
140 | return export(E, nb, **kw) | |
141 | _export.__doc__ = """Export a notebook object to {0} format""".format(name) |
|
141 | _export.__doc__ = """Export a notebook object to {0} format""".format(name) | |
142 | return _export |
|
142 | return _export | |
143 |
|
143 | |||
144 | g = globals() |
|
144 | g = globals() | |
145 |
|
145 | |||
146 | for name, E in exporter_map.items(): |
|
146 | for name, E in exporter_map.items(): | |
147 | g['export_%s' % name] = DocDecorator(_make_exporter(name, E)) |
|
147 | g['export_%s' % name] = DocDecorator(_make_exporter(name, E)) | |
148 |
|
148 | |||
149 | @DocDecorator |
|
149 | @DocDecorator | |
150 | def export_by_name(format_name, nb, **kw): |
|
150 | def export_by_name(format_name, nb, **kw): | |
151 | """ |
|
151 | """ | |
152 | Export a notebook object to a template type by its name. Reflection |
|
152 | Export a notebook object to a template type by its name. Reflection | |
153 | (Inspect) is used to find the template's corresponding explicit export |
|
153 | (Inspect) is used to find the template's corresponding explicit export | |
154 | method defined in this module. That method is then called directly. |
|
154 | method defined in this module. That method is then called directly. | |
155 |
|
155 | |||
156 | Parameters |
|
156 | Parameters | |
157 | ---------- |
|
157 | ---------- | |
158 | format_name : str |
|
158 | format_name : str | |
159 | Name of the template style to export to. |
|
159 | Name of the template style to export to. | |
160 | """ |
|
160 | """ | |
161 |
|
161 | |||
162 | function_name = "export_" + format_name.lower() |
|
162 | function_name = "export_" + format_name.lower() | |
163 |
|
163 | |||
164 | if function_name in globals(): |
|
164 | if function_name in globals(): | |
165 | return globals()[function_name](nb, **kw) |
|
165 | return globals()[function_name](nb, **kw) | |
166 | else: |
|
166 | else: | |
167 | raise ExporterNameError("template for `%s` not found" % function_name) |
|
167 | raise ExporterNameError("template for `%s` not found" % function_name) | |
168 |
|
168 | |||
169 |
|
169 | |||
170 | def get_export_names(): |
|
170 | def get_export_names(): | |
171 | """Return a list of the currently supported export targets |
|
171 | """Return a list of the currently supported export targets | |
172 |
|
172 | |||
173 | WARNING: API WILL CHANGE IN FUTURE RELEASES OF NBCONVERT""" |
|
173 | WARNING: API WILL CHANGE IN FUTURE RELEASES OF NBCONVERT""" | |
174 | return sorted(exporter_map.keys()) |
|
174 | return sorted(exporter_map.keys()) |
@@ -1,177 +1,168 b'' | |||||
1 | { |
|
1 | { | |
2 | "metadata": { |
|
2 | "cells": [ | |
3 | "name": "notebook2" |
|
|||
4 | }, |
|
|||
5 | "nbformat": 3, |
|
|||
6 | "nbformat_minor": 0, |
|
|||
7 | "worksheets": [ |
|
|||
8 | { |
|
3 | { | |
9 | "cells": [ |
|
4 | "cell_type": "heading", | |
|
5 | "level": 1, | |||
|
6 | "metadata": {}, | |||
|
7 | "source": [ | |||
|
8 | "NumPy and Matplotlib examples" | |||
|
9 | ] | |||
|
10 | }, | |||
|
11 | { | |||
|
12 | "cell_type": "markdown", | |||
|
13 | "metadata": {}, | |||
|
14 | "source": [ | |||
|
15 | "First import NumPy and Matplotlib:" | |||
|
16 | ] | |||
|
17 | }, | |||
|
18 | { | |||
|
19 | "cell_type": "code", | |||
|
20 | "metadata": { | |||
|
21 | "collapsed": false | |||
|
22 | }, | |||
|
23 | "outputs": [ | |||
10 | { |
|
24 | { | |
11 | "cell_type": "heading", |
|
|||
12 | "level": 1, |
|
|||
13 | "metadata": {}, |
|
25 | "metadata": {}, | |
14 | "source": [ |
|
26 | "name": "stdout", | |
15 | "NumPy and Matplotlib examples" |
|
27 | "output_type": "stream", | |
16 | ] |
|
28 | "text": "\nWelcome to pylab, a matplotlib-based Python environment [backend: module://IPython.kernel.zmq.pylab.backend_inline].\nFor more information, type 'help(pylab)'.\n" | |
17 |
} |
|
29 | } | |
|
30 | ], | |||
|
31 | "prompt_number": 1, | |||
|
32 | "source": [ | |||
|
33 | "%pylab inline" | |||
|
34 | ] | |||
|
35 | }, | |||
|
36 | { | |||
|
37 | "cell_type": "code", | |||
|
38 | "metadata": { | |||
|
39 | "collapsed": false | |||
|
40 | }, | |||
|
41 | "outputs": [], | |||
|
42 | "prompt_number": 2, | |||
|
43 | "source": [ | |||
|
44 | "import numpy as np" | |||
|
45 | ] | |||
|
46 | }, | |||
|
47 | { | |||
|
48 | "cell_type": "markdown", | |||
|
49 | "metadata": {}, | |||
|
50 | "source": [ | |||
|
51 | "Now we show some very basic examples of how they can be used." | |||
|
52 | ] | |||
|
53 | }, | |||
|
54 | { | |||
|
55 | "cell_type": "code", | |||
|
56 | "metadata": { | |||
|
57 | "collapsed": false | |||
|
58 | }, | |||
|
59 | "outputs": [], | |||
|
60 | "prompt_number": 6, | |||
|
61 | "source": [ | |||
|
62 | "a = np.random.uniform(size=(100,100))" | |||
|
63 | ] | |||
|
64 | }, | |||
|
65 | { | |||
|
66 | "cell_type": "code", | |||
|
67 | "metadata": { | |||
|
68 | "collapsed": false | |||
|
69 | }, | |||
|
70 | "outputs": [ | |||
18 | { |
|
71 | { | |
19 | "cell_type": "markdown", |
|
|||
20 | "metadata": {}, |
|
72 | "metadata": {}, | |
21 | "source": [ |
|
73 | "output_type": "execute_result", | |
22 | "First import NumPy and Matplotlib:" |
|
74 | "prompt_number": 7, | |
|
75 | "text/plain": [ | |||
|
76 | "(100, 100)" | |||
23 | ] |
|
77 | ] | |
24 |
} |
|
78 | } | |
25 |
|
|
79 | ], | |
26 | "cell_type": "code", |
|
80 | "prompt_number": 7, | |
27 | "collapsed": false, |
|
81 | "source": [ | |
28 | "input": [ |
|
82 | "a.shape" | |
29 | "%pylab inline" |
|
83 | ] | |
30 | ], |
|
84 | }, | |
31 | "language": "python", |
|
85 | { | |
32 | "metadata": {}, |
|
86 | "cell_type": "code", | |
33 | "outputs": [ |
|
87 | "metadata": { | |
34 | { |
|
88 | "collapsed": false | |
35 | "output_type": "stream", |
|
89 | }, | |
36 | "stream": "stdout", |
|
90 | "outputs": [], | |
37 | "text": [ |
|
91 | "prompt_number": 8, | |
38 | "\n", |
|
92 | "source": [ | |
39 | "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.kernel.zmq.pylab.backend_inline].\n", |
|
93 | "evs = np.linalg.eigvals(a)" | |
40 | "For more information, type 'help(pylab)'.\n" |
|
94 | ] | |
41 | ] |
|
95 | }, | |
42 | } |
|
96 | { | |
43 | ], |
|
97 | "cell_type": "code", | |
44 | "prompt_number": 1 |
|
98 | "metadata": { | |
45 | }, |
|
99 | "collapsed": false | |
46 |
|
|
100 | }, | |
47 | "cell_type": "code", |
|
101 | "outputs": [ | |
48 | "collapsed": false, |
|
|||
49 | "input": [ |
|
|||
50 | "import numpy as np" |
|
|||
51 | ], |
|
|||
52 | "language": "python", |
|
|||
53 | "metadata": {}, |
|
|||
54 | "outputs": [], |
|
|||
55 | "prompt_number": 2 |
|
|||
56 | }, |
|
|||
57 | { |
|
102 | { | |
58 | "cell_type": "markdown", |
|
|||
59 | "metadata": {}, |
|
103 | "metadata": {}, | |
60 | "source": [ |
|
104 | "output_type": "execute_result", | |
61 | "Now we show some very basic examples of how they can be used." |
|
105 | "prompt_number": 10, | |
|
106 | "text/plain": [ | |||
|
107 | "(100,)" | |||
62 | ] |
|
108 | ] | |
63 |
} |
|
109 | } | |
64 |
|
|
110 | ], | |
65 | "cell_type": "code", |
|
111 | "prompt_number": 10, | |
66 | "collapsed": false, |
|
112 | "source": [ | |
67 | "input": [ |
|
113 | "evs.shape" | |
68 | "a = np.random.uniform(size=(100,100))" |
|
114 | ] | |
69 | ], |
|
115 | }, | |
70 | "language": "python", |
|
116 | { | |
71 | "metadata": {}, |
|
117 | "cell_type": "markdown", | |
72 | "outputs": [], |
|
118 | "metadata": {}, | |
73 | "prompt_number": 6 |
|
119 | "source": [ | |
74 | }, |
|
120 | "Here is a cell that has both text and PNG output:" | |
75 |
|
|
121 | ] | |
76 | "cell_type": "code", |
|
122 | }, | |
77 | "collapsed": false, |
|
123 | { | |
78 | "input": [ |
|
124 | "cell_type": "code", | |
79 | "a.shape" |
|
125 | "metadata": { | |
80 | ], |
|
126 | "collapsed": false | |
81 | "language": "python", |
|
127 | }, | |
82 | "metadata": {}, |
|
128 | "outputs": [ | |
83 | "outputs": [ |
|
|||
84 | { |
|
|||
85 | "metadata": {}, |
|
|||
86 | "output_type": "pyout", |
|
|||
87 | "prompt_number": 7, |
|
|||
88 | "text": [ |
|
|||
89 | "(100, 100)" |
|
|||
90 | ] |
|
|||
91 | } |
|
|||
92 | ], |
|
|||
93 | "prompt_number": 7 |
|
|||
94 | }, |
|
|||
95 | { |
|
|||
96 | "cell_type": "code", |
|
|||
97 | "collapsed": false, |
|
|||
98 | "input": [ |
|
|||
99 | "evs = np.linalg.eigvals(a)" |
|
|||
100 | ], |
|
|||
101 | "language": "python", |
|
|||
102 | "metadata": {}, |
|
|||
103 | "outputs": [], |
|
|||
104 | "prompt_number": 8 |
|
|||
105 | }, |
|
|||
106 | { |
|
|||
107 | "cell_type": "code", |
|
|||
108 | "collapsed": false, |
|
|||
109 | "input": [ |
|
|||
110 | "evs.shape" |
|
|||
111 | ], |
|
|||
112 | "language": "python", |
|
|||
113 | "metadata": {}, |
|
|||
114 | "outputs": [ |
|
|||
115 | { |
|
|||
116 | "metadata": {}, |
|
|||
117 | "output_type": "pyout", |
|
|||
118 | "prompt_number": 10, |
|
|||
119 | "text": [ |
|
|||
120 | "(100,)" |
|
|||
121 | ] |
|
|||
122 | } |
|
|||
123 | ], |
|
|||
124 | "prompt_number": 10 |
|
|||
125 | }, |
|
|||
126 | { |
|
129 | { | |
127 | "cell_type": "markdown", |
|
|||
128 | "metadata": {}, |
|
130 | "metadata": {}, | |
129 | "source": [ |
|
131 | "output_type": "execute_result", | |
130 | "Here is a cell that has both text and PNG output:" |
|
132 | "prompt_number": 14, | |
|
133 | "text/plain": [ | |||
|
134 | "(array([95, 4, 0, 0, 0, 0, 0, 0, 0, 1]),\n", | |||
|
135 | " array([ -2.93566063, 2.35937011, 7.65440086, 12.9494316 ,\n", | |||
|
136 | " 18.24446235, 23.53949309, 28.83452384, 34.12955458,\n", | |||
|
137 | " 39.42458533, 44.71961607, 50.01464682]),\n", | |||
|
138 | " <a list of 10 Patch objects>)" | |||
131 | ] |
|
139 | ] | |
132 | }, |
|
140 | }, | |
133 | { |
|
141 | { | |
134 | "cell_type": "code", |
|
142 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXgAAAD9CAYAAAC2l2x5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAEhdJREFUeJzt3X1olfX/x/HXtVbT8CZDmsK6KmrubEu3U2xnZOpxLBnG\nOqsIE7RoE3QRZkT/yEAjcIh/LIs6i/BEGSU1CkxT0+pkFp1zMmsxZ5uUTIXoxm95lmdlef3+8Nep\ndbtz7exs16fnAw7sXNs5n/c14nmurl3naDmO4wgAYJy8sR4AADA6CDwAGIrAA4ChCDwAGIrAA4Ch\nCDwAGOofA9/U1KTCwkLNnj07vS2ZTCoUCsm2bTU2NmpgYCD9vccee0zFxcUqKyvTgQMHRm9qAMC/\n+sfA33PPPdq9e/eQbeFwWLZtq6+vT0VFRero6JAkffXVV3ryySf15ptvKhwOa/Xq1aM3NQDgX/1j\n4OfNm6dp06YN2RaPx9Xc3KyCggI1NTUpFotJkmKxmOrr62XbthYsWCDHcZRMJkdvcgDAP8r4HHwi\nkZDP55Mk+Xw+xeNxSecDX1pamv65kpKS9PcAALmXn+kDMvlkA8uyhrUNAPDvMv1kmYyP4KuqqtTT\n0yNJ6unpUVVVlSQpEAjo8OHD6Z87cuRI+nt/NaRXb+vWrRvzGZh/7Odgfu/dvDy747j7yLCMAx8I\nBBSJRJRKpRSJRFRTUyNJqq6u1p49e9Tf369oNKq8vDxNnjzZ1VAAgJH7x8AvXbpUN9xwg3p7e3X5\n5ZfrmWeeUUtLi/r7+1VSUqKTJ09q1apVkqTCwkK1tLSotrZW9957rzZv3pyTHQAA/DXLcXvs73ZB\ny3L9vxvjQTQaVTAYHOsxXGP+scX8Y8fLs0vu2kngAcAD3LSTjyoAAEMReAAwFIEHAEMReAAwFIEH\nAEP9ZwM/Zcqlsixr1G9Tplw61rsK4D/qP3uZ5PnPxMnFHONjfwF4G5dJAgDSCDwAGIrAA4ChCDwA\nGIrAA4ChCDwAGIrAA4ChCDwAGIrAA4ChCDwAGIrAA4ChCDwAGIrAA4ChCDwAGIrAA4ChCDwAGIrA\nA4ChCDwAGIrAA4ChCDwAGIrAA4ChCDwAGIrAA4ChCDwAGIrAA4ChCDwAGIrAA4ChXAf+6aef1g03\n3KDrr79ea9askSQlk0mFQiHZtq3GxkYNDAxkbVAAQGZcBf7UqVPasGGD9u7dq0Qiod7eXu3Zs0fh\ncFi2bauvr09FRUXq6OjI9rwAgGFyFfiJEyfKcRx9//33SqVSOnPmjC655BLF43E1NzeroKBATU1N\nisVi2Z4XADBMrgMfDod15ZVXasaMGZo7d64CgYASiYR8Pp8kyefzKR6PZ3VYAMDw5bt50Ndff62W\nlhYdPnxY06ZN0x133KEdO3bIcZxhPX79+vXpr4PBoILBoJsxAMBY0WhU0Wh0RM9hOcOt8u/s3LlT\nW7du1bZt2yRJ4XBYx44d09GjR9Xa2iq/36+DBw+qra1NnZ2dQxe0rGG/EIwmy7Ik5WKO8bG/ALzN\nTTtdnaKZN2+ePvzwQ506dUo//vijdu3apUWLFikQCCgSiSiVSikSiaimpsbN0wMAssBV4KdMmaLW\n1lbdeuutuvHGG1VRUaGFCxeqpaVF/f39Kikp0cmTJ7Vq1apszwsAGCZXp2hGtCCnaAAgYzk7RQMA\nGP8IPAAYisADgKEIPAAYisADgKEIPAAYisADgKEIPAAYisADgKEIPAAYisADgKEIPAAYisADgKEI\nPAAYisADgKEIPAAYisADgKEIPAAYisADgKEIPAAYisADgKEIPAAYisADgKEIPAAYisADgKEIPAAY\nisADgKEIPAAYisADgKEIPAAYisADgKEIPAAYisADgKEIPAAYisADgKEIPAAYynXgf/jhB919992a\nNWuWysrKFIvFlEwmFQqFZNu2GhsbNTAwkM1ZAQAZcB34devWybZtdXV1qaurSz6fT+FwWLZtq6+v\nT0VFRero6MjmrACADLgO/L59+7R27VpNmDBB+fn5mjp1quLxuJqbm1VQUKCmpibFYrFszgoAyICr\nwJ84cUKDg4NqaWlRIBDQxo0blUqllEgk5PP5JEk+n0/xeDyrwwIAhi/fzYMGBwfV29urTZs2qa6u\nTitXrtRLL70kx3GG9fj169envw4GgwoGg27GAABjRaNRRaPRET2H5Qy3yn9QWlqqnp4eSdKuXbv0\n3HPP6aefflJra6v8fr8OHjyotrY2dXZ2Dl3Qsob9QjCaLMuSlIs5xsf+AvA2N+10fQ6+uLhYsVhM\n586d086dO1VXV6dAIKBIJKJUKqVIJKKamhq3Tw8AGCHXR/C9vb266667NDg4qLq6Oj388MM6d+6c\nli1bpkOHDum6667T888/r0mTJg1dkCN4AMiYm3a6DrxbBB4AMpfTUzQAgPGNwAOAoQg8ABiKwAOA\n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\n", | |
135 | "collapsed": false, |
|
|||
136 | "input": [ |
|
|||
137 | "hist(evs.real)" |
|
|||
138 | ], |
|
|||
139 | "language": "python", |
|
|||
140 | "metadata": {}, |
|
143 | "metadata": {}, | |
141 | "outputs": [ |
|
144 | "output_type": "display_data", | |
142 | { |
|
145 | "text/plain": [ | |
143 | "metadata": {}, |
|
146 | "<matplotlib.figure.Figure at 0x108c8f1d0>" | |
144 | "output_type": "pyout", |
|
147 | ] | |
145 | "prompt_number": 14, |
|
|||
146 | "text": [ |
|
|||
147 | "(array([95, 4, 0, 0, 0, 0, 0, 0, 0, 1]),\n", |
|
|||
148 | " array([ -2.93566063, 2.35937011, 7.65440086, 12.9494316 ,\n", |
|
|||
149 | " 18.24446235, 23.53949309, 28.83452384, 34.12955458,\n", |
|
|||
150 | " 39.42458533, 44.71961607, 50.01464682]),\n", |
|
|||
151 | " <a list of 10 Patch objects>)" |
|
|||
152 | ] |
|
|||
153 | }, |
|
|||
154 | { |
|
|||
155 | "metadata": {}, |
|
|||
156 | "output_type": "display_data", |
|
|||
157 | "png": "iVBORw0KGgoAAAANSUhEUgAAAXgAAAD9CAYAAAC2l2x5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAEhdJREFUeJzt3X1olfX/x/HXtVbT8CZDmsK6KmrubEu3U2xnZOpxLBnG\nOqsIE7RoE3QRZkT/yEAjcIh/LIs6i/BEGSU1CkxT0+pkFp1zMmsxZ5uUTIXoxm95lmdlef3+8Nep\ndbtz7exs16fnAw7sXNs5n/c14nmurl3naDmO4wgAYJy8sR4AADA6CDwAGIrAA4ChCDwAGIrAA4Ch\nCDwAGOofA9/U1KTCwkLNnj07vS2ZTCoUCsm2bTU2NmpgYCD9vccee0zFxcUqKyvTgQMHRm9qAMC/\n+sfA33PPPdq9e/eQbeFwWLZtq6+vT0VFRero6JAkffXVV3ryySf15ptvKhwOa/Xq1aM3NQDgX/1j\n4OfNm6dp06YN2RaPx9Xc3KyCggI1NTUpFotJkmKxmOrr62XbthYsWCDHcZRMJkdvcgDAP8r4HHwi\nkZDP55Mk+Xw+xeNxSecDX1pamv65kpKS9PcAALmXn+kDMvlkA8uyhrUNAPDvMv1kmYyP4KuqqtTT\n0yNJ6unpUVVVlSQpEAjo8OHD6Z87cuRI+nt/NaRXb+vWrRvzGZh/7Odgfu/dvDy747j7yLCMAx8I\nBBSJRJRKpRSJRFRTUyNJqq6u1p49e9Tf369oNKq8vDxNnjzZ1VAAgJH7x8AvXbpUN9xwg3p7e3X5\n5ZfrmWeeUUtLi/r7+1VSUqKTJ09q1apVkqTCwkK1tLSotrZW9957rzZv3pyTHQAA/DXLcXvs73ZB\ny3L9vxvjQTQaVTAYHOsxXGP+scX8Y8fLs0vu2kngAcAD3LSTjyoAAEMReAAwFIEHAEMReAAwFIEH\nAEP9ZwM/Zcqlsixr1G9Tplw61rsK4D/qP3uZ5PnPxMnFHONjfwF4G5dJAgDSCDwAGIrAA4ChCDwA\nGIrAA4ChCDwAGIrAA4ChCDwAGIrAA4ChCDwAGIrAA4ChCDwAGIrAA4ChCDwAGIrAA4ChCDwAGIrA\nA4ChCDwAGIrAA4ChCDwAGIrAA4ChCDwAGIrAA4ChCDwAGIrAA4ChCDwAGIrAA4ChXAf+6aef1g03\n3KDrr79ea9askSQlk0mFQiHZtq3GxkYNDAxkbVAAQGZcBf7UqVPasGGD9u7dq0Qiod7eXu3Zs0fh\ncFi2bauvr09FRUXq6OjI9rwAgGFyFfiJEyfKcRx9//33SqVSOnPmjC655BLF43E1NzeroKBATU1N\nisVi2Z4XADBMrgMfDod15ZVXasaMGZo7d64CgYASiYR8Pp8kyefzKR6PZ3VYAMDw5bt50Ndff62W\nlhYdPnxY06ZN0x133KEdO3bIcZxhPX79+vXpr4PBoILBoJsxAMBY0WhU0Wh0RM9hOcOt8u/s3LlT\nW7du1bZt2yRJ4XBYx44d09GjR9Xa2iq/36+DBw+qra1NnZ2dQxe0rGG/EIwmy7Ik5WKO8bG/ALzN\nTTtdnaKZN2+ePvzwQ506dUo//vijdu3apUWLFikQCCgSiSiVSikSiaimpsbN0wMAssBV4KdMmaLW\n1lbdeuutuvHGG1VRUaGFCxeqpaVF/f39Kikp0cmTJ7Vq1apszwsAGCZXp2hGtCCnaAAgYzk7RQMA\nGP8IPAAYisADgKEIPAAYisADgKEIPAAYisADgKEIPAAYisADgKEIPAAYisADgKEIPAAYisADgKEI\nPAAYisADgKEIPAAYisADgKEIPAAYisADgKEIPAAYisADgKEIPAAYisADgKEIPAAYisADgKEIPAAY\nisADgKEIPAAYisADgKEIPAAYisADgKEIPAAYisADgKEIPAAYisADgKEIPAAYynXgf/jhB919992a\nNWuWysrKFIvFlEwmFQqFZNu2GhsbNTAwkM1ZAQAZcB34devWybZtdXV1qaurSz6fT+FwWLZtq6+v\nT0VFRero6MjmrACADLgO/L59+7R27VpNmDBB+fn5mjp1quLxuJqbm1VQUKCmpibFYrFszgoAyICr\nwJ84cUKDg4NqaWlRIBDQxo0blUqllEgk5PP5JEk+n0/xeDyrwwIAhi/fzYMGBwfV29urTZs2qa6u\nTitXrtRLL70kx3GG9fj169envw4GgwoGg27GAABjRaNRRaPRET2H5Qy3yn9QWlqqnp4eSdKuXbv0\n3HPP6aefflJra6v8fr8OHjyotrY2dXZ2Dl3Qsob9QjCaLMuSlIs5xsf+AvA2N+10fQ6+uLhYsVhM\n586d086dO1VXV6dAIKBIJKJUKqVIJKKamhq3Tw8AGCHXR/C9vb266667NDg4qLq6Oj388MM6d+6c\nli1bpkOHDum6667T888/r0mTJg1dkCN4AMiYm3a6DrxbBB4AMpfTUzQAgPGNwAOAoQg8ABiKwAOA\n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\n", |
|
|||
158 | "text": [ |
|
|||
159 | "<matplotlib.figure.Figure at 0x108c8f1d0>" |
|
|||
160 | ] |
|
|||
161 | } |
|
|||
162 | ], |
|
|||
163 | "prompt_number": 14 |
|
|||
164 | }, |
|
|||
165 | { |
|
|||
166 | "cell_type": "code", |
|
|||
167 | "collapsed": false, |
|
|||
168 | "input": [], |
|
|||
169 | "language": "python", |
|
|||
170 | "metadata": {}, |
|
|||
171 | "outputs": [] |
|
|||
172 | } |
|
148 | } | |
173 | ], |
|
149 | ], | |
174 | "metadata": {} |
|
150 | "prompt_number": 14, | |
|
151 | "source": [ | |||
|
152 | "hist(evs.real)" | |||
|
153 | ] | |||
|
154 | }, | |||
|
155 | { | |||
|
156 | "cell_type": "code", | |||
|
157 | "metadata": { | |||
|
158 | "collapsed": false | |||
|
159 | }, | |||
|
160 | "outputs": [], | |||
|
161 | "prompt_number": null, | |||
|
162 | "source": [] | |||
175 | } |
|
163 | } | |
176 | ] |
|
164 | ], | |
|
165 | "metadata": {}, | |||
|
166 | "nbformat": 4, | |||
|
167 | "nbformat_minor": 0 | |||
177 | } No newline at end of file |
|
168 | } |
@@ -1,84 +1,77 b'' | |||||
1 | { |
|
1 | { | |
2 | "metadata": { |
|
2 | "cells": [ | |
3 | "name": "" |
|
|||
4 | }, |
|
|||
5 | "nbformat": 3, |
|
|||
6 | "nbformat_minor": 0, |
|
|||
7 | "worksheets": [ |
|
|||
8 | { |
|
3 | { | |
9 |
"cell |
|
4 | "cell_type": "raw", | |
10 | { |
|
5 | "metadata": { | |
11 | "cell_type": "raw", |
|
6 | "raw_mimetype": "text/html" | |
12 | "metadata": { |
|
7 | }, | |
13 | "raw_mimetype": "text/html" |
|
8 | "source": [ | |
14 | }, |
|
9 | "<b>raw html</b>" | |
15 | "source": [ |
|
10 | ] | |
16 | "<b>raw html</b>" |
|
11 | }, | |
17 | ] |
|
12 | { | |
18 | }, |
|
13 | "cell_type": "raw", | |
19 | { |
|
14 | "metadata": { | |
20 | "cell_type": "raw", |
|
15 | "raw_mimetype": "text/markdown" | |
21 | "metadata": { |
|
16 | }, | |
22 | "raw_mimetype": "text/markdown" |
|
17 | "source": [ | |
23 | }, |
|
18 | "* raw markdown\n", | |
24 | "source": [ |
|
19 | "* bullet\n", | |
25 | "* raw markdown\n", |
|
20 | "* list" | |
26 | "* bullet\n", |
|
21 | ] | |
27 | "* list" |
|
22 | }, | |
28 | ] |
|
23 | { | |
29 | }, |
|
24 | "cell_type": "raw", | |
30 | { |
|
25 | "metadata": { | |
31 | "cell_type": "raw", |
|
26 | "raw_mimetype": "text/restructuredtext" | |
32 | "metadata": { |
|
27 | }, | |
33 | "raw_mimetype": "text/restructuredtext" |
|
28 | "source": [ | |
34 | }, |
|
29 | "``raw rst``\n", | |
35 | "source": [ |
|
30 | "\n", | |
36 | "``raw rst``\n", |
|
31 | ".. sourcecode:: python\n", | |
37 |
|
|
32 | "\n", | |
38 | ".. sourcecode:: python\n", |
|
33 | " def foo(): pass\n" | |
39 | "\n", |
|
34 | ] | |
40 | " def foo(): pass\n" |
|
35 | }, | |
41 | ] |
|
36 | { | |
42 | }, |
|
37 | "cell_type": "raw", | |
43 | { |
|
38 | "metadata": { | |
44 | "cell_type": "raw", |
|
39 | "raw_mimetype": "text/x-python" | |
45 | "metadata": { |
|
40 | }, | |
46 | "raw_mimetype": "text/x-python" |
|
41 | "source": [ | |
47 | }, |
|
42 | "def bar():\n", | |
48 | "source": [ |
|
43 | " \"\"\"raw python\"\"\"\n", | |
49 | "def bar():\n", |
|
44 | " pass" | |
50 | " \"\"\"raw python\"\"\"\n", |
|
45 | ] | |
51 | " pass" |
|
46 | }, | |
52 | ] |
|
47 | { | |
53 | }, |
|
48 | "cell_type": "raw", | |
54 | { |
|
49 | "metadata": { | |
55 | "cell_type": "raw", |
|
50 | "raw_mimetype": "text/latex" | |
56 | "metadata": { |
|
51 | }, | |
57 | "raw_mimetype": "text/latex" |
|
52 | "source": [ | |
58 | }, |
|
53 | "\\LaTeX\n", | |
59 | "source": [ |
|
54 | "% raw latex" | |
60 | "\\LaTeX\n", |
|
55 | ] | |
61 | "% raw latex" |
|
56 | }, | |
62 | ] |
|
57 | { | |
63 | }, |
|
58 | "cell_type": "raw", | |
64 | { |
|
59 | "metadata": {}, | |
65 | "cell_type": "raw", |
|
60 | "source": [ | |
66 | "metadata": {}, |
|
61 | "# no raw_mimetype metadata, should be included by default" | |
67 | "source": [ |
|
62 | ] | |
68 | "# no raw_mimetype metadata, should be included by default" |
|
63 | }, | |
69 | ] |
|
64 | { | |
70 | }, |
|
65 | "cell_type": "raw", | |
71 | { |
|
66 | "metadata": { | |
72 | "cell_type": "raw", |
|
67 | "raw_mimetype": "doesnotexist" | |
73 | "metadata": { |
|
68 | }, | |
74 | "raw_mimetype": "doesnotexist" |
|
69 | "source": [ | |
75 | }, |
|
70 | "garbage format defined, should never be included" | |
76 | "source": [ |
|
71 | ] | |
77 | "garbage format defined, should never be included" |
|
|||
78 | ] |
|
|||
79 | } |
|
|||
80 | ], |
|
|||
81 | "metadata": {} |
|
|||
82 | } |
|
72 | } | |
83 | ] |
|
73 | ], | |
84 | } |
|
74 | "metadata": {}, | |
|
75 | "nbformat": 4, | |||
|
76 | "nbformat_minor": 0 | |||
|
77 | } No newline at end of file |
@@ -1,118 +1,116 b'' | |||||
1 | """Tests for Latex exporter""" |
|
1 | """Tests for Latex exporter""" | |
2 |
|
2 | |||
3 | # Copyright (c) IPython Development Team. |
|
3 | # Copyright (c) IPython Development Team. | |
4 | # Distributed under the terms of the Modified BSD License. |
|
4 | # Distributed under the terms of the Modified BSD License. | |
5 |
|
5 | |||
6 | import os.path |
|
6 | import os.path | |
7 | import textwrap |
|
7 | import textwrap | |
8 | import re |
|
8 | import re | |
9 |
|
9 | |||
10 | from .base import ExportersTestsBase |
|
10 | from .base import ExportersTestsBase | |
11 | from ..latex import LatexExporter |
|
11 | from ..latex import LatexExporter | |
12 | from IPython.nbformat import current |
|
12 | from IPython.nbformat import current | |
13 | from IPython.testing.decorators import onlyif_cmds_exist |
|
13 | from IPython.testing.decorators import onlyif_cmds_exist | |
14 | from IPython.utils.tempdir import TemporaryDirectory |
|
14 | from IPython.utils.tempdir import TemporaryDirectory | |
15 |
|
15 | |||
16 |
|
16 | |||
17 | class TestLatexExporter(ExportersTestsBase): |
|
17 | class TestLatexExporter(ExportersTestsBase): | |
18 | """Contains test functions for latex.py""" |
|
18 | """Contains test functions for latex.py""" | |
19 |
|
19 | |||
20 | exporter_class = LatexExporter |
|
20 | exporter_class = LatexExporter | |
21 | should_include_raw = ['latex'] |
|
21 | should_include_raw = ['latex'] | |
22 |
|
22 | |||
23 | def test_constructor(self): |
|
23 | def test_constructor(self): | |
24 | """ |
|
24 | """ | |
25 | Can a LatexExporter be constructed? |
|
25 | Can a LatexExporter be constructed? | |
26 | """ |
|
26 | """ | |
27 | LatexExporter() |
|
27 | LatexExporter() | |
28 |
|
28 | |||
29 |
|
29 | |||
30 | @onlyif_cmds_exist('pandoc') |
|
30 | @onlyif_cmds_exist('pandoc') | |
31 | def test_export(self): |
|
31 | def test_export(self): | |
32 | """ |
|
32 | """ | |
33 | Can a LatexExporter export something? |
|
33 | Can a LatexExporter export something? | |
34 | """ |
|
34 | """ | |
35 | (output, resources) = LatexExporter().from_filename(self._get_notebook()) |
|
35 | (output, resources) = LatexExporter().from_filename(self._get_notebook()) | |
36 | assert len(output) > 0 |
|
36 | assert len(output) > 0 | |
37 |
|
37 | |||
38 |
|
38 | |||
39 | @onlyif_cmds_exist('pandoc') |
|
39 | @onlyif_cmds_exist('pandoc') | |
40 | def test_export_book(self): |
|
40 | def test_export_book(self): | |
41 | """ |
|
41 | """ | |
42 | Can a LatexExporter export using 'report' template? |
|
42 | Can a LatexExporter export using 'report' template? | |
43 | """ |
|
43 | """ | |
44 | (output, resources) = LatexExporter(template_file='report').from_filename(self._get_notebook()) |
|
44 | (output, resources) = LatexExporter(template_file='report').from_filename(self._get_notebook()) | |
45 | assert len(output) > 0 |
|
45 | assert len(output) > 0 | |
46 |
|
46 | |||
47 |
|
47 | |||
48 | @onlyif_cmds_exist('pandoc') |
|
48 | @onlyif_cmds_exist('pandoc') | |
49 | def test_export_basic(self): |
|
49 | def test_export_basic(self): | |
50 | """ |
|
50 | """ | |
51 | Can a LatexExporter export using 'article' template? |
|
51 | Can a LatexExporter export using 'article' template? | |
52 | """ |
|
52 | """ | |
53 | (output, resources) = LatexExporter(template_file='article').from_filename(self._get_notebook()) |
|
53 | (output, resources) = LatexExporter(template_file='article').from_filename(self._get_notebook()) | |
54 | assert len(output) > 0 |
|
54 | assert len(output) > 0 | |
55 |
|
55 | |||
56 |
|
56 | |||
57 | @onlyif_cmds_exist('pandoc') |
|
57 | @onlyif_cmds_exist('pandoc') | |
58 | def test_export_article(self): |
|
58 | def test_export_article(self): | |
59 | """ |
|
59 | """ | |
60 | Can a LatexExporter export using 'article' template? |
|
60 | Can a LatexExporter export using 'article' template? | |
61 | """ |
|
61 | """ | |
62 | (output, resources) = LatexExporter(template_file='article').from_filename(self._get_notebook()) |
|
62 | (output, resources) = LatexExporter(template_file='article').from_filename(self._get_notebook()) | |
63 | assert len(output) > 0 |
|
63 | assert len(output) > 0 | |
64 |
|
64 | |||
65 | @onlyif_cmds_exist('pandoc') |
|
65 | @onlyif_cmds_exist('pandoc') | |
66 | def test_very_long_cells(self): |
|
66 | def test_very_long_cells(self): | |
67 | """ |
|
67 | """ | |
68 | Torture test that long cells do not cause issues |
|
68 | Torture test that long cells do not cause issues | |
69 | """ |
|
69 | """ | |
70 | lorem_ipsum_text = textwrap.dedent("""\ |
|
70 | lorem_ipsum_text = textwrap.dedent("""\ | |
71 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec |
|
71 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec | |
72 | dignissim, ipsum non facilisis tempus, dui felis tincidunt metus, |
|
72 | dignissim, ipsum non facilisis tempus, dui felis tincidunt metus, | |
73 | nec pulvinar neque odio eget risus. Nulla nisi lectus, cursus |
|
73 | nec pulvinar neque odio eget risus. Nulla nisi lectus, cursus | |
74 | suscipit interdum at, ultrices sit amet orci. Mauris facilisis |
|
74 | suscipit interdum at, ultrices sit amet orci. Mauris facilisis | |
75 | imperdiet elit, vitae scelerisque ipsum dignissim non. Integer |
|
75 | imperdiet elit, vitae scelerisque ipsum dignissim non. Integer | |
76 | consequat malesuada neque sit amet pulvinar. Curabitur pretium |
|
76 | consequat malesuada neque sit amet pulvinar. Curabitur pretium | |
77 | ut turpis eget aliquet. Maecenas sagittis lacus sed lectus |
|
77 | ut turpis eget aliquet. Maecenas sagittis lacus sed lectus | |
78 | volutpat, eu adipiscing purus pulvinar. Maecenas consequat |
|
78 | volutpat, eu adipiscing purus pulvinar. Maecenas consequat | |
79 | luctus urna, eget cursus quam mollis a. Aliquam vitae ornare |
|
79 | luctus urna, eget cursus quam mollis a. Aliquam vitae ornare | |
80 | erat, non hendrerit urna. Sed eu diam nec massa egestas pharetra |
|
80 | erat, non hendrerit urna. Sed eu diam nec massa egestas pharetra | |
81 | at nec tellus. Fusce feugiat lacus quis urna sollicitudin volutpat. |
|
81 | at nec tellus. Fusce feugiat lacus quis urna sollicitudin volutpat. | |
82 | Quisque at sapien non nibh feugiat tempus ac ultricies purus. |
|
82 | Quisque at sapien non nibh feugiat tempus ac ultricies purus. | |
83 | """) |
|
83 | """) | |
84 | lorem_ipsum_text = lorem_ipsum_text.replace("\n"," ") + "\n\n" |
|
84 | lorem_ipsum_text = lorem_ipsum_text.replace("\n"," ") + "\n\n" | |
85 | large_lorem_ipsum_text = "".join([lorem_ipsum_text]*3000) |
|
85 | large_lorem_ipsum_text = "".join([lorem_ipsum_text]*3000) | |
86 |
|
86 | |||
87 | notebook_name = "lorem_ipsum_long.ipynb" |
|
87 | notebook_name = "lorem_ipsum_long.ipynb" | |
88 | nb = current.new_notebook( |
|
88 | nb = current.new_notebook( | |
89 |
|
|
89 | cells=[ | |
90 | current.new_worksheet(cells=[ |
|
90 | current.new_markdown_cell(source=large_lorem_ipsum_text) | |
91 | current.new_text_cell('markdown',source=large_lorem_ipsum_text) |
|
|||
92 | ]) |
|
|||
93 | ] |
|
91 | ] | |
94 | ) |
|
92 | ) | |
95 |
|
93 | |||
96 | with TemporaryDirectory() as td: |
|
94 | with TemporaryDirectory() as td: | |
97 | nbfile = os.path.join(td, notebook_name) |
|
95 | nbfile = os.path.join(td, notebook_name) | |
98 | with open(nbfile, 'w') as f: |
|
96 | with open(nbfile, 'w') as f: | |
99 | current.write(nb, f, 'ipynb') |
|
97 | current.write(nb, f, 'ipynb') | |
100 |
|
98 | |||
101 | (output, resources) = LatexExporter(template_file='article').from_filename(nbfile) |
|
99 | (output, resources) = LatexExporter(template_file='article').from_filename(nbfile) | |
102 | assert len(output) > 0 |
|
100 | assert len(output) > 0 | |
103 |
|
101 | |||
104 | @onlyif_cmds_exist('pandoc') |
|
102 | @onlyif_cmds_exist('pandoc') | |
105 | def test_prompt_number_color(self): |
|
103 | def test_prompt_number_color(self): | |
106 | """ |
|
104 | """ | |
107 | Does LatexExporter properly format input and output prompts in color? |
|
105 | Does LatexExporter properly format input and output prompts in color? | |
108 | """ |
|
106 | """ | |
109 | (output, resources) = LatexExporter().from_filename( |
|
107 | (output, resources) = LatexExporter().from_filename( | |
110 | self._get_notebook(nb_name="prompt_numbers.ipynb")) |
|
108 | self._get_notebook(nb_name="prompt_numbers.ipynb")) | |
111 | in_regex = r"In \[\{\\color\{incolor\}(.*)\}\]:" |
|
109 | in_regex = r"In \[\{\\color\{incolor\}(.*)\}\]:" | |
112 | out_regex = r"Out\[\{\\color\{outcolor\}(.*)\}\]:" |
|
110 | out_regex = r"Out\[\{\\color\{outcolor\}(.*)\}\]:" | |
113 |
|
111 | |||
114 | ins = ["2", "10", " ", " ", "*", "0"] |
|
112 | ins = ["2", "10", " ", " ", "*", "0"] | |
115 | outs = ["10"] |
|
113 | outs = ["10"] | |
116 |
|
114 | |||
117 | assert re.findall(in_regex, output) == ins |
|
115 | assert re.findall(in_regex, output) == ins | |
118 | assert re.findall(out_regex, output) == outs |
|
116 | assert re.findall(out_regex, output) == outs |
@@ -1,65 +1,62 b'' | |||||
1 | """Tests for RSTExporter""" |
|
1 | """Tests for RSTExporter""" | |
2 |
|
2 | |||
3 | #----------------------------------------------------------------------------- |
|
3 | #----------------------------------------------------------------------------- | |
4 | # Copyright (c) 2013, the IPython Development Team. |
|
4 | # Copyright (c) 2013, the IPython Development Team. | |
5 | # |
|
5 | # | |
6 | # Distributed under the terms of the Modified BSD License. |
|
6 | # Distributed under the terms of the Modified BSD License. | |
7 | # |
|
7 | # | |
8 | # The full license is in the file COPYING.txt, distributed with this software. |
|
8 | # The full license is in the file COPYING.txt, distributed with this software. | |
9 | #----------------------------------------------------------------------------- |
|
9 | #----------------------------------------------------------------------------- | |
10 |
|
10 | |||
11 | #----------------------------------------------------------------------------- |
|
11 | #----------------------------------------------------------------------------- | |
12 | # Imports |
|
12 | # Imports | |
13 | #----------------------------------------------------------------------------- |
|
13 | #----------------------------------------------------------------------------- | |
14 |
|
14 | |||
15 | import io |
|
15 | import io | |
16 |
|
16 | |||
17 | from IPython.nbformat import current |
|
17 | from IPython.nbformat import current | |
18 |
|
18 | |||
19 | from .base import ExportersTestsBase |
|
19 | from .base import ExportersTestsBase | |
20 | from ..rst import RSTExporter |
|
20 | from ..rst import RSTExporter | |
21 | from IPython.testing.decorators import onlyif_cmds_exist |
|
21 | from IPython.testing.decorators import onlyif_cmds_exist | |
22 |
|
22 | |||
23 | #----------------------------------------------------------------------------- |
|
|||
24 | # Class |
|
|||
25 | #----------------------------------------------------------------------------- |
|
|||
26 |
|
23 | |||
27 | class TestRSTExporter(ExportersTestsBase): |
|
24 | class TestRSTExporter(ExportersTestsBase): | |
28 | """Tests for RSTExporter""" |
|
25 | """Tests for RSTExporter""" | |
29 |
|
26 | |||
30 | exporter_class = RSTExporter |
|
27 | exporter_class = RSTExporter | |
31 | should_include_raw = ['rst'] |
|
28 | should_include_raw = ['rst'] | |
32 |
|
29 | |||
33 | def test_constructor(self): |
|
30 | def test_constructor(self): | |
34 | """ |
|
31 | """ | |
35 | Can a RSTExporter be constructed? |
|
32 | Can a RSTExporter be constructed? | |
36 | """ |
|
33 | """ | |
37 | RSTExporter() |
|
34 | RSTExporter() | |
38 |
|
35 | |||
39 |
|
36 | |||
40 | @onlyif_cmds_exist('pandoc') |
|
37 | @onlyif_cmds_exist('pandoc') | |
41 | def test_export(self): |
|
38 | def test_export(self): | |
42 | """ |
|
39 | """ | |
43 | Can a RSTExporter export something? |
|
40 | Can a RSTExporter export something? | |
44 | """ |
|
41 | """ | |
45 | (output, resources) = RSTExporter().from_filename(self._get_notebook()) |
|
42 | (output, resources) = RSTExporter().from_filename(self._get_notebook()) | |
46 | assert len(output) > 0 |
|
43 | assert len(output) > 0 | |
47 |
|
44 | |||
48 | @onlyif_cmds_exist('pandoc') |
|
45 | @onlyif_cmds_exist('pandoc') | |
49 | def test_empty_code_cell(self): |
|
46 | def test_empty_code_cell(self): | |
50 | """No empty code cells in rst""" |
|
47 | """No empty code cells in rst""" | |
51 | nbname = self._get_notebook() |
|
48 | nbname = self._get_notebook() | |
52 | with io.open(nbname, encoding='utf8') as f: |
|
49 | with io.open(nbname, encoding='utf8') as f: | |
53 | nb = current.read(f, 'json') |
|
50 | nb = current.read(f, 'json') | |
54 |
|
51 | |||
55 | exporter = self.exporter_class() |
|
52 | exporter = self.exporter_class() | |
56 |
|
53 | |||
57 | (output, resources) = exporter.from_notebook_node(nb) |
|
54 | (output, resources) = exporter.from_notebook_node(nb) | |
58 | # add an empty code cell |
|
55 | # add an empty code cell | |
59 |
nb |
|
56 | nb.cells.append( | |
60 |
current.new_code_cell( |
|
57 | current.new_code_cell(source="") | |
61 | ) |
|
58 | ) | |
62 | (output2, resources) = exporter.from_notebook_node(nb) |
|
59 | (output2, resources) = exporter.from_notebook_node(nb) | |
63 | # adding an empty code cell shouldn't change output |
|
60 | # adding an empty code cell shouldn't change output | |
64 | self.assertEqual(output.strip(), output2.strip()) |
|
61 | self.assertEqual(output.strip(), output2.strip()) | |
65 |
|
62 |
@@ -1,93 +1,92 b'' | |||||
1 | """Base class for preprocessors""" |
|
1 | """Base class for preprocessors""" | |
2 |
|
2 | |||
3 | # Copyright (c) IPython Development Team. |
|
3 | # Copyright (c) IPython Development Team. | |
4 | # Distributed under the terms of the Modified BSD License. |
|
4 | # Distributed under the terms of the Modified BSD License. | |
5 |
|
5 | |||
6 | from ..utils.base import NbConvertBase |
|
6 | from ..utils.base import NbConvertBase | |
7 | from IPython.utils.traitlets import Bool |
|
7 | from IPython.utils.traitlets import Bool | |
8 |
|
8 | |||
9 |
|
9 | |||
10 | class Preprocessor(NbConvertBase): |
|
10 | class Preprocessor(NbConvertBase): | |
11 | """ A configurable preprocessor |
|
11 | """ A configurable preprocessor | |
12 |
|
12 | |||
13 | Inherit from this class if you wish to have configurability for your |
|
13 | Inherit from this class if you wish to have configurability for your | |
14 | preprocessor. |
|
14 | preprocessor. | |
15 |
|
15 | |||
16 | Any configurable traitlets this class exposed will be configurable in |
|
16 | Any configurable traitlets this class exposed will be configurable in | |
17 | profiles using c.SubClassName.attribute = value |
|
17 | profiles using c.SubClassName.attribute = value | |
18 |
|
18 | |||
19 | you can overwrite :meth:`preprocess_cell` to apply a transformation |
|
19 | you can overwrite :meth:`preprocess_cell` to apply a transformation | |
20 | independently on each cell or :meth:`preprocess` if you prefer your own |
|
20 | independently on each cell or :meth:`preprocess` if you prefer your own | |
21 | logic. See corresponding docstring for informations. |
|
21 | logic. See corresponding docstring for informations. | |
22 |
|
22 | |||
23 | Disabled by default and can be enabled via the config by |
|
23 | Disabled by default and can be enabled via the config by | |
24 | 'c.YourPreprocessorName.enabled = True' |
|
24 | 'c.YourPreprocessorName.enabled = True' | |
25 | """ |
|
25 | """ | |
26 |
|
26 | |||
27 | enabled = Bool(False, config=True) |
|
27 | enabled = Bool(False, config=True) | |
28 |
|
28 | |||
29 | def __init__(self, **kw): |
|
29 | def __init__(self, **kw): | |
30 | """ |
|
30 | """ | |
31 | Public constructor |
|
31 | Public constructor | |
32 |
|
32 | |||
33 | Parameters |
|
33 | Parameters | |
34 | ---------- |
|
34 | ---------- | |
35 | config : Config |
|
35 | config : Config | |
36 | Configuration file structure |
|
36 | Configuration file structure | |
37 | **kw : misc |
|
37 | **kw : misc | |
38 | Additional arguments |
|
38 | Additional arguments | |
39 | """ |
|
39 | """ | |
40 |
|
40 | |||
41 | super(Preprocessor, self).__init__(**kw) |
|
41 | super(Preprocessor, self).__init__(**kw) | |
42 |
|
42 | |||
43 |
|
43 | |||
44 | def __call__(self, nb, resources): |
|
44 | def __call__(self, nb, resources): | |
45 | if self.enabled: |
|
45 | if self.enabled: | |
46 | self.log.debug("Applying preprocessor: %s", self.__class__.__name__) |
|
46 | self.log.debug("Applying preprocessor: %s", self.__class__.__name__) | |
47 | return self.preprocess(nb,resources) |
|
47 | return self.preprocess(nb,resources) | |
48 | else: |
|
48 | else: | |
49 | return nb, resources |
|
49 | return nb, resources | |
50 |
|
50 | |||
51 |
|
51 | |||
52 | def preprocess(self, nb, resources): |
|
52 | def preprocess(self, nb, resources): | |
53 | """ |
|
53 | """ | |
54 | Preprocessing to apply on each notebook. |
|
54 | Preprocessing to apply on each notebook. | |
55 |
|
55 | |||
56 | Must return modified nb, resources. |
|
56 | Must return modified nb, resources. | |
57 |
|
57 | |||
58 | If you wish to apply your preprocessing to each cell, you might want |
|
58 | If you wish to apply your preprocessing to each cell, you might want | |
59 | to override preprocess_cell method instead. |
|
59 | to override preprocess_cell method instead. | |
60 |
|
60 | |||
61 | Parameters |
|
61 | Parameters | |
62 | ---------- |
|
62 | ---------- | |
63 | nb : NotebookNode |
|
63 | nb : NotebookNode | |
64 | Notebook being converted |
|
64 | Notebook being converted | |
65 | resources : dictionary |
|
65 | resources : dictionary | |
66 | Additional resources used in the conversion process. Allows |
|
66 | Additional resources used in the conversion process. Allows | |
67 | preprocessors to pass variables into the Jinja engine. |
|
67 | preprocessors to pass variables into the Jinja engine. | |
68 | """ |
|
68 | """ | |
69 | for worksheet in nb.worksheets: |
|
69 | for index, cell in enumerate(nb.cells): | |
70 | for index, cell in enumerate(worksheet.cells): |
|
70 | nb.cells[index], resources = self.preprocess_cell(cell, resources, index) | |
71 | worksheet.cells[index], resources = self.preprocess_cell(cell, resources, index) |
|
|||
72 | return nb, resources |
|
71 | return nb, resources | |
73 |
|
72 | |||
74 |
|
73 | |||
75 | def preprocess_cell(self, cell, resources, index): |
|
74 | def preprocess_cell(self, cell, resources, index): | |
76 | """ |
|
75 | """ | |
77 | Override if you want to apply some preprocessing to each cell. |
|
76 | Override if you want to apply some preprocessing to each cell. | |
78 | Must return modified cell and resource dictionary. |
|
77 | Must return modified cell and resource dictionary. | |
79 |
|
78 | |||
80 | Parameters |
|
79 | Parameters | |
81 | ---------- |
|
80 | ---------- | |
82 | cell : NotebookNode cell |
|
81 | cell : NotebookNode cell | |
83 | Notebook cell being processed |
|
82 | Notebook cell being processed | |
84 | resources : dictionary |
|
83 | resources : dictionary | |
85 | Additional resources used in the conversion process. Allows |
|
84 | Additional resources used in the conversion process. Allows | |
86 | preprocessors to pass variables into the Jinja engine. |
|
85 | preprocessors to pass variables into the Jinja engine. | |
87 | index : int |
|
86 | index : int | |
88 | Index of the cell being processed |
|
87 | Index of the cell being processed | |
89 | """ |
|
88 | """ | |
90 |
|
89 | |||
91 | raise NotImplementedError('should be implemented by subclass') |
|
90 | raise NotImplementedError('should be implemented by subclass') | |
92 | return cell, resources |
|
91 | return cell, resources | |
93 |
|
92 |
@@ -1,77 +1,75 b'' | |||||
1 | """Preprocessor for merging consecutive stream outputs for easier handling.""" |
|
1 | """Preprocessor for merging consecutive stream outputs for easier handling.""" | |
2 |
|
2 | |||
3 | # Copyright (c) IPython Development Team. |
|
3 | # Copyright (c) IPython Development Team. | |
4 | # Distributed under the terms of the Modified BSD License. |
|
4 | # Distributed under the terms of the Modified BSD License. | |
5 |
|
5 | |||
6 | import re |
|
6 | import re | |
|
7 | from IPython.utils.log import get_logger | |||
7 |
|
8 | |||
8 | def cell_preprocessor(function): |
|
9 | def cell_preprocessor(function): | |
9 | """ |
|
10 | """ | |
10 | Wrap a function to be executed on all cells of a notebook |
|
11 | Wrap a function to be executed on all cells of a notebook | |
11 |
|
12 | |||
12 | The wrapped function should have these parameters: |
|
13 | The wrapped function should have these parameters: | |
13 |
|
14 | |||
14 | cell : NotebookNode cell |
|
15 | cell : NotebookNode cell | |
15 | Notebook cell being processed |
|
16 | Notebook cell being processed | |
16 | resources : dictionary |
|
17 | resources : dictionary | |
17 | Additional resources used in the conversion process. Allows |
|
18 | Additional resources used in the conversion process. Allows | |
18 | preprocessors to pass variables into the Jinja engine. |
|
19 | preprocessors to pass variables into the Jinja engine. | |
19 | index : int |
|
20 | index : int | |
20 | Index of the cell being processed |
|
21 | Index of the cell being processed | |
21 | """ |
|
22 | """ | |
22 |
|
23 | |||
23 | def wrappedfunc(nb, resources): |
|
24 | def wrappedfunc(nb, resources): | |
24 | from IPython.config import Application |
|
25 | get_logger().debug( | |
25 | if Application.initialized(): |
|
|||
26 | Application.instance().log.debug( |
|
|||
27 | "Applying preprocessor: %s", function.__name__ |
|
26 | "Applying preprocessor: %s", function.__name__ | |
28 | ) |
|
27 | ) | |
29 | for worksheet in nb.worksheets: |
|
28 | for index, cell in enumerate(nb.cells): | |
30 | for index, cell in enumerate(worksheet.cells): |
|
29 | nb.cells[index], resources = function(cell, resources, index) | |
31 | worksheet.cells[index], resources = function(cell, resources, index) |
|
|||
32 | return nb, resources |
|
30 | return nb, resources | |
33 | return wrappedfunc |
|
31 | return wrappedfunc | |
34 |
|
32 | |||
35 | cr_pat = re.compile(r'.*\r(?=[^\n])') |
|
33 | cr_pat = re.compile(r'.*\r(?=[^\n])') | |
36 |
|
34 | |||
37 | @cell_preprocessor |
|
35 | @cell_preprocessor | |
38 | def coalesce_streams(cell, resources, index): |
|
36 | def coalesce_streams(cell, resources, index): | |
39 | """ |
|
37 | """ | |
40 | Merge consecutive sequences of stream output into single stream |
|
38 | Merge consecutive sequences of stream output into single stream | |
41 | to prevent extra newlines inserted at flush calls |
|
39 | to prevent extra newlines inserted at flush calls | |
42 |
|
40 | |||
43 | Parameters |
|
41 | Parameters | |
44 | ---------- |
|
42 | ---------- | |
45 | cell : NotebookNode cell |
|
43 | cell : NotebookNode cell | |
46 | Notebook cell being processed |
|
44 | Notebook cell being processed | |
47 | resources : dictionary |
|
45 | resources : dictionary | |
48 | Additional resources used in the conversion process. Allows |
|
46 | Additional resources used in the conversion process. Allows | |
49 | transformers to pass variables into the Jinja engine. |
|
47 | transformers to pass variables into the Jinja engine. | |
50 | index : int |
|
48 | index : int | |
51 | Index of the cell being processed |
|
49 | Index of the cell being processed | |
52 | """ |
|
50 | """ | |
53 |
|
51 | |||
54 | outputs = cell.get('outputs', []) |
|
52 | outputs = cell.get('outputs', []) | |
55 | if not outputs: |
|
53 | if not outputs: | |
56 | return cell, resources |
|
54 | return cell, resources | |
57 |
|
55 | |||
58 | last = outputs[0] |
|
56 | last = outputs[0] | |
59 | new_outputs = [last] |
|
57 | new_outputs = [last] | |
60 | for output in outputs[1:]: |
|
58 | for output in outputs[1:]: | |
61 | if (output.output_type == 'stream' and |
|
59 | if (output.output_type == 'stream' and | |
62 | last.output_type == 'stream' and |
|
60 | last.output_type == 'stream' and | |
63 |
last. |
|
61 | last.name == output.name | |
64 | ): |
|
62 | ): | |
65 | last.text += output.text |
|
63 | last.text += output.text | |
66 |
|
64 | |||
67 | else: |
|
65 | else: | |
68 | new_outputs.append(output) |
|
66 | new_outputs.append(output) | |
69 | last = output |
|
67 | last = output | |
70 |
|
68 | |||
71 | # process \r characters |
|
69 | # process \r characters | |
72 | for output in new_outputs: |
|
70 | for output in new_outputs: | |
73 | if output.output_type == 'stream' and '\r' in output.text: |
|
71 | if output.output_type == 'stream' and '\r' in output.text: | |
74 | output.text = cr_pat.sub('', output.text) |
|
72 | output.text = cr_pat.sub('', output.text) | |
75 |
|
73 | |||
76 | cell.outputs = new_outputs |
|
74 | cell.outputs = new_outputs | |
77 | return cell, resources |
|
75 | return cell, resources |
@@ -1,143 +1,134 b'' | |||||
1 | """Module containing a preprocessor that removes the outputs from code cells""" |
|
1 | """Module containing a preprocessor that removes the outputs from code cells""" | |
2 |
|
2 | |||
3 | # Copyright (c) IPython Development Team. |
|
3 | # Copyright (c) IPython Development Team. | |
4 | # Distributed under the terms of the Modified BSD License. |
|
4 | # Distributed under the terms of the Modified BSD License. | |
5 |
|
5 | |||
6 | import os |
|
6 | import os | |
7 | import sys |
|
7 | import sys | |
8 |
|
8 | |||
9 | try: |
|
9 | try: | |
10 | from queue import Empty # Py 3 |
|
10 | from queue import Empty # Py 3 | |
11 | except ImportError: |
|
11 | except ImportError: | |
12 | from Queue import Empty # Py 2 |
|
12 | from Queue import Empty # Py 2 | |
13 |
|
13 | |||
14 | from IPython.utils.traitlets import List, Unicode |
|
14 | from IPython.utils.traitlets import List, Unicode | |
15 |
|
15 | |||
16 |
from IPython.nbformat.current import reads, |
|
16 | from IPython.nbformat.current import reads, writes, new_output | |
17 | from .base import Preprocessor |
|
17 | from .base import Preprocessor | |
18 | from IPython.utils.traitlets import Integer |
|
18 | from IPython.utils.traitlets import Integer | |
19 |
|
19 | |||
20 | class ExecutePreprocessor(Preprocessor): |
|
20 | class ExecutePreprocessor(Preprocessor): | |
21 | """ |
|
21 | """ | |
22 | Executes all the cells in a notebook |
|
22 | Executes all the cells in a notebook | |
23 | """ |
|
23 | """ | |
24 |
|
24 | |||
25 | timeout = Integer(30, config=True, |
|
25 | timeout = Integer(30, config=True, | |
26 | help="The time to wait (in seconds) for output from executions." |
|
26 | help="The time to wait (in seconds) for output from executions." | |
27 | ) |
|
27 | ) | |
28 | # FIXME: to be removed with nbformat v4 |
|
|||
29 | # map msg_type to v3 output_type |
|
|||
30 | msg_type_map = { |
|
|||
31 | "error" : "pyerr", |
|
|||
32 | "execute_result" : "pyout", |
|
|||
33 | } |
|
|||
34 |
|
||||
35 | # FIXME: to be removed with nbformat v4 |
|
|||
36 | # map mime-type to v3 mime-type keys |
|
|||
37 | mime_map = { |
|
|||
38 | "text/plain" : "text", |
|
|||
39 | "text/html" : "html", |
|
|||
40 | "image/svg+xml" : "svg", |
|
|||
41 | "image/png" : "png", |
|
|||
42 | "image/jpeg" : "jpeg", |
|
|||
43 | "text/latex" : "latex", |
|
|||
44 | "application/json" : "json", |
|
|||
45 | "application/javascript" : "javascript", |
|
|||
46 | } |
|
|||
47 |
|
28 | |||
48 | extra_arguments = List(Unicode) |
|
29 | extra_arguments = List(Unicode) | |
49 |
|
30 | |||
50 | def preprocess(self, nb, resources): |
|
31 | def preprocess(self, nb, resources): | |
51 | from IPython.kernel import run_kernel |
|
32 | from IPython.kernel import run_kernel | |
52 | kernel_name = nb.metadata.get('kernelspec', {}).get('name', 'python') |
|
33 | kernel_name = nb.metadata.get('kernelspec', {}).get('name', 'python') | |
53 | self.log.info("Executing notebook with kernel: %s" % kernel_name) |
|
34 | self.log.info("Executing notebook with kernel: %s" % kernel_name) | |
54 | with run_kernel(kernel_name=kernel_name, |
|
35 | with run_kernel(kernel_name=kernel_name, | |
55 | extra_arguments=self.extra_arguments, |
|
36 | extra_arguments=self.extra_arguments, | |
56 | stderr=open(os.devnull, 'w')) as kc: |
|
37 | stderr=open(os.devnull, 'w')) as kc: | |
57 | self.kc = kc |
|
38 | self.kc = kc | |
58 | nb, resources = super(ExecutePreprocessor, self).preprocess(nb, resources) |
|
39 | nb, resources = super(ExecutePreprocessor, self).preprocess(nb, resources) | |
59 | return nb, resources |
|
40 | return nb, resources | |
60 |
|
41 | |||
61 | def preprocess_cell(self, cell, resources, cell_index): |
|
42 | def preprocess_cell(self, cell, resources, cell_index): | |
62 | """ |
|
43 | """ | |
63 | Apply a transformation on each code cell. See base.py for details. |
|
44 | Apply a transformation on each code cell. See base.py for details. | |
64 | """ |
|
45 | """ | |
65 | if cell.cell_type != 'code': |
|
46 | if cell.cell_type != 'code': | |
66 | return cell, resources |
|
47 | return cell, resources | |
67 | try: |
|
48 | try: | |
68 | outputs = self.run_cell(self.kc.shell_channel, self.kc.iopub_channel, cell) |
|
49 | outputs = self.run_cell(self.kc.shell_channel, self.kc.iopub_channel, cell) | |
69 | except Exception as e: |
|
50 | except Exception as e: | |
70 | self.log.error("failed to run cell: " + repr(e)) |
|
51 | self.log.error("failed to run cell: " + repr(e)) | |
71 |
self.log.error(str(cell. |
|
52 | self.log.error(str(cell.source)) | |
72 | raise |
|
53 | raise | |
73 | cell.outputs = outputs |
|
54 | cell.outputs = outputs | |
74 | return cell, resources |
|
55 | return cell, resources | |
75 |
|
56 | |||
76 | def run_cell(self, shell, iopub, cell): |
|
57 | def run_cell(self, shell, iopub, cell): | |
77 |
msg_id = shell.execute(cell. |
|
58 | msg_id = shell.execute(cell.source) | |
78 |
self.log.debug("Executing cell:\n%s", cell. |
|
59 | self.log.debug("Executing cell:\n%s", cell.source) | |
79 | # wait for finish, with timeout |
|
60 | # wait for finish, with timeout | |
80 | while True: |
|
61 | while True: | |
81 | try: |
|
62 | try: | |
82 | msg = shell.get_msg(timeout=self.timeout) |
|
63 | msg = shell.get_msg(timeout=self.timeout) | |
83 | except Empty: |
|
64 | except Empty: | |
84 | self.log.error("Timeout waiting for execute reply") |
|
65 | self.log.error("Timeout waiting for execute reply") | |
85 | raise |
|
66 | raise | |
86 | if msg['parent_header'].get('msg_id') == msg_id: |
|
67 | if msg['parent_header'].get('msg_id') == msg_id: | |
87 | break |
|
68 | break | |
88 | else: |
|
69 | else: | |
89 | # not our reply |
|
70 | # not our reply | |
90 | continue |
|
71 | continue | |
91 |
|
72 | |||
92 | outs = [] |
|
73 | outs = [] | |
93 |
|
74 | |||
94 | while True: |
|
75 | while True: | |
95 | try: |
|
76 | try: | |
96 | msg = iopub.get_msg(timeout=self.timeout) |
|
77 | msg = iopub.get_msg(timeout=self.timeout) | |
97 | except Empty: |
|
78 | except Empty: | |
98 | self.log.warn("Timeout waiting for IOPub output") |
|
79 | self.log.warn("Timeout waiting for IOPub output") | |
99 | break |
|
80 | break | |
100 | if msg['parent_header'].get('msg_id') != msg_id: |
|
81 | if msg['parent_header'].get('msg_id') != msg_id: | |
101 | # not an output from our execution |
|
82 | # not an output from our execution | |
102 | continue |
|
83 | continue | |
103 |
|
84 | |||
104 | msg_type = msg['msg_type'] |
|
85 | msg_type = msg['msg_type'] | |
105 | self.log.debug("output: %s", msg_type) |
|
86 | self.log.debug("output: %s", msg_type) | |
106 | content = msg['content'] |
|
87 | content = msg['content'] | |
107 | out = NotebookNode(output_type=self.msg_type_map.get(msg_type, msg_type)) |
|
|||
108 |
|
88 | |||
109 | # set the prompt number for the input and the output |
|
89 | # set the prompt number for the input and the output | |
110 | if 'execution_count' in content: |
|
90 | if 'execution_count' in content: | |
111 | cell['prompt_number'] = content['execution_count'] |
|
91 | cell['prompt_number'] = content['execution_count'] | |
112 | out.prompt_number = content['execution_count'] |
|
92 | out.prompt_number = content['execution_count'] | |
113 |
|
93 | |||
114 | if msg_type == 'status': |
|
94 | if msg_type == 'status': | |
115 | if content['execution_state'] == 'idle': |
|
95 | if content['execution_state'] == 'idle': | |
116 | break |
|
96 | break | |
117 | else: |
|
97 | else: | |
118 | continue |
|
98 | continue | |
119 |
elif msg_type in {'execute_input' |
|
99 | elif msg_type in {'execute_input'}: | |
120 | continue |
|
100 | continue | |
121 | elif msg_type == 'clear_output': |
|
101 | elif msg_type == 'clear_output': | |
122 | outs = [] |
|
102 | outs = [] | |
123 | continue |
|
103 | continue | |
124 |
|
104 | |||
125 | if msg_type == 'stream': |
|
105 | # set the prompt number for the input and the output | |
126 | out.stream = content['name'] |
|
106 | if msg_type == 'execute_result': | |
127 |
|
|
107 | cell['prompt_number'] = content['execution_count'] | |
128 | elif msg_type in ('display_data', 'execute_result'): |
|
108 | out = new_output(output_type=msg_type, | |
129 |
|
|
109 | metadata=content['metadata'], | |
130 |
|
|
110 | mime_bundle=content['data'], | |
131 | # map mime-type keys to nbformat v3 keys |
|
111 | prompt_number=content['execution_count'], | |
132 | # this will be unnecessary in nbformat v4 |
|
112 | ) | |
133 | key = self.mime_map.get(mime, mime) |
|
113 | ||
134 | out[key] = data |
|
114 | elif msg_type == 'stream': | |
|
115 | out = new_output(output_type=msg_type, | |||
|
116 | name=content['name'], | |||
|
117 | data=content['data'], | |||
|
118 | ) | |||
|
119 | elif msg_type == 'display_data': | |||
|
120 | out = new_output(output_type=msg_type, | |||
|
121 | metadata=content['metadata'], | |||
|
122 | mime_bundle=content['data'], | |||
|
123 | ) | |||
135 | elif msg_type == 'error': |
|
124 | elif msg_type == 'error': | |
136 | out.ename = content['ename'] |
|
125 | out = new_output(output_type=msg_type, | |
137 |
|
|
126 | ename=content['ename'], | |
138 |
|
|
127 | evalue=content['evalue'], | |
|
128 | traceback=content['traceback'], | |||
|
129 | ) | |||
139 | else: |
|
130 | else: | |
140 | self.log.error("unhandled iopub msg: " + msg_type) |
|
131 | self.log.error("unhandled iopub msg: " + msg_type) | |
141 |
|
132 | |||
142 | outs.append(out) |
|
133 | outs.append(out) | |
143 | return outs |
|
134 | return outs |
@@ -1,112 +1,101 b'' | |||||
1 |
""" |
|
1 | """A preprocessor that extracts all of the outputs from the | |
2 | notebook file. The extracted outputs are returned in the 'resources' dictionary. |
|
2 | notebook file. The extracted outputs are returned in the 'resources' dictionary. | |
3 | """ |
|
3 | """ | |
4 | #----------------------------------------------------------------------------- |
|
|||
5 | # Copyright (c) 2013, the IPython Development Team. |
|
|||
6 | # |
|
|||
7 | # Distributed under the terms of the Modified BSD License. |
|
|||
8 | # |
|
|||
9 | # The full license is in the file COPYING.txt, distributed with this software. |
|
|||
10 | #----------------------------------------------------------------------------- |
|
|||
11 |
|
4 | |||
12 | #----------------------------------------------------------------------------- |
|
5 | # Copyright (c) IPython Development Team. | |
13 | # Imports |
|
6 | # Distributed under the terms of the Modified BSD License. | |
14 | #----------------------------------------------------------------------------- |
|
|||
15 |
|
7 | |||
16 | import base64 |
|
8 | import base64 | |
17 | import sys |
|
9 | import sys | |
18 | import os |
|
10 | import os | |
19 | from mimetypes import guess_extension |
|
11 | from mimetypes import guess_extension | |
20 |
|
12 | |||
21 | from IPython.utils.traitlets import Unicode, Set |
|
13 | from IPython.utils.traitlets import Unicode, Set | |
22 | from .base import Preprocessor |
|
14 | from .base import Preprocessor | |
23 | from IPython.utils import py3compat |
|
15 | from IPython.utils import py3compat | |
24 |
|
16 | |||
25 | #----------------------------------------------------------------------------- |
|
|||
26 | # Classes |
|
|||
27 | #----------------------------------------------------------------------------- |
|
|||
28 |
|
17 | |||
29 | class ExtractOutputPreprocessor(Preprocessor): |
|
18 | class ExtractOutputPreprocessor(Preprocessor): | |
30 | """ |
|
19 | """ | |
31 | Extracts all of the outputs from the notebook file. The extracted |
|
20 | Extracts all of the outputs from the notebook file. The extracted | |
32 | outputs are returned in the 'resources' dictionary. |
|
21 | outputs are returned in the 'resources' dictionary. | |
33 | """ |
|
22 | """ | |
34 |
|
23 | |||
35 | output_filename_template = Unicode( |
|
24 | output_filename_template = Unicode( | |
36 | "{unique_key}_{cell_index}_{index}{extension}", config=True) |
|
25 | "{unique_key}_{cell_index}_{index}{extension}", config=True) | |
37 |
|
26 | |||
38 | extract_output_types = Set({'png', 'jpeg', 'svg', 'application/pdf'}, config=True) |
|
27 | extract_output_types = Set({'image/png', 'image/jpeg', 'image/svg+xml', 'application/pdf'}, config=True) | |
39 |
|
28 | |||
40 | def preprocess_cell(self, cell, resources, cell_index): |
|
29 | def preprocess_cell(self, cell, resources, cell_index): | |
41 | """ |
|
30 | """ | |
42 | Apply a transformation on each cell, |
|
31 | Apply a transformation on each cell, | |
43 |
|
32 | |||
44 | Parameters |
|
33 | Parameters | |
45 | ---------- |
|
34 | ---------- | |
46 | cell : NotebookNode cell |
|
35 | cell : NotebookNode cell | |
47 | Notebook cell being processed |
|
36 | Notebook cell being processed | |
48 | resources : dictionary |
|
37 | resources : dictionary | |
49 | Additional resources used in the conversion process. Allows |
|
38 | Additional resources used in the conversion process. Allows | |
50 | preprocessors to pass variables into the Jinja engine. |
|
39 | preprocessors to pass variables into the Jinja engine. | |
51 | cell_index : int |
|
40 | cell_index : int | |
52 | Index of the cell being processed (see base.py) |
|
41 | Index of the cell being processed (see base.py) | |
53 | """ |
|
42 | """ | |
54 |
|
43 | |||
55 | #Get the unique key from the resource dict if it exists. If it does not |
|
44 | #Get the unique key from the resource dict if it exists. If it does not | |
56 | #exist, use 'output' as the default. Also, get files directory if it |
|
45 | #exist, use 'output' as the default. Also, get files directory if it | |
57 | #has been specified |
|
46 | #has been specified | |
58 | unique_key = resources.get('unique_key', 'output') |
|
47 | unique_key = resources.get('unique_key', 'output') | |
59 | output_files_dir = resources.get('output_files_dir', None) |
|
48 | output_files_dir = resources.get('output_files_dir', None) | |
60 |
|
49 | |||
61 | #Make sure outputs key exists |
|
50 | #Make sure outputs key exists | |
62 | if not isinstance(resources['outputs'], dict): |
|
51 | if not isinstance(resources['outputs'], dict): | |
63 | resources['outputs'] = {} |
|
52 | resources['outputs'] = {} | |
64 |
|
53 | |||
65 | #Loop through all of the outputs in the cell |
|
54 | #Loop through all of the outputs in the cell | |
66 | for index, out in enumerate(cell.get('outputs', [])): |
|
55 | for index, out in enumerate(cell.get('outputs', [])): | |
67 |
|
56 | |||
68 | #Get the output in data formats that the template needs extracted |
|
57 | #Get the output in data formats that the template needs extracted | |
69 | for out_type in self.extract_output_types: |
|
58 | for out_type in self.extract_output_types: | |
70 | if out_type in out: |
|
59 | if out_type in out: | |
71 | data = out[out_type] |
|
60 | data = out[out_type] | |
72 |
|
61 | |||
73 | #Binary files are base64-encoded, SVG is already XML |
|
62 | #Binary files are base64-encoded, SVG is already XML | |
74 | if out_type in {'png', 'jpeg', 'application/pdf'}: |
|
63 | if out_type in {'image/png', 'image/jpeg', 'application/pdf'}: | |
75 |
|
64 | |||
76 | # data is b64-encoded as text (str, unicode) |
|
65 | # data is b64-encoded as text (str, unicode) | |
77 | # decodestring only accepts bytes |
|
66 | # decodestring only accepts bytes | |
78 | data = py3compat.cast_bytes(data) |
|
67 | data = py3compat.cast_bytes(data) | |
79 | data = base64.decodestring(data) |
|
68 | data = base64.decodestring(data) | |
80 | elif sys.platform == 'win32': |
|
69 | elif sys.platform == 'win32': | |
81 | data = data.replace('\n', '\r\n').encode("UTF-8") |
|
70 | data = data.replace('\n', '\r\n').encode("UTF-8") | |
82 | else: |
|
71 | else: | |
83 | data = data.encode("UTF-8") |
|
72 | data = data.encode("UTF-8") | |
84 |
|
73 | |||
85 | # Build an output name |
|
74 | # Build an output name | |
86 | # filthy hack while we have some mimetype output, and some not |
|
75 | # filthy hack while we have some mimetype output, and some not | |
87 | if '/' in out_type: |
|
76 | if '/' in out_type: | |
88 | ext = guess_extension(out_type) |
|
77 | ext = guess_extension(out_type) | |
89 | if ext is None: |
|
78 | if ext is None: | |
90 | ext = '.' + out_type.rsplit('/')[-1] |
|
79 | ext = '.' + out_type.rsplit('/')[-1] | |
91 | else: |
|
80 | else: | |
92 | ext = '.' + out_type |
|
81 | ext = '.' + out_type | |
93 |
|
82 | |||
94 | filename = self.output_filename_template.format( |
|
83 | filename = self.output_filename_template.format( | |
95 | unique_key=unique_key, |
|
84 | unique_key=unique_key, | |
96 | cell_index=cell_index, |
|
85 | cell_index=cell_index, | |
97 | index=index, |
|
86 | index=index, | |
98 | extension=ext) |
|
87 | extension=ext) | |
99 |
|
88 | |||
100 | #On the cell, make the figure available via |
|
89 | #On the cell, make the figure available via | |
101 | # cell.outputs[i].svg_filename ... etc (svg in example) |
|
90 | # cell.outputs[i].svg_filename ... etc (svg in example) | |
102 | # Where |
|
91 | # Where | |
103 | # cell.outputs[i].svg contains the data |
|
92 | # cell.outputs[i].svg contains the data | |
104 | if output_files_dir is not None: |
|
93 | if output_files_dir is not None: | |
105 | filename = os.path.join(output_files_dir, filename) |
|
94 | filename = os.path.join(output_files_dir, filename) | |
106 | out[out_type + '_filename'] = filename |
|
95 | out[out_type + '_filename'] = filename | |
107 |
|
96 | |||
108 | #In the resources, make the figure available via |
|
97 | #In the resources, make the figure available via | |
109 | # resources['outputs']['filename'] = data |
|
98 | # resources['outputs']['filename'] = data | |
110 | resources['outputs'][filename] = data |
|
99 | resources['outputs'][filename] = data | |
111 |
|
100 | |||
112 | return cell, resources |
|
101 | return cell, resources |
@@ -1,113 +1,100 b'' | |||||
1 | """This preprocessor detect cells using a different language through |
|
1 | """This preprocessor detect cells using a different language through | |
2 | magic extensions such as `%%R` or `%%octave`. Cell's metadata is marked |
|
2 | magic extensions such as `%%R` or `%%octave`. Cell's metadata is marked | |
3 | so that the appropriate highlighter can be used in the `highlight` |
|
3 | so that the appropriate highlighter can be used in the `highlight` | |
4 | filter. |
|
4 | filter. | |
5 | """ |
|
5 | """ | |
6 |
|
6 | |||
7 | #----------------------------------------------------------------------------- |
|
7 | # Copyright (c) IPython Development Team. | |
8 | # Copyright (c) 2013, the IPython Development Team. |
|
|||
9 | # |
|
|||
10 | # Distributed under the terms of the Modified BSD License. |
|
8 | # Distributed under the terms of the Modified BSD License. | |
11 | # |
|
|||
12 | # The full license is in the file COPYING.txt, distributed with this software. |
|
|||
13 | #----------------------------------------------------------------------------- |
|
|||
14 |
|
||||
15 | #----------------------------------------------------------------------------- |
|
|||
16 | # Imports |
|
|||
17 | #----------------------------------------------------------------------------- |
|
|||
18 |
|
9 | |||
19 | from __future__ import print_function, absolute_import |
|
10 | from __future__ import print_function, absolute_import | |
20 |
|
11 | |||
21 | import re |
|
12 | import re | |
22 |
|
13 | |||
23 | # Our own imports |
|
14 | # Our own imports | |
24 | from .base import Preprocessor |
|
15 | from .base import Preprocessor | |
25 | from IPython.utils.traitlets import Dict |
|
16 | from IPython.utils.traitlets import Dict | |
26 |
|
17 | |||
27 | #----------------------------------------------------------------------------- |
|
|||
28 | # Classes |
|
|||
29 | #----------------------------------------------------------------------------- |
|
|||
30 |
|
||||
31 |
|
18 | |||
32 | class HighlightMagicsPreprocessor(Preprocessor): |
|
19 | class HighlightMagicsPreprocessor(Preprocessor): | |
33 | """ |
|
20 | """ | |
34 | Detects and tags code cells that use a different languages than Python. |
|
21 | Detects and tags code cells that use a different languages than Python. | |
35 | """ |
|
22 | """ | |
36 |
|
23 | |||
37 | # list of magic language extensions and their associated pygment lexers |
|
24 | # list of magic language extensions and their associated pygment lexers | |
38 | default_languages = Dict( |
|
25 | default_languages = Dict( | |
39 | default_value={ |
|
26 | default_value={ | |
40 | '%%R': 'r', |
|
27 | '%%R': 'r', | |
41 | '%%bash': 'bash', |
|
28 | '%%bash': 'bash', | |
42 | '%%cython': 'cython', |
|
29 | '%%cython': 'cython', | |
43 | '%%javascript': 'javascript', |
|
30 | '%%javascript': 'javascript', | |
44 | '%%julia': 'julia', |
|
31 | '%%julia': 'julia', | |
45 | '%%latex': 'latex', |
|
32 | '%%latex': 'latex', | |
46 | '%%octave': 'octave', |
|
33 | '%%octave': 'octave', | |
47 | '%%perl': 'perl', |
|
34 | '%%perl': 'perl', | |
48 | '%%ruby': 'ruby', |
|
35 | '%%ruby': 'ruby', | |
49 | '%%sh': 'sh'}) |
|
36 | '%%sh': 'sh'}) | |
50 |
|
37 | |||
51 | # user defined language extensions |
|
38 | # user defined language extensions | |
52 | languages = Dict( |
|
39 | languages = Dict( | |
53 | config=True, |
|
40 | config=True, | |
54 | help=("Syntax highlighting for magic's extension languages. " |
|
41 | help=("Syntax highlighting for magic's extension languages. " | |
55 | "Each item associates a language magic extension such as %%R, " |
|
42 | "Each item associates a language magic extension such as %%R, " | |
56 | "with a pygments lexer such as r.")) |
|
43 | "with a pygments lexer such as r.")) | |
57 |
|
44 | |||
58 | def __init__(self, config=None, **kw): |
|
45 | def __init__(self, config=None, **kw): | |
59 | """Public constructor""" |
|
46 | """Public constructor""" | |
60 |
|
47 | |||
61 | super(HighlightMagicsPreprocessor, self).__init__(config=config, **kw) |
|
48 | super(HighlightMagicsPreprocessor, self).__init__(config=config, **kw) | |
62 |
|
49 | |||
63 | # Update the default languages dict with the user configured ones |
|
50 | # Update the default languages dict with the user configured ones | |
64 | self.default_languages.update(self.languages) |
|
51 | self.default_languages.update(self.languages) | |
65 |
|
52 | |||
66 | # build a regular expression to catch language extensions and choose |
|
53 | # build a regular expression to catch language extensions and choose | |
67 | # an adequate pygments lexer |
|
54 | # an adequate pygments lexer | |
68 | any_language = "|".join(self.default_languages.keys()) |
|
55 | any_language = "|".join(self.default_languages.keys()) | |
69 | self.re_magic_language = re.compile( |
|
56 | self.re_magic_language = re.compile( | |
70 | r'^\s*({0})\s+'.format(any_language)) |
|
57 | r'^\s*({0})\s+'.format(any_language)) | |
71 |
|
58 | |||
72 | def which_magic_language(self, source): |
|
59 | def which_magic_language(self, source): | |
73 | """ |
|
60 | """ | |
74 | When a cell uses another language through a magic extension, |
|
61 | When a cell uses another language through a magic extension, | |
75 | the other language is returned. |
|
62 | the other language is returned. | |
76 | If no language magic is detected, this function returns None. |
|
63 | If no language magic is detected, this function returns None. | |
77 |
|
64 | |||
78 | Parameters |
|
65 | Parameters | |
79 | ---------- |
|
66 | ---------- | |
80 | source: str |
|
67 | source: str | |
81 | Source code of the cell to highlight |
|
68 | Source code of the cell to highlight | |
82 | """ |
|
69 | """ | |
83 |
|
70 | |||
84 | m = self.re_magic_language.match(source) |
|
71 | m = self.re_magic_language.match(source) | |
85 |
|
72 | |||
86 | if m: |
|
73 | if m: | |
87 | # By construction of the re, the matched language must be in the |
|
74 | # By construction of the re, the matched language must be in the | |
88 | # languages dictionary |
|
75 | # languages dictionary | |
89 | return self.default_languages[m.group(1)] |
|
76 | return self.default_languages[m.group(1)] | |
90 | else: |
|
77 | else: | |
91 | return None |
|
78 | return None | |
92 |
|
79 | |||
93 | def preprocess_cell(self, cell, resources, cell_index): |
|
80 | def preprocess_cell(self, cell, resources, cell_index): | |
94 | """ |
|
81 | """ | |
95 | Tags cells using a magic extension language |
|
82 | Tags cells using a magic extension language | |
96 |
|
83 | |||
97 | Parameters |
|
84 | Parameters | |
98 | ---------- |
|
85 | ---------- | |
99 | cell : NotebookNode cell |
|
86 | cell : NotebookNode cell | |
100 | Notebook cell being processed |
|
87 | Notebook cell being processed | |
101 | resources : dictionary |
|
88 | resources : dictionary | |
102 | Additional resources used in the conversion process. Allows |
|
89 | Additional resources used in the conversion process. Allows | |
103 | preprocessors to pass variables into the Jinja engine. |
|
90 | preprocessors to pass variables into the Jinja engine. | |
104 | cell_index : int |
|
91 | cell_index : int | |
105 | Index of the cell being processed (see base.py) |
|
92 | Index of the cell being processed (see base.py) | |
106 | """ |
|
93 | """ | |
107 |
|
94 | |||
108 | # Only tag code cells |
|
95 | # Only tag code cells | |
109 |
if |
|
96 | if cell.cell_type == "code": | |
110 |
magic_language = self.which_magic_language(cell. |
|
97 | magic_language = self.which_magic_language(cell.source) | |
111 | if magic_language: |
|
98 | if magic_language: | |
112 | cell['metadata']['magics_language'] = magic_language |
|
99 | cell['metadata']['magics_language'] = magic_language | |
113 | return cell, resources |
|
100 | return cell, resources |
@@ -1,75 +1,62 b'' | |||||
1 | """Module that pre-processes the notebook for export via Reveal. |
|
1 | """Module that pre-processes the notebook for export via Reveal.""" | |
2 | """ |
|
|||
3 | #----------------------------------------------------------------------------- |
|
|||
4 | # Copyright (c) 2013, the IPython Development Team. |
|
|||
5 | # |
|
|||
6 | # Distributed under the terms of the Modified BSD License. |
|
|||
7 | # |
|
|||
8 | # The full license is in the file COPYING.txt, distributed with this software. |
|
|||
9 | #----------------------------------------------------------------------------- |
|
|||
10 |
|
2 | |||
11 | #----------------------------------------------------------------------------- |
|
3 | # Copyright (c) IPython Development Team. | |
12 | # Imports |
|
4 | # Distributed under the terms of the Modified BSD License. | |
13 | #----------------------------------------------------------------------------- |
|
|||
14 |
|
5 | |||
15 | from .base import Preprocessor |
|
6 | from .base import Preprocessor | |
16 | from IPython.utils.traitlets import Unicode |
|
7 | from IPython.utils.traitlets import Unicode | |
17 |
|
8 | |||
18 | #----------------------------------------------------------------------------- |
|
|||
19 | # Classes and functions |
|
|||
20 | #----------------------------------------------------------------------------- |
|
|||
21 |
|
9 | |||
22 | class RevealHelpPreprocessor(Preprocessor): |
|
10 | class RevealHelpPreprocessor(Preprocessor): | |
23 |
|
11 | |||
24 | url_prefix = Unicode('reveal.js', config=True, |
|
12 | url_prefix = Unicode('reveal.js', config=True, | |
25 | help="""The URL prefix for reveal.js. |
|
13 | help="""The URL prefix for reveal.js. | |
26 | This can be a a relative URL for a local copy of reveal.js, |
|
14 | This can be a a relative URL for a local copy of reveal.js, | |
27 | or point to a CDN. |
|
15 | or point to a CDN. | |
28 |
|
16 | |||
29 | For speaker notes to work, a local reveal.js prefix must be used. |
|
17 | For speaker notes to work, a local reveal.js prefix must be used. | |
30 | """ |
|
18 | """ | |
31 | ) |
|
19 | ) | |
32 |
|
20 | |||
33 | def preprocess(self, nb, resources): |
|
21 | def preprocess(self, nb, resources): | |
34 | """ |
|
22 | """ | |
35 | Called once to 'preprocess' contents of the notebook. |
|
23 | Called once to 'preprocess' contents of the notebook. | |
36 |
|
24 | |||
37 | Parameters |
|
25 | Parameters | |
38 | ---------- |
|
26 | ---------- | |
39 | nb : NotebookNode |
|
27 | nb : NotebookNode | |
40 | Notebook being converted |
|
28 | Notebook being converted | |
41 | resources : dictionary |
|
29 | resources : dictionary | |
42 | Additional resources used in the conversion process. Allows |
|
30 | Additional resources used in the conversion process. Allows | |
43 | preprocessors to pass variables into the Jinja engine. |
|
31 | preprocessors to pass variables into the Jinja engine. | |
44 | """ |
|
32 | """ | |
45 |
|
33 | |||
46 | for worksheet in nb.worksheets: |
|
34 | for index, cell in enumerate(nb.cells): | |
47 | for index, cell in enumerate(worksheet.cells): |
|
35 | ||
48 |
|
36 | #Make sure the cell has slideshow metadata. | ||
49 | #Make sure the cell has slideshow metadata. |
|
37 | cell.metadata.slide_type = cell.get('metadata', {}).get('slideshow', {}).get('slide_type', '-') | |
50 | cell.metadata.slide_type = cell.get('metadata', {}).get('slideshow', {}).get('slide_type', '-') |
|
38 | ||
51 |
|
39 | # Get the slide type. If type is start, subslide, or slide, | ||
52 |
|
|
40 | # end the last subslide/slide. | |
53 | #end the last subslide/slide. |
|
41 | if cell.metadata.slide_type in ['slide']: | |
54 |
|
|
42 | nb.cells[index - 1].metadata.slide_helper = 'slide_end' | |
55 |
|
|
43 | if cell.metadata.slide_type in ['subslide']: | |
56 |
|
|
44 | nb.cells[index - 1].metadata.slide_helper = 'subslide_end' | |
57 | worksheet.cells[index - 1].metadata.slide_helper = 'subslide_end' |
|
45 | # Prevent the rendering of "do nothing" cells before fragments | |
58 | #Prevent the rendering of "do nothing" cells before fragments |
|
46 | # Group fragments passing frag_number to the data-fragment-index | |
59 | #Group fragments passing frag_number to the data-fragment-index |
|
47 | if cell.metadata.slide_type in ['fragment']: | |
60 |
|
|
48 | nb.cells[index].metadata.frag_number = index | |
61 | worksheet.cells[index].metadata.frag_number = index |
|
49 | i = 1 | |
62 | i = 1 |
|
50 | while i < len(nb.cells) - index: | |
63 | while i < len(worksheet.cells) - index: |
|
51 | nb.cells[index + i].metadata.frag_helper = 'fragment_end' | |
64 |
|
|
52 | nb.cells[index + i].metadata.frag_number = index | |
65 | worksheet.cells[index + i].metadata.frag_number = index |
|
53 | i += 1 | |
66 | i += 1 |
|
54 | # Restart the slide_helper when the cell status is changed | |
67 | #Restart the slide_helper when the cell status is changed |
|
55 | # to other types. | |
68 | #to other types. |
|
56 | if cell.metadata.slide_type in ['-', 'skip', 'notes', 'fragment']: | |
69 | if cell.metadata.slide_type in ['-', 'skip', 'notes', 'fragment']: |
|
57 | nb.cells[index - 1].metadata.slide_helper = '-' | |
70 | worksheet.cells[index - 1].metadata.slide_helper = '-' |
|
|||
71 |
|
58 | |||
72 | if not isinstance(resources['reveal'], dict): |
|
59 | if not isinstance(resources['reveal'], dict): | |
73 | resources['reveal'] = {} |
|
60 | resources['reveal'] = {} | |
74 | resources['reveal']['url_prefix'] = self.url_prefix |
|
61 | resources['reveal']['url_prefix'] = self.url_prefix | |
75 | return nb, resources |
|
62 | return nb, resources |
@@ -1,56 +1,41 b'' | |||||
1 | """ |
|
1 | """utility functions for preprocessor tests""" | |
2 | Module with utility functions for preprocessor tests |
|
|||
3 | """ |
|
|||
4 |
|
2 | |||
5 | #----------------------------------------------------------------------------- |
|
3 | # Copyright (c) IPython Development Team. | |
6 | # Copyright (c) 2013, the IPython Development Team. |
|
|||
7 | # |
|
|||
8 | # Distributed under the terms of the Modified BSD License. |
|
4 | # Distributed under the terms of the Modified BSD License. | |
9 | # |
|
|||
10 | # The full license is in the file COPYING.txt, distributed with this software. |
|
|||
11 | #----------------------------------------------------------------------------- |
|
|||
12 |
|
||||
13 | #----------------------------------------------------------------------------- |
|
|||
14 | # Imports |
|
|||
15 | #----------------------------------------------------------------------------- |
|
|||
16 |
|
5 | |||
17 | from IPython.nbformat import current as nbformat |
|
6 | from IPython.nbformat import current as nbformat | |
18 |
|
7 | |||
19 | from ...tests.base import TestsBase |
|
8 | from ...tests.base import TestsBase | |
20 | from ...exporters.exporter import ResourcesDict |
|
9 | from ...exporters.exporter import ResourcesDict | |
21 |
|
10 | |||
22 | #----------------------------------------------------------------------------- |
|
|||
23 | # Class |
|
|||
24 | #----------------------------------------------------------------------------- |
|
|||
25 |
|
11 | |||
26 | class PreprocessorTestsBase(TestsBase): |
|
12 | class PreprocessorTestsBase(TestsBase): | |
27 | """Contains test functions preprocessor tests""" |
|
13 | """Contains test functions preprocessor tests""" | |
28 |
|
14 | |||
29 |
|
15 | |||
30 | def build_notebook(self): |
|
16 | def build_notebook(self): | |
31 | """Build a notebook in memory for use with preprocessor tests""" |
|
17 | """Build a notebook in memory for use with preprocessor tests""" | |
32 |
|
18 | |||
33 |
outputs = [nbformat.new_output(output_type="stream", |
|
19 | outputs = [nbformat.new_output(output_type="stream", name="stdout", text="a"), | |
34 |
nbformat.new_output(output_type=" |
|
20 | nbformat.new_output(output_type="display_data", mime_bundle={'text/plain': 'b'}), | |
35 |
nbformat.new_output(output_type="stream", |
|
21 | nbformat.new_output(output_type="stream", name="stdout", text="c"), | |
36 |
nbformat.new_output(output_type="stream", |
|
22 | nbformat.new_output(output_type="stream", name="stdout", text="d"), | |
37 |
nbformat.new_output(output_type="stream", |
|
23 | nbformat.new_output(output_type="stream", name="stderr", text="e"), | |
38 |
nbformat.new_output(output_type="stream", |
|
24 | nbformat.new_output(output_type="stream", name="stderr", text="f"), | |
39 |
nbformat.new_output(output_type=" |
|
25 | nbformat.new_output(output_type="display_data", mime_bundle={'image/png': 'Zw=='})] # g | |
40 |
out = nbformat.new_output(output_type=" |
|
26 | out = nbformat.new_output(output_type="display_data") | |
41 |
out['application/pdf'] = 'aA==' |
|
27 | out['application/pdf'] = 'aA==' | |
42 | outputs.append(out) |
|
28 | outputs.append(out) | |
43 |
|
29 | |||
44 |
cells=[nbformat.new_code_cell( |
|
30 | cells=[nbformat.new_code_cell(source="$ e $", prompt_number=1, outputs=outputs), | |
45 |
nbformat.new_ |
|
31 | nbformat.new_markdown_cell(source="$ e $")] | |
46 | worksheets = [nbformat.new_worksheet(cells=cells)] |
|
|||
47 |
|
32 | |||
48 |
return nbformat.new_notebook( |
|
33 | return nbformat.new_notebook(cells=cells) | |
49 |
|
34 | |||
50 |
|
35 | |||
51 | def build_resources(self): |
|
36 | def build_resources(self): | |
52 | """Build an empty resources dictionary.""" |
|
37 | """Build an empty resources dictionary.""" | |
53 |
|
38 | |||
54 | res = ResourcesDict() |
|
39 | res = ResourcesDict() | |
55 | res['metadata'] = ResourcesDict() |
|
40 | res['metadata'] = ResourcesDict() | |
56 | return res |
|
41 | return res |
@@ -1,46 +1,38 b'' | |||||
1 | { |
|
1 | { | |
2 | "metadata": { |
|
2 | "cells": [ | |
3 | "name": "" |
|
|||
4 | }, |
|
|||
5 | "nbformat": 3, |
|
|||
6 | "nbformat_minor": 0, |
|
|||
7 | "worksheets": [ |
|
|||
8 | { |
|
3 | { | |
9 |
"cell |
|
4 | "cell_type": "code", | |
10 | { |
|
5 | "metadata": { | |
11 | "cell_type": "code", |
|
6 | "collapsed": false | |
12 | "collapsed": false, |
|
7 | }, | |
13 |
|
|
8 | "outputs": [], | |
14 | "from IPython.display import clear_output" |
|
9 | "prompt_number": 1, | |
15 | ], |
|
10 | "source": [ | |
16 | "language": "python", |
|
11 | "from IPython.display import clear_output" | |
17 | "metadata": {}, |
|
12 | ] | |
18 | "outputs": [], |
|
13 | }, | |
19 | "prompt_number": 1 |
|
14 | { | |
20 | }, |
|
15 | "cell_type": "code", | |
|
16 | "metadata": { | |||
|
17 | "collapsed": false | |||
|
18 | }, | |||
|
19 | "outputs": [ | |||
21 | { |
|
20 | { | |
22 | "cell_type": "code", |
|
|||
23 | "collapsed": false, |
|
|||
24 | "input": [ |
|
|||
25 | "for i in range(10):\n", |
|
|||
26 | " clear_output()\n", |
|
|||
27 | " print(i)" |
|
|||
28 | ], |
|
|||
29 | "language": "python", |
|
|||
30 | "metadata": {}, |
|
21 | "metadata": {}, | |
31 | "outputs": [ |
|
22 | "name": "stdout", | |
32 | { |
|
23 | "output_type": "stream", | |
33 | "output_type": "stream", |
|
24 | "text": "9\n" | |
34 | "stream": "stdout", |
|
|||
35 | "text": [ |
|
|||
36 | "9\n" |
|
|||
37 | ] |
|
|||
38 | } |
|
|||
39 | ], |
|
|||
40 | "prompt_number": 2 |
|
|||
41 | } |
|
25 | } | |
42 | ], |
|
26 | ], | |
43 | "metadata": {} |
|
27 | "prompt_number": 2, | |
|
28 | "source": [ | |||
|
29 | "for i in range(10):\n", | |||
|
30 | " clear_output()\n", | |||
|
31 | " print(i)" | |||
|
32 | ] | |||
44 | } |
|
33 | } | |
45 | ] |
|
34 | ], | |
|
35 | "metadata": {}, | |||
|
36 | "nbformat": 4, | |||
|
37 | "nbformat_minor": 0 | |||
46 | } No newline at end of file |
|
38 | } |
@@ -1,55 +1,38 b'' | |||||
1 | { |
|
1 | { | |
2 | "metadata": { |
|
2 | "cells": [ | |
3 | "name": "" |
|
|||
4 | }, |
|
|||
5 | "nbformat": 3, |
|
|||
6 | "nbformat_minor": 0, |
|
|||
7 | "worksheets": [ |
|
|||
8 | { |
|
3 | { | |
9 |
"cell |
|
4 | "cell_type": "code", | |
10 | { |
|
5 | "metadata": { | |
11 | "cell_type": "code", |
|
6 | "collapsed": false | |
12 | "collapsed": false, |
|
7 | }, | |
13 |
|
|
8 | "outputs": [], | |
14 | "i, j = 1, 1" |
|
9 | "prompt_number": 1, | |
15 | ], |
|
10 | "source": [ | |
16 | "language": "python", |
|
11 | "i, j = 1, 1" | |
17 | "metadata": {}, |
|
12 | ] | |
18 | "outputs": [], |
|
13 | }, | |
19 | "prompt_number": 1 |
|
14 | { | |
20 | }, |
|
15 | "cell_type": "code", | |
|
16 | "metadata": { | |||
|
17 | "collapsed": false | |||
|
18 | }, | |||
|
19 | "outputs": [ | |||
21 | { |
|
20 | { | |
22 | "cell_type": "code", |
|
|||
23 | "collapsed": false, |
|
|||
24 | "input": [ |
|
|||
25 | "for m in range(10):\n", |
|
|||
26 | " i, j = j, i + j\n", |
|
|||
27 | " print(j)" |
|
|||
28 | ], |
|
|||
29 | "language": "python", |
|
|||
30 | "metadata": {}, |
|
21 | "metadata": {}, | |
31 | "outputs": [ |
|
22 | "name": "stdout", | |
32 | { |
|
23 | "output_type": "stream", | |
33 | "output_type": "stream", |
|
24 | "text": "2\n3\n5\n8\n13\n21\n34\n55\n89\n144\n" | |
34 | "stream": "stdout", |
|
|||
35 | "text": [ |
|
|||
36 | "2\n", |
|
|||
37 | "3\n", |
|
|||
38 | "5\n", |
|
|||
39 | "8\n", |
|
|||
40 | "13\n", |
|
|||
41 | "21\n", |
|
|||
42 | "34\n", |
|
|||
43 | "55\n", |
|
|||
44 | "89\n", |
|
|||
45 | "144\n" |
|
|||
46 | ] |
|
|||
47 | } |
|
|||
48 | ], |
|
|||
49 | "prompt_number": 2 |
|
|||
50 | } |
|
25 | } | |
51 | ], |
|
26 | ], | |
52 | "metadata": {} |
|
27 | "prompt_number": 2, | |
|
28 | "source": [ | |||
|
29 | "for m in range(10):\n", | |||
|
30 | " i, j = j, i + j\n", | |||
|
31 | " print(j)" | |||
|
32 | ] | |||
53 | } |
|
33 | } | |
54 | ] |
|
34 | ], | |
|
35 | "metadata": {}, | |||
|
36 | "nbformat": 4, | |||
|
37 | "nbformat_minor": 0 | |||
55 | } No newline at end of file |
|
38 | } |
@@ -1,33 +1,25 b'' | |||||
1 | { |
|
1 | { | |
2 | "metadata": { |
|
2 | "cells": [ | |
3 | "name": "" |
|
|||
4 | }, |
|
|||
5 | "nbformat": 3, |
|
|||
6 | "nbformat_minor": 0, |
|
|||
7 | "worksheets": [ |
|
|||
8 | { |
|
3 | { | |
9 |
"cell |
|
4 | "cell_type": "code", | |
|
5 | "metadata": { | |||
|
6 | "collapsed": false | |||
|
7 | }, | |||
|
8 | "outputs": [ | |||
10 | { |
|
9 | { | |
11 | "cell_type": "code", |
|
|||
12 | "collapsed": false, |
|
|||
13 | "input": [ |
|
|||
14 | "print(\"Hello World\")" |
|
|||
15 | ], |
|
|||
16 | "language": "python", |
|
|||
17 | "metadata": {}, |
|
10 | "metadata": {}, | |
18 | "outputs": [ |
|
11 | "name": "stdout", | |
19 | { |
|
12 | "output_type": "stream", | |
20 | "output_type": "stream", |
|
13 | "text": "Hello World\n" | |
21 | "stream": "stdout", |
|
|||
22 | "text": [ |
|
|||
23 | "Hello World\n" |
|
|||
24 | ] |
|
|||
25 | } |
|
|||
26 | ], |
|
|||
27 | "prompt_number": 1 |
|
|||
28 | } |
|
14 | } | |
29 | ], |
|
15 | ], | |
30 | "metadata": {} |
|
16 | "prompt_number": 1, | |
|
17 | "source": [ | |||
|
18 | "print(\"Hello World\")" | |||
|
19 | ] | |||
31 | } |
|
20 | } | |
32 | ] |
|
21 | ], | |
|
22 | "metadata": {}, | |||
|
23 | "nbformat": 4, | |||
|
24 | "nbformat_minor": 0 | |||
33 | } No newline at end of file |
|
25 | } |
@@ -1,36 +1,29 b'' | |||||
1 | { |
|
1 | { | |
2 | "metadata": { |
|
2 | "cells": [ | |
3 | "name": "" |
|
|||
4 | }, |
|
|||
5 | "nbformat": 3, |
|
|||
6 | "nbformat_minor": 0, |
|
|||
7 | "worksheets": [ |
|
|||
8 | { |
|
3 | { | |
9 |
"cell |
|
4 | "cell_type": "code", | |
10 | { |
|
5 | "metadata": { | |
11 | "cell_type": "code", |
|
6 | "collapsed": false | |
12 | "collapsed": false, |
|
7 | }, | |
13 |
|
|
8 | "outputs": [], | |
14 | "from IPython.display import Image" |
|
9 | "prompt_number": 1, | |
15 | ], |
|
10 | "source": [ | |
16 | "language": "python", |
|
11 | "from IPython.display import Image" | |
17 | "metadata": {}, |
|
12 | ] | |
18 | "outputs": [], |
|
13 | }, | |
19 | "prompt_number": 1 |
|
14 | { | |
20 | }, |
|
15 | "cell_type": "code", | |
21 | { |
|
16 | "metadata": { | |
22 | "cell_type": "code", |
|
17 | "collapsed": false | |
23 | "collapsed": false, |
|
18 | }, | |
24 |
|
|
19 | "outputs": [], | |
25 | "Image('../input/python.png');" |
|
20 | "prompt_number": 2, | |
26 | ], |
|
21 | "source": [ | |
27 | "language": "python", |
|
22 | "Image('../input/python.png');" | |
28 | "metadata": {}, |
|
23 | ] | |
29 | "outputs": [], |
|
|||
30 | "prompt_number": 2 |
|
|||
31 | } |
|
|||
32 | ], |
|
|||
33 | "metadata": {} |
|
|||
34 | } |
|
24 | } | |
35 | ] |
|
25 | ], | |
|
26 | "metadata": {}, | |||
|
27 | "nbformat": 4, | |||
|
28 | "nbformat_minor": 0 | |||
36 | } No newline at end of file |
|
29 | } |
@@ -1,53 +1,46 b'' | |||||
1 | { |
|
1 | { | |
2 | "metadata": { |
|
2 | "cells": [ | |
3 | "name": "" |
|
|||
4 | }, |
|
|||
5 | "nbformat": 3, |
|
|||
6 | "nbformat_minor": 0, |
|
|||
7 | "worksheets": [ |
|
|||
8 | { |
|
3 | { | |
9 |
"cell |
|
4 | "cell_type": "code", | |
10 | { |
|
5 | "metadata": { | |
11 | "cell_type": "code", |
|
6 | "collapsed": false | |
12 | "collapsed": false, |
|
7 | }, | |
13 |
|
|
8 | "outputs": [], | |
14 | "from IPython.display import SVG" |
|
9 | "prompt_number": 1, | |
15 | ], |
|
10 | "source": [ | |
16 | "language": "python", |
|
11 | "from IPython.display import SVG" | |
17 | "metadata": {}, |
|
12 | ] | |
18 | "outputs": [], |
|
13 | }, | |
19 | "prompt_number": 1 |
|
14 | { | |
20 | }, |
|
15 | "cell_type": "code", | |
|
16 | "metadata": { | |||
|
17 | "collapsed": false | |||
|
18 | }, | |||
|
19 | "outputs": [ | |||
21 | { |
|
20 | { | |
22 | "cell_type": "code", |
|
21 | "image/svg+xml": [ | |
23 | "collapsed": false, |
|
|||
24 | "input": [ |
|
|||
25 | "SVG(data='''\n", |
|
|||
26 | "<svg height=\"100\" width=\"100\">\n", |
|
22 | "<svg height=\"100\" width=\"100\">\n", | |
27 |
" <circle cx=\"50\" cy=\"50\" r=\"40\" stroke=\"black\" stroke-width=\"2\" |
|
23 | " <circle cx=\"50\" cy=\"50\" fill=\"red\" r=\"40\" stroke=\"black\" stroke-width=\"2\"/>\n", | |
28 |
"</svg> |
|
24 | "</svg>" | |
29 | ], |
|
25 | ], | |
30 | "language": "python", |
|
|||
31 | "metadata": {}, |
|
26 | "metadata": {}, | |
32 | "outputs": [ |
|
27 | "output_type": "execute_result", | |
33 | { |
|
28 | "prompt_number": 2, | |
34 | "metadata": {}, |
|
29 | "text/plain": [ | |
35 | "output_type": "pyout", |
|
30 | "<IPython.core.display.SVG object>" | |
36 | "prompt_number": 2, |
|
31 | ] | |
37 | "svg": [ |
|
|||
38 | "<svg height=\"100\" width=\"100\">\n", |
|
|||
39 | " <circle cx=\"50\" cy=\"50\" fill=\"red\" r=\"40\" stroke=\"black\" stroke-width=\"2\"/>\n", |
|
|||
40 | "</svg>" |
|
|||
41 | ], |
|
|||
42 | "text": [ |
|
|||
43 | "<IPython.core.display.SVG at 0x10428e150>" |
|
|||
44 | ] |
|
|||
45 | } |
|
|||
46 | ], |
|
|||
47 | "prompt_number": 2 |
|
|||
48 | } |
|
32 | } | |
49 | ], |
|
33 | ], | |
50 | "metadata": {} |
|
34 | "prompt_number": 2, | |
|
35 | "source": [ | |||
|
36 | "SVG(data='''\n", | |||
|
37 | "<svg height=\"100\" width=\"100\">\n", | |||
|
38 | " <circle cx=\"50\" cy=\"50\" r=\"40\" stroke=\"black\" stroke-width=\"2\" fill=\"red\" />\n", | |||
|
39 | "</svg>''')" | |||
|
40 | ] | |||
51 | } |
|
41 | } | |
52 | ] |
|
42 | ], | |
|
43 | "metadata": {}, | |||
|
44 | "nbformat": 4, | |||
|
45 | "nbformat_minor": 0 | |||
53 | } No newline at end of file |
|
46 | } |
@@ -1,57 +1,51 b'' | |||||
1 | { |
|
1 | { | |
2 | "metadata": { |
|
2 | "cells": [ | |
3 | "name": "", |
|
|||
4 | "signature": "sha256:9d47889f0678e9685429071216d0f3354db59bb66489f3225bcadfb6a1a9bbba" |
|
|||
5 | }, |
|
|||
6 | "nbformat": 3, |
|
|||
7 | "nbformat_minor": 0, |
|
|||
8 | "worksheets": [ |
|
|||
9 | { |
|
3 | { | |
10 |
"cell |
|
4 | "cell_type": "code", | |
|
5 | "metadata": { | |||
|
6 | "collapsed": false | |||
|
7 | }, | |||
|
8 | "outputs": [ | |||
11 | { |
|
9 | { | |
12 |
" |
|
10 | "ename": "Exception", | |
13 | "collapsed": false, |
|
11 | "evalue": "message", | |
14 | "input": [ |
|
|||
15 | "raise Exception(\"message\")" |
|
|||
16 | ], |
|
|||
17 | "language": "python", |
|
|||
18 | "metadata": {}, |
|
12 | "metadata": {}, | |
19 |
"output |
|
13 | "output_type": "error", | |
20 | { |
|
14 | "traceback": [ | |
21 | "ename": "Exception", |
|
15 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", | |
22 | "evalue": "message", |
|
16 | "\u001b[1;31mException\u001b[0m Traceback (most recent call last)", | |
23 | "output_type": "pyerr", |
|
17 | "\u001b[1;32m<ipython-input-1-335814d14fc1>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mException\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"message\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", | |
24 | "traceback": [ |
|
18 | "\u001b[1;31mException\u001b[0m: message" | |
25 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", |
|
19 | ] | |
26 | "\u001b[1;31mException\u001b[0m Traceback (most recent call last)", |
|
20 | } | |
27 | "\u001b[1;32m<ipython-input-1-335814d14fc1>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mException\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"message\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", |
|
21 | ], | |
28 | "\u001b[1;31mException\u001b[0m: message" |
|
22 | "prompt_number": 1, | |
29 | ] |
|
23 | "source": [ | |
30 | } |
|
24 | "raise Exception(\"message\")" | |
31 |
|
|
25 | ] | |
32 | "prompt_number": 1 |
|
26 | }, | |
33 | }, |
|
27 | { | |
|
28 | "cell_type": "code", | |||
|
29 | "metadata": { | |||
|
30 | "collapsed": false | |||
|
31 | }, | |||
|
32 | "outputs": [ | |||
34 | { |
|
33 | { | |
35 | "cell_type": "code", |
|
|||
36 | "collapsed": false, |
|
|||
37 | "input": [ |
|
|||
38 | "print('ok')" |
|
|||
39 | ], |
|
|||
40 | "language": "python", |
|
|||
41 | "metadata": {}, |
|
34 | "metadata": {}, | |
42 | "outputs": [ |
|
35 | "name": "stdout", | |
43 | { |
|
36 | "output_type": "stream", | |
44 | "output_type": "stream", |
|
37 | "text": "ok\n" | |
45 | "stream": "stdout", |
|
|||
46 | "text": [ |
|
|||
47 | "ok\n" |
|
|||
48 | ] |
|
|||
49 | } |
|
|||
50 | ], |
|
|||
51 | "prompt_number": 2 |
|
|||
52 | } |
|
38 | } | |
53 | ], |
|
39 | ], | |
54 | "metadata": {} |
|
40 | "prompt_number": 2, | |
|
41 | "source": [ | |||
|
42 | "print('ok')" | |||
|
43 | ] | |||
55 | } |
|
44 | } | |
56 | ] |
|
45 | ], | |
|
46 | "metadata": { | |||
|
47 | "signature": "sha256:9d47889f0678e9685429071216d0f3354db59bb66489f3225bcadfb6a1a9bbba" | |||
|
48 | }, | |||
|
49 | "nbformat": 4, | |||
|
50 | "nbformat_minor": 0 | |||
57 | } No newline at end of file |
|
51 | } |
@@ -1,33 +1,25 b'' | |||||
1 | { |
|
1 | { | |
2 | "metadata": { |
|
2 | "cells": [ | |
3 | "name": "" |
|
|||
4 | }, |
|
|||
5 | "nbformat": 3, |
|
|||
6 | "nbformat_minor": 0, |
|
|||
7 | "worksheets": [ |
|
|||
8 | { |
|
3 | { | |
9 |
"cell |
|
4 | "cell_type": "code", | |
|
5 | "metadata": { | |||
|
6 | "collapsed": false | |||
|
7 | }, | |||
|
8 | "outputs": [ | |||
10 | { |
|
9 | { | |
11 | "cell_type": "code", |
|
|||
12 | "collapsed": false, |
|
|||
13 | "input": [ |
|
|||
14 | "print('\u2603')" |
|
|||
15 | ], |
|
|||
16 | "language": "python", |
|
|||
17 | "metadata": {}, |
|
10 | "metadata": {}, | |
18 | "outputs": [ |
|
11 | "name": "stdout", | |
19 | { |
|
12 | "output_type": "stream", | |
20 | "output_type": "stream", |
|
13 | "text": "\u2603\n" | |
21 | "stream": "stdout", |
|
|||
22 | "text": [ |
|
|||
23 | "\u2603\n" |
|
|||
24 | ] |
|
|||
25 | } |
|
|||
26 | ], |
|
|||
27 | "prompt_number": 1 |
|
|||
28 | } |
|
14 | } | |
29 | ], |
|
15 | ], | |
30 | "metadata": {} |
|
16 | "prompt_number": 1, | |
|
17 | "source": [ | |||
|
18 | "print('\u2603')" | |||
|
19 | ] | |||
31 | } |
|
20 | } | |
32 | ] |
|
21 | ], | |
|
22 | "metadata": {}, | |||
|
23 | "nbformat": 4, | |||
|
24 | "nbformat_minor": 0 | |||
33 | } No newline at end of file |
|
25 | } |
@@ -1,42 +1,35 b'' | |||||
1 | """ |
|
1 | """ | |
2 | Module with tests for the clearoutput preprocessor. |
|
2 | Module with tests for the clearoutput preprocessor. | |
3 | """ |
|
3 | """ | |
4 |
|
4 | |||
5 | # Copyright (c) IPython Development Team. |
|
5 | # Copyright (c) IPython Development Team. | |
6 | # Distributed under the terms of the Modified BSD License. |
|
6 | # Distributed under the terms of the Modified BSD License. | |
7 |
|
7 | |||
8 | #----------------------------------------------------------------------------- |
|
|||
9 | # Imports |
|
|||
10 | #----------------------------------------------------------------------------- |
|
|||
11 | from IPython.nbformat import current as nbformat |
|
8 | from IPython.nbformat import current as nbformat | |
12 |
|
9 | |||
13 | from .base import PreprocessorTestsBase |
|
10 | from .base import PreprocessorTestsBase | |
14 | from ..clearoutput import ClearOutputPreprocessor |
|
11 | from ..clearoutput import ClearOutputPreprocessor | |
15 |
|
12 | |||
16 |
|
13 | |||
17 | #----------------------------------------------------------------------------- |
|
|||
18 | # Class |
|
|||
19 | #----------------------------------------------------------------------------- |
|
|||
20 |
|
||||
21 | class TestClearOutput(PreprocessorTestsBase): |
|
14 | class TestClearOutput(PreprocessorTestsBase): | |
22 | """Contains test functions for clearoutput.py""" |
|
15 | """Contains test functions for clearoutput.py""" | |
23 |
|
16 | |||
24 |
|
17 | |||
25 | def build_preprocessor(self): |
|
18 | def build_preprocessor(self): | |
26 | """Make an instance of a preprocessor""" |
|
19 | """Make an instance of a preprocessor""" | |
27 | preprocessor = ClearOutputPreprocessor() |
|
20 | preprocessor = ClearOutputPreprocessor() | |
28 | preprocessor.enabled = True |
|
21 | preprocessor.enabled = True | |
29 | return preprocessor |
|
22 | return preprocessor | |
30 |
|
23 | |||
31 | def test_constructor(self): |
|
24 | def test_constructor(self): | |
32 | """Can a ClearOutputPreprocessor be constructed?""" |
|
25 | """Can a ClearOutputPreprocessor be constructed?""" | |
33 | self.build_preprocessor() |
|
26 | self.build_preprocessor() | |
34 |
|
27 | |||
35 | def test_output(self): |
|
28 | def test_output(self): | |
36 | """Test the output of the ClearOutputPreprocessor""" |
|
29 | """Test the output of the ClearOutputPreprocessor""" | |
37 | nb = self.build_notebook() |
|
30 | nb = self.build_notebook() | |
38 | res = self.build_resources() |
|
31 | res = self.build_resources() | |
39 | preprocessor = self.build_preprocessor() |
|
32 | preprocessor = self.build_preprocessor() | |
40 | nb, res = preprocessor(nb, res) |
|
33 | nb, res = preprocessor(nb, res) | |
41 |
assert nb |
|
34 | assert nb.cells[0].outputs == [] | |
42 |
assert nb |
|
35 | assert nb.cells[0].prompt_number is None |
@@ -1,60 +1,58 b'' | |||||
1 | """Tests for the coalescestreams preprocessor""" |
|
1 | """Tests for the coalescestreams preprocessor""" | |
2 |
|
2 | |||
3 | # Copyright (c) IPython Development Team. |
|
3 | # Copyright (c) IPython Development Team. | |
4 | # Distributed under the terms of the Modified BSD License. |
|
4 | # Distributed under the terms of the Modified BSD License. | |
5 |
|
5 | |||
6 | from IPython.nbformat import current as nbformat |
|
6 | from IPython.nbformat import current as nbformat | |
7 |
|
7 | |||
8 | from .base import PreprocessorTestsBase |
|
8 | from .base import PreprocessorTestsBase | |
9 | from ..coalescestreams import coalesce_streams |
|
9 | from ..coalescestreams import coalesce_streams | |
10 |
|
10 | |||
11 |
|
11 | |||
12 | class TestCoalesceStreams(PreprocessorTestsBase): |
|
12 | class TestCoalesceStreams(PreprocessorTestsBase): | |
13 | """Contains test functions for coalescestreams.py""" |
|
13 | """Contains test functions for coalescestreams.py""" | |
14 |
|
14 | |||
15 | def test_coalesce_streams(self): |
|
15 | def test_coalesce_streams(self): | |
16 | """coalesce_streams preprocessor output test""" |
|
16 | """coalesce_streams preprocessor output test""" | |
17 | nb = self.build_notebook() |
|
17 | nb = self.build_notebook() | |
18 | res = self.build_resources() |
|
18 | res = self.build_resources() | |
19 | nb, res = coalesce_streams(nb, res) |
|
19 | nb, res = coalesce_streams(nb, res) | |
20 |
outputs = nb. |
|
20 | outputs = nb.cells[0].outputs | |
21 | self.assertEqual(outputs[0].text, "a") |
|
21 | self.assertEqual(outputs[0].text, "a") | |
22 |
self.assertEqual(outputs[1].output_type, " |
|
22 | self.assertEqual(outputs[1].output_type, "display_data") | |
23 | self.assertEqual(outputs[2].text, "cd") |
|
23 | self.assertEqual(outputs[2].text, "cd") | |
24 | self.assertEqual(outputs[3].text, "ef") |
|
24 | self.assertEqual(outputs[3].text, "ef") | |
25 |
|
25 | |||
26 | def test_coalesce_sequenced_streams(self): |
|
26 | def test_coalesce_sequenced_streams(self): | |
27 | """Can the coalesce streams preprocessor merge a sequence of streams?""" |
|
27 | """Can the coalesce streams preprocessor merge a sequence of streams?""" | |
28 |
outputs = [nbformat.new_output(output_type="stream", |
|
28 | outputs = [nbformat.new_output(output_type="stream", name="stdout", text="0"), | |
29 |
nbformat.new_output(output_type="stream", |
|
29 | nbformat.new_output(output_type="stream", name="stdout", text="1"), | |
30 |
nbformat.new_output(output_type="stream", |
|
30 | nbformat.new_output(output_type="stream", name="stdout", text="2"), | |
31 |
nbformat.new_output(output_type="stream", |
|
31 | nbformat.new_output(output_type="stream", name="stdout", text="3"), | |
32 |
nbformat.new_output(output_type="stream", |
|
32 | nbformat.new_output(output_type="stream", name="stdout", text="4"), | |
33 |
nbformat.new_output(output_type="stream", |
|
33 | nbformat.new_output(output_type="stream", name="stdout", text="5"), | |
34 |
nbformat.new_output(output_type="stream", |
|
34 | nbformat.new_output(output_type="stream", name="stdout", text="6"), | |
35 |
nbformat.new_output(output_type="stream", |
|
35 | nbformat.new_output(output_type="stream", name="stdout", text="7")] | |
36 |
cells=[nbformat.new_code_cell( |
|
36 | cells=[nbformat.new_code_cell(source="# None", prompt_number=1,outputs=outputs)] | |
37 | worksheets = [nbformat.new_worksheet(cells=cells)] |
|
37 | ||
38 |
|
38 | nb = nbformat.new_notebook(cells=cells) | ||
39 | nb = nbformat.new_notebook(name="notebook1", worksheets=worksheets) |
|
|||
40 | res = self.build_resources() |
|
39 | res = self.build_resources() | |
41 | nb, res = coalesce_streams(nb, res) |
|
40 | nb, res = coalesce_streams(nb, res) | |
42 |
outputs = nb. |
|
41 | outputs = nb.cells[0].outputs | |
43 | self.assertEqual(outputs[0].text, u'01234567') |
|
42 | self.assertEqual(outputs[0].text, u'01234567') | |
44 |
|
43 | |||
45 | def test_coalesce_replace_streams(self): |
|
44 | def test_coalesce_replace_streams(self): | |
46 | """Are \\r characters handled?""" |
|
45 | """Are \\r characters handled?""" | |
47 |
outputs = [nbformat.new_output(output_type="stream", |
|
46 | outputs = [nbformat.new_output(output_type="stream", name="stdout", text="z"), | |
48 |
nbformat.new_output(output_type="stream", |
|
47 | nbformat.new_output(output_type="stream", name="stdout", text="\ra"), | |
49 |
nbformat.new_output(output_type="stream", |
|
48 | nbformat.new_output(output_type="stream", name="stdout", text="\nz\rb"), | |
50 |
nbformat.new_output(output_type="stream", |
|
49 | nbformat.new_output(output_type="stream", name="stdout", text="\nz"), | |
51 |
nbformat.new_output(output_type="stream", |
|
50 | nbformat.new_output(output_type="stream", name="stdout", text="\rc\n"), | |
52 |
nbformat.new_output(output_type="stream", |
|
51 | nbformat.new_output(output_type="stream", name="stdout", text="z\rz\rd")] | |
53 |
cells=[nbformat.new_code_cell( |
|
52 | cells=[nbformat.new_code_cell(source="# None", prompt_number=1,outputs=outputs)] | |
54 | worksheets = [nbformat.new_worksheet(cells=cells)] |
|
53 | ||
55 |
|
54 | nb = nbformat.new_notebook(cells=cells) | ||
56 | nb = nbformat.new_notebook(name="notebook1", worksheets=worksheets) |
|
|||
57 | res = self.build_resources() |
|
55 | res = self.build_resources() | |
58 | nb, res = coalesce_streams(nb, res) |
|
56 | nb, res = coalesce_streams(nb, res) | |
59 |
outputs = nb. |
|
57 | outputs = nb.cells[0].outputs | |
60 | self.assertEqual(outputs[0].text, u'a\nb\nc\nd') |
|
58 | self.assertEqual(outputs[0].text, u'a\nb\nc\nd') |
@@ -1,90 +1,88 b'' | |||||
1 | """ |
|
1 | """ | |
2 | Module with tests for the execute preprocessor. |
|
2 | Module with tests for the execute preprocessor. | |
3 | """ |
|
3 | """ | |
4 |
|
4 | |||
5 | # Copyright (c) IPython Development Team. |
|
5 | # Copyright (c) IPython Development Team. | |
6 | # Distributed under the terms of the Modified BSD License. |
|
6 | # Distributed under the terms of the Modified BSD License. | |
7 |
|
7 | |||
8 | import copy |
|
8 | import copy | |
9 | import glob |
|
9 | import glob | |
10 | import os |
|
10 | import os | |
11 | import re |
|
11 | import re | |
12 |
|
12 | |||
13 | from IPython.nbformat import current as nbformat |
|
13 | from IPython.nbformat import current as nbformat | |
14 |
|
14 | |||
15 | from .base import PreprocessorTestsBase |
|
15 | from .base import PreprocessorTestsBase | |
16 | from ..execute import ExecutePreprocessor |
|
16 | from ..execute import ExecutePreprocessor | |
17 |
|
17 | |||
18 | from IPython.nbconvert.filters import strip_ansi |
|
18 | from IPython.nbconvert.filters import strip_ansi | |
19 |
|
19 | |||
20 | addr_pat = re.compile(r'0x[0-9a-f]{7,9}') |
|
20 | addr_pat = re.compile(r'0x[0-9a-f]{7,9}') | |
21 |
|
21 | |||
22 | class TestExecute(PreprocessorTestsBase): |
|
22 | class TestExecute(PreprocessorTestsBase): | |
23 | """Contains test functions for execute.py""" |
|
23 | """Contains test functions for execute.py""" | |
24 |
|
24 | |||
25 | @staticmethod |
|
25 | @staticmethod | |
26 | def normalize_output(output): |
|
26 | def normalize_output(output): | |
27 | """ |
|
27 | """ | |
28 | Normalizes outputs for comparison. |
|
28 | Normalizes outputs for comparison. | |
29 | """ |
|
29 | """ | |
30 | output = dict(output) |
|
30 | output = dict(output) | |
31 | if 'metadata' in output: |
|
31 | if 'metadata' in output: | |
32 | del output['metadata'] |
|
32 | del output['metadata'] | |
33 | if 'text' in output: |
|
33 | if 'text/plain' in output: | |
34 | output['text'] = re.sub(addr_pat, '<HEXADDR>', output['text']) |
|
34 | output['text/plain'] = re.sub(addr_pat, '<HEXADDR>', output['text/plain']) | |
35 | if 'svg' in output: |
|
|||
36 | del output['text'] |
|
|||
37 | if 'traceback' in output: |
|
35 | if 'traceback' in output: | |
38 | tb = [] |
|
36 | tb = [] | |
39 | for line in output['traceback']: |
|
37 | for line in output['traceback']: | |
40 | tb.append(strip_ansi(line)) |
|
38 | tb.append(strip_ansi(line)) | |
41 | output['traceback'] = tb |
|
39 | output['traceback'] = tb | |
42 |
|
40 | |||
43 | return output |
|
41 | return output | |
44 |
|
42 | |||
45 |
|
43 | |||
46 | def assert_notebooks_equal(self, expected, actual): |
|
44 | def assert_notebooks_equal(self, expected, actual): | |
47 |
expected_cells = expected[' |
|
45 | expected_cells = expected['cells'] | |
48 |
actual_cells = actual[' |
|
46 | actual_cells = actual['cells'] | |
49 | assert len(expected_cells) == len(actual_cells) |
|
47 | assert len(expected_cells) == len(actual_cells) | |
50 |
|
48 | |||
51 | for expected_cell, actual_cell in zip(expected_cells, actual_cells): |
|
49 | for expected_cell, actual_cell in zip(expected_cells, actual_cells): | |
52 | expected_outputs = expected_cell.get('outputs', []) |
|
50 | expected_outputs = expected_cell.get('outputs', []) | |
53 | actual_outputs = actual_cell.get('outputs', []) |
|
51 | actual_outputs = actual_cell.get('outputs', []) | |
54 | normalized_expected_outputs = list(map(self.normalize_output, expected_outputs)) |
|
52 | normalized_expected_outputs = list(map(self.normalize_output, expected_outputs)) | |
55 | normalized_actual_outputs = list(map(self.normalize_output, actual_outputs)) |
|
53 | normalized_actual_outputs = list(map(self.normalize_output, actual_outputs)) | |
56 | assert normalized_expected_outputs == normalized_actual_outputs |
|
54 | assert normalized_expected_outputs == normalized_actual_outputs | |
57 |
|
55 | |||
58 | expected_prompt_number = expected_cell.get('prompt_number', None) |
|
56 | expected_prompt_number = expected_cell.get('prompt_number', None) | |
59 | actual_prompt_number = actual_cell.get('prompt_number', None) |
|
57 | actual_prompt_number = actual_cell.get('prompt_number', None) | |
60 | assert expected_prompt_number == actual_prompt_number |
|
58 | assert expected_prompt_number == actual_prompt_number | |
61 |
|
59 | |||
62 |
|
60 | |||
63 | def build_preprocessor(self): |
|
61 | def build_preprocessor(self): | |
64 | """Make an instance of a preprocessor""" |
|
62 | """Make an instance of a preprocessor""" | |
65 | preprocessor = ExecutePreprocessor() |
|
63 | preprocessor = ExecutePreprocessor() | |
66 | preprocessor.enabled = True |
|
64 | preprocessor.enabled = True | |
67 | return preprocessor |
|
65 | return preprocessor | |
68 |
|
66 | |||
69 |
|
67 | |||
70 | def test_constructor(self): |
|
68 | def test_constructor(self): | |
71 | """Can a ExecutePreprocessor be constructed?""" |
|
69 | """Can a ExecutePreprocessor be constructed?""" | |
72 | self.build_preprocessor() |
|
70 | self.build_preprocessor() | |
73 |
|
71 | |||
74 |
|
72 | |||
75 | def test_run_notebooks(self): |
|
73 | def test_run_notebooks(self): | |
76 | """Runs a series of test notebooks and compares them to their actual output""" |
|
74 | """Runs a series of test notebooks and compares them to their actual output""" | |
77 | current_dir = os.path.dirname(__file__) |
|
75 | current_dir = os.path.dirname(__file__) | |
78 | input_files = glob.glob(os.path.join(current_dir, 'files', '*.ipynb')) |
|
76 | input_files = glob.glob(os.path.join(current_dir, 'files', '*.ipynb')) | |
79 | for filename in input_files: |
|
77 | for filename in input_files: | |
80 | with open(os.path.join(current_dir, 'files', filename)) as f: |
|
78 | with open(os.path.join(current_dir, 'files', filename)) as f: | |
81 | input_nb = nbformat.read(f, 'ipynb') |
|
79 | input_nb = nbformat.read(f, 'ipynb') | |
82 | res = self.build_resources() |
|
80 | res = self.build_resources() | |
83 | preprocessor = self.build_preprocessor() |
|
81 | preprocessor = self.build_preprocessor() | |
84 | cleaned_input_nb = copy.deepcopy(input_nb) |
|
82 | cleaned_input_nb = copy.deepcopy(input_nb) | |
85 |
for cell in cleaned_input_nb. |
|
83 | for cell in cleaned_input_nb.cells: | |
86 | if 'prompt_number' in cell: |
|
84 | if 'prompt_number' in cell: | |
87 | del cell['prompt_number'] |
|
85 | del cell['prompt_number'] | |
88 | cell['outputs'] = [] |
|
86 | cell['outputs'] = [] | |
89 | output_nb, _ = preprocessor(cleaned_input_nb, res) |
|
87 | output_nb, _ = preprocessor(cleaned_input_nb, res) | |
90 | self.assert_notebooks_equal(output_nb, input_nb) |
|
88 | self.assert_notebooks_equal(output_nb, input_nb) |
@@ -1,74 +1,59 b'' | |||||
1 | """ |
|
1 | """Tests for the extractoutput preprocessor""" | |
2 | Module with tests for the extractoutput preprocessor |
|
|||
3 | """ |
|
|||
4 |
|
2 | |||
5 | #----------------------------------------------------------------------------- |
|
3 | # Copyright (c) IPython Development Team. | |
6 | # Copyright (c) 2013, the IPython Development Team. |
|
|||
7 | # |
|
|||
8 | # Distributed under the terms of the Modified BSD License. |
|
4 | # Distributed under the terms of the Modified BSD License. | |
9 | # |
|
|||
10 | # The full license is in the file COPYING.txt, distributed with this software. |
|
|||
11 | #----------------------------------------------------------------------------- |
|
|||
12 |
|
||||
13 | #----------------------------------------------------------------------------- |
|
|||
14 | # Imports |
|
|||
15 | #----------------------------------------------------------------------------- |
|
|||
16 |
|
5 | |||
17 | from .base import PreprocessorTestsBase |
|
6 | from .base import PreprocessorTestsBase | |
18 | from ..extractoutput import ExtractOutputPreprocessor |
|
7 | from ..extractoutput import ExtractOutputPreprocessor | |
19 |
|
8 | |||
20 |
|
9 | |||
21 | #----------------------------------------------------------------------------- |
|
|||
22 | # Class |
|
|||
23 | #----------------------------------------------------------------------------- |
|
|||
24 |
|
||||
25 | class TestExtractOutput(PreprocessorTestsBase): |
|
10 | class TestExtractOutput(PreprocessorTestsBase): | |
26 | """Contains test functions for extractoutput.py""" |
|
11 | """Contains test functions for extractoutput.py""" | |
27 |
|
12 | |||
28 |
|
13 | |||
29 | def build_preprocessor(self): |
|
14 | def build_preprocessor(self): | |
30 | """Make an instance of a preprocessor""" |
|
15 | """Make an instance of a preprocessor""" | |
31 | preprocessor = ExtractOutputPreprocessor() |
|
16 | preprocessor = ExtractOutputPreprocessor() | |
32 | preprocessor.extract_output_types = {'text', 'png', 'application/pdf'} |
|
17 | preprocessor.extract_output_types = {'text/plain', 'image/png', 'application/pdf'} | |
33 | preprocessor.enabled = True |
|
18 | preprocessor.enabled = True | |
34 | return preprocessor |
|
19 | return preprocessor | |
35 |
|
20 | |||
36 |
|
21 | |||
37 | def test_constructor(self): |
|
22 | def test_constructor(self): | |
38 | """Can a ExtractOutputPreprocessor be constructed?""" |
|
23 | """Can a ExtractOutputPreprocessor be constructed?""" | |
39 | self.build_preprocessor() |
|
24 | self.build_preprocessor() | |
40 |
|
25 | |||
41 |
|
26 | |||
42 | def test_output(self): |
|
27 | def test_output(self): | |
43 | """Test the output of the ExtractOutputPreprocessor""" |
|
28 | """Test the output of the ExtractOutputPreprocessor""" | |
44 | nb = self.build_notebook() |
|
29 | nb = self.build_notebook() | |
45 | res = self.build_resources() |
|
30 | res = self.build_resources() | |
46 | preprocessor = self.build_preprocessor() |
|
31 | preprocessor = self.build_preprocessor() | |
47 | nb, res = preprocessor(nb, res) |
|
32 | nb, res = preprocessor(nb, res) | |
48 |
|
33 | |||
49 | # Check if text was extracted. |
|
34 | # Check if text was extracted. | |
50 |
output = nb |
|
35 | output = nb.cells[0].outputs[1] | |
51 | assert 'text_filename' in output |
|
36 | assert 'text/plain_filename' in output | |
52 | text_filename = output['text_filename'] |
|
37 | text_filename = output['text/plain_filename'] | |
53 |
|
38 | |||
54 | # Check if png was extracted. |
|
39 | # Check if png was extracted. | |
55 |
output = nb |
|
40 | output = nb.cells[0].outputs[6] | |
56 | assert 'png_filename' in output |
|
41 | assert 'image/png_filename' in output | |
57 | png_filename = output['png_filename'] |
|
42 | png_filename = output['image/png_filename'] | |
58 |
|
43 | |||
59 | # Check that pdf was extracted |
|
44 | # Check that pdf was extracted | |
60 |
output = nb |
|
45 | output = nb.cells[0].outputs[7] | |
61 | assert 'application/pdf_filename' in output |
|
46 | assert 'application/pdf_filename' in output | |
62 | pdf_filename = output['application/pdf_filename'] |
|
47 | pdf_filename = output['application/pdf_filename'] | |
63 |
|
48 | |||
64 | # Verify text output |
|
49 | # Verify text output | |
65 | assert text_filename in res['outputs'] |
|
50 | assert text_filename in res['outputs'] | |
66 | self.assertEqual(res['outputs'][text_filename], b'b') |
|
51 | self.assertEqual(res['outputs'][text_filename], b'b') | |
67 |
|
52 | |||
68 | # Verify png output |
|
53 | # Verify png output | |
69 | assert png_filename in res['outputs'] |
|
54 | assert png_filename in res['outputs'] | |
70 | self.assertEqual(res['outputs'][png_filename], b'g') |
|
55 | self.assertEqual(res['outputs'][png_filename], b'g') | |
71 |
|
56 | |||
72 | # Verify pdf output |
|
57 | # Verify pdf output | |
73 | assert pdf_filename in res['outputs'] |
|
58 | assert pdf_filename in res['outputs'] | |
74 | self.assertEqual(res['outputs'][pdf_filename], b'h') |
|
59 | self.assertEqual(res['outputs'][pdf_filename], b'h') |
@@ -1,68 +1,50 b'' | |||||
1 | """ |
|
1 | """Tests for the HighlightMagics preprocessor""" | |
2 | Module with tests for the HighlightMagics preprocessor |
|
|||
3 | """ |
|
|||
4 |
|
||||
5 | #----------------------------------------------------------------------------- |
|
|||
6 | # Copyright (c) 2013, the IPython Development Team. |
|
|||
7 | # |
|
|||
8 | # Distributed under the terms of the Modified BSD License. |
|
|||
9 | # |
|
|||
10 | # The full license is in the file COPYING.txt, distributed with this software. |
|
|||
11 | #----------------------------------------------------------------------------- |
|
|||
12 |
|
||||
13 | #----------------------------------------------------------------------------- |
|
|||
14 | # Imports |
|
|||
15 | #----------------------------------------------------------------------------- |
|
|||
16 |
|
2 | |||
17 | from .base import PreprocessorTestsBase |
|
3 | from .base import PreprocessorTestsBase | |
18 | from ..highlightmagics import HighlightMagicsPreprocessor |
|
4 | from ..highlightmagics import HighlightMagicsPreprocessor | |
19 |
|
5 | |||
20 |
|
6 | |||
21 | #----------------------------------------------------------------------------- |
|
|||
22 | # Class |
|
|||
23 | #----------------------------------------------------------------------------- |
|
|||
24 |
|
||||
25 | class TestHighlightMagics(PreprocessorTestsBase): |
|
7 | class TestHighlightMagics(PreprocessorTestsBase): | |
26 | """Contains test functions for highlightmagics.py""" |
|
8 | """Contains test functions for highlightmagics.py""" | |
27 |
|
9 | |||
28 |
|
10 | |||
29 | def build_preprocessor(self): |
|
11 | def build_preprocessor(self): | |
30 | """Make an instance of a preprocessor""" |
|
12 | """Make an instance of a preprocessor""" | |
31 | preprocessor = HighlightMagicsPreprocessor() |
|
13 | preprocessor = HighlightMagicsPreprocessor() | |
32 | preprocessor.enabled = True |
|
14 | preprocessor.enabled = True | |
33 | return preprocessor |
|
15 | return preprocessor | |
34 |
|
16 | |||
35 | def test_constructor(self): |
|
17 | def test_constructor(self): | |
36 | """Can a HighlightMagicsPreprocessor be constructed?""" |
|
18 | """Can a HighlightMagicsPreprocessor be constructed?""" | |
37 | self.build_preprocessor() |
|
19 | self.build_preprocessor() | |
38 |
|
20 | |||
39 | def test_tagging(self): |
|
21 | def test_tagging(self): | |
40 | """Test the HighlightMagicsPreprocessor tagging""" |
|
22 | """Test the HighlightMagicsPreprocessor tagging""" | |
41 | nb = self.build_notebook() |
|
23 | nb = self.build_notebook() | |
42 | res = self.build_resources() |
|
24 | res = self.build_resources() | |
43 | preprocessor = self.build_preprocessor() |
|
25 | preprocessor = self.build_preprocessor() | |
44 |
nb |
|
26 | nb.cells[0].source = """%%R -i x,y -o XYcoef | |
45 | lm.fit <- lm(y~x) |
|
27 | lm.fit <- lm(y~x) | |
46 | par(mfrow=c(2,2)) |
|
28 | par(mfrow=c(2,2)) | |
47 | print(summary(lm.fit)) |
|
29 | print(summary(lm.fit)) | |
48 | plot(lm.fit) |
|
30 | plot(lm.fit) | |
49 | XYcoef <- coef(lm.fit)""" |
|
31 | XYcoef <- coef(lm.fit)""" | |
50 |
|
32 | |||
51 | nb, res = preprocessor(nb, res) |
|
33 | nb, res = preprocessor(nb, res) | |
52 |
|
34 | |||
53 |
assert('magics_language' in nb. |
|
35 | assert('magics_language' in nb.cells[0]['metadata']) | |
54 |
|
36 | |||
55 |
self.assertEqual(nb |
|
37 | self.assertEqual(nb.cells[0]['metadata']['magics_language'], 'r') | |
56 |
|
38 | |||
57 | def test_no_false_positive(self): |
|
39 | def test_no_false_positive(self): | |
58 | """Test that HighlightMagicsPreprocessor does not tag false positives""" |
|
40 | """Test that HighlightMagicsPreprocessor does not tag false positives""" | |
59 | nb = self.build_notebook() |
|
41 | nb = self.build_notebook() | |
60 | res = self.build_resources() |
|
42 | res = self.build_resources() | |
61 | preprocessor = self.build_preprocessor() |
|
43 | preprocessor = self.build_preprocessor() | |
62 |
nb |
|
44 | nb.cells[0].source = """# this should not be detected | |
63 | print(\""" |
|
45 | print(\""" | |
64 | %%R -i x, y |
|
46 | %%R -i x, y | |
65 | \""")""" |
|
47 | \""")""" | |
66 | nb, res = preprocessor(nb, res) |
|
48 | nb, res = preprocessor(nb, res) | |
67 |
|
49 | |||
68 |
assert('magics_language' not in nb. |
|
50 | assert('magics_language' not in nb.cells[0]['metadata']) No newline at end of file |
@@ -1,51 +1,36 b'' | |||||
1 | """ |
|
1 | """Tests for the latex preprocessor""" | |
2 | Module with tests for the latex preprocessor |
|
|||
3 | """ |
|
|||
4 |
|
2 | |||
5 | #----------------------------------------------------------------------------- |
|
3 | # Copyright (c) IPython Development Team. | |
6 | # Copyright (c) 2013, the IPython Development Team. |
|
|||
7 | # |
|
|||
8 | # Distributed under the terms of the Modified BSD License. |
|
4 | # Distributed under the terms of the Modified BSD License. | |
9 | # |
|
|||
10 | # The full license is in the file COPYING.txt, distributed with this software. |
|
|||
11 | #----------------------------------------------------------------------------- |
|
|||
12 |
|
||||
13 | #----------------------------------------------------------------------------- |
|
|||
14 | # Imports |
|
|||
15 | #----------------------------------------------------------------------------- |
|
|||
16 |
|
5 | |||
17 | from .base import PreprocessorTestsBase |
|
6 | from .base import PreprocessorTestsBase | |
18 | from ..latex import LatexPreprocessor |
|
7 | from ..latex import LatexPreprocessor | |
19 |
|
8 | |||
20 |
|
9 | |||
21 | #----------------------------------------------------------------------------- |
|
|||
22 | # Class |
|
|||
23 | #----------------------------------------------------------------------------- |
|
|||
24 |
|
||||
25 | class TestLatex(PreprocessorTestsBase): |
|
10 | class TestLatex(PreprocessorTestsBase): | |
26 | """Contains test functions for latex.py""" |
|
11 | """Contains test functions for latex.py""" | |
27 |
|
12 | |||
28 |
|
13 | |||
29 | def build_preprocessor(self): |
|
14 | def build_preprocessor(self): | |
30 | """Make an instance of a preprocessor""" |
|
15 | """Make an instance of a preprocessor""" | |
31 | preprocessor = LatexPreprocessor() |
|
16 | preprocessor = LatexPreprocessor() | |
32 | preprocessor.enabled = True |
|
17 | preprocessor.enabled = True | |
33 | return preprocessor |
|
18 | return preprocessor | |
34 |
|
19 | |||
35 | def test_constructor(self): |
|
20 | def test_constructor(self): | |
36 | """Can a LatexPreprocessor be constructed?""" |
|
21 | """Can a LatexPreprocessor be constructed?""" | |
37 | self.build_preprocessor() |
|
22 | self.build_preprocessor() | |
38 |
|
23 | |||
39 |
|
24 | |||
40 | def test_output(self): |
|
25 | def test_output(self): | |
41 | """Test the output of the LatexPreprocessor""" |
|
26 | """Test the output of the LatexPreprocessor""" | |
42 | nb = self.build_notebook() |
|
27 | nb = self.build_notebook() | |
43 | res = self.build_resources() |
|
28 | res = self.build_resources() | |
44 | preprocessor = self.build_preprocessor() |
|
29 | preprocessor = self.build_preprocessor() | |
45 | nb, res = preprocessor(nb, res) |
|
30 | nb, res = preprocessor(nb, res) | |
46 |
|
31 | |||
47 | # Make sure the code cell wasn't modified. |
|
32 | # Make sure the code cell wasn't modified. | |
48 |
self.assertEqual(nb. |
|
33 | self.assertEqual(nb.cells[0].source, '$ e $') | |
49 |
|
34 | |||
50 | # Verify that the markdown cell wasn't processed. |
|
35 | # Verify that the markdown cell wasn't processed. | |
51 |
self.assertEqual(nb |
|
36 | self.assertEqual(nb.cells[1].source, '$ e $') |
@@ -1,79 +1,78 b'' | |||||
1 | """Tests for the revealhelp preprocessor""" |
|
1 | """Tests for the revealhelp preprocessor""" | |
2 |
|
2 | |||
3 | # Copyright (c) IPython Development Team. |
|
3 | # Copyright (c) IPython Development Team. | |
4 | # Distributed under the terms of the Modified BSD License. |
|
4 | # Distributed under the terms of the Modified BSD License. | |
5 |
|
5 | |||
6 | from IPython.nbformat import current as nbformat |
|
6 | from IPython.nbformat import current as nbformat | |
7 |
|
7 | |||
8 | from .base import PreprocessorTestsBase |
|
8 | from .base import PreprocessorTestsBase | |
9 | from ..revealhelp import RevealHelpPreprocessor |
|
9 | from ..revealhelp import RevealHelpPreprocessor | |
10 |
|
10 | |||
11 |
|
11 | |||
12 | class Testrevealhelp(PreprocessorTestsBase): |
|
12 | class Testrevealhelp(PreprocessorTestsBase): | |
13 | """Contains test functions for revealhelp.py""" |
|
13 | """Contains test functions for revealhelp.py""" | |
14 |
|
14 | |||
15 | def build_notebook(self): |
|
15 | def build_notebook(self): | |
16 | """Build a reveal slides notebook in memory for use with tests. |
|
16 | """Build a reveal slides notebook in memory for use with tests. | |
17 | Overrides base in PreprocessorTestsBase""" |
|
17 | Overrides base in PreprocessorTestsBase""" | |
18 |
|
18 | |||
19 |
outputs = [nbformat.new_output(output_type="stream", |
|
19 | outputs = [nbformat.new_output(output_type="stream", name="stdout", text="a")] | |
20 |
|
20 | |||
21 | slide_metadata = {'slideshow' : {'slide_type': 'slide'}} |
|
21 | slide_metadata = {'slideshow' : {'slide_type': 'slide'}} | |
22 | subslide_metadata = {'slideshow' : {'slide_type': 'subslide'}} |
|
22 | subslide_metadata = {'slideshow' : {'slide_type': 'subslide'}} | |
23 |
|
23 | |||
24 |
cells=[nbformat.new_code_cell( |
|
24 | cells=[nbformat.new_code_cell(source="", prompt_number=1, outputs=outputs), | |
25 |
nbformat.new_ |
|
25 | nbformat.new_markdown_cell(source="", metadata=slide_metadata), | |
26 |
nbformat.new_code_cell( |
|
26 | nbformat.new_code_cell(source="", prompt_number=2, outputs=outputs), | |
27 |
nbformat.new_ |
|
27 | nbformat.new_markdown_cell(source="", metadata=slide_metadata), | |
28 |
nbformat.new_ |
|
28 | nbformat.new_markdown_cell(source="", metadata=subslide_metadata)] | |
29 | worksheets = [nbformat.new_worksheet(cells=cells)] |
|
|||
30 |
|
29 | |||
31 |
return nbformat.new_notebook( |
|
30 | return nbformat.new_notebook(cells=cells) | |
32 |
|
31 | |||
33 |
|
32 | |||
34 | def build_preprocessor(self): |
|
33 | def build_preprocessor(self): | |
35 | """Make an instance of a preprocessor""" |
|
34 | """Make an instance of a preprocessor""" | |
36 | preprocessor = RevealHelpPreprocessor() |
|
35 | preprocessor = RevealHelpPreprocessor() | |
37 | preprocessor.enabled = True |
|
36 | preprocessor.enabled = True | |
38 | return preprocessor |
|
37 | return preprocessor | |
39 |
|
38 | |||
40 |
|
39 | |||
41 | def test_constructor(self): |
|
40 | def test_constructor(self): | |
42 | """Can a RevealHelpPreprocessor be constructed?""" |
|
41 | """Can a RevealHelpPreprocessor be constructed?""" | |
43 | self.build_preprocessor() |
|
42 | self.build_preprocessor() | |
44 |
|
43 | |||
45 |
|
44 | |||
46 | def test_reveal_attribute(self): |
|
45 | def test_reveal_attribute(self): | |
47 | """Make sure the reveal url_prefix resources is set""" |
|
46 | """Make sure the reveal url_prefix resources is set""" | |
48 | nb = self.build_notebook() |
|
47 | nb = self.build_notebook() | |
49 | res = self.build_resources() |
|
48 | res = self.build_resources() | |
50 | preprocessor = self.build_preprocessor() |
|
49 | preprocessor = self.build_preprocessor() | |
51 | nb, res = preprocessor(nb, res) |
|
50 | nb, res = preprocessor(nb, res) | |
52 | assert 'reveal' in res |
|
51 | assert 'reveal' in res | |
53 | assert 'url_prefix' in res['reveal'] |
|
52 | assert 'url_prefix' in res['reveal'] | |
54 |
|
53 | |||
55 |
|
54 | |||
56 | def test_reveal_output(self): |
|
55 | def test_reveal_output(self): | |
57 | """Make sure that the reveal preprocessor """ |
|
56 | """Make sure that the reveal preprocessor """ | |
58 | nb = self.build_notebook() |
|
57 | nb = self.build_notebook() | |
59 | res = self.build_resources() |
|
58 | res = self.build_resources() | |
60 | preprocessor = self.build_preprocessor() |
|
59 | preprocessor = self.build_preprocessor() | |
61 | nb, res = preprocessor(nb, res) |
|
60 | nb, res = preprocessor(nb, res) | |
62 |
cells = nb. |
|
61 | cells = nb.cells | |
63 |
|
62 | |||
64 | # Make sure correct metadata tags are available on every cell. |
|
63 | # Make sure correct metadata tags are available on every cell. | |
65 | for cell in cells: |
|
64 | for cell in cells: | |
66 | assert 'slide_type' in cell.metadata |
|
65 | assert 'slide_type' in cell.metadata | |
67 |
|
66 | |||
68 | # Make sure slide end is only applied to the cells preceeding slide |
|
67 | # Make sure slide end is only applied to the cells preceeding slide | |
69 | # cells. |
|
68 | # cells. | |
70 | assert 'slide_helper' in cells[1].metadata |
|
69 | assert 'slide_helper' in cells[1].metadata | |
71 | self.assertEqual(cells[1].metadata['slide_helper'], '-') |
|
70 | self.assertEqual(cells[1].metadata['slide_helper'], '-') | |
72 |
|
71 | |||
73 | # Verify 'slide-end' |
|
72 | # Verify 'slide-end' | |
74 | assert 'slide_helper' in cells[0].metadata |
|
73 | assert 'slide_helper' in cells[0].metadata | |
75 | self.assertEqual(cells[0].metadata['slide_helper'], 'slide_end') |
|
74 | self.assertEqual(cells[0].metadata['slide_helper'], 'slide_end') | |
76 | assert 'slide_helper' in cells[2].metadata |
|
75 | assert 'slide_helper' in cells[2].metadata | |
77 | self.assertEqual(cells[2].metadata['slide_helper'], 'slide_end') |
|
76 | self.assertEqual(cells[2].metadata['slide_helper'], 'slide_end') | |
78 | assert 'slide_helper' in cells[3].metadata |
|
77 | assert 'slide_helper' in cells[3].metadata | |
79 | self.assertEqual(cells[3].metadata['slide_helper'], 'subslide_end') |
|
78 | self.assertEqual(cells[3].metadata['slide_helper'], 'subslide_end') |
@@ -1,90 +1,74 b'' | |||||
1 | """ |
|
1 | """Tests for the svg2pdf preprocessor""" | |
2 | Module with tests for the svg2pdf preprocessor |
|
|||
3 | """ |
|
|||
4 |
|
2 | |||
5 | #----------------------------------------------------------------------------- |
|
3 | # Copyright (c) IPython Development Team. | |
6 | # Copyright (c) 2013, the IPython Development Team. |
|
|||
7 | # |
|
|||
8 | # Distributed under the terms of the Modified BSD License. |
|
4 | # Distributed under the terms of the Modified BSD License. | |
9 | # |
|
|||
10 | # The full license is in the file COPYING.txt, distributed with this software. |
|
|||
11 | #----------------------------------------------------------------------------- |
|
|||
12 |
|
||||
13 | #----------------------------------------------------------------------------- |
|
|||
14 | # Imports |
|
|||
15 | #----------------------------------------------------------------------------- |
|
|||
16 |
|
5 | |||
17 | from IPython.testing import decorators as dec |
|
6 | from IPython.testing import decorators as dec | |
18 | from IPython.nbformat import current as nbformat |
|
7 | from IPython.nbformat import current as nbformat | |
19 |
|
8 | |||
20 | from .base import PreprocessorTestsBase |
|
9 | from .base import PreprocessorTestsBase | |
21 | from ..svg2pdf import SVG2PDFPreprocessor |
|
10 | from ..svg2pdf import SVG2PDFPreprocessor | |
22 |
|
11 | |||
23 |
|
12 | |||
24 | #----------------------------------------------------------------------------- |
|
|||
25 | # Class |
|
|||
26 | #----------------------------------------------------------------------------- |
|
|||
27 |
|
||||
28 | class Testsvg2pdf(PreprocessorTestsBase): |
|
13 | class Testsvg2pdf(PreprocessorTestsBase): | |
29 | """Contains test functions for svg2pdf.py""" |
|
14 | """Contains test functions for svg2pdf.py""" | |
30 |
|
15 | |||
31 | simple_svg = """<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
|
16 | simple_svg = """<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |
32 | <!-- Created with Inkscape (http://www.inkscape.org/) --> |
|
17 | <!-- Created with Inkscape (http://www.inkscape.org/) --> | |
33 | <svg |
|
18 | <svg | |
34 | xmlns:svg="http://www.w3.org/2000/svg" |
|
19 | xmlns:svg="http://www.w3.org/2000/svg" | |
35 | xmlns="http://www.w3.org/2000/svg" |
|
20 | xmlns="http://www.w3.org/2000/svg" | |
36 | version="1.0" |
|
21 | version="1.0" | |
37 | x="0.00000000" |
|
22 | x="0.00000000" | |
38 | y="0.00000000" |
|
23 | y="0.00000000" | |
39 | width="500.00000" |
|
24 | width="500.00000" | |
40 | height="500.00000" |
|
25 | height="500.00000" | |
41 | id="svg2"> |
|
26 | id="svg2"> | |
42 | <defs |
|
27 | <defs | |
43 | id="defs4" /> |
|
28 | id="defs4" /> | |
44 | <g |
|
29 | <g | |
45 | id="layer1"> |
|
30 | id="layer1"> | |
46 | <rect |
|
31 | <rect | |
47 | width="300.00000" |
|
32 | width="300.00000" | |
48 | height="300.00000" |
|
33 | height="300.00000" | |
49 | x="100.00000" |
|
34 | x="100.00000" | |
50 | y="100.00000" |
|
35 | y="100.00000" | |
51 | style="opacity:1.0000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000000;stroke-width:8.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.00000000;stroke-opacity:1.0000000" |
|
36 | style="opacity:1.0000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000000;stroke-width:8.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.00000000;stroke-opacity:1.0000000" | |
52 | id="rect5719" /> |
|
37 | id="rect5719" /> | |
53 | </g> |
|
38 | </g> | |
54 | </svg>""" |
|
39 | </svg>""" | |
55 |
|
40 | |||
56 | def build_notebook(self): |
|
41 | def build_notebook(self): | |
57 | """Build a reveal slides notebook in memory for use with tests. |
|
42 | """Build a reveal slides notebook in memory for use with tests. | |
58 | Overrides base in PreprocessorTestsBase""" |
|
43 | Overrides base in PreprocessorTestsBase""" | |
59 |
|
44 | |||
60 | outputs = [nbformat.new_output(output_type="svg", output_svg=self.simple_svg)] |
|
45 | outputs = [nbformat.new_output(output_type="svg", output_svg=self.simple_svg)] | |
61 |
|
46 | |||
62 | slide_metadata = {'slideshow' : {'slide_type': 'slide'}} |
|
47 | slide_metadata = {'slideshow' : {'slide_type': 'slide'}} | |
63 | subslide_metadata = {'slideshow' : {'slide_type': 'subslide'}} |
|
48 | subslide_metadata = {'slideshow' : {'slide_type': 'subslide'}} | |
64 |
|
49 | |||
65 |
cells=[nbformat.new_code_cell( |
|
50 | cells=[nbformat.new_code_cell(source="", prompt_number=1, outputs=outputs)] | |
66 | worksheets = [nbformat.new_worksheet(name="worksheet1", cells=cells)] |
|
|||
67 |
|
51 | |||
68 |
return nbformat.new_notebook( |
|
52 | return nbformat.new_notebook(cells=cells) | |
69 |
|
53 | |||
70 |
|
54 | |||
71 | def build_preprocessor(self): |
|
55 | def build_preprocessor(self): | |
72 | """Make an instance of a preprocessor""" |
|
56 | """Make an instance of a preprocessor""" | |
73 | preprocessor = SVG2PDFPreprocessor() |
|
57 | preprocessor = SVG2PDFPreprocessor() | |
74 | preprocessor.enabled = True |
|
58 | preprocessor.enabled = True | |
75 | return preprocessor |
|
59 | return preprocessor | |
76 |
|
60 | |||
77 |
|
61 | |||
78 | def test_constructor(self): |
|
62 | def test_constructor(self): | |
79 | """Can a SVG2PDFPreprocessor be constructed?""" |
|
63 | """Can a SVG2PDFPreprocessor be constructed?""" | |
80 | self.build_preprocessor() |
|
64 | self.build_preprocessor() | |
81 |
|
65 | |||
82 |
|
66 | |||
83 | @dec.onlyif_cmds_exist('inkscape') |
|
67 | @dec.onlyif_cmds_exist('inkscape') | |
84 | def test_output(self): |
|
68 | def test_output(self): | |
85 | """Test the output of the SVG2PDFPreprocessor""" |
|
69 | """Test the output of the SVG2PDFPreprocessor""" | |
86 | nb = self.build_notebook() |
|
70 | nb = self.build_notebook() | |
87 | res = self.build_resources() |
|
71 | res = self.build_resources() | |
88 | preprocessor = self.build_preprocessor() |
|
72 | preprocessor = self.build_preprocessor() | |
89 | nb, res = preprocessor(nb, res) |
|
73 | nb, res = preprocessor(nb, res) | |
90 |
assert 'svg' in nb. |
|
74 | assert 'svg' in nb.cells[0].outputs[0] |
@@ -1,203 +1,203 b'' | |||||
1 | {%- extends 'display_priority.tpl' -%} |
|
1 | {%- extends 'display_priority.tpl' -%} | |
2 |
|
2 | |||
3 |
|
3 | |||
4 | {% block codecell %} |
|
4 | {% block codecell %} | |
5 | <div class="cell border-box-sizing code_cell rendered"> |
|
5 | <div class="cell border-box-sizing code_cell rendered"> | |
6 | {{ super() }} |
|
6 | {{ super() }} | |
7 | </div> |
|
7 | </div> | |
8 | {%- endblock codecell %} |
|
8 | {%- endblock codecell %} | |
9 |
|
9 | |||
10 | {% block input_group -%} |
|
10 | {% block input_group -%} | |
11 | <div class="input"> |
|
11 | <div class="input"> | |
12 | {{ super() }} |
|
12 | {{ super() }} | |
13 | </div> |
|
13 | </div> | |
14 | {% endblock input_group %} |
|
14 | {% endblock input_group %} | |
15 |
|
15 | |||
16 | {% block output_group %} |
|
16 | {% block output_group %} | |
17 | <div class="output_wrapper"> |
|
17 | <div class="output_wrapper"> | |
18 | <div class="output"> |
|
18 | <div class="output"> | |
19 | {{ super() }} |
|
19 | {{ super() }} | |
20 | </div> |
|
20 | </div> | |
21 | </div> |
|
21 | </div> | |
22 | {% endblock output_group %} |
|
22 | {% endblock output_group %} | |
23 |
|
23 | |||
24 | {% block in_prompt -%} |
|
24 | {% block in_prompt -%} | |
25 | <div class="prompt input_prompt"> |
|
25 | <div class="prompt input_prompt"> | |
26 | {%- if cell.prompt_number is defined -%} |
|
26 | {%- if cell.prompt_number is defined -%} | |
27 | In [{{ cell.prompt_number|replace(None, " ") }}]: |
|
27 | In [{{ cell.prompt_number|replace(None, " ") }}]: | |
28 | {%- else -%} |
|
28 | {%- else -%} | |
29 | In [ ]: |
|
29 | In [ ]: | |
30 | {%- endif -%} |
|
30 | {%- endif -%} | |
31 | </div> |
|
31 | </div> | |
32 | {%- endblock in_prompt %} |
|
32 | {%- endblock in_prompt %} | |
33 |
|
33 | |||
34 | {% block empty_in_prompt -%} |
|
34 | {% block empty_in_prompt -%} | |
35 | <div class="prompt input_prompt"> |
|
35 | <div class="prompt input_prompt"> | |
36 | </div> |
|
36 | </div> | |
37 | {%- endblock empty_in_prompt %} |
|
37 | {%- endblock empty_in_prompt %} | |
38 |
|
38 | |||
39 | {# |
|
39 | {# | |
40 | output_prompt doesn't do anything in HTML, |
|
40 | output_prompt doesn't do anything in HTML, | |
41 | because there is a prompt div in each output area (see output block) |
|
41 | because there is a prompt div in each output area (see output block) | |
42 | #} |
|
42 | #} | |
43 | {% block output_prompt %} |
|
43 | {% block output_prompt %} | |
44 | {% endblock output_prompt %} |
|
44 | {% endblock output_prompt %} | |
45 |
|
45 | |||
46 | {% block input %} |
|
46 | {% block input %} | |
47 | <div class="inner_cell"> |
|
47 | <div class="inner_cell"> | |
48 | <div class="input_area"> |
|
48 | <div class="input_area"> | |
49 |
{{ cell. |
|
49 | {{ cell.source | highlight_code(metadata=cell.metadata) }} | |
50 | </div> |
|
50 | </div> | |
51 | </div> |
|
51 | </div> | |
52 | {%- endblock input %} |
|
52 | {%- endblock input %} | |
53 |
|
53 | |||
54 | {% block output %} |
|
54 | {% block output %} | |
55 | <div class="output_area"> |
|
55 | <div class="output_area"> | |
56 |
{%- if output.output_type == ' |
|
56 | {%- if output.output_type == 'execute_result' -%} | |
57 | <div class="prompt output_prompt"> |
|
57 | <div class="prompt output_prompt"> | |
58 | {%- if cell.prompt_number is defined -%} |
|
58 | {%- if cell.prompt_number is defined -%} | |
59 | Out[{{ cell.prompt_number|replace(None, " ") }}]: |
|
59 | Out[{{ cell.prompt_number|replace(None, " ") }}]: | |
60 | {%- else -%} |
|
60 | {%- else -%} | |
61 | Out[ ]: |
|
61 | Out[ ]: | |
62 | {%- endif -%} |
|
62 | {%- endif -%} | |
63 | {%- else -%} |
|
63 | {%- else -%} | |
64 | <div class="prompt"> |
|
64 | <div class="prompt"> | |
65 | {%- endif -%} |
|
65 | {%- endif -%} | |
66 | </div> |
|
66 | </div> | |
67 | {{ super() }} |
|
67 | {{ super() }} | |
68 | </div> |
|
68 | </div> | |
69 | {% endblock output %} |
|
69 | {% endblock output %} | |
70 |
|
70 | |||
71 | {% block markdowncell scoped %} |
|
71 | {% block markdowncell scoped %} | |
72 | <div class="cell border-box-sizing text_cell rendered"> |
|
72 | <div class="cell border-box-sizing text_cell rendered"> | |
73 | {{ self.empty_in_prompt() }} |
|
73 | {{ self.empty_in_prompt() }} | |
74 | <div class="inner_cell"> |
|
74 | <div class="inner_cell"> | |
75 | <div class="text_cell_render border-box-sizing rendered_html"> |
|
75 | <div class="text_cell_render border-box-sizing rendered_html"> | |
76 | {{ cell.source | markdown2html | strip_files_prefix }} |
|
76 | {{ cell.source | markdown2html | strip_files_prefix }} | |
77 | </div> |
|
77 | </div> | |
78 | </div> |
|
78 | </div> | |
79 | </div> |
|
79 | </div> | |
80 | {%- endblock markdowncell %} |
|
80 | {%- endblock markdowncell %} | |
81 |
|
81 | |||
82 | {% block headingcell scoped %} |
|
82 | {% block headingcell scoped %} | |
83 | <div class="cell border-box-sizing text_cell rendered"> |
|
83 | <div class="cell border-box-sizing text_cell rendered"> | |
84 | {{ self.empty_in_prompt() }} |
|
84 | {{ self.empty_in_prompt() }} | |
85 | <div class="inner_cell"> |
|
85 | <div class="inner_cell"> | |
86 | <div class="text_cell_render border-box-sizing rendered_html"> |
|
86 | <div class="text_cell_render border-box-sizing rendered_html"> | |
87 | {{ ("#" * cell.level + cell.source) | replace('\n', ' ') | markdown2html | strip_files_prefix | add_anchor }} |
|
87 | {{ ("#" * cell.level + cell.source) | replace('\n', ' ') | markdown2html | strip_files_prefix | add_anchor }} | |
88 | </div> |
|
88 | </div> | |
89 | </div> |
|
89 | </div> | |
90 | </div> |
|
90 | </div> | |
91 | {% endblock headingcell %} |
|
91 | {% endblock headingcell %} | |
92 |
|
92 | |||
93 | {% block unknowncell scoped %} |
|
93 | {% block unknowncell scoped %} | |
94 | unknown type {{ cell.type }} |
|
94 | unknown type {{ cell.type }} | |
95 | {% endblock unknowncell %} |
|
95 | {% endblock unknowncell %} | |
96 |
|
96 | |||
97 |
{% block |
|
97 | {% block execute_result -%} | |
98 |
{%- set extra_class="output_ |
|
98 | {%- set extra_class="output_execute_result" -%} | |
99 | {% block data_priority scoped %} |
|
99 | {% block data_priority scoped %} | |
100 | {{ super() }} |
|
100 | {{ super() }} | |
101 | {% endblock %} |
|
101 | {% endblock %} | |
102 | {%- set extra_class="" -%} |
|
102 | {%- set extra_class="" -%} | |
103 |
{%- endblock |
|
103 | {%- endblock execute_result %} | |
104 |
|
104 | |||
105 | {% block stream_stdout -%} |
|
105 | {% block stream_stdout -%} | |
106 | <div class="output_subarea output_stream output_stdout output_text"> |
|
106 | <div class="output_subarea output_stream output_stdout output_text"> | |
107 | <pre> |
|
107 | <pre> | |
108 | {{- output.text | ansi2html -}} |
|
108 | {{- output.text | ansi2html -}} | |
109 | </pre> |
|
109 | </pre> | |
110 | </div> |
|
110 | </div> | |
111 | {%- endblock stream_stdout %} |
|
111 | {%- endblock stream_stdout %} | |
112 |
|
112 | |||
113 | {% block stream_stderr -%} |
|
113 | {% block stream_stderr -%} | |
114 | <div class="output_subarea output_stream output_stderr output_text"> |
|
114 | <div class="output_subarea output_stream output_stderr output_text"> | |
115 | <pre> |
|
115 | <pre> | |
116 | {{- output.text | ansi2html -}} |
|
116 | {{- output.text | ansi2html -}} | |
117 | </pre> |
|
117 | </pre> | |
118 | </div> |
|
118 | </div> | |
119 | {%- endblock stream_stderr %} |
|
119 | {%- endblock stream_stderr %} | |
120 |
|
120 | |||
121 | {% block data_svg scoped -%} |
|
121 | {% block data_svg scoped -%} | |
122 | <div class="output_svg output_subarea {{extra_class}}"> |
|
122 | <div class="output_svg output_subarea {{extra_class}}"> | |
123 | {%- if output.svg_filename %} |
|
123 | {%- if output.svg_filename %} | |
124 | <img src="{{output.svg_filename | posix_path}}" |
|
124 | <img src="{{output.svg_filename | posix_path}}" | |
125 | {%- else %} |
|
125 | {%- else %} | |
126 | {{ output.svg }} |
|
126 | {{ output.svg }} | |
127 | {%- endif %} |
|
127 | {%- endif %} | |
128 | </div> |
|
128 | </div> | |
129 | {%- endblock data_svg %} |
|
129 | {%- endblock data_svg %} | |
130 |
|
130 | |||
131 | {% block data_html scoped -%} |
|
131 | {% block data_html scoped -%} | |
132 | <div class="output_html rendered_html output_subarea {{extra_class}}"> |
|
132 | <div class="output_html rendered_html output_subarea {{extra_class}}"> | |
133 | {{ output.html }} |
|
133 | {{ output.html }} | |
134 | </div> |
|
134 | </div> | |
135 | {%- endblock data_html %} |
|
135 | {%- endblock data_html %} | |
136 |
|
136 | |||
137 | {% block data_png scoped %} |
|
137 | {% block data_png scoped %} | |
138 | <div class="output_png output_subarea {{extra_class}}"> |
|
138 | <div class="output_png output_subarea {{extra_class}}"> | |
139 | {%- if output.png_filename %} |
|
139 | {%- if output.png_filename %} | |
140 | <img src="{{output.png_filename | posix_path}}" |
|
140 | <img src="{{output.png_filename | posix_path}}" | |
141 | {%- else %} |
|
141 | {%- else %} | |
142 | <img src="data:image/png;base64,{{ output.png }}" |
|
142 | <img src="data:image/png;base64,{{ output.png }}" | |
143 | {%- endif %} |
|
143 | {%- endif %} | |
144 | {%- if 'metadata' in output and 'width' in output.metadata.get('png', {}) %} |
|
144 | {%- if 'metadata' in output and 'width' in output.metadata.get('png', {}) %} | |
145 | width={{output.metadata['png']['width']}} |
|
145 | width={{output.metadata['png']['width']}} | |
146 | {%- endif %} |
|
146 | {%- endif %} | |
147 | {%- if 'metadata' in output and 'height' in output.metadata.get('png', {}) %} |
|
147 | {%- if 'metadata' in output and 'height' in output.metadata.get('png', {}) %} | |
148 | height={{output.metadata['png']['height']}} |
|
148 | height={{output.metadata['png']['height']}} | |
149 | {%- endif %} |
|
149 | {%- endif %} | |
150 | > |
|
150 | > | |
151 | </div> |
|
151 | </div> | |
152 | {%- endblock data_png %} |
|
152 | {%- endblock data_png %} | |
153 |
|
153 | |||
154 | {% block data_jpg scoped %} |
|
154 | {% block data_jpg scoped %} | |
155 | <div class="output_jpeg output_subarea {{extra_class}}"> |
|
155 | <div class="output_jpeg output_subarea {{extra_class}}"> | |
156 | {%- if output.jpeg_filename %} |
|
156 | {%- if output.jpeg_filename %} | |
157 | <img src="{{output.jpeg_filename | posix_path}}" |
|
157 | <img src="{{output.jpeg_filename | posix_path}}" | |
158 | {%- else %} |
|
158 | {%- else %} | |
159 | <img src="data:image/jpeg;base64,{{ output.jpeg }}" |
|
159 | <img src="data:image/jpeg;base64,{{ output.jpeg }}" | |
160 | {%- endif %} |
|
160 | {%- endif %} | |
161 | {%- if 'metadata' in output and 'width' in output.metadata.get('jpeg', {}) %} |
|
161 | {%- if 'metadata' in output and 'width' in output.metadata.get('jpeg', {}) %} | |
162 | width={{output.metadata['jpeg']['width']}} |
|
162 | width={{output.metadata['jpeg']['width']}} | |
163 | {%- endif %} |
|
163 | {%- endif %} | |
164 | {%- if 'metadata' in output and 'height' in output.metadata.get('jpeg', {}) %} |
|
164 | {%- if 'metadata' in output and 'height' in output.metadata.get('jpeg', {}) %} | |
165 | height={{output.metadata['jpeg']['height']}} |
|
165 | height={{output.metadata['jpeg']['height']}} | |
166 | {%- endif %} |
|
166 | {%- endif %} | |
167 | > |
|
167 | > | |
168 | </div> |
|
168 | </div> | |
169 | {%- endblock data_jpg %} |
|
169 | {%- endblock data_jpg %} | |
170 |
|
170 | |||
171 | {% block data_latex scoped %} |
|
171 | {% block data_latex scoped %} | |
172 | <div class="output_latex output_subarea {{extra_class}}"> |
|
172 | <div class="output_latex output_subarea {{extra_class}}"> | |
173 | {{ output.latex }} |
|
173 | {{ output.latex }} | |
174 | </div> |
|
174 | </div> | |
175 | {%- endblock data_latex %} |
|
175 | {%- endblock data_latex %} | |
176 |
|
176 | |||
177 |
{% block |
|
177 | {% block error -%} | |
178 |
<div class="output_subarea output_text output_ |
|
178 | <div class="output_subarea output_text output_error"> | |
179 | <pre> |
|
179 | <pre> | |
180 | {{- super() -}} |
|
180 | {{- super() -}} | |
181 | </pre> |
|
181 | </pre> | |
182 | </div> |
|
182 | </div> | |
183 |
{%- endblock |
|
183 | {%- endblock error %} | |
184 |
|
184 | |||
185 | {%- block traceback_line %} |
|
185 | {%- block traceback_line %} | |
186 | {{ line | ansi2html }} |
|
186 | {{ line | ansi2html }} | |
187 | {%- endblock traceback_line %} |
|
187 | {%- endblock traceback_line %} | |
188 |
|
188 | |||
189 | {%- block data_text scoped %} |
|
189 | {%- block data_text scoped %} | |
190 | <div class="output_text output_subarea {{extra_class}}"> |
|
190 | <div class="output_text output_subarea {{extra_class}}"> | |
191 | <pre> |
|
191 | <pre> | |
192 | {{- output.text | ansi2html -}} |
|
192 | {{- output.text | ansi2html -}} | |
193 | </pre> |
|
193 | </pre> | |
194 | </div> |
|
194 | </div> | |
195 | {%- endblock -%} |
|
195 | {%- endblock -%} | |
196 |
|
196 | |||
197 | {%- block data_javascript scoped %} |
|
197 | {%- block data_javascript scoped %} | |
198 | <div class="output_subarea output_javascript {{extra_class}}"> |
|
198 | <div class="output_subarea output_javascript {{extra_class}}"> | |
199 | <script type="text/javascript"> |
|
199 | <script type="text/javascript"> | |
200 | {{ output.javascript }} |
|
200 | {{ output.javascript }} | |
201 | </script> |
|
201 | </script> | |
202 | </div> |
|
202 | </div> | |
203 | {%- endblock -%} |
|
203 | {%- endblock -%} |
@@ -1,223 +1,223 b'' | |||||
1 | ((= Latex base template (must inherit) |
|
1 | ((= Latex base template (must inherit) | |
2 | This template builds upon the abstract template, adding common latex output |
|
2 | This template builds upon the abstract template, adding common latex output | |
3 | functions. Figures, data_text, |
|
3 | functions. Figures, data_text, | |
4 | This template does not define a docclass, the inheriting class must define this.=)) |
|
4 | This template does not define a docclass, the inheriting class must define this.=)) | |
5 |
|
5 | |||
6 | ((*- extends 'display_priority.tplx' -*)) |
|
6 | ((*- extends 'display_priority.tplx' -*)) | |
7 |
|
7 | |||
8 | %=============================================================================== |
|
8 | %=============================================================================== | |
9 | % Abstract overrides |
|
9 | % Abstract overrides | |
10 | %=============================================================================== |
|
10 | %=============================================================================== | |
11 |
|
11 | |||
12 | ((* block header *)) |
|
12 | ((* block header *)) | |
13 | ((* block docclass *))((* endblock docclass *)) |
|
13 | ((* block docclass *))((* endblock docclass *)) | |
14 |
|
14 | |||
15 | ((* block packages *)) |
|
15 | ((* block packages *)) | |
16 | \usepackage{graphicx} % Used to insert images |
|
16 | \usepackage{graphicx} % Used to insert images | |
17 | \usepackage{adjustbox} % Used to constrain images to a maximum size |
|
17 | \usepackage{adjustbox} % Used to constrain images to a maximum size | |
18 | \usepackage{color} % Allow colors to be defined |
|
18 | \usepackage{color} % Allow colors to be defined | |
19 | \usepackage{enumerate} % Needed for markdown enumerations to work |
|
19 | \usepackage{enumerate} % Needed for markdown enumerations to work | |
20 | \usepackage{geometry} % Used to adjust the document margins |
|
20 | \usepackage{geometry} % Used to adjust the document margins | |
21 | \usepackage{amsmath} % Equations |
|
21 | \usepackage{amsmath} % Equations | |
22 | \usepackage{amssymb} % Equations |
|
22 | \usepackage{amssymb} % Equations | |
23 | \usepackage[mathletters]{ucs} % Extended unicode (utf-8) support |
|
23 | \usepackage[mathletters]{ucs} % Extended unicode (utf-8) support | |
24 | \usepackage[utf8x]{inputenc} % Allow utf-8 characters in the tex document |
|
24 | \usepackage[utf8x]{inputenc} % Allow utf-8 characters in the tex document | |
25 | \usepackage{fancyvrb} % verbatim replacement that allows latex |
|
25 | \usepackage{fancyvrb} % verbatim replacement that allows latex | |
26 | \usepackage{grffile} % extends the file name processing of package graphics |
|
26 | \usepackage{grffile} % extends the file name processing of package graphics | |
27 | % to support a larger range |
|
27 | % to support a larger range | |
28 | % The hyperref package gives us a pdf with properly built |
|
28 | % The hyperref package gives us a pdf with properly built | |
29 | % internal navigation ('pdf bookmarks' for the table of contents, |
|
29 | % internal navigation ('pdf bookmarks' for the table of contents, | |
30 | % internal cross-reference links, web links for URLs, etc.) |
|
30 | % internal cross-reference links, web links for URLs, etc.) | |
31 | \usepackage{hyperref} |
|
31 | \usepackage{hyperref} | |
32 | \usepackage{longtable} % longtable support required by pandoc >1.10 |
|
32 | \usepackage{longtable} % longtable support required by pandoc >1.10 | |
33 | \usepackage{booktabs} % table support for pandoc > 1.12.2 |
|
33 | \usepackage{booktabs} % table support for pandoc > 1.12.2 | |
34 | ((* endblock packages *)) |
|
34 | ((* endblock packages *)) | |
35 |
|
35 | |||
36 | ((* block definitions *)) |
|
36 | ((* block definitions *)) | |
37 | \definecolor{orange}{cmyk}{0,0.4,0.8,0.2} |
|
37 | \definecolor{orange}{cmyk}{0,0.4,0.8,0.2} | |
38 | \definecolor{darkorange}{rgb}{.71,0.21,0.01} |
|
38 | \definecolor{darkorange}{rgb}{.71,0.21,0.01} | |
39 | \definecolor{darkgreen}{rgb}{.12,.54,.11} |
|
39 | \definecolor{darkgreen}{rgb}{.12,.54,.11} | |
40 | \definecolor{myteal}{rgb}{.26, .44, .56} |
|
40 | \definecolor{myteal}{rgb}{.26, .44, .56} | |
41 | \definecolor{gray}{gray}{0.45} |
|
41 | \definecolor{gray}{gray}{0.45} | |
42 | \definecolor{lightgray}{gray}{.95} |
|
42 | \definecolor{lightgray}{gray}{.95} | |
43 | \definecolor{mediumgray}{gray}{.8} |
|
43 | \definecolor{mediumgray}{gray}{.8} | |
44 | \definecolor{inputbackground}{rgb}{.95, .95, .85} |
|
44 | \definecolor{inputbackground}{rgb}{.95, .95, .85} | |
45 | \definecolor{outputbackground}{rgb}{.95, .95, .95} |
|
45 | \definecolor{outputbackground}{rgb}{.95, .95, .95} | |
46 | \definecolor{traceback}{rgb}{1, .95, .95} |
|
46 | \definecolor{traceback}{rgb}{1, .95, .95} | |
47 | % ansi colors |
|
47 | % ansi colors | |
48 | \definecolor{red}{rgb}{.6,0,0} |
|
48 | \definecolor{red}{rgb}{.6,0,0} | |
49 | \definecolor{green}{rgb}{0,.65,0} |
|
49 | \definecolor{green}{rgb}{0,.65,0} | |
50 | \definecolor{brown}{rgb}{0.6,0.6,0} |
|
50 | \definecolor{brown}{rgb}{0.6,0.6,0} | |
51 | \definecolor{blue}{rgb}{0,.145,.698} |
|
51 | \definecolor{blue}{rgb}{0,.145,.698} | |
52 | \definecolor{purple}{rgb}{.698,.145,.698} |
|
52 | \definecolor{purple}{rgb}{.698,.145,.698} | |
53 | \definecolor{cyan}{rgb}{0,.698,.698} |
|
53 | \definecolor{cyan}{rgb}{0,.698,.698} | |
54 | \definecolor{lightgray}{gray}{0.5} |
|
54 | \definecolor{lightgray}{gray}{0.5} | |
55 |
|
55 | |||
56 | % bright ansi colors |
|
56 | % bright ansi colors | |
57 | \definecolor{darkgray}{gray}{0.25} |
|
57 | \definecolor{darkgray}{gray}{0.25} | |
58 | \definecolor{lightred}{rgb}{1.0,0.39,0.28} |
|
58 | \definecolor{lightred}{rgb}{1.0,0.39,0.28} | |
59 | \definecolor{lightgreen}{rgb}{0.48,0.99,0.0} |
|
59 | \definecolor{lightgreen}{rgb}{0.48,0.99,0.0} | |
60 | \definecolor{lightblue}{rgb}{0.53,0.81,0.92} |
|
60 | \definecolor{lightblue}{rgb}{0.53,0.81,0.92} | |
61 | \definecolor{lightpurple}{rgb}{0.87,0.63,0.87} |
|
61 | \definecolor{lightpurple}{rgb}{0.87,0.63,0.87} | |
62 | \definecolor{lightcyan}{rgb}{0.5,1.0,0.83} |
|
62 | \definecolor{lightcyan}{rgb}{0.5,1.0,0.83} | |
63 |
|
63 | |||
64 | % commands and environments needed by pandoc snippets |
|
64 | % commands and environments needed by pandoc snippets | |
65 | % extracted from the output of `pandoc -s` |
|
65 | % extracted from the output of `pandoc -s` | |
66 | \DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}} |
|
66 | \DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}} | |
67 | % Add ',fontsize=\small' for more characters per line |
|
67 | % Add ',fontsize=\small' for more characters per line | |
68 | \newenvironment{Shaded}{}{} |
|
68 | \newenvironment{Shaded}{}{} | |
69 | \newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} |
|
69 | \newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} | |
70 | \newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{{#1}}} |
|
70 | \newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{{#1}}} | |
71 | \newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} |
|
71 | \newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} | |
72 | \newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} |
|
72 | \newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} | |
73 | \newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} |
|
73 | \newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} | |
74 | \newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} |
|
74 | \newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} | |
75 | \newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} |
|
75 | \newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} | |
76 | \newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{{#1}}}} |
|
76 | \newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{{#1}}}} | |
77 | \newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{{#1}}} |
|
77 | \newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{{#1}}} | |
78 | \newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} |
|
78 | \newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} | |
79 | \newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{{#1}}} |
|
79 | \newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{{#1}}} | |
80 | \newcommand{\RegionMarkerTok}[1]{{#1}} |
|
80 | \newcommand{\RegionMarkerTok}[1]{{#1}} | |
81 | \newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} |
|
81 | \newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} | |
82 | \newcommand{\NormalTok}[1]{{#1}} |
|
82 | \newcommand{\NormalTok}[1]{{#1}} | |
83 |
|
83 | |||
84 | % Define a nice break command that doesn't care if a line doesn't already |
|
84 | % Define a nice break command that doesn't care if a line doesn't already | |
85 | % exist. |
|
85 | % exist. | |
86 | \def\br{\hspace*{\fill} \\* } |
|
86 | \def\br{\hspace*{\fill} \\* } | |
87 | % Math Jax compatability definitions |
|
87 | % Math Jax compatability definitions | |
88 | \def\gt{>} |
|
88 | \def\gt{>} | |
89 | \def\lt{<} |
|
89 | \def\lt{<} | |
90 | % Document parameters |
|
90 | % Document parameters | |
91 | ((* block title *))\title{((( resources.metadata.name | ascii_only | escape_latex )))}((* endblock title *)) |
|
91 | ((* block title *))\title{((( resources.metadata.name | ascii_only | escape_latex )))}((* endblock title *)) | |
92 | ((* block date *))((* endblock date *)) |
|
92 | ((* block date *))((* endblock date *)) | |
93 | ((* block author *))((* endblock author *)) |
|
93 | ((* block author *))((* endblock author *)) | |
94 | ((* endblock definitions *)) |
|
94 | ((* endblock definitions *)) | |
95 |
|
95 | |||
96 | ((* block commands *)) |
|
96 | ((* block commands *)) | |
97 | % Prevent overflowing lines due to hard-to-break entities |
|
97 | % Prevent overflowing lines due to hard-to-break entities | |
98 | \sloppy |
|
98 | \sloppy | |
99 | % Setup hyperref package |
|
99 | % Setup hyperref package | |
100 | \hypersetup{ |
|
100 | \hypersetup{ | |
101 | breaklinks=true, % so long urls are correctly broken across lines |
|
101 | breaklinks=true, % so long urls are correctly broken across lines | |
102 | colorlinks=true, |
|
102 | colorlinks=true, | |
103 | urlcolor=blue, |
|
103 | urlcolor=blue, | |
104 | linkcolor=darkorange, |
|
104 | linkcolor=darkorange, | |
105 | citecolor=darkgreen, |
|
105 | citecolor=darkgreen, | |
106 | } |
|
106 | } | |
107 | % Slightly bigger margins than the latex defaults |
|
107 | % Slightly bigger margins than the latex defaults | |
108 | ((* block margins *)) |
|
108 | ((* block margins *)) | |
109 | \geometry{verbose,tmargin=1in,bmargin=1in,lmargin=1in,rmargin=1in} |
|
109 | \geometry{verbose,tmargin=1in,bmargin=1in,lmargin=1in,rmargin=1in} | |
110 | ((* endblock margins *)) |
|
110 | ((* endblock margins *)) | |
111 | ((* endblock commands *)) |
|
111 | ((* endblock commands *)) | |
112 | ((* endblock header *)) |
|
112 | ((* endblock header *)) | |
113 |
|
113 | |||
114 | ((* block body *)) |
|
114 | ((* block body *)) | |
115 | \begin{document} |
|
115 | \begin{document} | |
116 |
|
116 | |||
117 | ((* block predoc *)) |
|
117 | ((* block predoc *)) | |
118 | ((* block maketitle *))\maketitle((* endblock maketitle *)) |
|
118 | ((* block maketitle *))\maketitle((* endblock maketitle *)) | |
119 | ((* block abstract *))((* endblock abstract *)) |
|
119 | ((* block abstract *))((* endblock abstract *)) | |
120 | ((* endblock predoc *)) |
|
120 | ((* endblock predoc *)) | |
121 |
|
121 | |||
122 | ((( super() ))) |
|
122 | ((( super() ))) | |
123 |
|
123 | |||
124 | % Add a bibliography block to the postdoc |
|
124 | % Add a bibliography block to the postdoc | |
125 | ((* block postdoc *)) |
|
125 | ((* block postdoc *)) | |
126 | ((* block bibliography *))((* endblock bibliography *)) |
|
126 | ((* block bibliography *))((* endblock bibliography *)) | |
127 | ((* endblock postdoc *)) |
|
127 | ((* endblock postdoc *)) | |
128 | \end{document} |
|
128 | \end{document} | |
129 | ((* endblock body *)) |
|
129 | ((* endblock body *)) | |
130 |
|
130 | |||
131 | %=============================================================================== |
|
131 | %=============================================================================== | |
132 | % Support blocks |
|
132 | % Support blocks | |
133 | %=============================================================================== |
|
133 | %=============================================================================== | |
134 |
|
134 | |||
135 | % Displaying simple data text |
|
135 | % Displaying simple data text | |
136 | ((* block data_text *)) |
|
136 | ((* block data_text *)) | |
137 | \begin{verbatim} |
|
137 | \begin{verbatim} | |
138 | ((( output.text ))) |
|
138 | ((( output.text ))) | |
139 | \end{verbatim} |
|
139 | \end{verbatim} | |
140 | ((* endblock data_text *)) |
|
140 | ((* endblock data_text *)) | |
141 |
|
141 | |||
142 | % Display python error text as-is |
|
142 | % Display python error text as-is | |
143 |
((* block |
|
143 | ((* block error *)) | |
144 | \begin{Verbatim}[commandchars=\\\{\}] |
|
144 | \begin{Verbatim}[commandchars=\\\{\}] | |
145 | ((( super() ))) |
|
145 | ((( super() ))) | |
146 | \end{Verbatim} |
|
146 | \end{Verbatim} | |
147 |
((* endblock |
|
147 | ((* endblock error *)) | |
148 | ((* block traceback_line *)) |
|
148 | ((* block traceback_line *)) | |
149 | ((( line | indent | strip_ansi | escape_latex ))) |
|
149 | ((( line | indent | strip_ansi | escape_latex ))) | |
150 | ((* endblock traceback_line *)) |
|
150 | ((* endblock traceback_line *)) | |
151 |
|
151 | |||
152 | % Display stream ouput with coloring |
|
152 | % Display stream ouput with coloring | |
153 | ((* block stream *)) |
|
153 | ((* block stream *)) | |
154 | \begin{Verbatim}[commandchars=\\\{\}] |
|
154 | \begin{Verbatim}[commandchars=\\\{\}] | |
155 | ((( output.text | escape_latex | ansi2latex ))) |
|
155 | ((( output.text | escape_latex | ansi2latex ))) | |
156 | \end{Verbatim} |
|
156 | \end{Verbatim} | |
157 | ((* endblock stream *)) |
|
157 | ((* endblock stream *)) | |
158 |
|
158 | |||
159 | % Display latex |
|
159 | % Display latex | |
160 | ((* block data_latex -*)) |
|
160 | ((* block data_latex -*)) | |
161 | ((*- if output.latex.startswith('$'): -*)) |
|
161 | ((*- if output.latex.startswith('$'): -*)) | |
162 | ((= Replace $ symbols with more explicit, equation block. =)) |
|
162 | ((= Replace $ symbols with more explicit, equation block. =)) | |
163 | \begin{equation*}\adjustbox{max width=\hsize}{$ |
|
163 | \begin{equation*}\adjustbox{max width=\hsize}{$ | |
164 | ((( output.latex | strip_dollars ))) |
|
164 | ((( output.latex | strip_dollars ))) | |
165 | $}\end{equation*} |
|
165 | $}\end{equation*} | |
166 | ((*- else -*)) |
|
166 | ((*- else -*)) | |
167 | ((( output.latex ))) |
|
167 | ((( output.latex ))) | |
168 | ((*- endif *)) |
|
168 | ((*- endif *)) | |
169 | ((* endblock data_latex *)) |
|
169 | ((* endblock data_latex *)) | |
170 |
|
170 | |||
171 | % Default mechanism for rendering figures |
|
171 | % Default mechanism for rendering figures | |
172 | ((*- block data_png -*))((( draw_figure(output.png_filename) )))((*- endblock -*)) |
|
172 | ((*- block data_png -*))((( draw_figure(output.png_filename) )))((*- endblock -*)) | |
173 | ((*- block data_jpg -*))((( draw_figure(output.jpeg_filename) )))((*- endblock -*)) |
|
173 | ((*- block data_jpg -*))((( draw_figure(output.jpeg_filename) )))((*- endblock -*)) | |
174 | ((*- block data_svg -*))((( draw_figure(output.svg_filename) )))((*- endblock -*)) |
|
174 | ((*- block data_svg -*))((( draw_figure(output.svg_filename) )))((*- endblock -*)) | |
175 | ((*- block data_pdf -*))((( draw_figure(output['application/pdf_filename']) )))((*- endblock -*)) |
|
175 | ((*- block data_pdf -*))((( draw_figure(output['application/pdf_filename']) )))((*- endblock -*)) | |
176 |
|
176 | |||
177 | % Draw a figure using the graphicx package. |
|
177 | % Draw a figure using the graphicx package. | |
178 | ((* macro draw_figure(filename) -*)) |
|
178 | ((* macro draw_figure(filename) -*)) | |
179 | ((* set filename = filename | posix_path *)) |
|
179 | ((* set filename = filename | posix_path *)) | |
180 | ((*- block figure scoped -*)) |
|
180 | ((*- block figure scoped -*)) | |
181 | \begin{center} |
|
181 | \begin{center} | |
182 | \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{((( filename )))} |
|
182 | \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{((( filename )))} | |
183 | \end{center} |
|
183 | \end{center} | |
184 | { \hspace*{\fill} \\} |
|
184 | { \hspace*{\fill} \\} | |
185 | ((*- endblock figure -*)) |
|
185 | ((*- endblock figure -*)) | |
186 | ((*- endmacro *)) |
|
186 | ((*- endmacro *)) | |
187 |
|
187 | |||
188 | % Draw heading cell. Explicitly map different cell levels. |
|
188 | % Draw heading cell. Explicitly map different cell levels. | |
189 | ((* block headingcell scoped *)) |
|
189 | ((* block headingcell scoped *)) | |
190 |
|
190 | |||
191 | ((* if cell.level == 1 -*)) |
|
191 | ((* if cell.level == 1 -*)) | |
192 | ((* block h1 -*))\section((* endblock h1 -*)) |
|
192 | ((* block h1 -*))\section((* endblock h1 -*)) | |
193 | ((* elif cell.level == 2 -*)) |
|
193 | ((* elif cell.level == 2 -*)) | |
194 | ((* block h2 -*))\subsection((* endblock h2 -*)) |
|
194 | ((* block h2 -*))\subsection((* endblock h2 -*)) | |
195 | ((* elif cell.level == 3 -*)) |
|
195 | ((* elif cell.level == 3 -*)) | |
196 | ((* block h3 -*))\subsubsection((* endblock h3 -*)) |
|
196 | ((* block h3 -*))\subsubsection((* endblock h3 -*)) | |
197 | ((* elif cell.level == 4 -*)) |
|
197 | ((* elif cell.level == 4 -*)) | |
198 | ((* block h4 -*))\paragraph((* endblock h4 -*)) |
|
198 | ((* block h4 -*))\paragraph((* endblock h4 -*)) | |
199 | ((* elif cell.level == 5 -*)) |
|
199 | ((* elif cell.level == 5 -*)) | |
200 | ((* block h5 -*))\subparagraph((* endblock h5 -*)) |
|
200 | ((* block h5 -*))\subparagraph((* endblock h5 -*)) | |
201 | ((* elif cell.level == 6 -*)) |
|
201 | ((* elif cell.level == 6 -*)) | |
202 | ((* block h6 -*))\\*\textit((* endblock h6 -*)) |
|
202 | ((* block h6 -*))\\*\textit((* endblock h6 -*)) | |
203 | ((*- endif -*)) |
|
203 | ((*- endif -*)) | |
204 | {((( cell.source | replace('\n', ' ') | citation2latex | strip_files_prefix | prevent_list_blocks | markdown2latex(markup='markdown_strict+tex_math_dollars') )))} |
|
204 | {((( cell.source | replace('\n', ' ') | citation2latex | strip_files_prefix | prevent_list_blocks | markdown2latex(markup='markdown_strict+tex_math_dollars') )))} | |
205 |
|
205 | |||
206 |
|
206 | |||
207 | ((* endblock headingcell *)) |
|
207 | ((* endblock headingcell *)) | |
208 |
|
208 | |||
209 |
% Redirect |
|
209 | % Redirect execute_result to display data priority. | |
210 |
((* block |
|
210 | ((* block execute_result scoped *)) | |
211 | ((* block data_priority scoped *)) |
|
211 | ((* block data_priority scoped *)) | |
212 | ((( super() ))) |
|
212 | ((( super() ))) | |
213 | ((* endblock *)) |
|
213 | ((* endblock *)) | |
214 |
((* endblock |
|
214 | ((* endblock execute_result *)) | |
215 |
|
215 | |||
216 | % Render markdown |
|
216 | % Render markdown | |
217 | ((* block markdowncell scoped *)) |
|
217 | ((* block markdowncell scoped *)) | |
218 | ((( cell.source | citation2latex | strip_files_prefix | markdown2latex ))) |
|
218 | ((( cell.source | citation2latex | strip_files_prefix | markdown2latex ))) | |
219 | ((* endblock markdowncell *)) |
|
219 | ((* endblock markdowncell *)) | |
220 |
|
220 | |||
221 | % Don't display unknown types |
|
221 | % Don't display unknown types | |
222 | ((* block unknowncell scoped *)) |
|
222 | ((* block unknowncell scoped *)) | |
223 | ((* endblock unknowncell *)) |
|
223 | ((* endblock unknowncell *)) |
@@ -1,45 +1,41 b'' | |||||
1 | ((= Auto-generated template file, DO NOT edit directly! |
|
1 | ((= Auto-generated template file, DO NOT edit directly! | |
2 | To edit this file, please refer to ../../skeleton/README.md =)) |
|
2 | To edit this file, please refer to ../../skeleton/README.md =)) | |
3 |
|
3 | |||
4 |
|
4 | |||
5 | ((*- extends 'null.tplx' -*)) |
|
5 | ((*- extends 'null.tplx' -*)) | |
6 |
|
6 | |||
7 | ((=display data priority=)) |
|
7 | ((=display data priority=)) | |
8 |
|
8 | |||
9 |
|
9 | |||
10 | ((*- block data_priority scoped -*)) |
|
10 | ((*- block data_priority scoped -*)) | |
11 | ((*- for type in output | filter_data_type -*)) |
|
11 | ((*- for type in output | filter_data_type -*)) | |
12 |
((*- if type |
|
12 | ((*- if type == 'application/pdf' -*)) | |
13 | ((*- block data_pdf -*)) |
|
13 | ((*- block data_pdf -*)) | |
14 | ((*- endblock -*)) |
|
14 | ((*- endblock -*)) | |
15 |
((*- e |
|
15 | ((*- elif type == 'image/svg+xml' -*)) | |
16 | ((*- if type in ['svg']*)) |
|
|||
17 | ((*- block data_svg -*)) |
|
16 | ((*- block data_svg -*)) | |
18 | ((*- endblock -*)) |
|
17 | ((*- endblock -*)) | |
19 |
((*- e |
|
18 | ((*- elif type == 'image/png' -*)) | |
20 | ((*- if type in ['png']*)) |
|
|||
21 | ((*- block data_png -*)) |
|
19 | ((*- block data_png -*)) | |
22 | ((*- endblock -*)) |
|
20 | ((*- endblock -*)) | |
23 |
((*- e |
|
21 | ((*- elif type == 'text/html' -*)) | |
24 | ((*- if type in ['html']*)) |
|
|||
25 | ((*- block data_html -*)) |
|
22 | ((*- block data_html -*)) | |
26 | ((*- endblock -*)) |
|
23 | ((*- endblock -*)) | |
27 |
((*- e |
|
24 | ((*- elif type == 'image/jpeg' -*)) | |
28 | ((*- if type in ['jpeg']*)) |
|
|||
29 | ((*- block data_jpg -*)) |
|
25 | ((*- block data_jpg -*)) | |
30 | ((*- endblock -*)) |
|
26 | ((*- endblock -*)) | |
31 |
((*- e |
|
27 | ((*- elif type == 'text/plain' -*)) | |
32 | ((*- if type in ['text']*)) |
|
|||
33 | ((*- block data_text -*)) |
|
28 | ((*- block data_text -*)) | |
34 | ((*- endblock -*)) |
|
29 | ((*- endblock -*)) | |
35 |
((*- e |
|
30 | ((*- elif type == 'text/latex' -*)) | |
36 | ((*- if type in ['latex']*)) |
|
|||
37 | ((*- block data_latex -*)) |
|
31 | ((*- block data_latex -*)) | |
38 | ((*- endblock -*)) |
|
32 | ((*- endblock -*)) | |
39 | ((*- endif -*)) |
|
33 | ((*- elif type == 'application/javascript' -*)) | |
40 | ((*- if type in ['javascript']*)) |
|
|||
41 | ((*- block data_javascript -*)) |
|
34 | ((*- block data_javascript -*)) | |
42 | ((*- endblock -*)) |
|
35 | ((*- endblock -*)) | |
|
36 | ((*- else -*)) | |||
|
37 | ((*- block data_other -*)) | |||
|
38 | ((*- endblock -*)) | |||
43 | ((*- endif -*)) |
|
39 | ((*- endif -*)) | |
44 | ((*- endfor -*)) |
|
40 | ((*- endfor -*)) | |
45 | ((*- endblock data_priority -*)) |
|
41 | ((*- endblock data_priority -*)) |
@@ -1,98 +1,96 b'' | |||||
1 | ((= Auto-generated template file, DO NOT edit directly! |
|
1 | ((= Auto-generated template file, DO NOT edit directly! | |
2 | To edit this file, please refer to ../../skeleton/README.md =)) |
|
2 | To edit this file, please refer to ../../skeleton/README.md =)) | |
3 |
|
3 | |||
4 |
|
4 | |||
5 | ((= |
|
5 | ((= | |
6 |
|
6 | |||
7 | DO NOT USE THIS AS A BASE, |
|
7 | DO NOT USE THIS AS A BASE, | |
8 | IF YOU ARE COPY AND PASTING THIS FILE |
|
8 | IF YOU ARE COPY AND PASTING THIS FILE | |
9 | YOU ARE PROBABLY DOING THINGS INCORRECTLY. |
|
9 | YOU ARE PROBABLY DOING THINGS INCORRECTLY. | |
10 |
|
10 | |||
11 | Null template, does nothing except defining a basic structure |
|
11 | Null template, does nothing except defining a basic structure | |
12 | To layout the different blocks of a notebook. |
|
12 | To layout the different blocks of a notebook. | |
13 |
|
13 | |||
14 | Subtemplates can override blocks to define their custom representation. |
|
14 | Subtemplates can override blocks to define their custom representation. | |
15 |
|
15 | |||
16 | If one of the block you do overwrite is not a leave block, consider |
|
16 | If one of the block you do overwrite is not a leave block, consider | |
17 | calling super. |
|
17 | calling super. | |
18 |
|
18 | |||
19 | ((*- block nonLeaveBlock -*)) |
|
19 | ((*- block nonLeaveBlock -*)) | |
20 | #add stuff at beginning |
|
20 | #add stuff at beginning | |
21 | ((( super() ))) |
|
21 | ((( super() ))) | |
22 | #add stuff at end |
|
22 | #add stuff at end | |
23 | ((*- endblock nonLeaveBlock -*)) |
|
23 | ((*- endblock nonLeaveBlock -*)) | |
24 |
|
24 | |||
25 | consider calling super even if it is a leave block, we might insert more blocks later. |
|
25 | consider calling super even if it is a leave block, we might insert more blocks later. | |
26 |
|
26 | |||
27 | =)) |
|
27 | =)) | |
28 | ((*- block header -*)) |
|
28 | ((*- block header -*)) | |
29 | ((*- endblock header -*)) |
|
29 | ((*- endblock header -*)) | |
30 | ((*- block body -*)) |
|
30 | ((*- block body -*)) | |
31 |
((*- for |
|
31 | ((*- for cell in nb.cells -*)) | |
32 |
((*- |
|
32 | ((*- block any_cell scoped -*)) | |
33 |
((*- |
|
33 | ((*- if cell.cell_type == 'code' -*)) | |
34 |
((*- |
|
34 | ((*- block codecell scoped -*)) | |
35 |
((*- block |
|
35 | ((*- block input_group -*)) | |
36 |
((*- block in |
|
36 | ((*- block in_prompt -*))((*- endblock in_prompt -*)) | |
37 |
|
|
37 | ((*- block input -*))((*- endblock input -*)) | |
38 |
|
|
38 | ((*- endblock input_group -*)) | |
39 |
|
|
39 | ((*- if cell.outputs -*)) | |
40 |
|
|
40 | ((*- block output_group -*)) | |
41 |
((*- block output_ |
|
41 | ((*- block output_prompt -*))((*- endblock output_prompt -*)) | |
42 |
|
|
42 | ((*- block outputs scoped -*)) | |
43 |
((*- |
|
43 | ((*- for output in cell.outputs -*)) | |
44 |
((*- |
|
44 | ((*- block output scoped -*)) | |
45 |
((*- |
|
45 | ((*- if output.output_type == 'execute_result' -*)) | |
46 | ((*- if output.output_type in ['pyout'] -*)) |
|
46 | ((*- block execute_result scoped -*))((*- endblock execute_result -*)) | |
47 | ((*- block pyout scoped -*))((*- endblock pyout -*)) |
|
47 | ((*- elif output.output_type == 'stream' -*)) | |
48 |
((*- |
|
48 | ((*- block stream scoped -*)) | |
49 |
((*- |
|
49 | ((*- if output.name == 'stdout' -*)) | |
50 |
((*- |
|
50 | ((*- block stream_stdout scoped -*)) | |
51 |
|
|
51 | ((*- endblock stream_stdout -*)) | |
52 |
|
|
52 | ((*- elif output.name == 'stderr' -*)) | |
53 |
((*- |
|
53 | ((*- block stream_stderr scoped -*)) | |
54 |
|
|
54 | ((*- endblock stream_stderr -*)) | |
55 |
|
|
55 | ((*- endif -*)) | |
56 |
|
|
56 | ((*- endblock stream -*)) | |
57 |
|
|
57 | ((*- elif output.output_type == 'display_data' -*)) | |
58 |
((*- |
|
58 | ((*- block display_data scoped -*)) | |
59 |
((*- block d |
|
59 | ((*- block data_priority scoped -*)) | |
60 |
|
|
60 | ((*- endblock data_priority -*)) | |
61 |
|
|
61 | ((*- endblock display_data -*)) | |
62 |
|
|
62 | ((*- elif output.output_type == 'error' -*)) | |
63 |
((*- |
|
63 | ((*- block error scoped -*)) | |
64 |
|
|
64 | ((*- for line in output.traceback -*)) | |
65 |
((*- |
|
65 | ((*- block traceback_line scoped -*))((*- endblock traceback_line -*)) | |
66 | ((*- block traceback_line scoped -*))((*- endblock traceback_line -*)) |
|
66 | ((*- endfor -*)) | |
67 |
|
|
67 | ((*- endblock error -*)) | |
68 |
|
|
68 | ((*- endif -*)) | |
69 |
|
|
69 | ((*- endblock output -*)) | |
70 |
|
|
70 | ((*- endfor -*)) | |
71 |
|
|
71 | ((*- endblock outputs -*)) | |
72 |
|
|
72 | ((*- endblock output_group -*)) | |
73 |
|
|
73 | ((*- endif -*)) | |
74 |
|
|
74 | ((*- endblock codecell -*)) | |
75 | ((*- endblock codecell -*)) |
|
75 | ((*- elif cell.cell_type in ['markdown'] -*)) | |
76 |
((*- |
|
76 | ((*- block markdowncell scoped-*)) | |
77 |
|
|
77 | ((*- endblock markdowncell -*)) | |
78 | ((*- endblock markdowncell -*)) |
|
78 | ((*- elif cell.cell_type in ['heading'] -*)) | |
79 |
((*- |
|
79 | ((*- block headingcell scoped-*)) | |
80 |
|
|
80 | ((*- endblock headingcell -*)) | |
81 | ((*- endblock headingcell -*)) |
|
81 | ((*- elif cell.cell_type in ['raw'] -*)) | |
82 |
((*- |
|
82 | ((*- block rawcell scoped -*)) | |
83 | ((*- block rawcell scoped -*)) |
|
83 | ((* if cell.metadata.get('raw_mimetype', '').lower() in resources.get('raw_mimetypes', ['']) *)) | |
84 | ((* if cell.metadata.get('raw_mimetype', '').lower() in resources.get('raw_mimetypes', ['']) *)) |
|
84 | ((( cell.source ))) | |
85 |
|
|
85 | ((* endif *)) | |
86 |
|
|
86 | ((*- endblock rawcell -*)) | |
87 |
|
|
87 | ((*- else -*)) | |
88 |
((*- |
|
88 | ((*- block unknowncell scoped-*)) | |
89 |
|
|
89 | ((*- endblock unknowncell -*)) | |
90 |
|
|
90 | ((*- endif -*)) | |
91 | ((*- endif -*)) |
|
91 | ((*- endblock any_cell -*)) | |
92 | ((*- endblock any_cell -*)) |
|
|||
93 | ((*- endfor -*)) |
|
|||
94 | ((*- endfor -*)) |
|
92 | ((*- endfor -*)) | |
95 | ((*- endblock body -*)) |
|
93 | ((*- endblock body -*)) | |
96 |
|
94 | |||
97 | ((*- block footer -*)) |
|
95 | ((*- block footer -*)) | |
98 | ((*- endblock footer -*)) |
|
96 | ((*- endblock footer -*)) |
@@ -1,45 +1,45 b'' | |||||
1 | ((= Black&white ipython input/output style =)) |
|
1 | ((= Black&white ipython input/output style =)) | |
2 |
|
2 | |||
3 | ((*- extends 'base.tplx' -*)) |
|
3 | ((*- extends 'base.tplx' -*)) | |
4 |
|
4 | |||
5 | %=============================================================================== |
|
5 | %=============================================================================== | |
6 | % Input |
|
6 | % Input | |
7 | %=============================================================================== |
|
7 | %=============================================================================== | |
8 |
|
8 | |||
9 | ((* block input scoped *)) |
|
9 | ((* block input scoped *)) | |
10 |
((( add_prompt(cell. |
|
10 | ((( add_prompt(cell.source, cell, 'In ') ))) | |
11 | ((* endblock input *)) |
|
11 | ((* endblock input *)) | |
12 |
|
12 | |||
13 |
|
13 | |||
14 | %=============================================================================== |
|
14 | %=============================================================================== | |
15 | % Output |
|
15 | % Output | |
16 | %=============================================================================== |
|
16 | %=============================================================================== | |
17 |
|
17 | |||
18 |
((* block |
|
18 | ((* block execute_result scoped *)) | |
19 | ((*- for type in output | filter_data_type -*)) |
|
19 | ((*- for type in output | filter_data_type -*)) | |
20 | ((*- if type in ['text']*)) |
|
20 | ((*- if type in ['text']*)) | |
21 | ((( add_prompt(output.text, cell, 'Out') ))) |
|
21 | ((( add_prompt(output.text, cell, 'Out') ))) | |
22 | ((*- else -*)) |
|
22 | ((*- else -*)) | |
23 | \verb+Out[((( cell.prompt_number )))]:+((( super() ))) |
|
23 | \verb+Out[((( cell.prompt_number )))]:+((( super() ))) | |
24 | ((*- endif -*)) |
|
24 | ((*- endif -*)) | |
25 | ((*- endfor -*)) |
|
25 | ((*- endfor -*)) | |
26 |
((* endblock |
|
26 | ((* endblock execute_result *)) | |
27 |
|
27 | |||
28 |
|
28 | |||
29 | %============================================================================== |
|
29 | %============================================================================== | |
30 | % Support Macros |
|
30 | % Support Macros | |
31 | %============================================================================== |
|
31 | %============================================================================== | |
32 |
|
32 | |||
33 | % Name: draw_prompt |
|
33 | % Name: draw_prompt | |
34 | % Purpose: Renders an output/input prompt |
|
34 | % Purpose: Renders an output/input prompt | |
35 | ((* macro add_prompt(text, cell, prompt) -*)) |
|
35 | ((* macro add_prompt(text, cell, prompt) -*)) | |
36 | ((*- if cell.prompt_number is defined -*)) |
|
36 | ((*- if cell.prompt_number is defined -*)) | |
37 | ((*- set prompt_number = "" ~ (cell.prompt_number | replace(None, " ")) -*)) |
|
37 | ((*- set prompt_number = "" ~ (cell.prompt_number | replace(None, " ")) -*)) | |
38 | ((*- else -*)) |
|
38 | ((*- else -*)) | |
39 | ((*- set prompt_number = " " -*)) |
|
39 | ((*- set prompt_number = " " -*)) | |
40 | ((*- endif -*)) |
|
40 | ((*- endif -*)) | |
41 | ((*- set indentation = " " * (prompt_number | length + 7) -*)) |
|
41 | ((*- set indentation = " " * (prompt_number | length + 7) -*)) | |
42 | \begin{verbatim} |
|
42 | \begin{verbatim} | |
43 | (((- text | add_prompts(first=prompt ~ '[' ~ prompt_number ~ ']: ', cont=indentation) -))) |
|
43 | (((- text | add_prompts(first=prompt ~ '[' ~ prompt_number ~ ']: ', cont=indentation) -))) | |
44 | \end{verbatim} |
|
44 | \end{verbatim} | |
45 | ((*- endmacro *)) |
|
45 | ((*- endmacro *)) |
@@ -1,13 +1,13 b'' | |||||
1 | ((= Black&white Python input/output style =)) |
|
1 | ((= Black&white Python input/output style =)) | |
2 |
|
2 | |||
3 | ((*- extends 'base.tplx' -*)) |
|
3 | ((*- extends 'base.tplx' -*)) | |
4 |
|
4 | |||
5 | %=============================================================================== |
|
5 | %=============================================================================== | |
6 | % Input |
|
6 | % Input | |
7 | %=============================================================================== |
|
7 | %=============================================================================== | |
8 |
|
8 | |||
9 | ((* block input scoped *)) |
|
9 | ((* block input scoped *)) | |
10 | \begin{verbatim} |
|
10 | \begin{verbatim} | |
11 |
((( cell. |
|
11 | ((( cell.source | add_prompts ))) | |
12 | \end{verbatim} |
|
12 | \end{verbatim} | |
13 | ((* endblock input *)) |
|
13 | ((* endblock input *)) |
@@ -1,58 +1,58 b'' | |||||
1 | ((= IPython input/output style =)) |
|
1 | ((= IPython input/output style =)) | |
2 |
|
2 | |||
3 | ((*- extends 'base.tplx' -*)) |
|
3 | ((*- extends 'base.tplx' -*)) | |
4 |
|
4 | |||
5 | % Custom definitions |
|
5 | % Custom definitions | |
6 | ((* block definitions *)) |
|
6 | ((* block definitions *)) | |
7 | ((( super() ))) |
|
7 | ((( super() ))) | |
8 |
|
8 | |||
9 | % Pygments definitions |
|
9 | % Pygments definitions | |
10 | ((( resources.latex.pygments_definitions ))) |
|
10 | ((( resources.latex.pygments_definitions ))) | |
11 |
|
11 | |||
12 | % Exact colors from NB |
|
12 | % Exact colors from NB | |
13 | \definecolor{incolor}{rgb}{0.0, 0.0, 0.5} |
|
13 | \definecolor{incolor}{rgb}{0.0, 0.0, 0.5} | |
14 | \definecolor{outcolor}{rgb}{0.545, 0.0, 0.0} |
|
14 | \definecolor{outcolor}{rgb}{0.545, 0.0, 0.0} | |
15 |
|
15 | |||
16 | ((* endblock definitions *)) |
|
16 | ((* endblock definitions *)) | |
17 |
|
17 | |||
18 | %=============================================================================== |
|
18 | %=============================================================================== | |
19 | % Input |
|
19 | % Input | |
20 | %=============================================================================== |
|
20 | %=============================================================================== | |
21 |
|
21 | |||
22 | ((* block input scoped *)) |
|
22 | ((* block input scoped *)) | |
23 |
((( add_prompt(cell. |
|
23 | ((( add_prompt(cell.source | highlight_code(strip_verbatim=True), cell, 'In ', 'incolor') ))) | |
24 | ((* endblock input *)) |
|
24 | ((* endblock input *)) | |
25 |
|
25 | |||
26 |
|
26 | |||
27 | %=============================================================================== |
|
27 | %=============================================================================== | |
28 | % Output |
|
28 | % Output | |
29 | %=============================================================================== |
|
29 | %=============================================================================== | |
30 |
|
30 | |||
31 |
((* block |
|
31 | ((* block execute_result scoped *)) | |
32 | ((*- for type in output | filter_data_type -*)) |
|
32 | ((*- for type in output | filter_data_type -*)) | |
33 | ((*- if type in ['text']*)) |
|
33 | ((*- if type in ['text']*)) | |
34 | ((( add_prompt(output.text | escape_latex, cell, 'Out', 'outcolor') ))) |
|
34 | ((( add_prompt(output.text | escape_latex, cell, 'Out', 'outcolor') ))) | |
35 | ((* else -*)) |
|
35 | ((* else -*)) | |
36 | \texttt{\color{outcolor}Out[{\color{outcolor}((( cell.prompt_number )))}]:}((( super() ))) |
|
36 | \texttt{\color{outcolor}Out[{\color{outcolor}((( cell.prompt_number )))}]:}((( super() ))) | |
37 | ((*- endif -*)) |
|
37 | ((*- endif -*)) | |
38 | ((*- endfor -*)) |
|
38 | ((*- endfor -*)) | |
39 |
((* endblock |
|
39 | ((* endblock execute_result *)) | |
40 |
|
40 | |||
41 |
|
41 | |||
42 | %============================================================================== |
|
42 | %============================================================================== | |
43 | % Support Macros |
|
43 | % Support Macros | |
44 | %============================================================================== |
|
44 | %============================================================================== | |
45 |
|
45 | |||
46 | % Name: draw_prompt |
|
46 | % Name: draw_prompt | |
47 | % Purpose: Renders an output/input prompt |
|
47 | % Purpose: Renders an output/input prompt | |
48 | ((* macro add_prompt(text, cell, prompt, prompt_color) -*)) |
|
48 | ((* macro add_prompt(text, cell, prompt, prompt_color) -*)) | |
49 | ((*- if cell.prompt_number is defined -*)) |
|
49 | ((*- if cell.prompt_number is defined -*)) | |
50 | ((*- set prompt_number = "" ~ (cell.prompt_number | replace(None, " ")) -*)) |
|
50 | ((*- set prompt_number = "" ~ (cell.prompt_number | replace(None, " ")) -*)) | |
51 | ((*- else -*)) |
|
51 | ((*- else -*)) | |
52 | ((*- set prompt_number = " " -*)) |
|
52 | ((*- set prompt_number = " " -*)) | |
53 | ((*- endif -*)) |
|
53 | ((*- endif -*)) | |
54 | ((*- set indention = " " * (prompt_number | length + 7) -*)) |
|
54 | ((*- set indention = " " * (prompt_number | length + 7) -*)) | |
55 | \begin{Verbatim}[commandchars=\\\{\}] |
|
55 | \begin{Verbatim}[commandchars=\\\{\}] | |
56 | ((( text | add_prompts(first='{\color{' ~ prompt_color ~ '}' ~ prompt ~ '[{\\color{' ~ prompt_color ~ '}' ~ prompt_number ~ '}]:} ', cont=indention) ))) |
|
56 | ((( text | add_prompts(first='{\color{' ~ prompt_color ~ '}' ~ prompt ~ '[{\\color{' ~ prompt_color ~ '}' ~ prompt_number ~ '}]:} ', cont=indention) ))) | |
57 | \end{Verbatim} |
|
57 | \end{Verbatim} | |
58 | ((*- endmacro *)) |
|
58 | ((*- endmacro *)) |
@@ -1,21 +1,21 b'' | |||||
1 | ((= Python input/output style =)) |
|
1 | ((= Python input/output style =)) | |
2 |
|
2 | |||
3 | ((*- extends 'base.tplx' -*)) |
|
3 | ((*- extends 'base.tplx' -*)) | |
4 |
|
4 | |||
5 | % Custom definitions |
|
5 | % Custom definitions | |
6 | ((* block definitions *)) |
|
6 | ((* block definitions *)) | |
7 | ((( super() ))) |
|
7 | ((( super() ))) | |
8 |
|
8 | |||
9 | % Pygments definitions |
|
9 | % Pygments definitions | |
10 | ((( resources.latex.pygments_definitions ))) |
|
10 | ((( resources.latex.pygments_definitions ))) | |
11 | ((* endblock definitions *)) |
|
11 | ((* endblock definitions *)) | |
12 |
|
12 | |||
13 | %=============================================================================== |
|
13 | %=============================================================================== | |
14 | % Input |
|
14 | % Input | |
15 | %=============================================================================== |
|
15 | %=============================================================================== | |
16 |
|
16 | |||
17 | ((* block input scoped *)) |
|
17 | ((* block input scoped *)) | |
18 | \begin{Verbatim}[commandchars=\\\{\}] |
|
18 | \begin{Verbatim}[commandchars=\\\{\}] | |
19 |
((( cell. |
|
19 | ((( cell.source | highlight_code(strip_verbatim=True) | add_prompts ))) | |
20 | \end{Verbatim} |
|
20 | \end{Verbatim} | |
21 | ((* endblock input *)) |
|
21 | ((* endblock input *)) |
@@ -1,68 +1,68 b'' | |||||
1 | {% extends 'display_priority.tpl' %} |
|
1 | {% extends 'display_priority.tpl' %} | |
2 |
|
2 | |||
3 |
|
3 | |||
4 | {% block in_prompt %} |
|
4 | {% block in_prompt %} | |
5 | {% endblock in_prompt %} |
|
5 | {% endblock in_prompt %} | |
6 |
|
6 | |||
7 | {% block output_prompt %} |
|
7 | {% block output_prompt %} | |
8 | {%- endblock output_prompt %} |
|
8 | {%- endblock output_prompt %} | |
9 |
|
9 | |||
10 | {% block input %} |
|
10 | {% block input %} | |
11 |
{{ cell. |
|
11 | {{ cell.source | indent(4)}} | |
12 | {% endblock input %} |
|
12 | {% endblock input %} | |
13 |
|
13 | |||
14 |
{% block |
|
14 | {% block error %} | |
15 | {{ super() }} |
|
15 | {{ super() }} | |
16 |
{% endblock |
|
16 | {% endblock error %} | |
17 |
|
17 | |||
18 | {% block traceback_line %} |
|
18 | {% block traceback_line %} | |
19 | {{ line | indent | strip_ansi }} |
|
19 | {{ line | indent | strip_ansi }} | |
20 | {% endblock traceback_line %} |
|
20 | {% endblock traceback_line %} | |
21 |
|
21 | |||
22 |
{% block |
|
22 | {% block execute_result %} | |
23 |
|
23 | |||
24 | {% block data_priority scoped %} |
|
24 | {% block data_priority scoped %} | |
25 | {{ super() }} |
|
25 | {{ super() }} | |
26 | {% endblock %} |
|
26 | {% endblock %} | |
27 |
{% endblock |
|
27 | {% endblock execute_result %} | |
28 |
|
28 | |||
29 | {% block stream %} |
|
29 | {% block stream %} | |
30 | {{ output.text | indent }} |
|
30 | {{ output.text | indent }} | |
31 | {% endblock stream %} |
|
31 | {% endblock stream %} | |
32 |
|
32 | |||
33 | {% block data_svg %} |
|
33 | {% block data_svg %} | |
34 | ![svg]({{ output.svg_filename | path2url }}) |
|
34 | ![svg]({{ output.svg_filename | path2url }}) | |
35 | {% endblock data_svg %} |
|
35 | {% endblock data_svg %} | |
36 |
|
36 | |||
37 | {% block data_png %} |
|
37 | {% block data_png %} | |
38 | ![png]({{ output.png_filename | path2url }}) |
|
38 | ![png]({{ output.png_filename | path2url }}) | |
39 | {% endblock data_png %} |
|
39 | {% endblock data_png %} | |
40 |
|
40 | |||
41 | {% block data_jpg %} |
|
41 | {% block data_jpg %} | |
42 | ![jpeg]({{ output.jpeg_filename | path2url }}) |
|
42 | ![jpeg]({{ output.jpeg_filename | path2url }}) | |
43 | {% endblock data_jpg %} |
|
43 | {% endblock data_jpg %} | |
44 |
|
44 | |||
45 | {% block data_latex %} |
|
45 | {% block data_latex %} | |
46 | {{ output.latex }} |
|
46 | {{ output.latex }} | |
47 | {% endblock data_latex %} |
|
47 | {% endblock data_latex %} | |
48 |
|
48 | |||
49 | {% block data_html scoped %} |
|
49 | {% block data_html scoped %} | |
50 | {{ output.html }} |
|
50 | {{ output.html }} | |
51 | {% endblock data_html %} |
|
51 | {% endblock data_html %} | |
52 |
|
52 | |||
53 | {% block data_text scoped %} |
|
53 | {% block data_text scoped %} | |
54 | {{ output.text | indent }} |
|
54 | {{ output.text | indent }} | |
55 | {% endblock data_text %} |
|
55 | {% endblock data_text %} | |
56 |
|
56 | |||
57 | {% block markdowncell scoped %} |
|
57 | {% block markdowncell scoped %} | |
58 | {{ cell.source }} |
|
58 | {{ cell.source }} | |
59 | {% endblock markdowncell %} |
|
59 | {% endblock markdowncell %} | |
60 |
|
60 | |||
61 |
|
61 | |||
62 | {% block headingcell scoped %} |
|
62 | {% block headingcell scoped %} | |
63 | {{ '#' * cell.level }} {{ cell.source | replace('\n', ' ') }} |
|
63 | {{ '#' * cell.level }} {{ cell.source | replace('\n', ' ') }} | |
64 | {% endblock headingcell %} |
|
64 | {% endblock headingcell %} | |
65 |
|
65 | |||
66 | {% block unknowncell scoped %} |
|
66 | {% block unknowncell scoped %} | |
67 | unknown type {{ cell.type }} |
|
67 | unknown type {{ cell.type }} | |
68 | {% endblock unknowncell %} No newline at end of file |
|
68 | {% endblock unknowncell %} |
@@ -1,21 +1,21 b'' | |||||
1 | {%- extends 'null.tpl' -%} |
|
1 | {%- extends 'null.tpl' -%} | |
2 |
|
2 | |||
3 | {% block header %} |
|
3 | {% block header %} | |
4 | # coding: utf-8 |
|
4 | # coding: utf-8 | |
5 | {% endblock header %} |
|
5 | {% endblock header %} | |
6 |
|
6 | |||
7 | {% block in_prompt %} |
|
7 | {% block in_prompt %} | |
8 | # In[{{ cell.prompt_number if cell.prompt_number else ' ' }}]: |
|
8 | # In[{{ cell.prompt_number if cell.prompt_number else ' ' }}]: | |
9 | {% endblock in_prompt %} |
|
9 | {% endblock in_prompt %} | |
10 |
|
10 | |||
11 | {% block input %} |
|
11 | {% block input %} | |
12 |
{{ cell. |
|
12 | {{ cell.source | ipython2python }} | |
13 | {% endblock input %} |
|
13 | {% endblock input %} | |
14 |
|
14 | |||
15 | {% block markdowncell scoped %} |
|
15 | {% block markdowncell scoped %} | |
16 | {{ cell.source | comment_lines }} |
|
16 | {{ cell.source | comment_lines }} | |
17 | {% endblock markdowncell %} |
|
17 | {% endblock markdowncell %} | |
18 |
|
18 | |||
19 | {% block headingcell scoped %} |
|
19 | {% block headingcell scoped %} | |
20 | {{ '#' * cell.level }}{{ cell.source | replace('\n', ' ') | comment_lines }} |
|
20 | {{ '#' * cell.level }}{{ cell.source | replace('\n', ' ') | comment_lines }} | |
21 | {% endblock headingcell %} |
|
21 | {% endblock headingcell %} |
@@ -1,80 +1,80 b'' | |||||
1 | {%- extends 'display_priority.tpl' -%} |
|
1 | {%- extends 'display_priority.tpl' -%} | |
2 |
|
2 | |||
3 |
|
3 | |||
4 | {% block in_prompt %} |
|
4 | {% block in_prompt %} | |
5 | {% endblock in_prompt %} |
|
5 | {% endblock in_prompt %} | |
6 |
|
6 | |||
7 | {% block output_prompt %} |
|
7 | {% block output_prompt %} | |
8 | {% endblock output_prompt %} |
|
8 | {% endblock output_prompt %} | |
9 |
|
9 | |||
10 | {% block input %} |
|
10 | {% block input %} | |
11 |
{%- if cell. |
|
11 | {%- if cell.source.strip() -%} | |
12 | .. code:: python |
|
12 | .. code:: python | |
13 |
|
13 | |||
14 |
{{ cell. |
|
14 | {{ cell.source | indent}} | |
15 | {%- endif -%} |
|
15 | {%- endif -%} | |
16 | {% endblock input %} |
|
16 | {% endblock input %} | |
17 |
|
17 | |||
18 |
{% block |
|
18 | {% block error %} | |
19 | :: |
|
19 | :: | |
20 |
|
20 | |||
21 | {{ super() }} |
|
21 | {{ super() }} | |
22 |
{% endblock |
|
22 | {% endblock error %} | |
23 |
|
23 | |||
24 | {% block traceback_line %} |
|
24 | {% block traceback_line %} | |
25 | {{ line | indent | strip_ansi }} |
|
25 | {{ line | indent | strip_ansi }} | |
26 | {% endblock traceback_line %} |
|
26 | {% endblock traceback_line %} | |
27 |
|
27 | |||
28 |
{% block |
|
28 | {% block execute_result %} | |
29 | {% block data_priority scoped %} |
|
29 | {% block data_priority scoped %} | |
30 | {{ super() }} |
|
30 | {{ super() }} | |
31 | {% endblock %} |
|
31 | {% endblock %} | |
32 |
{% endblock |
|
32 | {% endblock execute_result %} | |
33 |
|
33 | |||
34 | {% block stream %} |
|
34 | {% block stream %} | |
35 | .. parsed-literal:: |
|
35 | .. parsed-literal:: | |
36 |
|
36 | |||
37 | {{ output.text | indent }} |
|
37 | {{ output.text | indent }} | |
38 | {% endblock stream %} |
|
38 | {% endblock stream %} | |
39 |
|
39 | |||
40 | {% block data_svg %} |
|
40 | {% block data_svg %} | |
41 | .. image:: {{ output.svg_filename|urlencode }} |
|
41 | .. image:: {{ output.svg_filename|urlencode }} | |
42 | {% endblock data_svg %} |
|
42 | {% endblock data_svg %} | |
43 |
|
43 | |||
44 | {% block data_png %} |
|
44 | {% block data_png %} | |
45 | .. image:: {{ output.png_filename|urlencode }} |
|
45 | .. image:: {{ output.png_filename|urlencode }} | |
46 | {% endblock data_png %} |
|
46 | {% endblock data_png %} | |
47 |
|
47 | |||
48 | {% block data_jpg %} |
|
48 | {% block data_jpg %} | |
49 | .. image:: {{ output.jpeg_filename|urlencode }} |
|
49 | .. image:: {{ output.jpeg_filename|urlencode }} | |
50 | {% endblock data_jpg %} |
|
50 | {% endblock data_jpg %} | |
51 |
|
51 | |||
52 | {% block data_latex %} |
|
52 | {% block data_latex %} | |
53 | .. math:: |
|
53 | .. math:: | |
54 |
|
54 | |||
55 | {{ output.latex | strip_dollars | indent }} |
|
55 | {{ output.latex | strip_dollars | indent }} | |
56 | {% endblock data_latex %} |
|
56 | {% endblock data_latex %} | |
57 |
|
57 | |||
58 | {% block data_text scoped %} |
|
58 | {% block data_text scoped %} | |
59 | .. parsed-literal:: |
|
59 | .. parsed-literal:: | |
60 |
|
60 | |||
61 | {{ output.text | indent }} |
|
61 | {{ output.text | indent }} | |
62 | {% endblock data_text %} |
|
62 | {% endblock data_text %} | |
63 |
|
63 | |||
64 | {% block data_html scoped %} |
|
64 | {% block data_html scoped %} | |
65 | .. raw:: html |
|
65 | .. raw:: html | |
66 |
|
66 | |||
67 | {{ output.html | indent }} |
|
67 | {{ output.html | indent }} | |
68 | {% endblock data_html %} |
|
68 | {% endblock data_html %} | |
69 |
|
69 | |||
70 | {% block markdowncell scoped %} |
|
70 | {% block markdowncell scoped %} | |
71 | {{ cell.source | markdown2rst }} |
|
71 | {{ cell.source | markdown2rst }} | |
72 | {% endblock markdowncell %} |
|
72 | {% endblock markdowncell %} | |
73 |
|
73 | |||
74 | {% block headingcell scoped %} |
|
74 | {% block headingcell scoped %} | |
75 | {{ ("#" * cell.level + cell.source) | replace('\n', ' ') | markdown2rst }} |
|
75 | {{ ("#" * cell.level + cell.source) | replace('\n', ' ') | markdown2rst }} | |
76 | {% endblock headingcell %} |
|
76 | {% endblock headingcell %} | |
77 |
|
77 | |||
78 | {% block unknowncell scoped %} |
|
78 | {% block unknowncell scoped %} | |
79 | unknown type {{cell.type}} |
|
79 | unknown type {{cell.type}} | |
80 | {% endblock unknowncell %} |
|
80 | {% endblock unknowncell %} |
@@ -1,41 +1,37 b'' | |||||
1 | {%- extends 'null.tpl' -%} |
|
1 | {%- extends 'null.tpl' -%} | |
2 |
|
2 | |||
3 | {#display data priority#} |
|
3 | {#display data priority#} | |
4 |
|
4 | |||
5 |
|
5 | |||
6 | {%- block data_priority scoped -%} |
|
6 | {%- block data_priority scoped -%} | |
7 | {%- for type in output | filter_data_type -%} |
|
7 | {%- for type in output | filter_data_type -%} | |
8 |
{%- if type |
|
8 | {%- if type == 'application/pdf' -%} | |
9 | {%- block data_pdf -%} |
|
9 | {%- block data_pdf -%} | |
10 | {%- endblock -%} |
|
10 | {%- endblock -%} | |
11 | {%- endif -%} |
|
11 | {%- elif type == 'image/svg+xml' -%} | |
12 | {%- if type in ['svg']%} |
|
|||
13 | {%- block data_svg -%} |
|
12 | {%- block data_svg -%} | |
14 | {%- endblock -%} |
|
13 | {%- endblock -%} | |
15 |
{%- e |
|
14 | {%- elif type == 'image/png' -%} | |
16 | {%- if type in ['png']%} |
|
|||
17 | {%- block data_png -%} |
|
15 | {%- block data_png -%} | |
18 | {%- endblock -%} |
|
16 | {%- endblock -%} | |
19 |
{%- e |
|
17 | {%- elif type == 'text/html' -%} | |
20 | {%- if type in ['html']%} |
|
|||
21 | {%- block data_html -%} |
|
18 | {%- block data_html -%} | |
22 | {%- endblock -%} |
|
19 | {%- endblock -%} | |
23 |
{%- e |
|
20 | {%- elif type == 'image/jpeg' -%} | |
24 | {%- if type in ['jpeg']%} |
|
|||
25 | {%- block data_jpg -%} |
|
21 | {%- block data_jpg -%} | |
26 | {%- endblock -%} |
|
22 | {%- endblock -%} | |
27 |
{%- e |
|
23 | {%- elif type == 'text/plain' -%} | |
28 | {%- if type in ['text']%} |
|
|||
29 | {%- block data_text -%} |
|
24 | {%- block data_text -%} | |
30 | {%- endblock -%} |
|
25 | {%- endblock -%} | |
31 |
{%- e |
|
26 | {%- elif type == 'text/latex' -%} | |
32 | {%- if type in ['latex']%} |
|
|||
33 | {%- block data_latex -%} |
|
27 | {%- block data_latex -%} | |
34 | {%- endblock -%} |
|
28 | {%- endblock -%} | |
35 | {%- endif -%} |
|
29 | {%- elif type == 'application/javascript' -%} | |
36 | {%- if type in ['javascript']%} |
|
|||
37 | {%- block data_javascript -%} |
|
30 | {%- block data_javascript -%} | |
38 | {%- endblock -%} |
|
31 | {%- endblock -%} | |
|
32 | {%- else -%} | |||
|
33 | {%- block data_other -%} | |||
|
34 | {%- endblock -%} | |||
39 | {%- endif -%} |
|
35 | {%- endif -%} | |
40 | {%- endfor -%} |
|
36 | {%- endfor -%} | |
41 | {%- endblock data_priority -%} |
|
37 | {%- endblock data_priority -%} |
@@ -1,94 +1,92 b'' | |||||
1 | {# |
|
1 | {# | |
2 |
|
2 | |||
3 | DO NOT USE THIS AS A BASE, |
|
3 | DO NOT USE THIS AS A BASE, | |
4 | IF YOU ARE COPY AND PASTING THIS FILE |
|
4 | IF YOU ARE COPY AND PASTING THIS FILE | |
5 | YOU ARE PROBABLY DOING THINGS INCORRECTLY. |
|
5 | YOU ARE PROBABLY DOING THINGS INCORRECTLY. | |
6 |
|
6 | |||
7 | Null template, does nothing except defining a basic structure |
|
7 | Null template, does nothing except defining a basic structure | |
8 | To layout the different blocks of a notebook. |
|
8 | To layout the different blocks of a notebook. | |
9 |
|
9 | |||
10 | Subtemplates can override blocks to define their custom representation. |
|
10 | Subtemplates can override blocks to define their custom representation. | |
11 |
|
11 | |||
12 | If one of the block you do overwrite is not a leave block, consider |
|
12 | If one of the block you do overwrite is not a leave block, consider | |
13 | calling super. |
|
13 | calling super. | |
14 |
|
14 | |||
15 | {%- block nonLeaveBlock -%} |
|
15 | {%- block nonLeaveBlock -%} | |
16 | #add stuff at beginning |
|
16 | #add stuff at beginning | |
17 | {{ super() }} |
|
17 | {{ super() }} | |
18 | #add stuff at end |
|
18 | #add stuff at end | |
19 | {%- endblock nonLeaveBlock -%} |
|
19 | {%- endblock nonLeaveBlock -%} | |
20 |
|
20 | |||
21 | consider calling super even if it is a leave block, we might insert more blocks later. |
|
21 | consider calling super even if it is a leave block, we might insert more blocks later. | |
22 |
|
22 | |||
23 | #} |
|
23 | #} | |
24 | {%- block header -%} |
|
24 | {%- block header -%} | |
25 | {%- endblock header -%} |
|
25 | {%- endblock header -%} | |
26 | {%- block body -%} |
|
26 | {%- block body -%} | |
27 |
{%- for |
|
27 | {%- for cell in nb.cells -%} | |
28 | {%- for cell in worksheet.cells -%} |
|
28 | {%- block any_cell scoped -%} | |
29 |
{%- |
|
29 | {%- if cell.cell_type == 'code' -%} | |
30 |
{%- |
|
30 | {%- block codecell scoped -%} | |
31 |
{%- block |
|
31 | {%- block input_group -%} | |
32 |
{%- block in |
|
32 | {%- block in_prompt -%}{%- endblock in_prompt -%} | |
33 |
|
|
33 | {%- block input -%}{%- endblock input -%} | |
34 |
|
|
34 | {%- endblock input_group -%} | |
35 |
|
|
35 | {%- if cell.outputs -%} | |
36 |
|
|
36 | {%- block output_group -%} | |
37 |
{%- block output_ |
|
37 | {%- block output_prompt -%}{%- endblock output_prompt -%} | |
38 |
|
|
38 | {%- block outputs scoped -%} | |
39 |
{%- |
|
39 | {%- for output in cell.outputs -%} | |
40 |
{%- |
|
40 | {%- block output scoped -%} | |
41 |
{%- |
|
41 | {%- if output.output_type == 'execute_result' -%} | |
42 | {%- if output.output_type in ['pyout'] -%} |
|
42 | {%- block execute_result scoped -%}{%- endblock execute_result -%} | |
43 | {%- block pyout scoped -%}{%- endblock pyout -%} |
|
43 | {%- elif output.output_type == 'stream' -%} | |
44 |
{%- |
|
44 | {%- block stream scoped -%} | |
45 |
{%- |
|
45 | {%- if output.name == 'stdout' -%} | |
46 |
{%- |
|
46 | {%- block stream_stdout scoped -%} | |
47 |
|
|
47 | {%- endblock stream_stdout -%} | |
48 |
|
|
48 | {%- elif output.name == 'stderr' -%} | |
49 |
{%- |
|
49 | {%- block stream_stderr scoped -%} | |
50 |
|
|
50 | {%- endblock stream_stderr -%} | |
51 |
|
|
51 | {%- endif -%} | |
52 |
|
|
52 | {%- endblock stream -%} | |
53 |
|
|
53 | {%- elif output.output_type == 'display_data' -%} | |
54 |
{%- |
|
54 | {%- block display_data scoped -%} | |
55 |
{%- block d |
|
55 | {%- block data_priority scoped -%} | |
56 |
|
|
56 | {%- endblock data_priority -%} | |
57 |
|
|
57 | {%- endblock display_data -%} | |
58 |
|
|
58 | {%- elif output.output_type == 'error' -%} | |
59 |
{%- |
|
59 | {%- block error scoped -%} | |
60 |
|
|
60 | {%- for line in output.traceback -%} | |
61 |
{%- |
|
61 | {%- block traceback_line scoped -%}{%- endblock traceback_line -%} | |
62 | {%- block traceback_line scoped -%}{%- endblock traceback_line -%} |
|
62 | {%- endfor -%} | |
63 |
|
|
63 | {%- endblock error -%} | |
64 |
|
|
64 | {%- endif -%} | |
65 |
|
|
65 | {%- endblock output -%} | |
66 |
|
|
66 | {%- endfor -%} | |
67 |
|
|
67 | {%- endblock outputs -%} | |
68 |
|
|
68 | {%- endblock output_group -%} | |
69 |
|
|
69 | {%- endif -%} | |
70 |
|
|
70 | {%- endblock codecell -%} | |
71 | {%- endblock codecell -%} |
|
71 | {%- elif cell.cell_type in ['markdown'] -%} | |
72 |
{%- |
|
72 | {%- block markdowncell scoped-%} | |
73 |
|
|
73 | {%- endblock markdowncell -%} | |
74 | {%- endblock markdowncell -%} |
|
74 | {%- elif cell.cell_type in ['heading'] -%} | |
75 | {%- elif cell.cell_type in ['heading'] -%} |
|
75 | {%- block headingcell scoped-%} | |
76 |
|
|
76 | {%- endblock headingcell -%} | |
77 | {%- endblock headingcell -%} |
|
77 | {%- elif cell.cell_type in ['raw'] -%} | |
78 |
{%- |
|
78 | {%- block rawcell scoped -%} | |
79 | {%- block rawcell scoped -%} |
|
79 | {% if cell.metadata.get('raw_mimetype', '').lower() in resources.get('raw_mimetypes', ['']) %} | |
80 | {% if cell.metadata.get('raw_mimetype', '').lower() in resources.get('raw_mimetypes', ['']) %} |
|
80 | {{ cell.source }} | |
81 |
|
|
81 | {% endif %} | |
82 |
|
|
82 | {%- endblock rawcell -%} | |
83 |
|
|
83 | {%- else -%} | |
84 |
{%- |
|
84 | {%- block unknowncell scoped-%} | |
85 |
|
|
85 | {%- endblock unknowncell -%} | |
86 | {%- endblock unknowncell -%} |
|
86 | {%- endif -%} | |
87 | {%- endif -%} |
|
87 | {%- endblock any_cell -%} | |
88 | {%- endblock any_cell -%} |
|
|||
89 | {%- endfor -%} |
|
|||
90 | {%- endfor -%} |
|
88 | {%- endfor -%} | |
91 | {%- endblock body -%} |
|
89 | {%- endblock body -%} | |
92 |
|
90 | |||
93 | {%- block footer -%} |
|
91 | {%- block footer -%} | |
94 | {%- endblock footer -%} |
|
92 | {%- endblock footer -%} |
@@ -1,164 +1,149 b'' | |||||
1 | """ |
|
1 | """Base test class for nbconvert""" | |
2 | Contains base test class for nbconvert |
|
2 | ||
3 | """ |
|
3 | # Copyright (c) IPython Development Team. | |
4 | #----------------------------------------------------------------------------- |
|
4 | # Distributed under the terms of the Modified BSD License. | |
5 | #Copyright (c) 2013, the IPython Development Team. |
|
|||
6 | # |
|
|||
7 | #Distributed under the terms of the Modified BSD License. |
|
|||
8 | # |
|
|||
9 | #The full license is in the file COPYING.txt, distributed with this software. |
|
|||
10 | #----------------------------------------------------------------------------- |
|
|||
11 |
|
||||
12 | #----------------------------------------------------------------------------- |
|
|||
13 | # Imports |
|
|||
14 | #----------------------------------------------------------------------------- |
|
|||
15 |
|
5 | |||
16 | import io |
|
6 | import io | |
17 | import os |
|
7 | import os | |
18 | import glob |
|
8 | import glob | |
19 | import shutil |
|
9 | import shutil | |
20 | import unittest |
|
10 | import unittest | |
21 |
|
11 | |||
22 | import IPython |
|
12 | import IPython | |
23 | from IPython.nbformat import current |
|
13 | from IPython.nbformat import current | |
24 | from IPython.utils.tempdir import TemporaryWorkingDirectory |
|
14 | from IPython.utils.tempdir import TemporaryWorkingDirectory | |
25 | from IPython.utils.path import get_ipython_package_dir |
|
15 | from IPython.utils.path import get_ipython_package_dir | |
26 | from IPython.utils.process import get_output_error_code |
|
16 | from IPython.utils.process import get_output_error_code | |
27 | from IPython.testing.tools import get_ipython_cmd |
|
17 | from IPython.testing.tools import get_ipython_cmd | |
28 |
|
18 | |||
29 | # a trailing space allows for simpler concatenation with the other arguments |
|
19 | # a trailing space allows for simpler concatenation with the other arguments | |
30 | ipy_cmd = get_ipython_cmd(as_string=True) + " " |
|
20 | ipy_cmd = get_ipython_cmd(as_string=True) + " " | |
31 |
|
21 | |||
32 | #----------------------------------------------------------------------------- |
|
|||
33 | # Classes and functions |
|
|||
34 | #----------------------------------------------------------------------------- |
|
|||
35 |
|
||||
36 |
|
22 | |||
37 | class TestsBase(unittest.TestCase): |
|
23 | class TestsBase(unittest.TestCase): | |
38 | """Base tests class. Contains useful fuzzy comparison and nbconvert |
|
24 | """Base tests class. Contains useful fuzzy comparison and nbconvert | |
39 | functions.""" |
|
25 | functions.""" | |
40 |
|
26 | |||
41 |
|
27 | |||
42 | def fuzzy_compare(self, a, b, newlines_are_spaces=True, tabs_are_spaces=True, |
|
28 | def fuzzy_compare(self, a, b, newlines_are_spaces=True, tabs_are_spaces=True, | |
43 | fuzzy_spacing=True, ignore_spaces=False, |
|
29 | fuzzy_spacing=True, ignore_spaces=False, | |
44 | ignore_newlines=False, case_sensitive=False, leave_padding=False): |
|
30 | ignore_newlines=False, case_sensitive=False, leave_padding=False): | |
45 | """ |
|
31 | """ | |
46 | Performs a fuzzy comparison of two strings. A fuzzy comparison is a |
|
32 | Performs a fuzzy comparison of two strings. A fuzzy comparison is a | |
47 | comparison that ignores insignificant differences in the two comparands. |
|
33 | comparison that ignores insignificant differences in the two comparands. | |
48 | The significance of certain differences can be specified via the keyword |
|
34 | The significance of certain differences can be specified via the keyword | |
49 | parameters of this method. |
|
35 | parameters of this method. | |
50 | """ |
|
36 | """ | |
51 |
|
37 | |||
52 | if not leave_padding: |
|
38 | if not leave_padding: | |
53 | a = a.strip() |
|
39 | a = a.strip() | |
54 | b = b.strip() |
|
40 | b = b.strip() | |
55 |
|
41 | |||
56 | if ignore_newlines: |
|
42 | if ignore_newlines: | |
57 | a = a.replace('\n', '') |
|
43 | a = a.replace('\n', '') | |
58 | b = b.replace('\n', '') |
|
44 | b = b.replace('\n', '') | |
59 |
|
45 | |||
60 | if newlines_are_spaces: |
|
46 | if newlines_are_spaces: | |
61 | a = a.replace('\n', ' ') |
|
47 | a = a.replace('\n', ' ') | |
62 | b = b.replace('\n', ' ') |
|
48 | b = b.replace('\n', ' ') | |
63 |
|
49 | |||
64 | if tabs_are_spaces: |
|
50 | if tabs_are_spaces: | |
65 | a = a.replace('\t', ' ') |
|
51 | a = a.replace('\t', ' ') | |
66 | b = b.replace('\t', ' ') |
|
52 | b = b.replace('\t', ' ') | |
67 |
|
53 | |||
68 | if ignore_spaces: |
|
54 | if ignore_spaces: | |
69 | a = a.replace(' ', '') |
|
55 | a = a.replace(' ', '') | |
70 | b = b.replace(' ', '') |
|
56 | b = b.replace(' ', '') | |
71 |
|
57 | |||
72 | if fuzzy_spacing: |
|
58 | if fuzzy_spacing: | |
73 | a = self.recursive_replace(a, ' ', ' ') |
|
59 | a = self.recursive_replace(a, ' ', ' ') | |
74 | b = self.recursive_replace(b, ' ', ' ') |
|
60 | b = self.recursive_replace(b, ' ', ' ') | |
75 |
|
61 | |||
76 | if not case_sensitive: |
|
62 | if not case_sensitive: | |
77 | a = a.lower() |
|
63 | a = a.lower() | |
78 | b = b.lower() |
|
64 | b = b.lower() | |
79 |
|
65 | |||
80 | self.assertEqual(a, b) |
|
66 | self.assertEqual(a, b) | |
81 |
|
67 | |||
82 |
|
68 | |||
83 | def recursive_replace(self, text, search, replacement): |
|
69 | def recursive_replace(self, text, search, replacement): | |
84 | """ |
|
70 | """ | |
85 | Performs a recursive replacement operation. Replaces all instances |
|
71 | Performs a recursive replacement operation. Replaces all instances | |
86 | of a search string in a text string with a replacement string until |
|
72 | of a search string in a text string with a replacement string until | |
87 | the search string no longer exists. Recursion is needed because the |
|
73 | the search string no longer exists. Recursion is needed because the | |
88 | replacement string may generate additional search strings. |
|
74 | replacement string may generate additional search strings. | |
89 |
|
75 | |||
90 | For example: |
|
76 | For example: | |
91 | Replace "ii" with "i" in the string "Hiiii" yields "Hii" |
|
77 | Replace "ii" with "i" in the string "Hiiii" yields "Hii" | |
92 | Another replacement cds "Hi" (the desired output) |
|
78 | Another replacement cds "Hi" (the desired output) | |
93 |
|
79 | |||
94 | Parameters |
|
80 | Parameters | |
95 | ---------- |
|
81 | ---------- | |
96 | text : string |
|
82 | text : string | |
97 | Text to replace in. |
|
83 | Text to replace in. | |
98 | search : string |
|
84 | search : string | |
99 | String to search for within "text" |
|
85 | String to search for within "text" | |
100 | replacement : string |
|
86 | replacement : string | |
101 | String to replace "search" with |
|
87 | String to replace "search" with | |
102 | """ |
|
88 | """ | |
103 | while search in text: |
|
89 | while search in text: | |
104 | text = text.replace(search, replacement) |
|
90 | text = text.replace(search, replacement) | |
105 | return text |
|
91 | return text | |
106 |
|
92 | |||
107 | def create_temp_cwd(self, copy_filenames=None): |
|
93 | def create_temp_cwd(self, copy_filenames=None): | |
108 | temp_dir = TemporaryWorkingDirectory() |
|
94 | temp_dir = TemporaryWorkingDirectory() | |
109 |
|
95 | |||
110 | #Copy the files if requested. |
|
96 | #Copy the files if requested. | |
111 | if copy_filenames is not None: |
|
97 | if copy_filenames is not None: | |
112 | self.copy_files_to(copy_filenames, dest=temp_dir.name) |
|
98 | self.copy_files_to(copy_filenames, dest=temp_dir.name) | |
113 |
|
99 | |||
114 | #Return directory handler |
|
100 | #Return directory handler | |
115 | return temp_dir |
|
101 | return temp_dir | |
116 |
|
102 | |||
117 | def create_empty_notebook(self, path): |
|
103 | def create_empty_notebook(self, path): | |
118 | nb = current.new_notebook() |
|
104 | nb = current.new_notebook() | |
119 | nb.worksheets.append(current.new_worksheet()) |
|
|||
120 | with io.open(path, 'w', encoding='utf-8') as f: |
|
105 | with io.open(path, 'w', encoding='utf-8') as f: | |
121 | current.write(nb, f, 'json') |
|
106 | current.write(nb, f, 'json') | |
122 |
|
107 | |||
123 |
|
108 | |||
124 | def copy_files_to(self, copy_filenames, dest='.'): |
|
109 | def copy_files_to(self, copy_filenames, dest='.'): | |
125 | "Copy test files into the destination directory" |
|
110 | "Copy test files into the destination directory" | |
126 | if not os.path.isdir(dest): |
|
111 | if not os.path.isdir(dest): | |
127 | os.makedirs(dest) |
|
112 | os.makedirs(dest) | |
128 | files_path = self._get_files_path() |
|
113 | files_path = self._get_files_path() | |
129 | for pattern in copy_filenames: |
|
114 | for pattern in copy_filenames: | |
130 | for match in glob.glob(os.path.join(files_path, pattern)): |
|
115 | for match in glob.glob(os.path.join(files_path, pattern)): | |
131 | shutil.copyfile(match, os.path.join(dest, os.path.basename(match))) |
|
116 | shutil.copyfile(match, os.path.join(dest, os.path.basename(match))) | |
132 |
|
117 | |||
133 |
|
118 | |||
134 | def _get_files_path(self): |
|
119 | def _get_files_path(self): | |
135 |
|
120 | |||
136 | #Get the relative path to this module in the IPython directory. |
|
121 | #Get the relative path to this module in the IPython directory. | |
137 | names = self.__module__.split('.')[1:-1] |
|
122 | names = self.__module__.split('.')[1:-1] | |
138 | names.append('files') |
|
123 | names.append('files') | |
139 |
|
124 | |||
140 | #Build a path using the IPython directory and the relative path we just |
|
125 | #Build a path using the IPython directory and the relative path we just | |
141 | #found. |
|
126 | #found. | |
142 | path = get_ipython_package_dir() |
|
127 | path = get_ipython_package_dir() | |
143 | for name in names: |
|
128 | for name in names: | |
144 | path = os.path.join(path, name) |
|
129 | path = os.path.join(path, name) | |
145 | return path |
|
130 | return path | |
146 |
|
131 | |||
147 |
|
132 | |||
148 | def call(self, parameters, ignore_return_code=False): |
|
133 | def call(self, parameters, ignore_return_code=False): | |
149 | """ |
|
134 | """ | |
150 | Execute a, IPython shell command, listening for both Errors and non-zero |
|
135 | Execute a, IPython shell command, listening for both Errors and non-zero | |
151 | return codes. |
|
136 | return codes. | |
152 |
|
137 | |||
153 | Parameters |
|
138 | Parameters | |
154 | ---------- |
|
139 | ---------- | |
155 | parameters : str |
|
140 | parameters : str | |
156 | List of parameters to pass to IPython. |
|
141 | List of parameters to pass to IPython. | |
157 | ignore_return_code : optional bool (default False) |
|
142 | ignore_return_code : optional bool (default False) | |
158 | Throw an OSError if the return code |
|
143 | Throw an OSError if the return code | |
159 | """ |
|
144 | """ | |
160 |
|
145 | |||
161 | stdout, stderr, retcode = get_output_error_code(ipy_cmd + parameters) |
|
146 | stdout, stderr, retcode = get_output_error_code(ipy_cmd + parameters) | |
162 | if not (retcode == 0 or ignore_return_code): |
|
147 | if not (retcode == 0 or ignore_return_code): | |
163 | raise OSError(stderr) |
|
148 | raise OSError(stderr) | |
164 | return stdout, stderr |
|
149 | return stdout, stderr |
@@ -1,149 +1,143 b'' | |||||
1 | { |
|
1 | { | |
2 | "metadata": { |
|
2 | "cells": [ | |
3 | "name": "notebook1" |
|
|||
4 | }, |
|
|||
5 | "nbformat": 3, |
|
|||
6 | "nbformat_minor": 0, |
|
|||
7 | "worksheets": [ |
|
|||
8 | { |
|
3 | { | |
9 | "cells": [ |
|
4 | "cell_type": "heading", | |
10 | { |
|
5 | "level": 1, | |
11 | "cell_type": "heading", |
|
6 | "metadata": {}, | |
12 | "level": 1, |
|
7 | "source": [ | |
13 | "metadata": {}, |
|
8 | "A simple SymPy example" | |
14 | "source": [ |
|
9 | ] | |
15 | "A simple SymPy example" |
|
10 | }, | |
16 | ] |
|
11 | { | |
17 | }, |
|
12 | "cell_type": "markdown", | |
|
13 | "metadata": {}, | |||
|
14 | "source": [ | |||
|
15 | "First we import SymPy and initialize printing:" | |||
|
16 | ] | |||
|
17 | }, | |||
|
18 | { | |||
|
19 | "cell_type": "code", | |||
|
20 | "metadata": { | |||
|
21 | "collapsed": false | |||
|
22 | }, | |||
|
23 | "outputs": [], | |||
|
24 | "prompt_number": 2, | |||
|
25 | "source": [ | |||
|
26 | "from sympy import init_printing\n", | |||
|
27 | "from sympy import *\n", | |||
|
28 | " init_printing()" | |||
|
29 | ] | |||
|
30 | }, | |||
|
31 | { | |||
|
32 | "cell_type": "markdown", | |||
|
33 | "metadata": {}, | |||
|
34 | "source": [ | |||
|
35 | "Create a few symbols:" | |||
|
36 | ] | |||
|
37 | }, | |||
|
38 | { | |||
|
39 | "cell_type": "code", | |||
|
40 | "metadata": { | |||
|
41 | "collapsed": false | |||
|
42 | }, | |||
|
43 | "outputs": [], | |||
|
44 | "prompt_number": 4, | |||
|
45 | "source": [ | |||
|
46 | "x,y,z = symbols('x y z')" | |||
|
47 | ] | |||
|
48 | }, | |||
|
49 | { | |||
|
50 | "cell_type": "markdown", | |||
|
51 | "metadata": {}, | |||
|
52 | "source": [ | |||
|
53 | "Here is a basic expression:" | |||
|
54 | ] | |||
|
55 | }, | |||
|
56 | { | |||
|
57 | "cell_type": "code", | |||
|
58 | "metadata": { | |||
|
59 | "collapsed": false | |||
|
60 | }, | |||
|
61 | "outputs": [ | |||
18 | { |
|
62 | { | |
19 | "cell_type": "markdown", |
|
63 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAKMAAAAZBAMAAACvE4OgAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHarIkSJZt3NVLsy\nme8Q6PJIAAACz0lEQVRIDa1UTWjUQBT+ZpvdzW7TGlrxItjYSg/C6vbiDwjmoCgUpHioPYhdqig9\nFJYiPYmW4klB14NgFGnw4EHpj7UgUtTFXhSEBgVBxIOFggWVrrUqiMY3mZkkLNIK7oN575vvvfky\n8yYJIGzgkSlRrULKrivVSkvq6LbxtcaSjV3aSo0lgWyl5pK69V+SRlEsPxNTGYhhDrV3M2Ue2etc\nEDmuMmM+IjolrCuHXNoLoQDNSAXdzbjsfFVKTY1vCgFXFIxenG4cFSSzRewAPnN0FugXjPDr45MQ\nJwoKtitgXL9zT+CsJeIHYG+Z4H1gwhRU4G/FcAQbbYU3KdDo+0sCK8lRU0guA72uKqMYk9RehHxP\niDIu0NS2v90KGShJYi7T7tgvkrQ2vIT2XtRISWNra6lzGc8/PW3ji4PL7Vmge095YIX0iB71NCaZ\n5N3XyM0VCuNIyFNIyY3AMG/KDUvjn90DGmwq9wpIl5AyU5WsTYy0aJf6JFGB5An3Der5jExKHjNR\n4JKPge/EXqDBoOXpkxkmkJHFfAFRVhDIveWA0S57N2Me6yw+DSX1n1uCq3sIfCF2IcjNkjeWyKli\nginHubboOB4vSNAjyaiXE26ygrkyTfod55Lj3CTE+n2P73ImJpnk6wJJKjYJSwt3OQbNJu4icM5s\nKGGbzMuD70N6JSbJD44x7pLDyJrbkfiLpOEhYVMJSVEj83x5YFLyNrAzJsmvJ+uhLrieXvcJDshy\nHtQuD54c2IWWEnSXfUTDZJJfAjcpOW5imp9aHvw4ZZ4NDV4FGjw0tzadKgbFwinJUd//AT0P1tdW\nBtuRU39oKdk9ONQ163fM+nvu/s4D/FX30otdQIZGlSnJKpq6KUxKVqV1WxGHFIhishjhEO1Gi3r4\nkZCMg+hH1henV8EjmFoly1PTMs/Uadaox+FceY2STpmvt9co/Pe0Jvt1GvgDK/Osw/4jQ4wAAAAA\nSUVORK5CYII=\n", | |
20 | "metadata": {}, |
|
64 | "metadata": {}, | |
21 | "source": [ |
|
65 | "output_type": "execute_result", | |
22 | "First we import SymPy and initialize printing:" |
|
66 | "prompt_number": 6, | |
23 | ] |
|
67 | "text/latex": [ | |
24 | }, |
|
68 | "$$x^{2} + 2.0 y + \\sin{\\left (z \\right )}$$" | |
25 | { |
|
|||
26 | "cell_type": "code", |
|
|||
27 | "collapsed": false, |
|
|||
28 | "input": [ |
|
|||
29 | "from sympy import init_printing\n", |
|
|||
30 | "from sympy import *\n", |
|
|||
31 | " init_printing()" |
|
|||
32 | ], |
|
69 | ], | |
33 | "language": "python", |
|
70 | "text/plain": [ | |
34 | "metadata": {}, |
|
71 | " 2 \n", | |
35 | "outputs": [], |
|
72 | "x + 2.0\u22c5y + sin(z)" | |
36 | "prompt_number": 2 |
|
|||
37 | }, |
|
|||
38 | { |
|
|||
39 | "cell_type": "markdown", |
|
|||
40 | "metadata": {}, |
|
|||
41 | "source": [ |
|
|||
42 | "Create a few symbols:" |
|
|||
43 | ] |
|
73 | ] | |
44 |
} |
|
74 | } | |
45 |
|
|
75 | ], | |
46 | "cell_type": "code", |
|
76 | "prompt_number": 6, | |
47 | "collapsed": false, |
|
77 | "source": [ | |
48 | "input": [ |
|
78 | "e = x**2 + 2.0*y + sin(z); e" | |
49 | "x,y,z = symbols('x y z')" |
|
79 | ] | |
50 | ], |
|
80 | }, | |
51 | "language": "python", |
|
81 | { | |
52 | "metadata": {}, |
|
82 | "cell_type": "code", | |
53 | "outputs": [], |
|
83 | "metadata": { | |
54 | "prompt_number": 4 |
|
84 | "collapsed": false | |
55 |
|
|
85 | }, | |
56 | { |
|
86 | "outputs": [ | |
57 | "cell_type": "markdown", |
|
|||
58 | "metadata": {}, |
|
|||
59 | "source": [ |
|
|||
60 | "Here is a basic expression:" |
|
|||
61 | ] |
|
|||
62 | }, |
|
|||
63 | { |
|
|||
64 | "cell_type": "code", |
|
|||
65 | "collapsed": false, |
|
|||
66 | "input": [ |
|
|||
67 | "e = x**2 + 2.0*y + sin(z); e" |
|
|||
68 | ], |
|
|||
69 | "language": "python", |
|
|||
70 | "metadata": {}, |
|
|||
71 | "outputs": [ |
|
|||
72 | { |
|
|||
73 | "latex": [ |
|
|||
74 | "$$x^{2} + 2.0 y + \\sin{\\left (z \\right )}$$" |
|
|||
75 | ], |
|
|||
76 | "metadata": {}, |
|
|||
77 | "output_type": "pyout", |
|
|||
78 | "png": "iVBORw0KGgoAAAANSUhEUgAAAKMAAAAZBAMAAACvE4OgAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHarIkSJZt3NVLsy\nme8Q6PJIAAACz0lEQVRIDa1UTWjUQBT+ZpvdzW7TGlrxItjYSg/C6vbiDwjmoCgUpHioPYhdqig9\nFJYiPYmW4klB14NgFGnw4EHpj7UgUtTFXhSEBgVBxIOFggWVrrUqiMY3mZkkLNIK7oN575vvvfky\n8yYJIGzgkSlRrULKrivVSkvq6LbxtcaSjV3aSo0lgWyl5pK69V+SRlEsPxNTGYhhDrV3M2Ue2etc\nEDmuMmM+IjolrCuHXNoLoQDNSAXdzbjsfFVKTY1vCgFXFIxenG4cFSSzRewAPnN0FugXjPDr45MQ\nJwoKtitgXL9zT+CsJeIHYG+Z4H1gwhRU4G/FcAQbbYU3KdDo+0sCK8lRU0guA72uKqMYk9RehHxP\niDIu0NS2v90KGShJYi7T7tgvkrQ2vIT2XtRISWNra6lzGc8/PW3ji4PL7Vmge095YIX0iB71NCaZ\n5N3XyM0VCuNIyFNIyY3AMG/KDUvjn90DGmwq9wpIl5AyU5WsTYy0aJf6JFGB5An3Der5jExKHjNR\n4JKPge/EXqDBoOXpkxkmkJHFfAFRVhDIveWA0S57N2Me6yw+DSX1n1uCq3sIfCF2IcjNkjeWyKli\nginHubboOB4vSNAjyaiXE26ygrkyTfod55Lj3CTE+n2P73ImJpnk6wJJKjYJSwt3OQbNJu4icM5s\nKGGbzMuD70N6JSbJD44x7pLDyJrbkfiLpOEhYVMJSVEj83x5YFLyNrAzJsmvJ+uhLrieXvcJDshy\nHtQuD54c2IWWEnSXfUTDZJJfAjcpOW5imp9aHvw4ZZ4NDV4FGjw0tzadKgbFwinJUd//AT0P1tdW\nBtuRU39oKdk9ONQ163fM+nvu/s4D/FX30otdQIZGlSnJKpq6KUxKVqV1WxGHFIhishjhEO1Gi3r4\nkZCMg+hH1henV8EjmFoly1PTMs/Uadaox+FceY2STpmvt9co/Pe0Jvt1GvgDK/Osw/4jQ4wAAAAA\nSUVORK5CYII=\n", |
|
|||
79 | "prompt_number": 6, |
|
|||
80 | "text": [ |
|
|||
81 | " 2 \n", |
|
|||
82 | "x + 2.0\u22c5y + sin(z)" |
|
|||
83 | ] |
|
|||
84 | } |
|
|||
85 | ], |
|
|||
86 | "prompt_number": 6 |
|
|||
87 | }, |
|
|||
88 | { |
|
87 | { | |
89 | "cell_type": "code", |
|
88 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAOBAMAAADd6iHDAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIpm7MhCriUTv3c12\nVGZoascqAAAAgElEQVQIHWNgVDJ2YICAMAb2H1BmKgPDTChzFgNDvgOEvT8AzgQKrA9gPZPYUwNk\ncXxnCGd4dWA1kMllwFDKUB9wEchUZmAIYNgMZDDwJIDIPyDiEgOjAAPLFwZWBhYFBh6BqzwfGI4y\nSJUXZXH8Zf7A+IBh////v1hzjh5/xwAAW80hUDE8HYkAAAAASUVORK5CYII=\n", | |
90 | "collapsed": false, |
|
|||
91 | "input": [ |
|
|||
92 | "diff(e, x)" |
|
|||
93 | ], |
|
|||
94 | "language": "python", |
|
|||
95 | "metadata": {}, |
|
89 | "metadata": {}, | |
96 | "outputs": [ |
|
90 | "output_type": "execute_result", | |
97 | { |
|
91 | "prompt_number": 7, | |
98 |
|
|
92 | "text/latex": [ | |
99 |
|
|
93 | "$$2 x$$" | |
100 | ], |
|
|||
101 | "metadata": {}, |
|
|||
102 | "output_type": "pyout", |
|
|||
103 | "png": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAOBAMAAADd6iHDAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIpm7MhCriUTv3c12\nVGZoascqAAAAgElEQVQIHWNgVDJ2YICAMAb2H1BmKgPDTChzFgNDvgOEvT8AzgQKrA9gPZPYUwNk\ncXxnCGd4dWA1kMllwFDKUB9wEchUZmAIYNgMZDDwJIDIPyDiEgOjAAPLFwZWBhYFBh6BqzwfGI4y\nSJUXZXH8Zf7A+IBh////v1hzjh5/xwAAW80hUDE8HYkAAAAASUVORK5CYII=\n", |
|
|||
104 | "prompt_number": 7, |
|
|||
105 | "text": [ |
|
|||
106 | "2\u22c5x" |
|
|||
107 | ] |
|
|||
108 | } |
|
|||
109 | ], |
|
94 | ], | |
110 | "prompt_number": 7 |
|
95 | "text/plain": [ | |
111 | }, |
|
96 | "2\u22c5x" | |
|
97 | ] | |||
|
98 | } | |||
|
99 | ], | |||
|
100 | "prompt_number": 7, | |||
|
101 | "source": [ | |||
|
102 | "diff(e, x)" | |||
|
103 | ] | |||
|
104 | }, | |||
|
105 | { | |||
|
106 | "cell_type": "code", | |||
|
107 | "metadata": { | |||
|
108 | "collapsed": false | |||
|
109 | }, | |||
|
110 | "outputs": [ | |||
112 | { |
|
111 | { | |
113 | "cell_type": "code", |
|
112 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAALsAAAAZBAMAAACbakK8AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHarIkSJZt3NVLsy\nme8Q6PJIAAADAklEQVRIDbVVS2gTURQ90/wmk0k6tCJCsR1SKShIsxE3CgNWBKUxq9qFmqFqShfF\nUKQrkaDiF0pcCKYgBBcuBLV+wIWKARe6kQ4UhNKKWdiF4KIptmA/xPvmzZuMxdYUzIPcd+655568\nvLlJAL6G32oOasQWNHz5Rvg6nrKh/mygfSzlX2ygPaBUGmov6//NXs1yq4sex2EPrsHemTd2snNg\ntkb+Cx1zBL6SqwxZLvQAKYHzKZaPY4fh4TeHd0S5Nox9OClItm/jiU9DrEwwVEawpiVis9VkimqX\nAOr4o2cCs/0BT2I5+FYJRhJbePQxgzcD7QLEqtV5gdnu2Icr3L45gcCyt74Z7neL4SLQ0nm4S+dM\nYCz1gSPHnhKZDWyHhcCCNKwjqaF/TkwGl0L6nClie/wc1D1xdoNsSLhT0IJkhi7Lzr22xb8keE/N\nPm0Sc9yEuhRUyuiG9HzvFNeImCyq39SriOhtQI7IV/TiTqE8glqwohjE0NJwiANxOZTdZoxtfzSa\nx2tI8DtHcKQoQFmV6f1XT2swibxFL+6k5EgenhBCqKLTPX3ULnaYdDlaTMcCSd8zuXTvBq2bJUJr\nlE4WgSV5ZRdBzLFgO6nzhJp1ltvrlB2HCoWxQuG+jTvt2GxBWUZaU2mMApZNuSHA3vJpCliRhqqs\nZtvbTrb9ZIk+i70Ut1OcnpgeKskTCFUwjaYy8Jhr3eiefq0HIfa7yC6HOwVyULRuNDn21JngbcL+\nE8A+MNnSxb+w59+Cj2tELJBbjEZr8SGwn0j2aLkTPdp08R2OcKV6fXB3ikPH3n8tM5WTfrETtZcw\ng3QWH0dH7nKNiMkszqo/EDafaHhJ5Bm6ee4UtdAabxnMcmUUl0SnYx+uVqs5XAGN9QGgdeCrASv0\n3TmCsJcOdhnozexD38goK9HXynEKr1OKDs9guhQD039kGySyIQpJAdbvJ9YTlPvyUl3/aLUf34G/\nuGxIyXpE37DoLbAHwJaU53t9MRCfrU8o/k4iRn36Lar8Wd5wAfgN4R6xelyy/ssAAAAASUVORK5C\nYII=\n", | |
114 | "collapsed": false, |
|
|||
115 | "input": [ |
|
|||
116 | "integrate(e, z)" |
|
|||
117 | ], |
|
|||
118 | "language": "python", |
|
|||
119 | "metadata": {}, |
|
113 | "metadata": {}, | |
120 | "outputs": [ |
|
114 | "output_type": "execute_result", | |
121 | { |
|
115 | "prompt_number": 8, | |
122 |
|
|
116 | "text/latex": [ | |
123 |
|
|
117 | "$$x^{2} z + 2.0 y z - \\cos{\\left (z \\right )}$$" | |
124 | ], |
|
|||
125 | "metadata": {}, |
|
|||
126 | "output_type": "pyout", |
|
|||
127 | "png": "iVBORw0KGgoAAAANSUhEUgAAALsAAAAZBAMAAACbakK8AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHarIkSJZt3NVLsy\nme8Q6PJIAAADAklEQVRIDbVVS2gTURQ90/wmk0k6tCJCsR1SKShIsxE3CgNWBKUxq9qFmqFqShfF\nUKQrkaDiF0pcCKYgBBcuBLV+wIWKARe6kQ4UhNKKWdiF4KIptmA/xPvmzZuMxdYUzIPcd+655568\nvLlJAL6G32oOasQWNHz5Rvg6nrKh/mygfSzlX2ygPaBUGmov6//NXs1yq4sex2EPrsHemTd2snNg\ntkb+Cx1zBL6SqwxZLvQAKYHzKZaPY4fh4TeHd0S5Nox9OClItm/jiU9DrEwwVEawpiVis9VkimqX\nAOr4o2cCs/0BT2I5+FYJRhJbePQxgzcD7QLEqtV5gdnu2Icr3L45gcCyt74Z7neL4SLQ0nm4S+dM\nYCz1gSPHnhKZDWyHhcCCNKwjqaF/TkwGl0L6nClie/wc1D1xdoNsSLhT0IJkhi7Lzr22xb8keE/N\nPm0Sc9yEuhRUyuiG9HzvFNeImCyq39SriOhtQI7IV/TiTqE8glqwohjE0NJwiANxOZTdZoxtfzSa\nx2tI8DtHcKQoQFmV6f1XT2swibxFL+6k5EgenhBCqKLTPX3ULnaYdDlaTMcCSd8zuXTvBq2bJUJr\nlE4WgSV5ZRdBzLFgO6nzhJp1ltvrlB2HCoWxQuG+jTvt2GxBWUZaU2mMApZNuSHA3vJpCliRhqqs\nZtvbTrb9ZIk+i70Ut1OcnpgeKskTCFUwjaYy8Jhr3eiefq0HIfa7yC6HOwVyULRuNDn21JngbcL+\nE8A+MNnSxb+w59+Cj2tELJBbjEZr8SGwn0j2aLkTPdp08R2OcKV6fXB3ikPH3n8tM5WTfrETtZcw\ng3QWH0dH7nKNiMkszqo/EDafaHhJ5Bm6ee4UtdAabxnMcmUUl0SnYx+uVqs5XAGN9QGgdeCrASv0\n3TmCsJcOdhnozexD38goK9HXynEKr1OKDs9guhQD039kGySyIQpJAdbvJ9YTlPvyUl3/aLUf34G/\nuGxIyXpE37DoLbAHwJaU53t9MRCfrU8o/k4iRn36Lar8Wd5wAfgN4R6xelyy/ssAAAAASUVORK5C\nYII=\n", |
|
|||
128 | "prompt_number": 8, |
|
|||
129 | "text": [ |
|
|||
130 | " 2 \n", |
|
|||
131 | "x \u22c5z + 2.0\u22c5y\u22c5z - cos(z)" |
|
|||
132 | ] |
|
|||
133 | } |
|
|||
134 | ], |
|
118 | ], | |
135 | "prompt_number": 8 |
|
119 | "text/plain": [ | |
136 | }, |
|
120 | " 2 \n", | |
137 | { |
|
121 | "x \u22c5z + 2.0\u22c5y\u22c5z - cos(z)" | |
138 | "cell_type": "code", |
|
122 | ] | |
139 | "collapsed": false, |
|
|||
140 | "input": [], |
|
|||
141 | "language": "python", |
|
|||
142 | "metadata": {}, |
|
|||
143 | "outputs": [] |
|
|||
144 | } |
|
123 | } | |
145 | ], |
|
124 | ], | |
146 | "metadata": {} |
|
125 | "prompt_number": 8, | |
|
126 | "source": [ | |||
|
127 | "integrate(e, z)" | |||
|
128 | ] | |||
|
129 | }, | |||
|
130 | { | |||
|
131 | "cell_type": "code", | |||
|
132 | "metadata": { | |||
|
133 | "collapsed": false | |||
|
134 | }, | |||
|
135 | "outputs": [], | |||
|
136 | "prompt_number": null, | |||
|
137 | "source": [] | |||
147 | } |
|
138 | } | |
148 | ] |
|
139 | ], | |
|
140 | "metadata": {}, | |||
|
141 | "nbformat": 4, | |||
|
142 | "nbformat_minor": 0 | |||
149 | } No newline at end of file |
|
143 | } |
@@ -1,224 +1,215 b'' | |||||
1 | { |
|
1 | { | |
2 | "metadata": { |
|
2 | "cells": [ | |
3 | "name": "", |
|
|||
4 | "signature": "sha256:9fffd84e69e3d9b8aee7b4cde2099ca5d4158a45391698b191f94fabaf394b41" |
|
|||
5 | }, |
|
|||
6 | "nbformat": 3, |
|
|||
7 | "nbformat_minor": 0, |
|
|||
8 | "worksheets": [ |
|
|||
9 | { |
|
3 | { | |
10 | "cells": [ |
|
4 | "cell_type": "heading", | |
|
5 | "level": 1, | |||
|
6 | "metadata": {}, | |||
|
7 | "source": [ | |||
|
8 | "NumPy and Matplotlib examples" | |||
|
9 | ] | |||
|
10 | }, | |||
|
11 | { | |||
|
12 | "cell_type": "markdown", | |||
|
13 | "metadata": {}, | |||
|
14 | "source": [ | |||
|
15 | "First import NumPy and Matplotlib:" | |||
|
16 | ] | |||
|
17 | }, | |||
|
18 | { | |||
|
19 | "cell_type": "code", | |||
|
20 | "metadata": { | |||
|
21 | "collapsed": false | |||
|
22 | }, | |||
|
23 | "outputs": [ | |||
11 | { |
|
24 | { | |
12 | "cell_type": "heading", |
|
|||
13 | "level": 1, |
|
|||
14 | "metadata": {}, |
|
25 | "metadata": {}, | |
15 | "source": [ |
|
26 | "name": "stdout", | |
16 | "NumPy and Matplotlib examples" |
|
27 | "output_type": "stream", | |
17 | ] |
|
28 | "text": "module://IPython.kernel.zmq.pylab.backend_inline\n" | |
18 |
} |
|
29 | } | |
|
30 | ], | |||
|
31 | "prompt_number": 1, | |||
|
32 | "source": [ | |||
|
33 | "%matplotlib inline\n", | |||
|
34 | "import matplotlib\n", | |||
|
35 | "import matplotlib.pyplot as plt\n", | |||
|
36 | "print(matplotlib.backends.backend)" | |||
|
37 | ] | |||
|
38 | }, | |||
|
39 | { | |||
|
40 | "cell_type": "code", | |||
|
41 | "metadata": { | |||
|
42 | "collapsed": false | |||
|
43 | }, | |||
|
44 | "outputs": [], | |||
|
45 | "prompt_number": 2, | |||
|
46 | "source": [ | |||
|
47 | "from IPython.display import set_matplotlib_formats\n", | |||
|
48 | "set_matplotlib_formats('png', 'pdf')\n", | |||
|
49 | "matplotlib.rcParams['figure.figsize'] = (2,1)" | |||
|
50 | ] | |||
|
51 | }, | |||
|
52 | { | |||
|
53 | "cell_type": "code", | |||
|
54 | "metadata": { | |||
|
55 | "collapsed": false | |||
|
56 | }, | |||
|
57 | "outputs": [ | |||
19 | { |
|
58 | { | |
20 | "cell_type": "markdown", |
|
|||
21 | "metadata": {}, |
|
59 | "metadata": {}, | |
22 | "source": [ |
|
60 | "output_type": "execute_result", | |
23 | "First import NumPy and Matplotlib:" |
|
61 | "prompt_number": 3, | |
|
62 | "text/plain": [ | |||
|
63 | "{matplotlib.figure.Figure: <function IPython.core.pylabtools.<lambda>>}" | |||
24 | ] |
|
64 | ] | |
25 |
} |
|
65 | } | |
26 |
|
|
66 | ], | |
27 | "cell_type": "code", |
|
67 | "prompt_number": 3, | |
28 | "collapsed": false, |
|
68 | "source": [ | |
29 | "input": [ |
|
69 | "ip.display_formatter.formatters['application/pdf'].type_printers" | |
30 | "%matplotlib inline\n", |
|
70 | ] | |
31 | "import matplotlib\n", |
|
71 | }, | |
32 | "import matplotlib.pyplot as plt\n", |
|
72 | { | |
33 | "print(matplotlib.backends.backend)" |
|
73 | "cell_type": "code", | |
34 | ], |
|
74 | "metadata": { | |
35 | "language": "python", |
|
75 | "collapsed": false | |
36 | "metadata": {}, |
|
76 | }, | |
37 |
|
|
77 | "outputs": [], | |
38 | { |
|
78 | "prompt_number": 4, | |
39 | "output_type": "stream", |
|
79 | "source": [ | |
40 | "stream": "stdout", |
|
80 | "import numpy as np" | |
41 | "text": [ |
|
81 | ] | |
42 | "module://IPython.kernel.zmq.pylab.backend_inline\n" |
|
82 | }, | |
43 | ] |
|
83 | { | |
44 | } |
|
84 | "cell_type": "markdown", | |
45 | ], |
|
85 | "metadata": {}, | |
46 | "prompt_number": 1 |
|
86 | "source": [ | |
47 | }, |
|
87 | "Now we show some very basic examples of how they can be used." | |
48 |
|
|
88 | ] | |
49 | "cell_type": "code", |
|
89 | }, | |
50 | "collapsed": false, |
|
90 | { | |
51 | "input": [ |
|
91 | "cell_type": "code", | |
52 | "from IPython.display import set_matplotlib_formats\n", |
|
92 | "metadata": { | |
53 | "set_matplotlib_formats('png', 'pdf')\n", |
|
93 | "collapsed": false | |
54 | "matplotlib.rcParams['figure.figsize'] = (2,1)" |
|
94 | }, | |
55 | ], |
|
95 | "outputs": [], | |
56 | "language": "python", |
|
96 | "prompt_number": 5, | |
57 | "metadata": {}, |
|
97 | "source": [ | |
58 | "outputs": [], |
|
98 | "a = np.random.uniform(size=(100,100))" | |
59 | "prompt_number": 2 |
|
99 | ] | |
60 |
|
|
100 | }, | |
61 |
|
|
101 | { | |
62 |
|
|
102 | "cell_type": "code", | |
63 | "collapsed": false, |
|
103 | "metadata": { | |
64 | "input": [ |
|
104 | "collapsed": false | |
65 | "ip.display_formatter.formatters['application/pdf'].type_printers" |
|
105 | }, | |
66 | ], |
|
106 | "outputs": [ | |
67 | "language": "python", |
|
|||
68 | "metadata": {}, |
|
|||
69 | "outputs": [ |
|
|||
70 | { |
|
|||
71 | "metadata": {}, |
|
|||
72 | "output_type": "pyout", |
|
|||
73 | "prompt_number": 3, |
|
|||
74 | "text": [ |
|
|||
75 | "{matplotlib.figure.Figure: <function IPython.core.pylabtools.<lambda>>}" |
|
|||
76 | ] |
|
|||
77 | } |
|
|||
78 | ], |
|
|||
79 | "prompt_number": 3 |
|
|||
80 | }, |
|
|||
81 | { |
|
|||
82 | "cell_type": "code", |
|
|||
83 | "collapsed": false, |
|
|||
84 | "input": [ |
|
|||
85 | "import numpy as np" |
|
|||
86 | ], |
|
|||
87 | "language": "python", |
|
|||
88 | "metadata": {}, |
|
|||
89 | "outputs": [], |
|
|||
90 | "prompt_number": 4 |
|
|||
91 | }, |
|
|||
92 | { |
|
107 | { | |
93 | "cell_type": "markdown", |
|
|||
94 | "metadata": {}, |
|
108 | "metadata": {}, | |
95 | "source": [ |
|
109 | "output_type": "execute_result", | |
96 | "Now we show some very basic examples of how they can be used." |
|
110 | "prompt_number": 6, | |
|
111 | "text/plain": [ | |||
|
112 | "(100, 100)" | |||
97 | ] |
|
113 | ] | |
98 |
} |
|
114 | } | |
99 |
|
|
115 | ], | |
100 | "cell_type": "code", |
|
116 | "prompt_number": 6, | |
101 | "collapsed": false, |
|
117 | "source": [ | |
102 | "input": [ |
|
118 | "a.shape" | |
103 | "a = np.random.uniform(size=(100,100))" |
|
119 | ] | |
104 | ], |
|
120 | }, | |
105 | "language": "python", |
|
121 | { | |
106 | "metadata": {}, |
|
122 | "cell_type": "code", | |
107 | "outputs": [], |
|
123 | "metadata": { | |
108 | "prompt_number": 5 |
|
124 | "collapsed": false | |
109 |
|
|
125 | }, | |
110 | { |
|
126 | "outputs": [], | |
111 | "cell_type": "code", |
|
127 | "prompt_number": 7, | |
112 | "collapsed": false, |
|
128 | "source": [ | |
113 | "input": [ |
|
129 | "evs = np.linalg.eigvals(a)" | |
114 | "a.shape" |
|
130 | ] | |
115 | ], |
|
131 | }, | |
116 | "language": "python", |
|
132 | { | |
117 | "metadata": {}, |
|
133 | "cell_type": "code", | |
118 | "outputs": [ |
|
134 | "metadata": { | |
119 | { |
|
135 | "collapsed": false | |
120 | "metadata": {}, |
|
136 | }, | |
121 | "output_type": "pyout", |
|
137 | "outputs": [ | |
122 | "prompt_number": 6, |
|
|||
123 | "text": [ |
|
|||
124 | "(100, 100)" |
|
|||
125 | ] |
|
|||
126 | } |
|
|||
127 | ], |
|
|||
128 | "prompt_number": 6 |
|
|||
129 | }, |
|
|||
130 | { |
|
|||
131 | "cell_type": "code", |
|
|||
132 | "collapsed": false, |
|
|||
133 | "input": [ |
|
|||
134 | "evs = np.linalg.eigvals(a)" |
|
|||
135 | ], |
|
|||
136 | "language": "python", |
|
|||
137 | "metadata": {}, |
|
|||
138 | "outputs": [], |
|
|||
139 | "prompt_number": 7 |
|
|||
140 | }, |
|
|||
141 | { |
|
|||
142 | "cell_type": "code", |
|
|||
143 | "collapsed": false, |
|
|||
144 | "input": [ |
|
|||
145 | "evs.shape" |
|
|||
146 | ], |
|
|||
147 | "language": "python", |
|
|||
148 | "metadata": {}, |
|
|||
149 | "outputs": [ |
|
|||
150 | { |
|
|||
151 | "metadata": {}, |
|
|||
152 | "output_type": "pyout", |
|
|||
153 | "prompt_number": 8, |
|
|||
154 | "text": [ |
|
|||
155 | "(100,)" |
|
|||
156 | ] |
|
|||
157 | } |
|
|||
158 | ], |
|
|||
159 | "prompt_number": 8 |
|
|||
160 | }, |
|
|||
161 | { |
|
138 | { | |
162 | "cell_type": "heading", |
|
|||
163 | "level": 2, |
|
|||
164 | "metadata": {}, |
|
139 | "metadata": {}, | |
165 | "source": [ |
|
140 | "output_type": "execute_result", | |
166 | "Here is a very long heading that pandoc will wrap and wrap and wrap and wrap and wrap and wrap and wrap and wrap and wrap and wrap and wrap and wrap" |
|
141 | "prompt_number": 8, | |
|
142 | "text/plain": [ | |||
|
143 | "(100,)" | |||
167 | ] |
|
144 | ] | |
168 |
} |
|
145 | } | |
|
146 | ], | |||
|
147 | "prompt_number": 8, | |||
|
148 | "source": [ | |||
|
149 | "evs.shape" | |||
|
150 | ] | |||
|
151 | }, | |||
|
152 | { | |||
|
153 | "cell_type": "heading", | |||
|
154 | "level": 2, | |||
|
155 | "metadata": {}, | |||
|
156 | "source": [ | |||
|
157 | "Here is a very long heading that pandoc will wrap and wrap and wrap and wrap and wrap and wrap and wrap and wrap and wrap and wrap and wrap and wrap" | |||
|
158 | ] | |||
|
159 | }, | |||
|
160 | { | |||
|
161 | "cell_type": "markdown", | |||
|
162 | "metadata": {}, | |||
|
163 | "source": [ | |||
|
164 | "Here is a cell that has both text and PNG output:" | |||
|
165 | ] | |||
|
166 | }, | |||
|
167 | { | |||
|
168 | "cell_type": "code", | |||
|
169 | "metadata": { | |||
|
170 | "collapsed": false | |||
|
171 | }, | |||
|
172 | "outputs": [ | |||
169 | { |
|
173 | { | |
170 | "cell_type": "markdown", |
|
|||
171 | "metadata": {}, |
|
174 | "metadata": {}, | |
172 | "source": [ |
|
175 | "output_type": "execute_result", | |
173 | "Here is a cell that has both text and PNG output:" |
|
176 | "prompt_number": 9, | |
|
177 | "text/plain": [ | |||
|
178 | "(array([97, 2, 0, 0, 0, 0, 0, 0, 0, 1]),\n", | |||
|
179 | " array([ -2.59479443, 2.67371141, 7.94221725, 13.21072308,\n", | |||
|
180 | " 18.47922892, 23.74773476, 29.0162406 , 34.28474644,\n", | |||
|
181 | " 39.55325228, 44.82175812, 50.09026395]),\n", | |||
|
182 | " <a list of 10 Patch objects>)" | |||
174 | ] |
|
183 | ] | |
175 | }, |
|
184 | }, | |
176 | { |
|
185 | { | |
177 | "cell_type": "code", |
|
186 | "application/pdf": "JVBERi0xLjQKJazcIKu6CjEgMCBvYmoKPDwgL1R5cGUgL0NhdGFsb2cgL1BhZ2VzIDIgMCBSID4+\nCmVuZG9iago4IDAgb2JqCjw8IC9YT2JqZWN0IDcgMCBSIC9QYXR0ZXJuIDUgMCBSCi9Qcm9jU2V0\nIFsgL1BERiAvVGV4dCAvSW1hZ2VCIC9JbWFnZUMgL0ltYWdlSSBdIC9FeHRHU3RhdGUgNCAwIFIK\nL1NoYWRpbmcgNiAwIFIgL0ZvbnQgMyAwIFIgPj4KZW5kb2JqCjEwIDAgb2JqCjw8IC9Hcm91cCA8\nPCAvQ1MgL0RldmljZVJHQiAvUyAvVHJhbnNwYXJlbmN5IC9UeXBlIC9Hcm91cCA+PiAvUGFyZW50\nIDIgMCBSCi9NZWRpYUJveCBbIDAgMCAxNTIuMzk4NDM3NSA4Ny4xOTIxODc1IF0gL1Jlc291cmNl\ncyA4IDAgUiAvVHlwZSAvUGFnZQovQ29udGVudHMgOSAwIFIgPj4KZW5kb2JqCjkgMCBvYmoKPDwg\nL0ZpbHRlciAvRmxhdGVEZWNvZGUgL0xlbmd0aCAxMSAwIFIgPj4Kc3RyZWFtCnicxZi/btwwDMYz\na+wTCJ3aRSEpiZLGHtAG6FbkgL5AmwTBXYCmQ16/dJycRcWq7SV3k81Pf76fzyZpo703l1/Q3v61\nZL9bsE8W7ZUBOTpajOR8ycGnKOcHdZ6Tw0KY5fAgojq9Mw+yKA2Lgiv+9WdvZeCVoewCR6ZoCVyk\njHIkewVw0IYPdTix8y/hao0qKvveiHOhcF5t6qJgqWDPRRXlkwmzm92vHp1g8rYzzf5on8xuby+/\noUWw+xsjO2L0w+gk06Ld/zKfPn64wAv4bPf39uu+XeGZwITgAuSQCQMVZbtRlHWt1fYbZRNCIAdA\n5F/mnjAWEFiiEb0vlGNSCI2iELRWIzTKJoQYXSglJU7PcyeEpf9BDFAJWDhQZgXRKApCazVEo2yC\nSOiQ0efhCnANQQsQhRz5BNHHhEFBNIqC0FoN0SibICR5QCjxde4E4RcgELLDVAqCTPQ6nzSSwmjE\nmqOVNoEgkCuFwuvkiSQskVBwSDTejKhJGkmTaFGRNNI2Esyu5PLyp9QkcYlkLpHr/K4J5jK8Gr/R\nuQ9Sc8bxlW1esL1YD6BjermIrTGdHI8VAXm47sDr8unkz6Pj/Mb1FG1c18Nnw6tcyzM/bIahMryU\neCZzUkOk+rSWp2hjuR4+G15pGUazvjgPle+lJ3RyGIPUvje+p2jjux4+G159qSPIZpXl9fc0RykT\nbyxP0cZyPXw2vNby8yy5p6hynVe77vRaXKeDFemDNxVUuc6JXKqfQWkIJs9/ZpMColBaaSmyffxt\nf9qHsZ12BFKZMbIUZxkbEBOHBCw20unEPk49atUtXxlhoITscwhNv5cdJ5TWC1TVO2ghBUkqYQRX\nS1WC9Mw788O+J9S896ON0gXIxBDZqwp4aBUxFQb3puE9CefA6rk/Dk+NzJQcSZLgFZdSzH+IK+Xd\nwXr2pW/1LnNhOaeowZRiusjnBevZP9o8ZK4i60pTrp8vpZgu8nnBevalSQfHsiYDSJekTCrFdJHP\nC9azL2BFsn2W/MaQGrBaMV3kM4N17A+vI0k8JOZEgM2nESWZLvR50boAwoaylaTvBEneMzSbkkwf\n+8xwPYLx7YtYXAafC2s4JRkpW5B5jtvW0gg3mk4+UZSmm9SHrBX9z/WKNxc9fsvXuu7w+ebt2ph/\nACMXFgplbmRzdHJlYW0KZW5kb2JqCjExIDAgb2JqCjg3MAplbmRvYmoKMTYgMCBvYmoKPDwgL0Zp\nbHRlciAvRmxhdGVEZWNvZGUgL0xlbmd0aDEgMTkgMCBSIC9MZW5ndGggMjAgMCBSID4+CnN0cmVh\nbQp4nNS9eYAdVZ0vfurudavq3rr7vvftvdOdTtIJi6QTsnQATdhCgsYECRAWIVFAwAUGWQL6JjDj\nAEEQRJYAvsnNnbZZxjfkzVMExhl7HImgeZBRCIn6BnUcRudB8vt8zqm66QScef/+DqnvreXUWb6f\n73pO2QpNCBEH8Ynq8iVLlwleawdAhLl81cozz//y80lcm0LoZyw/8+zFIiXCQvvNBj5feebw6M3v\n9H4RL+zA9YbzP3ne5v959xPrhTj9QSEC2fOvvrIaXKRVhTj3RDyvXrj5ok9etDjUI8Q5T+Od0y+6\n7NoLR5ee8b+EWLdJaGdt2LTxk9fkfn3RLCFCWSFWbN10wXkbn8ze+XPUHcT7Y5twIzjoXYPrjbju\n2vTJK68pvnny6UJ4QujPvvSCT12+7NTTbxHarheEqC+57Irzz1v629+uRv8fE8Ib/uR512z23hfG\n2LWtHM/l533ygq985Ml/EdqPMD/jbzdf8ekr77zla3cJ7fVpjGHW5k9dsPmkX106T4i1eK4NKd6I\n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\nc+tTOz5911Weq+KfyX7mK9f4ru2/9t5rv3Pdjs+e9Lmxz09d/+ANX/uTxTce/8W5N+Vv+sub/vam\nvTcdutm+uf/m3bc8sXXktk/dduNtk7d/4kuXfelzX/7Uf3vov/3sT/N/etmffvtPX9n2uW3T2/Zv\ne/eO+p32nVfe+fCdu+985c5Df9b1Zz/88xu+kv/K1r84/i+uu2vwbnH3GXdfdvef3f303b+455R7\n7tpe3X7a9s9tv2P7S9v3bP/ZvcvuPePej997yb1X33vjV6/56k1fveOr9311x32R+/L3dd83et9J\n951y30P3/eV9z973/P3x+8v3998/dv/i+z9y/7n3X3j/p+7/wv2333/X/Q/d/5f3P3v/8/f/8P7X\nvrb7a9//2itfe+Nrv35g9IGTHjjlgdUPfOKByx+MPJh/sPvB0QdPevCUB1d/fcnXV339Y1/f9PUr\nv37DQ2se2vjQ5oc+99DWb4x848RvTHzjrG9s+MZl3/jdw+Jh8+GtD08/vPfhAw//7hHxiPlI9pGu\nR0YeOfGRiUfOemTDI5c9cs0jNz1yxyP3PbLj0Tseve/RHY9OPrr7sfHHTntszWMbH9v82Od29O6Y\nu2N8x2k71uzYuGPzjjt23PH4xidGGLbLSFJ4/gGetwHbPiBGW4PDraHh1qDd6p5udQ/vSvvebQ3Z\nrebeXUXfu+KvvFqXb+CvmloO1KdpvoGR2fPnzUn19MydPzY2/yTvvLndjXog2DM2Nmc0nUryLwIG\nUplYLabheG3BPI8VTMfsZNg3VKkMBUaDp4yNLct1NwOB5w5t1P7hkLjq5JOvii3IWaVYNJOI6V2z\nB+eEJhYtP7E6r1FLJOc+7bn4vbs99703iiELoaJ1z196P+3phucXWhBe6XXEDh9qX2Fo6yYXGisN\nzxbajS2TO6PPRT3rpnZHp6P7ot51grZmHe3UOhqhdbQruETNkdlH2r240+5G2e6YbLe90NC2jFsP\nGDuN54wfGK8bbxuBde0rSnxSkk9KO0vPlX5Qer30dimwbmT2B4zzetneQPsKC29xgKJ9mKdvcxgL\n3bF0RoVGZs73nk47fyvbWdleFUPtK2KofQPIlIjZsWrMu2Vqd2w6ti/mxZ2aXavWvKhUY481Dc9q\n07V9NS9ewS3RXp9kX8Vj+/pop69/lH012wvz6Atk3dQD+Z355/Jo4Yq8bKGCFg73qha8sLDCczzs\n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\neZnDvTDnpW15FMecizPZO9u9Le+ZJTtX3t783qOrMa9dC84q3FMTcg5yLytRVqPgq8w9vknuOmc/\nPR5lys63JNwR8+s1z9HZPwdhKHH7aW+r6GPj97OSu8K2X3Fa2ae3o0xbVLqupgrbKrRY99j4tDtj\nszhbi6jkd5v8Ph2TI+ZOMtF/8p5ds0iViz6cPx2Sjntotbi/7rZPlYiNdpxxoLjDn8lFuYhrw2Je\nZ2udK6mzrvmTIOGekF89w7S0DL/j19QeWqQrtV5cDS2uvtZppQ1yXP+pe0bnPS1/+i+gju98rx4v\n7czeXuL+0ijin9cn7+Nv/9TQ2TKOUizWcO/Tc6sMS4nLn1z59Zt1PA/PFsu8VhWOKNP+t8+9rojO\nROTG823graNFjdtWyxJvS1WiP/EsnMM7Tctas9Bpve97vRP973J/lFrpOjj9uah+2dmO8beXQp/v\n3Mln3Hx3lv/5++0zyXJ1ud+2CP+8necX3Ifch638K91VVt7vuOPud93fuI+4q901drWccL/nft/9\ngb0hzbHa/BlvVXusbP0jwn9otflj9/3uF+2NaoG73t3g/sLeGv/enstfdS9bS1+xp/RCu3Pc5P7W\nPedudn9lb0S6Nz1k7f2ivV1Mtdr3WYxnug9YW5e5j7md7i63y93iFrk33Dfcg9bn/tTa9XV3v40V\n3uvOdZ9zx6zHjLkvu0/buOtZqavdq9Z7honI3e497in3K+6Xjatv2ojhp6xHf8ld6n7T/Yy7xD3v\nVrvPGIfvt3fcJ91vuBesl71p7/prLbojxkLb3Wq9Yb17n3vC/bnb4LvcP7gfcf/oNrrLrYd027vo\nqLvH3et+yb1ld6eL3L+4f3X/5A67R91PuvvcZhsTTrdRRK873092L7pzbOy7xe5Uj9to5bfcr7pn\nbGz4a+4rbprbaiOfP3G3ub90D7hZ7jL3bhsXvWTjytvdt9zF7t/cP7vX3efdu9y33R3uE+6T7lPu\ngPF7p9vmPu62u79zR90Pux3ur92Fforv9j2+10/10/x0P8PP9Of4c/15/nx/gb/QX+Tf5S92j/lL\n/KXuJ/y7bWT3AzYS/4L7afdjNhb/df8eG7P+rI3Ofshf7t/rZ/n3+ZL7L/9+d9Jf4T/gP+g/5D/s\nr7QR1Uf81e7f/TV+tr/Wz/Ef9XP9PD/fX+cX+Ov9DT7woY/8Qn+jv8nf7G/xH/OLfJ9f7Je4//RL\n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\n0ALYRzoAqQCkAZACQOv/B6ys2f+vd9C1/wd3UY3cZ2lVVmuyWpHVeqxWY7UWy0qs1mG1Cqs1WK3A\nav1Vq69l2jyL+/BLeBQm0WrV+EJ8E3JNyDMhx4T8EnJLyCshp4R8Ep1PSa2uam1VK6taV9WqqtZU\n8xXV/J1Kf+5/AIGHtqIKZW5kc3RyZWFtCmVuZG9iagoyMCAwIG9iago3MDc0OQplbmRvYmoKMTkg\nMCBvYmoKMTI3MzQwCmVuZG9iagoxNSAwIG9iago8PCAvRmlsdGVyIC9GbGF0ZURlY29kZSAvTGVu\nZ3RoIDY3ID4+CnN0cmVhbQp4nO3NMQ0AIQAEwVNMTYKOV4AZKhosIOQxQUNmuq02uWynZ2WmpWac\nLreHAAAAAAAAAAAAAAAAAAAAAPCY7weB+gXnCmVuZHN0cmVhbQplbmRvYmoKMTggMCBvYmoKPDwg\nL0ZpbHRlciAvRmxhdGVEZWNvZGUgL0xlbmd0aCAyNjEgPj4Kc3RyZWFtCnicXVE9b8MgEN35FTem\nQ0Rst5UHC6lKFw9Jq7qdogw2HBZSDQjjwf++fCRu1ZPg6T7ece+gx/a11coDfXeGd+hBKi0czmZx\nHGHAUWlSlCAU9zcv3XzqLaGB3K2zx6nV0pCmAfoRkrN3K+xehBnwgQAAfXMCndIj7L6OXQ51i7Xf\nOKH2cCCMgUAZ2p16e+4nBJrI+1aEvPLrPtB+Kz5Xi1Amv8gjcSNwtj1H1+sRSXMIxqCRwRhBLf7l\nq8wa5FZexfIAzwwuf9wiQ5mhyvCY4enOuKYGdXbrW4M6hsuyiNQMl4zXOM/95Tha3OOmmy/OBclp\n2UlrVKk0bv9hjY2seH4AHtCFLgplbmRzdHJlYW0KZW5kb2JqCjEzIDAgb2JqCjw8IC9DSURUb0dJ\nRE1hcCAxNSAwIFIgL0ZvbnREZXNjcmlwdG9yIDEyIDAgUiAvQmFzZUZvbnQgL0F2ZW5pci1Cb29r\nCi9DSURTeXN0ZW1JbmZvIDw8IC9PcmRlcmluZyAoSWRlbnRpdHkpIC9TdXBwbGVtZW50IDAgL1Jl\nZ2lzdHJ5IChBZG9iZSkgPj4KL1N1YnR5cGUgL0NJREZvbnRUeXBlMiAvVyAxNyAwIFIgL1R5cGUg\nL0ZvbnQgPj4KZW5kb2JqCjE0IDAgb2JqCjw8IC9FbmNvZGluZyAvSWRlbnRpdHktSCAvQmFzZUZv\nbnQgL0F2ZW5pci1Cb29rCi9EZXNjZW5kYW50Rm9udHMgWyAxMyAwIFIgXSAvU3VidHlwZSAvVHlw\nZTAgL1RvVW5pY29kZSAxOCAwIFIgL1R5cGUgL0ZvbnQKPj4KZW5kb2JqCjEyIDAgb2JqCjw8IC9E\nZXNjZW50IC0zNjYgL0ZvbnRCQm94IFsgLTE2NyAtMjg4IDEwMDAgOTQwIF0gL1N0ZW1WIDAgL0Zs\nYWdzIDMyCi9YSGVpZ2h0IDAgL1R5cGUgL0ZvbnREZXNjcmlwdG9yIC9Gb250RmlsZTIgMTYgMCBS\nIC9Gb250TmFtZSAvQXZlbmlyLUJvb2sKL01heFdpZHRoIDY4MiAvQ2FwSGVpZ2h0IDAgL0l0YWxp\nY0FuZ2xlIDAgL0FzY2VudCAxMDAwID4+CmVuZG9iagoxNyAwIG9iagpbIDQ4ClsgNTY5LjMzMzMz\nMzMzMzMgNTY5LjMzMzMzMzMzMzMgNTY5LjMzMzMzMzMzMzMgNTY5LjMzMzMzMzMzMzMKNTY5LjMz\nMzMzMzMzMzMgNTY5LjMzMzMzMzMzMzMgNTY5LjMzMzMzMzMzMzMgXQo1NiBbIDU2OS4zMzMzMzMz\nMzMzIF0gODcyMiBbIDY4MiBdIF0KZW5kb2JqCjMgMCBvYmoKPDwgL0YxIDE0IDAgUiA+PgplbmRv\nYmoKNCAwIG9iago8PCAvQTEgPDwgL0NBIDAgL1R5cGUgL0V4dEdTdGF0ZSAvY2EgMCA+PgovQTIg\nPDwgL0NBIDEgL1R5cGUgL0V4dEdTdGF0ZSAvY2EgMSA+PiA+PgplbmRvYmoKNSAwIG9iago8PCA+\nPgplbmRvYmoKNiAwIG9iago8PCA+PgplbmRvYmoKNyAwIG9iago8PCA+PgplbmRvYmoKMiAwIG9i\nago8PCAvQ291bnQgMSAvS2lkcyBbIDEwIDAgUiBdIC9UeXBlIC9QYWdlcyA+PgplbmRvYmoKMjEg\nMCBvYmoKPDwgL0NyZWF0aW9uRGF0ZSAoRDoyMDE0MDIyMDE3NTMyNS0wNycwMCcpCi9Qcm9kdWNl\nciAobWF0cGxvdGxpYiBwZGYgYmFja2VuZCkKL0NyZWF0b3IgKG1hdHBsb3RsaWIgMS4xLjEsIGh0\ndHA6Ly9tYXRwbG90bGliLnNmLm5ldCkgPj4KZW5kb2JqCnhyZWYKMCAyMgowMDAwMDAwMDAwIDY1\nNTM1IGYgCjAwMDAwMDAwMTYgMDAwMDAgbiAKMDAwMDA3MzYzOCAwMDAwMCBuIAowMDAwMDczNDQ0\nIDAwMDAwIG4gCjAwMDAwNzM0NzYgMDAwMDAgbiAKMDAwMDA3MzU3NSAwMDAwMCBuIAowMDAwMDcz\nNTk2IDAwMDAwIG4gCjAwMDAwNzM2MTcgMDAwMDAgbiAKMDAwMDAwMDA2NSAwMDAwMCBuIAowMDAw\nMDAwMzg4IDAwMDAwIG4gCjAwMDAwMDAyMDggMDAwMDAgbiAKMDAwMDAwMTMzMyAwMDAwMCBuIAow\nMDAwMDczMDYwIDAwMDAwIG4gCjAwMDAwNzI3MTIgMDAwMDAgbiAKMDAwMDA3MjkxOSAwMDAwMCBu\nIAowMDAwMDcyMjM5IDAwMDAwIG4gCjAwMDAwMDEzNTMgMDAwMDAgbiAKMDAwMDA3MzI3NyAwMDAw\nMCBuIAowMDAwMDcyMzc4IDAwMDAwIG4gCjAwMDAwNzIyMTYgMDAwMDAgbiAKMDAwMDA3MjE5NCAw\nMDAwMCBuIAowMDAwMDczNjk4IDAwMDAwIG4gCnRyYWlsZXIKPDwgL0luZm8gMjEgMCBSIC9Sb290\nIDEgMCBSIC9TaXplIDIyID4+CnN0YXJ0eHJlZgo3Mzg0OQolJUVPRgo=\n", | |
178 | "collapsed": false, |
|
187 | "image/png": "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\n", | |
179 | "input": [ |
|
|||
180 | "plt.hist(evs.real)" |
|
|||
181 | ], |
|
|||
182 | "language": "python", |
|
|||
183 | "metadata": {}, |
|
|||
184 | "outputs": [ |
|
|||
185 | { |
|
|||
186 | "metadata": {}, |
|
|||
187 | "output_type": "pyout", |
|
|||
188 | "prompt_number": 9, |
|
|||
189 | "text": [ |
|
|||
190 | "(array([97, 2, 0, 0, 0, 0, 0, 0, 0, 1]),\n", |
|
|||
191 | " array([ -2.59479443, 2.67371141, 7.94221725, 13.21072308,\n", |
|
|||
192 | " 18.47922892, 23.74773476, 29.0162406 , 34.28474644,\n", |
|
|||
193 | " 39.55325228, 44.82175812, 50.09026395]),\n", |
|
|||
194 | " <a list of 10 Patch objects>)" |
|
|||
195 | ] |
|
|||
196 | }, |
|
|||
197 | { |
|
|||
198 | "application/pdf": "JVBERi0xLjQKJazcIKu6CjEgMCBvYmoKPDwgL1R5cGUgL0NhdGFsb2cgL1BhZ2VzIDIgMCBSID4+\nCmVuZG9iago4IDAgb2JqCjw8IC9YT2JqZWN0IDcgMCBSIC9QYXR0ZXJuIDUgMCBSCi9Qcm9jU2V0\nIFsgL1BERiAvVGV4dCAvSW1hZ2VCIC9JbWFnZUMgL0ltYWdlSSBdIC9FeHRHU3RhdGUgNCAwIFIK\nL1NoYWRpbmcgNiAwIFIgL0ZvbnQgMyAwIFIgPj4KZW5kb2JqCjEwIDAgb2JqCjw8IC9Hcm91cCA8\nPCAvQ1MgL0RldmljZVJHQiAvUyAvVHJhbnNwYXJlbmN5IC9UeXBlIC9Hcm91cCA+PiAvUGFyZW50\nIDIgMCBSCi9NZWRpYUJveCBbIDAgMCAxNTIuMzk4NDM3NSA4Ny4xOTIxODc1IF0gL1Jlc291cmNl\ncyA4IDAgUiAvVHlwZSAvUGFnZQovQ29udGVudHMgOSAwIFIgPj4KZW5kb2JqCjkgMCBvYmoKPDwg\nL0ZpbHRlciAvRmxhdGVEZWNvZGUgL0xlbmd0aCAxMSAwIFIgPj4Kc3RyZWFtCnicxZi/btwwDMYz\na+wTCJ3aRSEpiZLGHtAG6FbkgL5AmwTBXYCmQ16/dJycRcWq7SV3k81Pf76fzyZpo703l1/Q3v61\nZL9bsE8W7ZUBOTpajOR8ycGnKOcHdZ6Tw0KY5fAgojq9Mw+yKA2Lgiv+9WdvZeCVoewCR6ZoCVyk\njHIkewVw0IYPdTix8y/hao0qKvveiHOhcF5t6qJgqWDPRRXlkwmzm92vHp1g8rYzzf5on8xuby+/\noUWw+xsjO2L0w+gk06Ld/zKfPn64wAv4bPf39uu+XeGZwITgAuSQCQMVZbtRlHWt1fYbZRNCIAdA\n5F/mnjAWEFiiEb0vlGNSCI2iELRWIzTKJoQYXSglJU7PcyeEpf9BDFAJWDhQZgXRKApCazVEo2yC\nSOiQ0efhCnANQQsQhRz5BNHHhEFBNIqC0FoN0SibICR5QCjxde4E4RcgELLDVAqCTPQ6nzSSwmjE\nmqOVNoEgkCuFwuvkiSQskVBwSDTejKhJGkmTaFGRNNI2Esyu5PLyp9QkcYlkLpHr/K4J5jK8Gr/R\nuQ9Sc8bxlW1esL1YD6BjermIrTGdHI8VAXm47sDr8unkz6Pj/Mb1FG1c18Nnw6tcyzM/bIahMryU\neCZzUkOk+rSWp2hjuR4+G15pGUazvjgPle+lJ3RyGIPUvje+p2jjux4+G159qSPIZpXl9fc0RykT\nbyxP0cZyPXw2vNby8yy5p6hynVe77vRaXKeDFemDNxVUuc6JXKqfQWkIJs9/ZpMColBaaSmyffxt\nf9qHsZ12BFKZMbIUZxkbEBOHBCw20unEPk49atUtXxlhoITscwhNv5cdJ5TWC1TVO2ghBUkqYQRX\nS1WC9Mw788O+J9S896ON0gXIxBDZqwp4aBUxFQb3puE9CefA6rk/Dk+NzJQcSZLgFZdSzH+IK+Xd\nwXr2pW/1LnNhOaeowZRiusjnBevZP9o8ZK4i60pTrp8vpZgu8nnBevalSQfHsiYDSJekTCrFdJHP\nC9azL2BFsn2W/MaQGrBaMV3kM4N17A+vI0k8JOZEgM2nESWZLvR50boAwoaylaTvBEneMzSbkkwf\n+8xwPYLx7YtYXAafC2s4JRkpW5B5jtvW0gg3mk4+UZSmm9SHrBX9z/WKNxc9fsvXuu7w+ebt2ph/\nACMXFgplbmRzdHJlYW0KZW5kb2JqCjExIDAgb2JqCjg3MAplbmRvYmoKMTYgMCBvYmoKPDwgL0Zp\nbHRlciAvRmxhdGVEZWNvZGUgL0xlbmd0aDEgMTkgMCBSIC9MZW5ndGggMjAgMCBSID4+CnN0cmVh\nbQp4nNS9eYAdVZ0vfurudavq3rr7vvftvdOdTtIJi6QTsnQATdhCgsYECRAWIVFAwAUGWQL6JjDj\nAEEQRJYAvsnNnbZZxjfkzVMExhl7HImgeZBRCIn6BnUcRudB8vt8zqm66QScef/+DqnvreXUWb6f\n73pO2QpNCBEH8Ynq8iVLlwleawdAhLl81cozz//y80lcm0LoZyw/8+zFIiXCQvvNBj5feebw6M3v\n9H4RL+zA9YbzP3ne5v959xPrhTj9QSEC2fOvvrIaXKRVhTj3RDyvXrj5ok9etDjUI8Q5T+Od0y+6\n7NoLR5ee8b+EWLdJaGdt2LTxk9fkfn3RLCFCWSFWbN10wXkbn8ze+XPUHcT7Y5twIzjoXYPrjbju\n2vTJK68pvnny6UJ4QujPvvSCT12+7NTTbxHarheEqC+57Irzz1v629+uRv8fE8Ib/uR512z23hfG\n2LWtHM/l533ygq985Ml/EdqPMD/jbzdf8ekr77zla3cJ7fVpjGHW5k9dsPmkX106T4i1eK4NKd6I\n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\nc+tTOz5911Weq+KfyX7mK9f4ru2/9t5rv3Pdjs+e9Lmxz09d/+ANX/uTxTce/8W5N+Vv+sub/vam\nvTcdutm+uf/m3bc8sXXktk/dduNtk7d/4kuXfelzX/7Uf3vov/3sT/N/etmffvtPX9n2uW3T2/Zv\ne/eO+p32nVfe+fCdu+985c5Df9b1Zz/88xu+kv/K1r84/i+uu2vwbnH3GXdfdvef3f303b+455R7\n7tpe3X7a9s9tv2P7S9v3bP/ZvcvuPePej997yb1X33vjV6/56k1fveOr9311x32R+/L3dd83et9J\n951y30P3/eV9z973/P3x+8v3998/dv/i+z9y/7n3X3j/p+7/wv2333/X/Q/d/5f3P3v/8/f/8P7X\nvrb7a9//2itfe+Nrv35g9IGTHjjlgdUPfOKByx+MPJh/sPvB0QdPevCUB1d/fcnXV339Y1/f9PUr\nv37DQ2se2vjQ5oc+99DWb4x848RvTHzjrG9s+MZl3/jdw+Jh8+GtD08/vPfhAw//7hHxiPlI9pGu\nR0YeOfGRiUfOemTDI5c9cs0jNz1yxyP3PbLj0Tseve/RHY9OPrr7sfHHTntszWMbH9v82Od29O6Y\nu2N8x2k71uzYuGPzjjt23PH4xidGGLbLSFJ4/gGetwHbPiBGW4PDraHh1qDd6p5udQ/vSvvebQ3Z\nrebeXUXfu+KvvFqXb+CvmloO1KdpvoGR2fPnzUn19MydPzY2/yTvvLndjXog2DM2Nmc0nUryLwIG\nUplYLabheG3BPI8VTMfsZNg3VKkMBUaDp4yNLct1NwOB5w5t1P7hkLjq5JOvii3IWaVYNJOI6V2z\nB+eEJhYtP7E6r1FLJOc+7bn4vbs99703iiELoaJ1z196P+3phucXWhBe6XXEDh9qX2Fo6yYXGisN\nzxbajS2TO6PPRT3rpnZHp6P7ot51grZmHe3UOhqhdbQruETNkdlH2r240+5G2e6YbLe90NC2jFsP\nGDuN54wfGK8bbxuBde0rSnxSkk9KO0vPlX5Qer30dimwbmT2B4zzetneQPsKC29xgKJ9mKdvcxgL\n3bF0RoVGZs73nk47fyvbWdleFUPtK2KofQPIlIjZsWrMu2Vqd2w6ti/mxZ2aXavWvKhUY481Dc9q\n07V9NS9ewS3RXp9kX8Vj+/pop69/lH012wvz6Atk3dQD+Z355/Jo4Yq8bKGCFg73qha8sLDCczzs\n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\neZnDvTDnpW15FMecizPZO9u9Le+ZJTtX3t783qOrMa9dC84q3FMTcg5yLytRVqPgq8w9vknuOmc/\nPR5lys63JNwR8+s1z9HZPwdhKHH7aW+r6GPj97OSu8K2X3Fa2ae3o0xbVLqupgrbKrRY99j4tDtj\nszhbi6jkd5v8Ph2TI+ZOMtF/8p5ds0iViz6cPx2Sjntotbi/7rZPlYiNdpxxoLjDn8lFuYhrw2Je\nZ2udK6mzrvmTIOGekF89w7S0DL/j19QeWqQrtV5cDS2uvtZppQ1yXP+pe0bnPS1/+i+gju98rx4v\n7czeXuL+0ijin9cn7+Nv/9TQ2TKOUizWcO/Tc6sMS4nLn1z59Zt1PA/PFsu8VhWOKNP+t8+9rojO\nROTG823graNFjdtWyxJvS1WiP/EsnMM7Tctas9Bpve97vRP973J/lFrpOjj9uah+2dmO8beXQp/v\n3Mln3Hx3lv/5++0zyXJ1ud+2CP+8necX3Ifch638K91VVt7vuOPud93fuI+4q901drWccL/nft/9\ngb0hzbHa/BlvVXusbP0jwn9otflj9/3uF+2NaoG73t3g/sLeGv/enstfdS9bS1+xp/RCu3Pc5P7W\nPedudn9lb0S6Nz1k7f2ivV1Mtdr3WYxnug9YW5e5j7md7i63y93iFrk33Dfcg9bn/tTa9XV3v40V\n3uvOdZ9zx6zHjLkvu0/buOtZqavdq9Z7honI3e497in3K+6Xjatv2ojhp6xHf8ld6n7T/Yy7xD3v\nVrvPGIfvt3fcJ91vuBesl71p7/prLbojxkLb3Wq9Yb17n3vC/bnb4LvcP7gfcf/oNrrLrYd027vo\nqLvH3et+yb1ld6eL3L+4f3X/5A67R91PuvvcZhsTTrdRRK873092L7pzbOy7xe5Uj9to5bfcr7pn\nbGz4a+4rbprbaiOfP3G3ub90D7hZ7jL3bhsXvWTjytvdt9zF7t/cP7vX3efdu9y33R3uE+6T7lPu\ngPF7p9vmPu62u79zR90Pux3ur92Fforv9j2+10/10/x0P8PP9Of4c/15/nx/gb/QX+Tf5S92j/lL\n/KXuJ/y7bWT3AzYS/4L7afdjNhb/df8eG7P+rI3Ofshf7t/rZ/n3+ZL7L/9+d9Jf4T/gP+g/5D/s\nr7QR1Uf81e7f/TV+tr/Wz/Ef9XP9PD/fX+cX+Ov9DT7woY/8Qn+jv8nf7G/xH/OLfJ9f7Je4//RL\n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\n0ALYRzoAqQCkAZACQOv/B6ys2f+vd9C1/wd3UY3cZ2lVVmuyWpHVeqxWY7UWy0qs1mG1Cqs1WK3A\nav1Vq69l2jyL+/BLeBQm0WrV+EJ8E3JNyDMhx4T8EnJLyCshp4R8Ep1PSa2uam1VK6taV9WqqtZU\n8xXV/J1Kf+5/AIGHtqIKZW5kc3RyZWFtCmVuZG9iagoyMCAwIG9iago3MDc0OQplbmRvYmoKMTkg\nMCBvYmoKMTI3MzQwCmVuZG9iagoxNSAwIG9iago8PCAvRmlsdGVyIC9GbGF0ZURlY29kZSAvTGVu\nZ3RoIDY3ID4+CnN0cmVhbQp4nO3NMQ0AIQAEwVNMTYKOV4AZKhosIOQxQUNmuq02uWynZ2WmpWac\nLreHAAAAAAAAAAAAAAAAAAAAAPCY7weB+gXnCmVuZHN0cmVhbQplbmRvYmoKMTggMCBvYmoKPDwg\nL0ZpbHRlciAvRmxhdGVEZWNvZGUgL0xlbmd0aCAyNjEgPj4Kc3RyZWFtCnicXVE9b8MgEN35FTem\nQ0Rst5UHC6lKFw9Jq7qdogw2HBZSDQjjwf++fCRu1ZPg6T7ece+gx/a11coDfXeGd+hBKi0czmZx\nHGHAUWlSlCAU9zcv3XzqLaGB3K2zx6nV0pCmAfoRkrN3K+xehBnwgQAAfXMCndIj7L6OXQ51i7Xf\nOKH2cCCMgUAZ2p16e+4nBJrI+1aEvPLrPtB+Kz5Xi1Amv8gjcSNwtj1H1+sRSXMIxqCRwRhBLf7l\nq8wa5FZexfIAzwwuf9wiQ5mhyvCY4enOuKYGdXbrW4M6hsuyiNQMl4zXOM/95Tha3OOmmy/OBclp\n2UlrVKk0bv9hjY2seH4AHtCFLgplbmRzdHJlYW0KZW5kb2JqCjEzIDAgb2JqCjw8IC9DSURUb0dJ\nRE1hcCAxNSAwIFIgL0ZvbnREZXNjcmlwdG9yIDEyIDAgUiAvQmFzZUZvbnQgL0F2ZW5pci1Cb29r\nCi9DSURTeXN0ZW1JbmZvIDw8IC9PcmRlcmluZyAoSWRlbnRpdHkpIC9TdXBwbGVtZW50IDAgL1Jl\nZ2lzdHJ5IChBZG9iZSkgPj4KL1N1YnR5cGUgL0NJREZvbnRUeXBlMiAvVyAxNyAwIFIgL1R5cGUg\nL0ZvbnQgPj4KZW5kb2JqCjE0IDAgb2JqCjw8IC9FbmNvZGluZyAvSWRlbnRpdHktSCAvQmFzZUZv\nbnQgL0F2ZW5pci1Cb29rCi9EZXNjZW5kYW50Rm9udHMgWyAxMyAwIFIgXSAvU3VidHlwZSAvVHlw\nZTAgL1RvVW5pY29kZSAxOCAwIFIgL1R5cGUgL0ZvbnQKPj4KZW5kb2JqCjEyIDAgb2JqCjw8IC9E\nZXNjZW50IC0zNjYgL0ZvbnRCQm94IFsgLTE2NyAtMjg4IDEwMDAgOTQwIF0gL1N0ZW1WIDAgL0Zs\nYWdzIDMyCi9YSGVpZ2h0IDAgL1R5cGUgL0ZvbnREZXNjcmlwdG9yIC9Gb250RmlsZTIgMTYgMCBS\nIC9Gb250TmFtZSAvQXZlbmlyLUJvb2sKL01heFdpZHRoIDY4MiAvQ2FwSGVpZ2h0IDAgL0l0YWxp\nY0FuZ2xlIDAgL0FzY2VudCAxMDAwID4+CmVuZG9iagoxNyAwIG9iagpbIDQ4ClsgNTY5LjMzMzMz\nMzMzMzMgNTY5LjMzMzMzMzMzMzMgNTY5LjMzMzMzMzMzMzMgNTY5LjMzMzMzMzMzMzMKNTY5LjMz\nMzMzMzMzMzMgNTY5LjMzMzMzMzMzMzMgNTY5LjMzMzMzMzMzMzMgXQo1NiBbIDU2OS4zMzMzMzMz\nMzMzIF0gODcyMiBbIDY4MiBdIF0KZW5kb2JqCjMgMCBvYmoKPDwgL0YxIDE0IDAgUiA+PgplbmRv\nYmoKNCAwIG9iago8PCAvQTEgPDwgL0NBIDAgL1R5cGUgL0V4dEdTdGF0ZSAvY2EgMCA+PgovQTIg\nPDwgL0NBIDEgL1R5cGUgL0V4dEdTdGF0ZSAvY2EgMSA+PiA+PgplbmRvYmoKNSAwIG9iago8PCA+\nPgplbmRvYmoKNiAwIG9iago8PCA+PgplbmRvYmoKNyAwIG9iago8PCA+PgplbmRvYmoKMiAwIG9i\nago8PCAvQ291bnQgMSAvS2lkcyBbIDEwIDAgUiBdIC9UeXBlIC9QYWdlcyA+PgplbmRvYmoKMjEg\nMCBvYmoKPDwgL0NyZWF0aW9uRGF0ZSAoRDoyMDE0MDIyMDE3NTMyNS0wNycwMCcpCi9Qcm9kdWNl\nciAobWF0cGxvdGxpYiBwZGYgYmFja2VuZCkKL0NyZWF0b3IgKG1hdHBsb3RsaWIgMS4xLjEsIGh0\ndHA6Ly9tYXRwbG90bGliLnNmLm5ldCkgPj4KZW5kb2JqCnhyZWYKMCAyMgowMDAwMDAwMDAwIDY1\nNTM1IGYgCjAwMDAwMDAwMTYgMDAwMDAgbiAKMDAwMDA3MzYzOCAwMDAwMCBuIAowMDAwMDczNDQ0\nIDAwMDAwIG4gCjAwMDAwNzM0NzYgMDAwMDAgbiAKMDAwMDA3MzU3NSAwMDAwMCBuIAowMDAwMDcz\nNTk2IDAwMDAwIG4gCjAwMDAwNzM2MTcgMDAwMDAgbiAKMDAwMDAwMDA2NSAwMDAwMCBuIAowMDAw\nMDAwMzg4IDAwMDAwIG4gCjAwMDAwMDAyMDggMDAwMDAgbiAKMDAwMDAwMTMzMyAwMDAwMCBuIAow\nMDAwMDczMDYwIDAwMDAwIG4gCjAwMDAwNzI3MTIgMDAwMDAgbiAKMDAwMDA3MjkxOSAwMDAwMCBu\nIAowMDAwMDcyMjM5IDAwMDAwIG4gCjAwMDAwMDEzNTMgMDAwMDAgbiAKMDAwMDA3MzI3NyAwMDAw\nMCBuIAowMDAwMDcyMzc4IDAwMDAwIG4gCjAwMDAwNzIyMTYgMDAwMDAgbiAKMDAwMDA3MjE5NCAw\nMDAwMCBuIAowMDAwMDczNjk4IDAwMDAwIG4gCnRyYWlsZXIKPDwgL0luZm8gMjEgMCBSIC9Sb290\nIDEgMCBSIC9TaXplIDIyID4+CnN0YXJ0eHJlZgo3Mzg0OQolJUVPRgo=\n", |
|
|||
199 | "metadata": {}, |
|
|||
200 | "output_type": "display_data", |
|
|||
201 | "png": "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\n", |
|
|||
202 | "text": [ |
|
|||
203 | "<matplotlib.figure.Figure at 0x10b0ecf10>" |
|
|||
204 | ] |
|
|||
205 | } |
|
|||
206 | ], |
|
|||
207 | "prompt_number": 9 |
|
|||
208 | }, |
|
|||
209 | { |
|
|||
210 | "cell_type": "markdown", |
|
|||
211 | "metadata": {}, |
|
188 | "metadata": {}, | |
212 | "source": [ |
|
189 | "output_type": "display_data", | |
213 | "```python\n", |
|
190 | "text/plain": [ | |
214 | "def foo(bar=1):\n", |
|
191 | "<matplotlib.figure.Figure at 0x10b0ecf10>" | |
215 | " \"\"\"docstring\"\"\"\n", |
|
|||
216 | " raise Exception(\"message\")\n", |
|
|||
217 | "```" |
|
|||
218 | ] |
|
192 | ] | |
219 | } |
|
193 | } | |
220 | ], |
|
194 | ], | |
221 | "metadata": {} |
|
195 | "prompt_number": 9, | |
|
196 | "source": [ | |||
|
197 | "plt.hist(evs.real)" | |||
|
198 | ] | |||
|
199 | }, | |||
|
200 | { | |||
|
201 | "cell_type": "markdown", | |||
|
202 | "metadata": {}, | |||
|
203 | "source": [ | |||
|
204 | "```python\n", | |||
|
205 | "def foo(bar=1):\n", | |||
|
206 | " \"\"\"docstring\"\"\"\n", | |||
|
207 | " raise Exception(\"message\")\n", | |||
|
208 | "```" | |||
|
209 | ] | |||
222 | } |
|
210 | } | |
223 | ] |
|
211 | ], | |
|
212 | "metadata": {}, | |||
|
213 | "nbformat": 4, | |||
|
214 | "nbformat_minor": 0 | |||
224 | } No newline at end of file |
|
215 | } |
@@ -1,96 +1,101 b'' | |||||
1 | """Python API for composing notebook elements |
|
1 | """Python API for composing notebook elements | |
2 |
|
2 | |||
3 | The Python representation of a notebook is a nested structure of |
|
3 | The Python representation of a notebook is a nested structure of | |
4 | dictionary subclasses that support attribute access |
|
4 | dictionary subclasses that support attribute access | |
5 | (IPython.utils.ipstruct.Struct). The functions in this module are merely |
|
5 | (IPython.utils.ipstruct.Struct). The functions in this module are merely | |
6 | helpers to build the structs in the right form. |
|
6 | helpers to build the structs in the right form. | |
7 | """ |
|
7 | """ | |
8 |
|
8 | |||
9 | # Copyright (c) IPython Development Team. |
|
9 | # Copyright (c) IPython Development Team. | |
10 | # Distributed under the terms of the Modified BSD License. |
|
10 | # Distributed under the terms of the Modified BSD License. | |
11 |
|
11 | |||
12 | from IPython.utils.ipstruct import Struct |
|
12 | from IPython.utils.ipstruct import Struct | |
13 |
|
13 | |||
14 | # Change this when incrementing the nbformat version |
|
14 | # Change this when incrementing the nbformat version | |
15 | nbformat = 4 |
|
15 | nbformat = 4 | |
16 | nbformat_minor = 0 |
|
16 | nbformat_minor = 0 | |
17 | nbformat_schema = 'nbformat.v4.schema.json' |
|
17 | nbformat_schema = 'nbformat.v4.schema.json' | |
18 |
|
18 | |||
19 | def validate(node, ref=None): |
|
19 | def validate(node, ref=None): | |
20 | """validate a v4 node""" |
|
20 | """validate a v4 node""" | |
21 | from ..current import validate |
|
21 | from ..current import validate | |
22 | return validate(node, ref=ref, version=nbformat) |
|
22 | return validate(node, ref=ref, version=nbformat) | |
23 |
|
23 | |||
24 | class NotebookNode(Struct): |
|
24 | class NotebookNode(Struct): | |
25 | pass |
|
25 | pass | |
26 |
|
26 | |||
27 | def from_dict(d): |
|
27 | def from_dict(d): | |
28 | if isinstance(d, dict): |
|
28 | if isinstance(d, dict): | |
29 | newd = NotebookNode() |
|
29 | newd = NotebookNode() | |
30 | for k,v in d.items(): |
|
30 | for k,v in d.items(): | |
31 | newd[k] = from_dict(v) |
|
31 | newd[k] = from_dict(v) | |
32 | return newd |
|
32 | return newd | |
33 | elif isinstance(d, (tuple, list)): |
|
33 | elif isinstance(d, (tuple, list)): | |
34 | return [from_dict(i) for i in d] |
|
34 | return [from_dict(i) for i in d] | |
35 | else: |
|
35 | else: | |
36 | return d |
|
36 | return d | |
37 |
|
37 | |||
38 |
|
38 | |||
39 | def new_output(output_type, mime_bundle=None, **kwargs): |
|
39 | def new_output(output_type, mime_bundle=None, **kwargs): | |
40 | """Create a new output, to go in the ``cell.outputs`` list of a code cell.""" |
|
40 | """Create a new output, to go in the ``cell.outputs`` list of a code cell.""" | |
41 |
output = NotebookNode(output_type=output_type |
|
41 | output = NotebookNode(output_type=output_type) | |
|
42 | output.update(from_dict(kwargs)) | |||
42 | if mime_bundle: |
|
43 | if mime_bundle: | |
43 | output.update(mime_bundle) |
|
44 | output.update(mime_bundle) | |
44 | # populate defaults: |
|
45 | # populate defaults: | |
45 | output.setdefault('metadata', NotebookNode()) |
|
46 | output.setdefault('metadata', NotebookNode()) | |
46 | if output_type == 'stream': |
|
47 | if output_type == 'stream': | |
47 | output.setdefault('name', 'stdout') |
|
48 | output.setdefault('name', 'stdout') | |
48 | output.setdefault('text', '') |
|
49 | output.setdefault('text', '') | |
49 | validate(output, output_type) |
|
50 | validate(output, output_type) | |
50 | return output |
|
51 | return output | |
51 |
|
52 | |||
52 | def new_code_cell(source='', **kwargs): |
|
53 | def new_code_cell(source='', **kwargs): | |
53 | """Create a new code cell""" |
|
54 | """Create a new code cell""" | |
54 |
cell = NotebookNode(cell_type='code', source=source |
|
55 | cell = NotebookNode(cell_type='code', source=source) | |
|
56 | cell.update(from_dict(kwargs)) | |||
55 | cell.setdefault('metadata', NotebookNode()) |
|
57 | cell.setdefault('metadata', NotebookNode()) | |
56 | cell.setdefault('source', '') |
|
58 | cell.setdefault('source', '') | |
57 | cell.setdefault('prompt_number', None) |
|
59 | cell.setdefault('prompt_number', None) | |
58 | cell.setdefault('outputs', []) |
|
60 | cell.setdefault('outputs', []) | |
59 |
|
61 | |||
60 | validate(cell, 'code_cell') |
|
62 | validate(cell, 'code_cell') | |
61 | return cell |
|
63 | return cell | |
62 |
|
64 | |||
63 | def new_markdown_cell(source='', **kwargs): |
|
65 | def new_markdown_cell(source='', **kwargs): | |
64 | """Create a new markdown cell""" |
|
66 | """Create a new markdown cell""" | |
65 |
cell = NotebookNode(cell_type='markdown', source=source |
|
67 | cell = NotebookNode(cell_type='markdown', source=source) | |
|
68 | cell.update(from_dict(kwargs)) | |||
66 | cell.setdefault('metadata', NotebookNode()) |
|
69 | cell.setdefault('metadata', NotebookNode()) | |
67 |
|
70 | |||
68 | validate(cell, 'markdown_cell') |
|
71 | validate(cell, 'markdown_cell') | |
69 | return cell |
|
72 | return cell | |
70 |
|
73 | |||
71 | def new_heading_cell(source='', **kwargs): |
|
74 | def new_heading_cell(source='', **kwargs): | |
72 | """Create a new heading cell""" |
|
75 | """Create a new heading cell""" | |
73 |
cell = NotebookNode(cell_type='heading', source=source |
|
76 | cell = NotebookNode(cell_type='heading', source=source) | |
|
77 | cell.update(from_dict(kwargs)) | |||
74 | cell.setdefault('metadata', NotebookNode()) |
|
78 | cell.setdefault('metadata', NotebookNode()) | |
75 | cell.setdefault('level', 1) |
|
79 | cell.setdefault('level', 1) | |
76 |
|
80 | |||
77 | validate(cell, 'heading_cell') |
|
81 | validate(cell, 'heading_cell') | |
78 | return cell |
|
82 | return cell | |
79 |
|
83 | |||
80 | def new_raw_cell(source='', **kwargs): |
|
84 | def new_raw_cell(source='', **kwargs): | |
81 | """Create a new raw cell""" |
|
85 | """Create a new raw cell""" | |
82 |
cell = NotebookNode(cell_type='raw', source=source |
|
86 | cell = NotebookNode(cell_type='raw', source=source) | |
|
87 | cell.update(from_dict(kwargs)) | |||
83 | cell.setdefault('metadata', NotebookNode()) |
|
88 | cell.setdefault('metadata', NotebookNode()) | |
84 |
|
89 | |||
85 | validate(cell, 'raw_cell') |
|
90 | validate(cell, 'raw_cell') | |
86 | return cell |
|
91 | return cell | |
87 |
|
92 | |||
88 | def new_notebook(**kwargs): |
|
93 | def new_notebook(**kwargs): | |
89 | """Create a new notebook""" |
|
94 | """Create a new notebook""" | |
90 |
nb = |
|
95 | nb = from_dict(kwargs) | |
91 | nb.nbformat = nbformat |
|
96 | nb.nbformat = nbformat | |
92 | nb.nbformat_minor = nbformat_minor |
|
97 | nb.nbformat_minor = nbformat_minor | |
93 | nb.setdefault('cells', []) |
|
98 | nb.setdefault('cells', []) | |
94 | nb.setdefault('metadata', NotebookNode()) |
|
99 | nb.setdefault('metadata', NotebookNode()) | |
95 | validate(nb) |
|
100 | validate(nb) | |
96 | return nb |
|
101 | return nb |
General Comments 0
You need to be logged in to leave comments.
Login now