Skip to content

Commit ff083a3

Browse files
committed
fixes #62
1 parent 305b43b commit ff083a3

File tree

3 files changed

+24
-13
lines changed

3 files changed

+24
-13
lines changed

execnb/_modidx.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
'execnb.shell._out_exc': ('shell.html#_out_exc', 'execnb/shell.py'),
4949
'execnb.shell._out_nb': ('shell.html#_out_nb', 'execnb/shell.py'),
5050
'execnb.shell._out_stream': ('shell.html#_out_stream', 'execnb/shell.py'),
51+
'execnb.shell._pre': ('shell.html#_pre', 'execnb/shell.py'),
5152
'execnb.shell.exec_nb': ('shell.html#exec_nb', 'execnb/shell.py'),
5253
'execnb.shell.find_output': ('shell.html#find_output', 'execnb/shell.py'),
5354
'execnb.shell.format_exc': ('shell.html#format_exc', 'execnb/shell.py'),

execnb/shell.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -137,22 +137,27 @@ def run(self:CaptureShell,
137137
return _out_nb(res, self.display_formatter)
138138

139139
# %% ../nbs/02_shell.ipynb
140-
def render_outputs(outputs, ansi_renderer=strip_ansi, include_imgs=True):
141-
try: import mistletoe
140+
def _pre(s, xtra=''): return f"<pre {xtra}><code>{escape(s)}</code></pre>"
141+
142+
def render_outputs(outputs, ansi_renderer=strip_ansi, include_imgs=True, pygments=False):
143+
try:
144+
from mistletoe import markdown, HTMLRenderer
145+
from mistletoe.contrib.pygments_renderer import PygmentsRenderer
142146
except ImportError: return print('mistletoe not found -- please install it')
147+
renderer = PygmentsRenderer if pygments else HTMLRenderer
143148
def render_output(out):
144149
otype = out['output_type']
145150
if otype == 'stream':
146151
txt = ansi_renderer(''.join(out['text']))
147-
return f"<pre>{txt}</pre>" if out['name']=='stdout' else f"<pre class='stderr'>{txt}</pre>"
152+
return _pre(txt, '' if out['name']=='stdout' else "class='stderr'")
148153
elif otype in ('display_data','execute_result'):
149154
data = out['data']
150155
_g = lambda t: ''.join(data[t]) if t in data else None
151156
if d := _g('text/html'): return d
152157
if d := _g('application/javascript'): return f'<script>{d}</script>'
153-
if d := _g('text/markdown'): return mistletoe.markdown(d)
158+
if d := _g('text/markdown'): return markdown(d, renderer=renderer)
154159
if d := _g('text/latex'): return f'<div class="math">${d}$</div>'
155-
if d := _g('text/plain'): return f"<pre>{escape(d)}</pre>"
160+
if d := _g('text/plain'): return _pre(d)
156161
if d := _g('image/svg+xml'): return d
157162
if include_imgs:
158163
if d := _g('image/jpeg'): return f'<img src="data:image/jpeg;base64,{d}"/>'

nbs/02_shell.ipynb

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -760,8 +760,8 @@
760760
"text/plain": [
761761
"[{'name': 'stdout',\n",
762762
" 'output_type': 'stream',\n",
763-
" 'text': ['CPU times: user 3 us, sys: 1e+03 ns, total: 4 us\\n',\n",
764-
" 'Wall time: 5.96 us\\n']},\n",
763+
" 'text': ['CPU times: user 1 us, sys: 1e+03 ns, total: 2 us\\n',\n",
764+
" 'Wall time: 5.01 us\\n']},\n",
765765
" {'data': {'text/plain': ['2']},\n",
766766
" 'metadata': {},\n",
767767
" 'output_type': 'execute_result'}]"
@@ -796,7 +796,7 @@
796796
" {'ename': 'ZeroDivisionError',\n",
797797
" 'evalue': 'division by zero',\n",
798798
" 'output_type': 'error',\n",
799-
" 'traceback': 'Traceback (most recent call last):\\n File \"/home/jhoward/miniconda3/lib/python3.12/site-packages/IPython/core/interactiveshell.py\", line 3577, in run_code\\n exec(code_obj, self.user_global_ns, self.user_ns)\\n File \"<ipython-input-1-9e1622b385b6>\", line 1, in <module>\\n 1/0\\n ~^~\\nZeroDivisionError: division by zero\\n'}]"
799+
" 'traceback': 'Traceback (most recent call last):\\n File \"/Users/jhoward/miniconda3/lib/python3.11/site-packages/IPython/core/interactiveshell.py\", line 3577, in run_code\\n exec(code_obj, self.user_global_ns, self.user_ns)\\n File \"<ipython-input-1-9e1622b385b6>\", line 1, in <module>\\n 1/0\\n ~^~\\nZeroDivisionError: division by zero\\n'}]"
800800
]
801801
},
802802
"execution_count": null,
@@ -816,22 +816,27 @@
816816
"outputs": [],
817817
"source": [
818818
"#| export\n",
819-
"def render_outputs(outputs, ansi_renderer=strip_ansi, include_imgs=True):\n",
820-
" try: import mistletoe\n",
819+
"def _pre(s, xtra=''): return f\"<pre {xtra}><code>{escape(s)}</code></pre>\"\n",
820+
"\n",
821+
"def render_outputs(outputs, ansi_renderer=strip_ansi, include_imgs=True, pygments=False):\n",
822+
" try:\n",
823+
" from mistletoe import markdown, HTMLRenderer\n",
824+
" from mistletoe.contrib.pygments_renderer import PygmentsRenderer\n",
821825
" except ImportError: return print('mistletoe not found -- please install it')\n",
826+
" renderer = PygmentsRenderer if pygments else HTMLRenderer\n",
822827
" def render_output(out):\n",
823828
" otype = out['output_type']\n",
824829
" if otype == 'stream':\n",
825830
" txt = ansi_renderer(''.join(out['text']))\n",
826-
" return f\"<pre>{txt}</pre>\" if out['name']=='stdout' else f\"<pre class='stderr'>{txt}</pre>\"\n",
831+
" return _pre(txt, '' if out['name']=='stdout' else \"class='stderr'\")\n",
827832
" elif otype in ('display_data','execute_result'):\n",
828833
" data = out['data']\n",
829834
" _g = lambda t: ''.join(data[t]) if t in data else None\n",
830835
" if d := _g('text/html'): return d\n",
831836
" if d := _g('application/javascript'): return f'<script>{d}</script>'\n",
832-
" if d := _g('text/markdown'): return mistletoe.markdown(d)\n",
837+
" if d := _g('text/markdown'): return markdown(d, renderer=renderer)\n",
833838
" if d := _g('text/latex'): return f'<div class=\"math\">${d}$</div>'\n",
834-
" if d := _g('text/plain'): return f\"<pre>{escape(d)}</pre>\"\n",
839+
" if d := _g('text/plain'): return _pre(d)\n",
835840
" if d := _g('image/svg+xml'): return d\n",
836841
" if include_imgs:\n",
837842
" if d := _g('image/jpeg'): return f'<img src=\"data:image/jpeg;base64,{d}\"/>'\n",

0 commit comments

Comments
 (0)