##// END OF EJS Templates
Test of simpler way to define ast macros. (#14100)...
Test of simpler way to define ast macros. (#14100) Provide and easier way to generate magics and pre-post hooks This introduce a code base way of modifying the ast. This allow to use Template strings with the two special variable names names `__code__` and `__ret__` allowing to quickly write a magic, or hooks that modify the ast. This also introduce a `%code_wrap` cell magic to on the fly wrap code. It is this easy to for example modify IPython to say time each block of code, or retry them, or wrap them in try/except and analyse the error message, profile... Note that this is not new, but simply convenience function and utilities, especially around hygiene.

File last commit:

r27632:cf0cbaf5
r28324:c3d7f161 merge
Show More
shell_mimerenderer.rst
60 lines | 2.4 KiB | text/x-rst | RstLexer
/ docs / source / config / shell_mimerenderer.rst

Mime Renderer Extensions

Like it's cousins, Jupyter Notebooks and JupyterLab, Terminal IPython can be thought to render a number of mimetypes in the shell. This can be used to either display inline images if your terminal emulator supports it; or open some display results with external file viewers.

Registering new mimetype handlers can so far only be done by extensions and requires 4 steps:

  • Define a callable that takes 2 parameters:data and metadata; return value of the callable is so far ignored. This callable is responsible for "displaying" the given mimetype. Which can be sending the right escape sequences and bytes to the current terminal; or open an external program. -
  • Appending the right mimetype to ipython.display_formatter.active_types for IPython to know it should not ignore those mimetypes.
  • Enabling the given mimetype: ipython.display_formatter.formatters[mime].enabled = True
  • Registering above callable with mimetype handler: ipython.mime_renderers[mime] = handler

Here is a complete IPython extension to display images inline and convert math to png, before displaying it inline for iterm2 on macOS

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 macOS and skip error handling for brevity. One could also invoke an external viewer with subprocess.run() and a temporary file, which is left as an exercise.