2012-12-07 1 views
15

Mi piacciono le celle Markdown di IPython per incorporare HTML e altri contenuti multimediali all'interno di notebook. Vorrei sapere se un output di comando può essere formattato in modo simile, nelle celle di output.Crea celle di output come Markdown

Ecco una delle mie funzioni l'output HTML:

print_html(): 
     print """ 
     <h2>Matplotlib's chart gallery (Click a chart to see the code to create it)</h2><br> 
     <div align="center"> <iframe title="Matplotlib Gallery" width="950" 
     height="250" src="http://matplotlib.org/gallery.html#api" frameborder="0" 
     allowfullscreen></iframe></div> 
    """ 

Il codice HTML sopra, se posto in Markdown cella (ingresso), produce bel link alla libreria Matplotlib. Ma nella cella di output è semplicemente testo. Un modo per renderlo ricco di contenuti?

+0

Solutions finora funzionano solo per le funzioni che voi chiamate direttamente da IPython - quello che se vogliamo rendere html in stampa/metodi di registrazione chiamato dall'interno una funzione? – Peter

risposta

16

trovato una soluzione qui: http://mail.scipy.org/pipermail/ipython-user/2012-April/009838.html

Citando la soluzione qui per ref:

Brian Granger:

" Abbia la funzione restituire il codice HTML crudo avvolto in un oggetto HTML:

from IPython.core.display import HTML 
... 
... 
def foo(): 
    raw_html = "<h1>Yah, rendered HTML</h1>" 
    return HTML(raw_html) 

"

Ora chiamare foo() fornisce un html ricco di formattazione come volevo.

+1

Come indicato dalla posta collegata, è necessario importare HTML come segue: da IPython.core.display import HTML – GermanK

+0

Grazie per aver migliorato questa risposta! –

+0

Ma non puoi mescolarlo con un po 'di stampa. Quindi, come creare un'intestazione e stampare del testo sotto – Norfeldt

4

Basta aggiungere qualche caratteristica in più al tuo esempio di codice

htmlContent = '' 

def header(text): 
    raw_html = '<h1>' + str(text) + '</h1>' 
    return raw_html 

def box(text): 
    raw_html = '<div style="border:1px dotted black;padding:2em;">'+str(text)+'</div>' 
    return raw_html 

def addContent(raw_html): 
    global htmlContent 
    htmlContent += raw_html 


# Example 
addContent(header("This is a header")) 
addContent(box("This is some text in a box")) 

from IPython.core.display import HTML 
HTML(htmlContent) 

ti dà questo:

OUTPUT

+0

bello vedere le caratteristiche fantastiche! –

7

Una soluzione in qualche modo più avanzato è stato recentemente pubblicato in un post sul blog qui:

http://guido.vonrudorff.de/ipython-notebook-code-output-as-markdown/

Crea e registra una nuova magia IPython %%asmarkdown. L'output di ogni cella di codice che tu anteponi a questo comando sarà reso come puro markdown delle celle. Utilizzando il contenuto della domanda iniziale, quanto segue si comporterebbe come previsto:

%%asmarkdown 
print """ 
<h2>Matplotlib's chart gallery (Click a chart to see the code to create it)</h2><br> 
<div align="center"> <iframe title="Matplotlib Gallery" width="950" 
height="250" src="http://matplotlib.org/gallery.html#api" frameborder="0" 
allowfullscreen></iframe></div> 
""" 
+1

Questo ha funzionato facilmente. La piccola eccezione di, per gli utenti di python 3, l'aggiunta di 'from io import StringIO' invece di' from stringIO import StringIO'. – josh

+0

Questa è la soluzione che meglio risponde alla domanda originale. –