Направете изходни клетки като Markdown

Харесвам клетките Markdown на IPython за включване на HTML и друго богато съдържание в бележниците. Бих искал да знам дали изход на команда може да бъде форматиран по подобен начин в изходни клетки.

Ето една от моите функции, извеждащи 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>
    """

HTML кодът по-горе, ако бъде поставен в клетка за маркиране (въвеждане), създава хубава връзка към библиотеката Matplotlib. Но в изходната клетка това е просто обикновен текст. Има ли начин да го обогатите със съдържание?


person nom-mon-ir    schedule 07.12.2012    source източник
comment
Решенията досега работят само за функции, които извиквате директно от IPython - какво ще стане, ако искаме да изобразим html в методи за печат/регистриране, извикани от функция?   -  person Peter    schedule 18.03.2015


Отговори (3)


Намерих решение тук: http://mail.scipy.org/pipermail/ipython-user/2012-April/009838.html

Цитирайки решението тук за справка:

Браян Грейнджър:

" Накарайте функцията да върне необработения HTML, обвит в HTML обект:

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

"

Сега извикването на foo() дава богато форматиран html, както исках.

person nom-mon-ir    schedule 07.12.2012
comment
Както посочва свързаната поща, трябва да импортирате HTML както следва: от IPython.core.display импортирайте HTML - person GermanK; 07.06.2013
comment
Благодаря, че подобрихте този отговор! - person nom-mon-ir; 07.06.2013
comment
Но не можете да го смесите с някакъв печат. Така че като да направите заглавка и да отпечатате малко текст отдолу - person Norfeldt; 25.07.2013
comment
Не е задължително да използвате печат. Просто добавете към низа raw_html каквото искате да отпечатате и след това върнете HTML(raw_html) - person nom-mon-ir; 25.07.2013
comment
Имайте предвид, че можете също да използвате markdown вместо HTML. Първо импортирайте Markdown: from IPython.core.display import Markdown, след това върнете съдържанието на Markdown на последния ред с Markdown(your_content_here). - person miha; 19.12.2016

Някак по-усъвършенствано решение беше публикувано наскоро в публикация в блог тук:

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

Той създава и регистрира нов IPython magic %%asmarkdown. Резултатът от всяка кодова клетка, която добавяте с тази команда, ще бъде изобразен като чисти маркдаун клетки. Използвайки съдържанието на първоначалния въпрос, следното ще се държи според очакванията:

%%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>
"""
person Elpy    schedule 24.10.2015
comment
Това работи супер лесно. Малкото изключение от, за потребители на python 3, добавяне на from io import StringIO вместо from stringIO import StringIO. - person Little Bobby Tables; 30.11.2015
comment
Това е решението, което най-добре отговаря на първоначалния въпрос. - person Bo Nygaard Bai; 03.11.2016

Просто добавяне на допълнителна функция към вашия примерен код

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)

ви дава това:

ИЗХОД

person Norfeldt    schedule 26.07.2013
comment
радвам се да видя фантастичните функции! - person nom-mon-ir; 27.07.2013