Show More
@@ -1,114 +1,27 b'' | |||||
1 | """reST directive for syntax-highlighting ipython interactive sessions. |
|
|||
2 |
|
||||
3 | XXX - See what improvements can be made based on the new (as of Sept 2009) |
|
|||
4 | 'pycon' lexer for the python console. At the very least it will give better |
|
|||
5 | highlighted tracebacks. |
|
|||
6 |
""" |
|
1 | """ | |
|
2 | reST directive for syntax-highlighting ipython interactive sessions. | |||
7 |
|
|
3 | ||
8 | #----------------------------------------------------------------------------- |
|
4 | """ | |
9 | # Needed modules |
|
|||
10 |
|
||||
11 | # Standard library |
|
|||
12 | import re |
|
|||
13 |
|
||||
14 | # Third party |
|
|||
15 | from pygments.lexer import Lexer, do_insertions |
|
|||
16 | from pygments.lexers.agile import (PythonConsoleLexer, PythonLexer, |
|
|||
17 | PythonTracebackLexer) |
|
|||
18 | from pygments.token import Comment, Generic |
|
|||
19 |
|
5 | |||
20 | from sphinx import highlighting |
|
6 | from sphinx import highlighting | |
21 |
|
7 | from ..nbconvert.utils.lexers import IPyLexer | ||
22 | #----------------------------------------------------------------------------- |
|
|||
23 | # Global constants |
|
|||
24 | line_re = re.compile('.*?\n') |
|
|||
25 |
|
||||
26 | #----------------------------------------------------------------------------- |
|
|||
27 | # Code begins - classes and functions |
|
|||
28 |
|
||||
29 | class IPythonConsoleLexer(Lexer): |
|
|||
30 | """ |
|
|||
31 | For IPython console output or doctests, such as: |
|
|||
32 |
|
||||
33 | .. sourcecode:: ipython |
|
|||
34 |
|
||||
35 | In [1]: a = 'foo' |
|
|||
36 |
|
||||
37 | In [2]: a |
|
|||
38 | Out[2]: 'foo' |
|
|||
39 |
|
||||
40 | In [3]: print a |
|
|||
41 | foo |
|
|||
42 |
|
||||
43 | In [4]: 1 / 0 |
|
|||
44 |
|
||||
45 | Notes: |
|
|||
46 |
|
||||
47 | - Tracebacks are not currently supported. |
|
|||
48 |
|
||||
49 | - It assumes the default IPython prompts, not customized ones. |
|
|||
50 | """ |
|
|||
51 |
|
||||
52 | name = 'IPython console session' |
|
|||
53 | aliases = ['ipython'] |
|
|||
54 | mimetypes = ['text/x-ipython-console'] |
|
|||
55 | input_prompt = re.compile("(In \[[0-9]+\]: )|( \.\.\.+:)") |
|
|||
56 | output_prompt = re.compile("(Out\[[0-9]+\]: )|( \.\.\.+:)") |
|
|||
57 | continue_prompt = re.compile(" \.\.\.+:") |
|
|||
58 | tb_start = re.compile("\-+") |
|
|||
59 |
|
||||
60 | def get_tokens_unprocessed(self, text): |
|
|||
61 | pylexer = PythonLexer(**self.options) |
|
|||
62 | tblexer = PythonTracebackLexer(**self.options) |
|
|||
63 |
|
||||
64 | curcode = '' |
|
|||
65 | insertions = [] |
|
|||
66 | for match in line_re.finditer(text): |
|
|||
67 | line = match.group() |
|
|||
68 | input_prompt = self.input_prompt.match(line) |
|
|||
69 | continue_prompt = self.continue_prompt.match(line.rstrip()) |
|
|||
70 | output_prompt = self.output_prompt.match(line) |
|
|||
71 | if line.startswith("#"): |
|
|||
72 | insertions.append((len(curcode), |
|
|||
73 | [(0, Comment, line)])) |
|
|||
74 | elif input_prompt is not None: |
|
|||
75 | insertions.append((len(curcode), |
|
|||
76 | [(0, Generic.Prompt, input_prompt.group())])) |
|
|||
77 | curcode += line[input_prompt.end():] |
|
|||
78 | elif continue_prompt is not None: |
|
|||
79 | insertions.append((len(curcode), |
|
|||
80 | [(0, Generic.Prompt, continue_prompt.group())])) |
|
|||
81 | curcode += line[continue_prompt.end():] |
|
|||
82 | elif output_prompt is not None: |
|
|||
83 | # Use the 'error' token for output. We should probably make |
|
|||
84 | # our own token, but error is typicaly in a bright color like |
|
|||
85 | # red, so it works fine for our output prompts. |
|
|||
86 | insertions.append((len(curcode), |
|
|||
87 | [(0, Generic.Error, output_prompt.group())])) |
|
|||
88 | curcode += line[output_prompt.end():] |
|
|||
89 | else: |
|
|||
90 | if curcode: |
|
|||
91 | for item in do_insertions(insertions, |
|
|||
92 | pylexer.get_tokens_unprocessed(curcode)): |
|
|||
93 | yield item |
|
|||
94 | curcode = '' |
|
|||
95 | insertions = [] |
|
|||
96 | yield match.start(), Generic.Output, line |
|
|||
97 | if curcode: |
|
|||
98 | for item in do_insertions(insertions, |
|
|||
99 | pylexer.get_tokens_unprocessed(curcode)): |
|
|||
100 | yield item |
|
|||
101 |
|
||||
102 |
|
8 | |||
103 | def setup(app): |
|
9 | def setup(app): | |
104 | """Setup as a sphinx extension.""" |
|
10 | """Setup as a sphinx extension.""" | |
105 |
|
11 | |||
106 | # This is only a lexer, so adding it below to pygments appears sufficient. |
|
12 | # This is only a lexer, so adding it below to pygments appears sufficient. | |
107 |
# But if somebody knows |
|
13 | # But if somebody knows what the right API usage should be to do that via | |
108 | # sphinx, by all means fix it here. At least having this setup.py |
|
14 | # sphinx, by all means fix it here. At least having this setup.py | |
109 | # suppresses the sphinx warning we'd get without it. |
|
15 | # suppresses the sphinx warning we'd get without it. | |
110 | pass |
|
16 | pass | |
111 |
|
17 | |||
112 | #----------------------------------------------------------------------------- |
|
18 | # Register the extension as a valid pygments lexerself. | |
113 | # Register the extension as a valid pygments lexer |
|
19 | # Alternatively, we could register the lexer with pygments instead. This would | |
114 | highlighting.lexers['ipython'] = IPythonConsoleLexer() |
|
20 | # require using setuptools entrypoints: http://pygments.org/docs/plugins | |
|
21 | ||||
|
22 | ipy = IPyLexer(python3=False) | |||
|
23 | ipy3 = IPyLexer(python3=True) | |||
|
24 | ipy3.aliases = ['ipy3'] | |||
|
25 | ||||
|
26 | highlighting.lexers['ipy'] = ipy | |||
|
27 | highlighting.lexers['ipy3'] = ipy3 |
General Comments 0
You need to be logged in to leave comments.
Login now