Někdy potřebujeme jako výstup našeho programu vytvořit html stránku. Mám zde na mysli lokální vytváření html stránky, ne dynamické generování html, jako třeba pomocí php.
Jak vytvořit www stránku
Někdy potřebujeme jako výstup našeho programu vytvořit html stránku. Mám zde na mysli lokální vytváření html stránky, ne dynamické generování html, jako třeba pomocí php. Serverové dynamické generování html stránek Python umí také , ale o tom někdy jindy.
Pěšky za vozem
Snad i někoho napadne následující jednoduché, přesto v mnoha případech naprosto dostačující a přirozené řešení - čistě texové. Práce s textovými řetězci. Ukazuji v něm také, jak ho uložit a jak automaticky na konci skriptu zavolat prohlížeč, abychom si ihned prohlédli svůj výtvor:
top="<html> <body bgcolor='lightyellow'>\n"
obsah=raw_input('Jak se jmenujes?: ')
obsah="Ja se jmenuji "+'<b style="color:red">'+obsah+"</b>"+"!\n"
spodek="</body> </html>"
stranka=top+obsah+spodek
print "\n"*2, stranka
nazevHTML='MojePrvniHtml.html'
ulozeno=file(nazevHTML,'w')
ulozeno.write(stranka)
ulozeno.close()
import webbrowser
webbrowser.open(nazevHTML)
Octavia
Tak se svezeme nějakým dobrým autem . Myslím tím, že použijeme nějaký dobrý modul. V Pythonu máme tu výhodu, že za něj nemusíme platit. Modulů na vytváření html stránek je mnoho, opravdu mnoho. Snad proto, že napsat si svůj modul je někdy rychlejší, než ho hledat a naučit se ho používat a také je to dobré programátorské cvičení. Ale to snad později...
HTMLtags
Mě se zalíbil modul HTMLTags. Při jeho stahování si vyzkoušíte i něco navíc. Na této stránce si zkopírujte kód modulu (nikde jsem ho totiž nenašel uložený pro download), vložte v textovém editoru do dokumentu a uložte pod jménem HTMLTags.py. Pozor na velikosti písmen. Místa pro vhodné uložení jsou dvě. Buď v adresáři Lib/site-packages nebo přímo do adresáře, kde bude ležet váš skript.
Co to v tom modulu je?
Zastavil bych se jen u pár věcí. Na tomto scriptu je vidět jednoduchost a mohutnost Pythonu. Neuvěřitelně přehledný, krátký, ale přesto výkonný kód. Těsně před koncem vidíme ve dvou seznamech tagy. Nad tím jediná třída (objektové programování), která definuje metody sčítání (co se stane, když dva tagy budu sčítat), násobení (co se stane, když tag vynásobím číslem ) a tisku (co se stane, když ho budu chtít tisknout). Odstavec #create the classes je pak skutečně high level...
Použití
Uvedu část/výtah z dokumentace přímo z modulu s mými poznámkami a změnami.
Modul HTMLTags definuje třídy pro všechny HTML Tagy, bohužel velkými písmeny, což si však můžete přímo v kódu modulu změnit (pohybujeme stále na půdě Open Source, případně GNU/GPL, narozdíl od placených řešení). Obecně se tag vytváří takto:
t = TAG(innerHTML, key1=val1,key2=val2,...)
takže "print t" vytiskne:
<TAG key1="val1" key2="val2" ...>innerHTML</TAG>
Například:
from HTMLTags import *
t= A('katalog', href="foo")
print t # ==> <A href="foo">katalog</A>
Proměnná t není text, ale instance objektu, která má svoje metody (viz objektové programování v Pythonu). I když "print t" vypadá, jako když to text je. Je to právě způsobeno metodou __str__() ve třídě TAG... Že je to skutečně instance zjistíte takto:
print repr(t) # ==> <HTMLTags.A instance at 0x00935B20>
# nebo
t=t+'ahoj'
# to způsobí chybu, protože chceme sčítat hrušky a jablka (instance a text)
# pokud to opravdu pořebuje, použijeme pomocny tag TEXT:
t=t+TEXT('ahoj')
Argument tagu může být jiný tag, takže můžeme tagy zanořovat do sebe:
print B(I('foo')) ==> <B><I>foo</I></B>
A máme tu slibované sčítání, jedna z high-level věcí:
print B('bar')+INPUT(name="bar") ==> <B>bar</B><INPUT name="bar">
První funkční příklad:
# -*- coding: cp1250 -*-
import HTMLTags as H
# abychom nemuseli všude psát HTMLTags, ale stačilo H
# dejte pozor, nikde pak nesmíte použít H jako proměnnou
# (například H=12)
hlavicka=H.HEAD(H.TITLE('Můj druhý HTML text'))
telo=H.BODY(H.H1('Toto je test')+
H.TEXT('První řádka')+H.BR()+
H.TEXT('Druhá řádka'))
stranka= H.HTML(hlavicka+telo)
nazevHTML='MojeDruheHtml.html'
ulozeno=file(nazevHTML,'w')
ulozeno.write(stranka.__str__())
# nestačí jako argument použít 'stranka'
# je třeba 'jinak a lépe' zavolat print
ulozeno.close()
print unicode(stranka.__str__(),'cp1250')
# kvuli češtině opět bohužel nestačí print stranka
import webbrowser
webbrowser.open(nazevHTML)
Výstup z programu:
<HTML>
<HEAD>
<TITLE>
Můj druhý HTML text
</TITLE>
</HEAD>
<BODY>
<H1>
Toto je test
</H1>
První řádka<BR>
Druhá řádka
</BODY>
</HTML>
Tabulky a CSS
stylesheet = H.LINK(rel="Stylesheet",href="doc.css")
radkyTabulky=H.TEXT() # inicializace proměnné
for i in range(10):
radkyTabulky=radkyTabulky+H.TR(H.TD(i)+H.TD(i*i))
stranka=H.HTML(H.HEAD(stylesheet)+H.BODY(H.TABLE(radkyTabulky)))