Tohle jsou asi zase jen poznámky pro mě, vy jako čtenáři se ke zdrojovým souborům blogu patrně nedostanete. Na druhou stranu, dílčí kroky (hromadné přejmenování, oprava konců řádků, změna kódování) z konverze by se mohly hodit i vám, pochopitelně pokud používáte linuxové nástroje.
O co tedy jde – při vytvoření generátoru blogu jsem všechny soubory pojmenoval s příponou txt, a protože jsem byl na Win XP, vznikaly samozřejmě s kódováním windows-1250. Dokud jsem Windows používal, bylo to v pořádku, po přechodu na Linux se situace trochu zkomplikovala. Musel jsem si pro editaci blogu vyhradit jEdit, v něm nastavit jako výchozí kódování to z windows a ještě si ho asociovat s příponou txt. Tím jsem si ji ale efektivně znehodnotil, protože od té doby se mi jEdit s codepage 1250 otevíral pro jakýkoliv textový soubor.
Nehledě na to, že Windows-1250 nedokáže zapsat všechny znaky, které bych mohl potřebovat.
Rozhodl jsem se to tedy narovnat. Generátor blogu je masivně konfigurovatelný, můžu si určit jak příponu zdrojových souborů, tak jejich kódování, ale co s daty?
Nejprve bylo třeba soubory hromadně přejmenovat. To umí balíček renameutils, takže:
sudo dnf install renameutils
Následně jsem podle návodů sestavil kombinací vyhledání (find) a přejmenování:
find -type f -name '*.txt' | rename "s/\.txt/\.blog/"
A ke svému překvapení zjistil, že to nefunguje. Dostával jsem hlášku "rename: málo argumentů". Teprve po několika desítkách minut jsem dohledal, že pro Fedoru se musí použít příkaz prename (!)
find -type f -name '*.txt' | prename "s/\.txt/\.blog/"
Pak už to prošlo. Ještě jsem si překonfiguroval generátor
#[INPUT]
#input.dateTimeFormatPattern=dd.MM.yyyy HH:mm
#input.charset=windows-1250
input.fileSuffix=blog
zkusil vygenerovat celý blog – a vše bylo ok!
Linux (a linuxové editory) používá pro konce řádků jenom znak LF (na rozdíl od windows, kde je to kombinace CR-LF), potřeboval jsem tedy provést v souborech i změnu konců. To zase umí balík dos2unix.
sudo dnf install dos2unix
Ten ovšem potřebuje cestu k souboru v parametru, takže spojení příkazů přes pipe mi nepomůže. Naštěstí find umožňuje pro každý nalezený soubor spustit příkaz a cestu mu předat do parametru
find -type f -name '*.blog' -exec dos2unix {} \;
Předchozí kroky byla ovšem jen rozcvička před tím hlavním – překódováním všech souborů z Windows-1250 do UTF-8. Našel jsem si, že potřebuji program iconv s tímto použitím:
iconv -f WINDOWS-1250 -t utf-8 puvodni_soubor.txt > zkonvertovany_soubor.txt
Vypisování konvertovaného obsahu na výstup je nepříjemné, nakonec jsem ale – naštěstí – přece jen našel potřebný parametr -o a mohl to tak propojit s find.
find -type f -name '*.blog' -exec iconv -f WINDOWS-1250 -t utf-8 {} -o {} \;
iconv: nepovolená vstupní sekvence na pozici 29692
iconv: nepovolená vstupní sekvence na pozici 3647
Árgh, dvě selhání – ale v kterém souboru? Nejprve jsem si myslel, že takové přeskočí, nechá je nezměněné a tudíž budou mít staré datum. Jenže vyhledání souborů nenašlo nic, takže je zjevně nepřeskočil.
find -type f -name '*.blog' -mtime +30
Nedalo se dělat nic jiného než vybalit zálohu a zkusit to znovu a lépe (s --verbose pro větší upovídanost):
find -type f -name '*.blog' -exec iconv --verbose -f WINDOWS-1250 -t utf-8 {} -o {} \;
Jenže! Bylo to upovídané tolik, že se mi výstup nevešel do bufferu terminálu a na výpisy z chybných souborů už jsem se nedostal. Inu, do třetice, s přesměrováním logu do souboru:
find -type f -name '*.blog' -exec iconv --verbose -f WINDOWS-1250 -t utf-8 {} -o {} \; &>out.txt
Konečně jsem se dostal ke zdroji problémů; jedno byl zkušební soubor, kde opakované konverze vedly ke zkáze, druhý byl skutečný článek, kde byly problematické znaky, něco od čtenáře. Po manuální opravě znaků už konverze proběhla dobře.
Nakonec jsem si zase přenastavil blog generátor:
#[INPUT]
#input.dateTimeFormatPattern=dd.MM.yyyy HH:mm
input.charset=UTF-8
input.fileSuffix=blog
Pak jsem si ještě chvíli hrál s nastavením MIME typů v Linuxu. Pozoroval jsem totiž divné chování – jakmile jsem pro příponu blog nastavil jedit, použil se i pro příponu txt. A naopak. Jako by byly nějak spojené, přestože je to úplně jiná přípona.
Řešení bylo nastavit si custom mime file type (dělal jsem to ve svém profilu, hlavně kvůli tomu, aby se mi to samo zazálohovalo s celým profilem, jinak by to bylo v /usr/share).
vi ~/.local/share/mime/packages/blogtext.xml
<?xml version="1.0"?>
<mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>
<mime-type type="application/blogtext">
<comment>blog text file</comment>
<glob pattern="*.blog"/>
<icon name="blog"/>
</mime-type>
</mime-info>
update-mime-database ~/.local/share/mime
Jenom ikonu mi to ignoruje, ať dělám co dělám (viz), ale to vem čert.
Hodnocení hvězdičkami používá jako prevenci
opakovaného kliknutí anonymní cookie.
Pokud s tím nesouhlasíte, neklikejte.
Další podrobnosti k cookies zde.