Portál AbcLinuxu, 1. května 2025 16:59
Narazil jsem na velmi zajímavě vypadající knihu o umělé inteligenci, plným názvem Artificial Intelligence - foundations of computational agents. Kniha je na webu dostupná pod Creative commons licencí, ale jen jako HTML. Na webu se sice s trochou snahy dá najít i jako .pdf
, ale to mi moc nepasuje do čtečky, proto jsem se jí rozhodl převést na epub.
Na začátku jsem o epubu nevěděl skoro nic, kromě toho že to jsou XML v ZIPu. Postupně jsem zjistil, že epub je docela fajn formát, i když má pár svých podivností. Stránka na anglické wikipedii se v tomhle ohledu ukázala jako víc než užitečná, v podstatě se dá použít jako návod.
Co se mi na něm líbí je struktura, kde jednotlivé kapitoly v podstatě odpovídají HTML stránkám, tak jak jsou na webu. To celé se obalí dvěma XML, přidá se trocha omáčky v podobě dvou zbytečných souborů, které tam vůbec být nemusely, zabalí do zipu a je z toho skoro epub.
mimetype META-INF/ container.xml OEBPS/ content.opf toc.ncx ...
První tři řádky obsahují soubory, které jsou jasně dané a není na nich co řešit. mimetype
je jen textový soubor obsahující string "application/epub+zip
".
container.xml
je základní informační soubor, který musí být ve složce META-INF
a skoro nic neobsahuje:
<?xml version="1.0"?> <container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> <rootfiles> <rootfile full-path="OEBPS/content.opf" media-type="application/oebps-package+xml"/> </rootfiles> </container>
Podstatný je jen full-path
argument tagu <rootfile>
, který obsahuje cestu k souboru kde jsou v podstatě všechna ostatní metadata. Z nějakého divného důvodu je ve většině souborů do kterých jsem koukal konvence používat složku pojmenovanou OEBPS/
, ale našel jsem i takové, které jí neobsahují a všechno ostatní je rovnou v rootu e-knihy.
Ve složce OEBPS/
už není nijak definovaná struktura a tak jsem jí použil jako hlavní úložiště na všechny .xhtml
soubory z webu. V případě Artificial inteligence jich je přes 350. Kniha používá docela velkou granularitu a tak v podstatě co pár stránek je nová podkapitolka ve vlastním souboru.
Do složky OEBPS/images
jsem pak nacpal všechny obrázky, na které se HTML soubory odkazují.
Původně jsem psal jednoduché stahovátko, které mělo poukládat všechny odkazy z indexu, poměrně záhy jsem ale zjistil, že index obsahuje jen dvě úrovně nadpisů. Stránky, kde kapitoly začínají třetí úrovní nebyly staženy a než jsem přišel na to co se vlastně děje, celé se to zkomplikovalo víc, než bylo nezbytně nutné.
Zpětně docela lituji, že jsem tu stahovací část psal v pythonu, protože je do velké míry zbytečně složitá a na stejnou věc by bohatě stačil wget. Takhle mi pod rukou vykvasily čtyři třídy, které se rekurzivně volají a celá ta architektura je dost divná. Zpětně nemám tušení, proč jsem to takhle napsal, prostě mi to nějak organicky vyrostlo pod rukama, ani nevím jak. Moc dobře jsem se nevyspal a tohle byl prostě jeden z těch dní, kdy je jednodušší upravovat zdroják a nabalovat další věci, než se zastavit, rozmyslet si co vlastně dělám a pak to udělat pořádně.
Script v podstatě rekurzivně prochází web, vyřezává ze stránek patřičný <div>
s odkazem, aby tam nebyly různé blbosti kolem jako menu a tak a ukládá si je do paměti jako objekty. Když narazí na obrázek, tak ho stáhne do paměti, zkonvertuje cesty na lokální složku images/
a upraví odkazy v HTML, aby ukazovaly správně.
Původně jsem si říkal, že by bylo dobré soubory průběžně ukládat na disk, ale pak mi došlo, že u těhle objemů je to stejně jedno. Co jsem tak koukal, vezme si to něco okolo ~40MB paměti a tak je to stejně buřta. Nemá smysl předčasně optimalizovat.
Speciálním souborem je XML soubor s titulním obrázkem. To je to co většina čteček zobrazuje jako ikonu a v metadatech to má své speciální místo.
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Cover</title> <meta content="urn:uuid:c02e8919-1dc2-4489-a5ce-979dc262dd1e" name="Adept.expected.resource"/> </head> <body> <a id="cover"/> <img alt="cover" src="images/182_9780521519007.jpg" style="height: 100%;"/> </body> </html>
Osobně moc nechápu, proč je soubor s obrázkem XML, kde je obrázek vložený stejně jako do HTML stránky. Asi je fajn mít možnost tam přidat nějaké texty, ale naprostá většina ebooků stejně použije rastrový obrázek, když už pro nic jiného, tak aspoň jako pozadí. Optimalizovat se s tím, aby se přes CSS všechny HTML nadpisy a jména autorů zobrazila správně na všech čtečkách a ještě i jako miniatury, to může asi jen masochista.
Edit: Při závěrečných kontrolách článku jsem si všiml <meta>
značky. Ta tam být pravděpodobně nemusí, vzal jsem to někde z nějakého příkladu a teď jsem moc líný to všude odstraňovat.
Nyní se konečně dostávám k tomu, co mi na celém procesu zabralo nejvíc času. Vytvoření validních metadat se ukázalo jako poměrně složité, protože mi stačilo na tom všem zabít celé odpoledne a nechtělo se mi trávit další čas studiem kompletní specifikace.
Tenhle soubor je jedna z prvních zbytečností. Měl by to být obsah knihy, celé to má ale dva problémy - jednak je to samé v podstatě znova duplikováno v content.opf
a druhak skoro každá kniha, na kterou jsem koukal používá separátní HTML soubor, kde je obsah nastylovaný tak jak ho tam chtějí autoři.
XML je docela jednoduché:
<?xml version="1.0"?> <!DOCTYPE ncx PUBLIC "-//NISO//DTD ncx 2005-1//EN" "http://www.daisy.org/z3986/2005/ncx-2005-1.dtd"> <ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1"> <head> <meta name="Artificial Intelligence - foundations of computational agents" content=""/> </head> <docTitle> <text>Artificial Intelligence - foundations of computational agents</text> </docTitle> <navMap> <navPoint id="navpoint-0" playOrder="0"> <navLabel> <text>Cover</text> </navLabel> <content src="book_cover.xhtml"/> </navPoint> </navMap> </ncx>
V <meta>
tagu a v <text>
je název knihy. V kontejneru <navMap>
se potom pro každou kapitolu opakuje tag <navPoint>
.
V <navPoint>
jsou atributy id
a playOrder
, které prostě inkrementuju výš a výš, s každým dalším <navPoint>
tagem. Podelement <navLabel>
obsahuje tag <text>
s názvem kapitoly, na kterou se odkazuje. Tag <content>
pak má v atributu src
odkaz na soubor s kapitolou.
Hlavním souborem se všemi podstatnými metadaty je content.opf
. Pojmenovaný a umístěný může být v podstatě jakkoliv, kde ho najít ukazuje META-INF/container.xml
, o kterém jsem už psal.
V souboru jsou v kontejneru <manifest>
uloženy odkazy na všechny ostatní soubory kromě sebe sama, zmiňovaného container.xml
a mimetype
.
<?xml version="1.0"?> <package version="2.0" xmlns="http://www.idpf.org/2007/opf" unique-identifier="BookId"> <metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf"> <dc:title>Artificial Intelligence</dc:title> <dc:title>foundations of computational agents</dc:title> <dc:creator opf:role="aut">David Poole</dc:creator> <dc:creator opf:role="aut">Alan Mackworth</dc:creator> <dc:format/> <dc:date>2010-06-07</dc:date> <dc:subject/> <dc:description/> <dc:rights/> <dc:language>en</dc:language> <dc:identifier id="BookId" opf:scheme="ISBN">9780521519007</dc:identifier> <meta content="cover" name="cover"/> </metadata> <manifest> <item href="toc.ncx" id="ncx" media-type="application/x-dtbncx+xml"/> <item href="images/ch04_GradientDescent.png" id="ch04_GradientDescent_png" media-type="image/png"/> ... </manifest> <spine toc="ncx"> <itemref idref="book_cover_xhtml" linear="yes"/> <itemref idref="ArtInt_html" linear="yes"/> ... </spine> <guide> <reference href="book_cover.xhtml" title="Cover" type="cover"/> <reference href="ArtInt.html" title="Table of Contents" type="toc"/> </guide> </package>
Kontejner <spine>
je potom jeden z důvodů, proč se mi zdá předchozí soubor toc.ncx
jako blbost, protože obsahuje v podstatě to samé - všechny kapitoly tak jak mají jít za sebou, s tím že se na ně odkazuje přes parametr id
tak, jak byl definovaný v kontejneru <manifest>
. Na pořadí zde záleží.
Na konci je pak kontejner <guide>
obsahující <reference>
tagy na věci jako je vlastní HTML index knihy a stránka obsahující obálku.
Výsledkem celého uvedeného souboru je skoro epub. Tváří se to jako epub, calibre to otevře jako epub, plugin do firefoxu to otevře jako epub, ale moje čtečka si z toho pšíkne, zakoulí očima a vysvětlí, že to teda ne.
Jak udělat ze skoro epubu epub jak se patří? Zkonvertovat ho z epubu do epubu přece!
Použít se k tomu dá program ebook-convert
, který je součástí balíku calibre
:
ebook-convert skoro.epub uplny.epub
Chvíli si povídá pro sebe, vypisuje co všechno vyházel, opravil a udělal správně a pak vyplivne krásný, více/méně validní epub, se kterým nemělo problémy žádné zařízení, kde jsem to zkoušel.
Pokud by měl někdo o knihu zájem, stačí si naklonovat příslušný repozitář a spustit script create_book.sh
:
To by bylo na téma "jak jsem zabil středeční odpoledne a večer" za mě. Co vy?
Za tip ohledně knihy děkuji FEE1DE4Dovi.
Tiskni
Sdílej:
Kiež by som ten svoj niekedy stihol prečítať :D Už je tak dlhý, že tie najstaršie kúsky pamätajú ešte distribúciu softvéru na disketách
40 minut v metruTo jako fakt?
Mercy Lynchová pracuje ve vojenské nemocnici. Po smrti manžela v zajateckém táboře ji už ve Virginii nic nedrží, a proto se vydává najít svého zraněného otce, který se s ní touží setkat. Cesta napříč kontinentem se mění v dobrodružné putování. Mercy postupně vystřídá vzducholoď, vlak i říční parník. Když dorazí do St. Louis, zjišťuje, že jediný vlak, který pokračuje dál, potáhne děsivá unionistická parní lokomotiva jménem Bitevník . Původně rychlá a klidná cesta se mění v boj o život poté, co je vlak přepaden hordou lupičů a později jižanskými vojáky. Mercy by ráda viděla svého otce dřív, než zemře. Pokud však chce z vlaku vystoupit živá, musí překonat intriky Unie a útoky Konfederace.
Nic tak neodhaluje charakter lidí jako to, čemu se vysmívají.-- Johann Wolfgang Goethe
Prostě si registruj účet, založ blog a tam to můžeš posílat pořád dokola a možná se i někdo chytí do diskuze.to je lež, kdyby si založil blog, zase bys mu spílal, že se sem nehodí, ale že se někdo chytí, to je pravda - bystroushaak převlečený za zlatohřbítka
Ja kvuli tomuto tematu poradne nespim.
Nedostatek spánku vede k poškození mozku. Tím by se vysvětlovala ta zeď textu nad citovaným úryvkem.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.