2014-01-26 7 views
7

Innerhalb einer Markdown-Zelle in einem Ipython-Notebook möchte ich in der Lage sein, Variablen automatisch zu erweitern. Kann das gemacht werden?Erweitere Variablen in Markdown-Zellen von ipython-notebook

Als Beispiel betrachten wir den folgenden Code

from IPython.core.display import HTML 
from markdown import markdown 

base_url = "https://stackoverflow.com/" 
markdown_string = "Two categories at [stackoverflow]({0}) are "\ 
        "[ipython-notebook]({0}questions/tagged/ipython-notebook) and "\ 
        "[matplotlib]({0}questions/tagged/matplotlib).".format(base_url) 
HTML("<p>{}</p>".format(markdown(markdown_string))) 

Dies erzeugt die Ausgangszelle mit den Links richtig, alle in Bezug auf base_url, wie

zwei Kategorien bei stackoverflow sind ipython-notebook und matplotlib.

Was ich möchte, ist in der Lage sein, den Abschlag direkt in die Zelle eintippen, Verweis auf eine vordefinierte Variable. Ist das möglich?

+0

Oh, ich wusste vorher noch nichts über 'IPython.core.display.HTML', habe immer mein eigenes Objekt mit' _repr_html_' gerollt. – Kos

+2

Dies ist sehr wahrscheinlich ein Duplikat von http://Stackoverflow.com/q/18878083/2870069 einige Kommentare werden auch hier gegeben: http://StackOverflow.com/Q/19524554/2870069 – Jakob

+0

@Jakob ist richtig - was ich wollte ist genau in der ersten Frage, die mir die Antwort gibt, die ich erwartet habe. – Ian

Antwort

6

Obwohl es noch nicht möglich ist, mit einer echten Markdown-Zelle zu arbeiten, können Sie leicht eine Magie erstellen, um den gleichen Effekt zu erzielen.

from __future__ import absolute_import 
from IPython.core.getipython import get_ipython 
from IPython.core.magic import (Magics, magics_class, cell_magic) 

@magics_class 
class MarkdownMagics(Magics): 

    @cell_magic 
    def markdown(self, line, cell): 
     from IPython.core.display import HTML 
     from markdown import markdown 

     vars = line.split() 

     d = {} 
     for k, v in self.shell.user_ns.items(): 
      if k in vars: 
       d[k] = v 

     return HTML("<p>{}</p>".format(markdown(cell.format(**d)))) 

get_ipython().register_magics(MarkdownMagics) 

einige Variablen gesetzt

foo = 1 
bar = 2 

Dann die Magie nennen, mit Argumenten die Variablen, die Sie aus dem Namensraum nehmen wollen zu sein.

%%markdown foo bar 

Substitute _{foo}_ and *{bar}* 
5

Wie @Jakob in den Kommentaren beantwortet, ist der einfachste Weg, dies accompish die python-markdown IPython Notebook Erweiterung zu installieren, wie auf der wiki page beschrieben.

Anschließend können Sie Ihre Variablen in Abschlag zugreifen, indem sie mit geschweiften Klammern umgeben:

Python Zelle:

x = 1000 

Markdown-Zelle:

Insert variable contents here -> {{x}}. 

Die Abschlag Zelle analysiert wird:

Insert variable contents here -> 1000. 
Verwandte Themen