Převod z TXT/PDB do HTML

Několik čtenářů mě požádalo, jestli bych nesepsal nějaké povídání o převodu čistě textových e-booků do HTML podoby (viz Šablona pro HTML knihu). Na rovinu říkám, že s tím mnoho zkušeností nemám, protože v drtivé většině případů, kdy jsem se o to pokoušel, se ukázalo, že to nestojí za tu námahu – knihy v plaintextu se často vyznačují skutečně příšerným OCR, a i když je OCR v pořádku, pořád tu je problém, že prostý text prostě nenese všechny potřebné informace (např. o kurzívě, která se v knihách vyskytuje až nečekaně často). Ale čas od času se stane, že opravdu není jiná cesta než vyjít z prostého textu a ten nějak zpracovat. Moje postupy pro tento případ jsou uvedeny ve článku – a stejné postupy lze použít i pro nejběžnější variantu formátu PDB, který je vlastně jen komprimovaným prostým textem.

Převod prostého textu do HTML probíhá v zásadě obdobně jako vyčištění HTML zdroje (např. z OCR programu), které už jsem popsal v článku Vyčištění HTML knihy, s několika významnými rozdíly. Některé celý proces výrazně zjednodušují: V prostém textu nejsou vyznačena žádná speciální formátování, protoje drtivá většina úpravy tvořena vyčištěním odstavců a identifikací kapitol. Jiné okolnosti jsou méně příznivé: problém je hlavně v tom, jak poznat konce odstavců. Existují čtyři základní pojetí, přičemž dvě se zpracovávají snadno a dvě se zpracovávají pěkně blbě.

Než se ale dostanu ke zpracování obecného textu, pár slov o syntaxi Markdown, která vám může celý převod velice usnadnit.

Markdown syntaxe

V roce 2004 definoval John Gruber speciální způsob formátování textových souborů, a program pro převod takto formátovaných souborů do HTML nazval Markdown. Markdown vychází z jakéhosi „přirozeného“ zápisu prostého textu, který neobsahuje žádné speciální značky, ale už jenom svým prostorovým rozložením umožňuje docela dobře definovat některé klíčové prvky textu. Podívejte se například na část readme souboru z mého YouTube Downloaderu:

Nástroj pro stahování videa z YouTube a dalších webových úložišť videa. Funguje 
z příkazové řádky, odkud přijme libovolný počet URL ke stažení, případně
soubor se seznamem URL. Soubory ukládá pod název z YouTube, preferuje
HD video, pokud je k dispozici.

Podporované weby a formáty URL:
-------------------------------

 - Barrandov.tv:

     - http://www.barrandov.tv/54698-nikdy-nerikej-nikdy-upoutavka-epizoda-12

       Pozn.: Jde o streamovaný formát podle protokolu RTMP. Viz níže.
       Přehrát jde například programem The KMPlayer.

 - Blip.tv:

     - http://blip.tv/play/hIVV4tIUAg
     - http://blip.tv/file/1607673/
     - http://thespoonyone.blip.tv/file/1607673/

 - CeskaTelevize.cz

Markdown si řekne: První čtyři řádky je prostý text, udělám z něj odstavec. Pak následuje podtrhnutý text, to bude nadpis. Následuje seznam, který obsahuje další vnořené seznamy. No a takhle, na základě grafické podoby textu rozebere všechno, co se rozebrat dá, a převede to na HTML značky.

Pokud je váš vstupní text – většinou to bývá právě dokumentace k programům, u e-booků se to vyskytuje spíš zřídka – uspořádán takto graficky, bude nejspíš Markdown nejlepší cesta, jak z něj udělat pěknou HTML knihu, protože celý proces vyřídíte jediným příkazem. Budete k tomu potřebovat nainstalovaný jazyk PERL (pro Windows asi nejspíš ActivePerl), samotný Markdown a knihu. Převod do HTML pak zařídíte příkazem perl Markdown.pl kniha.txt > kniha.htm. V závislosti na tom, jak moc se zdrojový soubor blíží syntaxi Markdown, dostanete více či méně použitelný soubor. Třeba u výše uváděného readme k YouTube Downloaderu to dopadlo velice hezky, přestože jsem při psaní vůbec o Markdown neuvažoval a prostě formátoval, jak mi to přišlo nejlepší: Výsledek převodu (bez úprav, tzn. ani jsem nevytvářel HTML hlavičky).

E-booky ve formátu TXT

Pokud se chcete zabývat e-booky, je pravděpodobné, že budete vycházet spíš z PDB souborů dostupných na českém internetu a na těch vám Markdown moc nepomůže. Budete se muset smířit s větším podílem ruční práce a horším vzhledem výstupu, ale za pomoci vhodných regulárních výrazů se přeci jen dá k použitelnému HTML dostat.

Klíčový problém je, jak převést běžný text na HTML odstavce. Všechno ostatní už je relativně nenáročné (hlavně proto, že běžného textu je v typické knize daleko nejvíc, kapitol nebo básniček je proti němu obvykle poměrně málo), takže se to dá vyřešit při čtení v rámci běžné korektury překlepů a OCR artefaktů, případně lze mírně adaptovat postupy, které jsem uvedl v článku o čištění HTML knih.

Znovu připomínám, že používám v zásadě syntaxi podle knihovny PCRE s některými rozšířeními z pluginu RESearch pro FAR Manager; při použití jiných nástrojů bude nutné některé výrazy poněkud adaptovat (jde hlavně o symbol $R, který se v RESearch nahradí pořadovým číslem nahrazení, a symbol \n, který značí „libovolný konec řádku“, ne jen [jako u ostatních nástrojů pro regulární výrazy] jeden konkrétní, „linuxový“, konec řádku).

Krok první: Kapitoly 1

Na začátku je vhodné si ujasnit, jestli vůbec chcete v tom prvotním strojovém zpracování nějak řešit kapitoly. Moje zkušenost je taková, že to skoro nestojí za to a je lepší k hlavičkám kapitol přistupovat jako k chybám na korekturu – opravovat je v průběhu čtení, jak na ně narazíte. Pokud má ale vaše TXT kniha kapitoly tvořené nějak rozumně konzistentně, nemusí uškodit zpracovat je vhodným regulárním výrazem. Potíž je jen v tom, že každý e-book, co jsem zkoušel, měl kapitoly značené úplně jinak, takže pro každou knihu by bylo potřeba nadefinovat speciální regulární výraz. Většinou jde o výrazy typu „kouknu a vidím“, ale tím hůř – „kouknu a vidím“ se velmi obtížně vysvětluje někomu, kdo příslušnou zkušenost nemá a sice koukne, ale nevidí. Nechal bych to při tom, že pokud dokážete příslušný regulární výraz napsat, je dobré to udělat hned na začátku.

Obecně se mi osvědčilo neoznačovat kapitoly rovnou pomocí HTML tagů, ale označit je nějakým vhodným symbolem, který se v knize jinak nevyskytuje (například vlnovkou ~ na začátku řádku následovanou názvem kapitoly a ukončenou mřížkou # – je ale nezbytné si předem (pomocí běžného vyhledávání) ověřit, že zamýšlený symbol skutečně není nikde použit). V pozdější fázi převodu, když už jsou vytvořeny odstavce, se totiž takto označený text snadno identifikuje a převede na kapitoly (výrazem typu „hledat=~(.*?)#, nahradit=<h2>$1</h2>„, ale klidně i složitějším – například v mé HTML šabloně používám „nahradit=</div>\n\n<div class="chapter">\n<h2 id="chapter-$R">$1</h2>„).

Krok druhý: Běžný text

Obvykle je vhodné ještě před označováním odstavců vyřídit nadbytečné mezery a tabulátory:

  • Odstranit mezery na začátku řádku: „hledat=^\s+, nahradit=“ (nahrazuje se prázdným řetězcem).

  • Odstranit mezery na konci řádku: „hledat=\s+$, nahradit=“ (opět se nahrazuje prázdným řetězcem).

  • Sekvenci po sobě jdoucích mezer nahradit mezerou jednou: „hledat=\s{2,}, nahradit= “ (nahrazuje se jednou mezerou).

Varianta 1: Co řádek, to odstavec

Toto je daleko nejpříznivější varianta. Vypadá nějak takhle:

Rok 1866 se proslavil podivnou událostí, nevysvětleným a nevysvětlitelným jevem, na který patrně dosud nikdo nezapomněl. Pověsti, jež se rozlétly mezi lidem z přístavů a vzrušily i veřejnost daleko ve vnitrozemí, zneklidnily nejvíc námořníky. O záhadný jev se zajímali hlavně obchodníci, loďaři, lodní kapitáni, evropští i američtí rejdaři, důstojníci válečného loďstva všech zemí a po nich i vlády různých států na obou pevninách.
V poslední době se totiž několik lodí setkalo na moři s "obrovskou věcí", s dlouhým vřetenovitým tělesem, které někdy světélkovalo a bylo mnohem větší a rychlejší než velryba.
Zprávy o tomto jevu, zanesené do různých lodních deníků, shodovaly se dost přesně v popisu tvaru onoho předmětu, jeho nevypočitatelné rychlosti, překvapivých pohybů a zdánlivě úplně zvláštní životnosti. Jestliže to byl nějaký kytovec*( Kytovci jsou mořští savci; patří mezi ně velryby, vorvaň, delfín atd.), pak svou velikostí předčil všechny, které věda až dosud popsala. Ani Cuvier, ani Lacepede, ani Duméril, ani Quatrefages*( G. Cuvier (1769-1832), E. de Lacepede (1756- 1825), H. A. Duméril (1812- 1870) a Quatrefages de Bréau (1810-1892) byli francouzští přírodovědci) by byli nepřipustili existenci takového netvora - ledaže by ho spatřili vlastníma vědeckýma očima.
Když se vzal průměr z mnoha různých pozorování, když se vyloučily nejisté dohady, které přisuzovaly předmětu délku šedesáti metrů, když se zavrhlo přehnané tvrzení o dvoukilometrové šířce a šestikilometrové délce, bylo možno souhlasit s tvrzením, že rozměry oné úžasné bytosti přesahují vše, co ichtyologové*(Ichtyolog se zabývá studiem ryb) až dosud připouštěli - jestliže ovšem ta bytost vůbec existovala!

(Dvacet tisíc mil pod mořem, Jules Verne)

Text samotný nahradíme pomocí výrazu „hledat=^(.+)$“ (řádek obsahující aspoň jeden znak), „nahradit=<p>$1</p>“ (před nalezený text dát začátek odstavce <p> a za něj konec odstavce </p>). Případné odřádkování uvnitř kapitol, vyznačené prázdnými řádky, pak vyřídí víceřádkový regulární výraz „hledat=\n{2,}, nahradit=\n<p>&nbsp;</p>\n (libovolný počet prázdných řádků bude nahrazen jedním prázdným odstavcem).

Varianta 2: Totéž, proložené prázdnými řádky

Také jde ještě o přijatelný případ, který vypadá nějak takhle (stejná ukázka):

Rok 1866 se proslavil podivnou událostí, nevysvětleným a nevysvětlitelným jevem, na který patrně dosud nikdo nezapomněl. Pověsti, jež se rozlétly mezi lidem z přístavů a vzrušily i veřejnost daleko ve vnitrozemí, zneklidnily nejvíc námořníky. O záhadný jev se zajímali hlavně obchodníci, loďaři, lodní kapitáni, evropští i američtí rejdaři, důstojníci válečného loďstva všech zemí a po nich i vlády různých států na obou pevninách.

V poslední době se totiž několik lodí setkalo na moři s "obrovskou věcí", s dlouhým vřetenovitým tělesem, které někdy světélkovalo a bylo mnohem větší a rychlejší než velryba.

Zprávy o tomto jevu, zanesené do různých lodních deníků, shodovaly se dost přesně v popisu tvaru onoho předmětu, jeho nevypočitatelné rychlosti, překvapivých pohybů a zdánlivě úplně zvláštní životnosti. Jestliže to byl nějaký kytovec*( Kytovci jsou mořští savci; patří mezi ně velryby, vorvaň, delfín atd.), pak svou velikostí předčil všechny, které věda až dosud popsala. Ani Cuvier, ani Lacepede, ani Duméril, ani Quatrefages*( G. Cuvier (1769-1832), E. de Lacepede (1756- 1825), H. A. Duméril (1812- 1870) a Quatrefages de Bréau (1810-1892) byli francouzští přírodovědci) by byli nepřipustili existenci takového netvora - ledaže by ho spatřili vlastníma vědeckýma očima.

Když se vzal průměr z mnoha různých pozorování, když se vyloučily nejisté dohady, které přisuzovaly předmětu délku šedesáti metrů, když se zavrhlo přehnané tvrzení o dvoukilometrové šířce a šestikilometrové délce, bylo možno souhlasit s tvrzením, že rozměry oné úžasné bytosti přesahují vše, co ichtyologové*(Ichtyolog se zabývá studiem ryb) až dosud připouštěli - jestliže ovšem ta bytost vůbec existovala!

Nejsnazší řešení je napřed odstranit ty nadbytečné prázdné řádky víceřádkovým výrazem „hledat=\n{2}, nahradit=\n“ (z každých dvou konců řádků po sobě udělat jen jeden) a pak pokračovat výrazy uvedenými ve variantě 1.

Varianta 3: Zalamované řádky, odstavce oddělené prázdným řádkem

Mám na mysli zhruba něco takovéhleho:

Rok 1866 se proslavil podivnou událostí, nevysvětleným a nevysvětlitelným 
jevem, na který patrně dosud nikdo nezapomněl. Pověsti, jež se rozlétly mezi 
lidem z přístavů a vzrušily i veřejnost daleko ve vnitrozemí, zneklidnily 
nejvíc námořníky. O záhadný jev se zajímali hlavně obchodníci, loďaři, lodní 
kapitáni, evropští i američtí rejdaři, důstojníci válečného loďstva všech 
zemí a po nich i vlády různých států na obou pevninách.

V poslední době se totiž několik lodí setkalo na moři s "obrovskou věcí", s 
dlouhým vřetenovitým tělesem, které někdy světélkovalo a bylo mnohem větší 
a rychlejší než velryba.

Zprávy o tomto jevu, zanesené do různých lodních deníků, shodovaly se dost 
přesně v popisu tvaru onoho předmětu, jeho nevypočitatelné rychlosti, 
překvapivých pohybů a zdánlivě úplně zvláštní životnosti. Jestliže to byl 
nějaký kytovec*( Kytovci jsou mořští savci; patří mezi ně velryby, vorvaň, 
delfín atd.), pak svou velikostí předčil všechny, které věda až dosud popsala. 
Ani Cuvier, ani Lacepede, ani Duméril, ani Quatrefages*( G. Cuvier (1769-1832), 
E. de Lacepede (1756- 1825), H. A. Duméril (1812- 1870) a Quatrefages de 
Bréau (1810-1892) byli francouzští přírodovědci) by byli nepřipustili existenci 
takového netvora - ledaže by ho spatřili vlastníma vědeckýma očima.

Když se vzal průměr z mnoha různých pozorování, když se vyloučily nejisté 
dohady, které přisuzovaly předmětu délku šedesáti metrů, když se zavrhlo 
přehnané tvrzení o dvoukilometrové šířce a šestikilometrové délce, bylo možno 
souhlasit s tvrzením, že rozměry oné úžasné bytosti přesahují vše, co 
ichtyologové*(Ichtyolog se zabývá studiem ryb) až dosud připouštěli - jestliže 
ovšem ta bytost vůbec existovala!

Tady už začíná přituhovat, existence prázdných řádků ale pořád dovoluje text jakž takž zpracovat. Postup je ten, že napřed pomocí prázdných řádků označíme začátky a konce odstavců (dvojice znaků \n pro konec řádku za sebou značí konec předchozího odstavce a začátek nového), potom všechny zbývající konce řádků nahradíme mezerami a do třetice všeho dobrého zase založíme nový řádek před každým symbolem <p> (začátek odstavce):

  1. Víceřádkový výraz „hledat=\n{2}, nahradit=</p><p>

  2. Víceřádkový výraz „hledat=\n, nahradit= “ (nahrazuje se jednou mezerou)

  3. Výraz „hledat=\s+(<p>), nahradit=\n$1

Následně je potřeba doplnit začátek odstavce do úplně prvního řádku, konec odstavce na posledním řádku, a nakonec nahradit série prázdných odstavců jedním prázdným odstavcem pomocí víceřádkového výrazu „hledat=(<p>\s*</p>\n*)+, nahradit=<p>&nbsp;</p>.

Varianta 4: Zalamované řádky, odstavce nejsou vyznačeny vůbec

Nejhorší a obávám se, že i nejčastější případ (aspoň na knihách, o které jsem se zajímal). Vypadá podobně jako varianta 3, ale nemá prázdné řádky vyznačující konce odstavců:

Rok 1866 se proslavil podivnou událostí, nevysvětleným a nevysvětlitelným 
jevem, na který patrně dosud nikdo nezapomněl. Pověsti, jež se rozlétly mezi 
lidem z přístavů a vzrušily i veřejnost daleko ve vnitrozemí, zneklidnily 
nejvíc námořníky. O záhadný jev se zajímali hlavně obchodníci, loďaři, lodní 
kapitáni, evropští i američtí rejdaři, důstojníci válečného loďstva všech 
zemí a po nich i vlády různých států na obou pevninách.
V poslední době se totiž několik lodí setkalo na moři s "obrovskou věcí", s 
dlouhým vřetenovitým tělesem, které někdy světélkovalo a bylo mnohem větší 
a rychlejší než velryba.
Zprávy o tomto jevu, zanesené do různých lodních deníků, shodovaly se dost 
přesně v popisu tvaru onoho předmětu, jeho nevypočitatelné rychlosti, 
překvapivých pohybů a zdánlivě úplně zvláštní životnosti. Jestliže to byl 
nějaký kytovec*( Kytovci jsou mořští savci; patří mezi ně velryby, vorvaň, 
delfín atd.), pak svou velikostí předčil všechny, které věda až dosud popsala. 
Ani Cuvier, ani Lacepede, ani Duméril, ani Quatrefages*( G. Cuvier (1769-1832), 
E. de Lacepede (1756- 1825), H. A. Duméril (1812- 1870) a Quatrefages de 
Bréau (1810-1892) byli francouzští přírodovědci) by byli nepřipustili existenci 
takového netvora - ledaže by ho spatřili vlastníma vědeckýma očima.
Když se vzal průměr z mnoha různých pozorování, když se vyloučily nejisté 
dohady, které přisuzovaly předmětu délku šedesáti metrů, když se zavrhlo 
přehnané tvrzení o dvoukilometrové šířce a šestikilometrové délce, bylo možno 
souhlasit s tvrzením, že rozměry oné úžasné bytosti přesahují vše, co 
ichtyologové*(Ichtyolog se zabývá studiem ryb) až dosud připouštěli - jestliže 
ovšem ta bytost vůbec existovala!

V tomto případě se neobejdete bez odhadu, který v mnoha případech vyjde, ale v mnoha jiných případech nevyjde. Každopádně počítejte s tím, že spousta odstavců bude ukončena špatně (budou delší, než by měly být, a vy je budete muset při korektuře ručně rozdělit).

Princip spojení vychází z pozorování, že většina řádků, které jsou posledním řádkem odstavce, je výrazně kratší než řádky, za kterými odstavec pokračuje. Potřebujete se podívat do souboru na obvyklou délku pokračujících řádků; v příkladu, který jsem použil, je to asi 70 a víc znaků. Řekněme tedy, že za řádkem delším než 65 znaků odstavec pokračuje, zatímco řádek dlouhý maximálně 65 znaků odstavec ukončí. (Zdůrazňuji: toto je třeba udělat pro každý soubor zvlášť!).

Vyznačení začátku a konce odstavce pak vychází z obdobné úvahy jako v předchozím případě: pokud je řádek maximálně 65 znaků dlouhý, tak za ním končí jeden odstavec a začíná další. V jazyce regulárních výrazů to znamená víceřádkový regulární výraz „hledat=(\n[^\n]{0,65})\n, nahradit=$1</p><p>„. Po jeho provedení pokračujeme bodem 2 z předchozí varianty.

Krok třetí: Dočištění

Po tomto základním vyznačení odstavců je třeba dočistit zbytky. Pozornost věnujte zejména začátku a konci textu, kde dost možná bude něco přebývat nebo naopak chybět. Zde je také vhodné místo pro finální vyznačení kapitol, pokud je chcete dělat automaticky. Vzorový výraz už jsem uvedl dříve u prvního kroku.

Potom už můžete doplnit hlavičku a patičku knihy podle příslušných kapitol Šablony.

Krok čtvrtý: Korektura

Korektura je nezbytná po každém OCR a vhodná po každém převodu, takže byste ji jistě provedli i bez tohoto extra bodu. Rozhodl jsem se ho uvést proto, že převod z TXT na HTML je jedním z těch procesů, po kterých je korektura nezbytná, ne jen „vhodná“. A zvlášť to platí pro varianty 3 a 4 z převodu odstavců. Počítejte s tím, že v takto převedené knize bude spousta chyb. A to nemluvím o tom, že perfekcionisty mezi vámi čeká ještě doplnění kurzívy tam, kde je v originální knize a kde v prostém textu pochopitelně nebyla; nepodceňujte to, kurzíva je v mnoha knihách velmi důležitá pro správné vyznění díla – výrazným, ale zdaleka ne jediným příkladem jsou Pratchettovy Zeměplochy.

Podobné příspěvky:

3 Responses to “Převod z TXT/PDB do HTML”

  1. avatar pepak napsal:

    Problém je v tom, že takový regulární výraz by zabral i na případ, kdy je uprostřed odstavce třeba nějaké jméno a zrovna se shodou okolností objeví na začátku řádku. Třeba v tom mém příkladu se to stane hned dvakrát, což je na prostoru čtyř odstavců dost velká chyba.

  2. avatar JirkaS napsal:

    Poznamka k variante 4: nedalo by se pouzit neco jako „\n([A-Z„])“ nahradit „$1“. Vychazim z toho, ze prvni znak v odtsavci je bud velke pismeno, nebo uvozovky dole. Ja tohle pouzivam, kdyz docistuju html.

  3. avatar Mr.Lilek napsal:

    Osobně pro tyhle účely už pár let používám šikovnou utilitku txt2html (http://dukelupus.pri.ee/txt2html.php), která velmi dobře zvládá tvorbu odstavců.
    Převod do HTML je tak otázkou okamžiku.
    Stačí jen doplnit hlavičku, případně styly, a během pár minut je hotovo.
    (názorná ukázka viz http://lilek.xf.cz/Obraz1.png)

Leave a Reply

Themocracy iconWordPress Themes

css.php