##// END OF EJS Templates
Provide hooks for arbitrary mimetypes handling....
Provide hooks for arbitrary mimetypes handling. This should allow at some point inline images, an math in the terminal.

File last commit:

r25164:cbfdf70d
r25164:cbfdf70d
Show More
mimerenderer.rst
55 lines | 2.2 KiB | text/x-rst | RstLexer
Matthias Bussonnier
Provide hooks for arbitrary mimetypes handling....
r25164 Arbitrary Mimetypes Handing in Terminal
=======================================
When using IPython terminal it is now possible to register function to handle
arbitrary mimetypes (``TerminalInteractiveShell.mime_renderers`` ``Dict``
configurable). While rendering non-text based representation was possible in
many jupyter frontend; it was not possible in terminal IPython, as usually
terminal are limited to displaying text. As many terminal these days provide
escape sequences to display non-text; bringing this loved feature to IPython CLI
made a lot of sens. This functionality will not only allow inline images; but
allow opening of external program; for example ``fmplayer`` to "display" sound
files.
Here is a complete IPython tension to display images inline and convert math to
png, before displaying it inline ::
from base64 import encodebytes
from IPython.lib.latextools import latex_to_png
def mathcat(data, meta):
png = latex_to_png(f'$${data}$$'.replace('\displaystyle', '').replace('$$$', '$$'))
imcat(png, meta)
IMAGE_CODE = '\033]1337;File=name=name;inline=true;:{}\a'
def imcat(image_data, metadata):
try:
print(IMAGE_CODE.format(encodebytes(image_data).decode()))
# bug workaround
except:
print(IMAGE_CODE.format(image_data))
def register_mimerenderer(ipython, mime, handler):
ipython.display_formatter.active_types.append(mime)
ipython.display_formatter.formatters[mime].enabled = True
ipython.mime_renderers[mime] = handler
def load_ipython_extension(ipython):
register_mimerenderer(ipython, 'image/png', imcat)
register_mimerenderer(ipython, 'image/jpeg', imcat)
register_mimerenderer(ipython, 'text/latex', mathcat)
This example only work for iterm2 on mac os and skip error handling for brevity.
One could also invoke an external viewer with ``subporcess.run()`` and a
tempfile, which is left as an exercise.
So far only the hooks necessary for this are in place, but no default mime
renderers added; so inline images will only be available via extensions. We will
progressively enable these features by default in the next few releases, and
contribution is welcomed.