Inline Code

All code should compute, code for typographic decoration should require extra effort to suppress. As a rule, code in a document should work.

In this document, we’ll execute code from within ticks as one would with inline code.

import ast, mistune, re

Use mistune’s pattern to discover inine code.

inline = re.compile(mistune.InlineGrammar.code.pattern[1:])

Create an ast.NodeTransformer that runs code in ticks. In this case, ast.parse is applied to any inline code.

class Inline(ast.NodeTransformer):
    def __init__(self, shell): self.shell = shell
    def visit_Expr(self, node):
        if isinstance(node.value, ast.Str):
            nodes = [node]
            for m in inline.finditer(node.value.s): nodes += ast.copy_location(self.shell.compile.ast_parse(m.group().strip('`')), node).body
            return nodes
        return node

Append to the ast_transformers with an IPython magic.

    def unload_ipython_extension(shell): shell.ast_transformers += [x for x in shell.ast_transformers if not isinstance(x, Inline)]
    def load_ipython_extension(shell): unload_ipython_extension(shell); shell.ast_transformers += [Inline(shell)]
    __name__ == '__main__' and load_ipython_extension(get_ipython())
Written on October 5, 2019