Sieczkarnia calibre w akcji. Porównanie do kindlegena.

Wiele osób poleca calibre jako niezawodne remedium na wszelkie bolączki związane z tematami ebookowymi. Ja natomiast widząc, co potrafi wyczyniać ten program zalecam daleko posuniętą ostrożność. Jednym z takich – niedopuszczalnych z mojego punktu widzenia – zachowań, jest daleko posunięta modyfikacja oryginalnego kodu ebooka. Dzieje się to nawet przy prostej generacji pliku MOBI na podstawie źródłowego pliku EPUB.  Zmiany są tak daleko posunięte, że – w moim mniemaniu – mamy do czynienia już z zupełnie innym plikiem o tej samej treści. Przejdźmy do dowodów.

Narzędzie librarian (wykorzystywane do generowania m.in. plików MOBI oraz EPUB publikowanych w serwisie WolneLektury.pl) od ostatniej aktualizacji ma możliwość generowania plików MOBI za pomocą calibre lub za pomocą oficjalnego narzędzia kindlegen. Dlatego analizując pliki wynikowe MOBI z konwersji tego samego źródłowego pliku możemy zobaczyć skalę „sieczki”, którą dokonuje calibre. Gotowe pliki Mobi do analizy zostały poddane rozpakowaniu narzędziem KindleUnpack.

Do analizy wykorzystałem źródłowy plik XML książki Tadeusza Boya-Żeleńskiego
Marzenie i pysk”.

Za pomocą librariana wygenerowałem na podstawie ww. pliku trzy pliki wynikowe:

  1. boy-marzenie-i-pysk.epub
  2. boy-marzenie-i-pysk_calibre.mobi (calibre było generatorem MOBI)
  3. boy-marzenie-i-pysk_kindlegen.mobi (kindlegen był generatorem MOBI)

Powyższe pliki są do pobrania z tej lokacji: https://googledrive.com/

Założenie wstępne. KindleUnpack modyfikuje przy rozpakowywaniu oryginalne nazwy plików, więc wszelkie referencje do tych plików są również zmienione. Tych zmian nie porównuję!

Na pierwszy rzut zobaczmy plik part2.html z pliku EPUB. Wygląda on tak:

A teraz popatrzmy co z nim uczynił calibre:

Widać, że nawet w tak małym pliku zostały dokonane modyfikacje polegające na wstawienie nic nie znaczących z punktu widzenia semantyczności kodu klasy: .calibre, .calibre1, .calibre7. Wyciął również DOCTYPE, mimo, że nikt go o to nie prosił.

Zobaczmy, co zatem uczynił kindlegen z tym samym plikiem:

Nic, absolutnie nic.

To tylko małe preludium do masakry wykonanej na pliku ze stylami. Źródło z pliku EPUB:

calibre jest niezwykłym kreatorem zupełnie nowej rzeczywistości, nie mającej nic wspólnego z semantyką, utrudniając analizę kodu do bólu wręcz. Zamiast semantycznych selektorów pojawiły się nic nieznaczące ponumerowane klasy. Rozpleniły się również właściwości, których w pierwotnym pliku nie było. Dodatkowo zamiast jednego pliku ze stylami mamy już dwa. Oto pierwszy z nich:

A to drugi z nich:

A teraz popatrzmy na wynik działania kindlegena:

Nie dokonane zostały żadne zmiany.

Podsumowanie. Decydując się na korzystanie z calibre przy tej skali ingerencji w kod nie macie żadnej gwarancji, że wygląd ebooka będzie odpowiadał temu, co chcieli uzyskać autorzy. Dlatego przestrzegam przed pochopnym korzystaniem z tego narzędzia i ordynowaniem go bezkrytycznie.

14 przemyśleń nt. „Sieczkarnia calibre w akcji. Porównanie do kindlegena.

  1. Jeśli ktoś używa calibre wyłącznie do konwersji z plików tekstowych to problemu takiego niema. Za to co robi z epub to brak słów. ;( Komplikowanie html to jedno, ale css nie powinno być w ogóle ruszane.

    Najprostszym rozwiązaniem jest napisanie wtyczki do calibre która zintegruje kindlegena do konwersji mobi. Tylko to nie rozwiązuje problemu.

    Ps. Czy w komentarzach można używać kolorowania składni? I czy wtyczka to Crayon Syntax Highlighter?

    1. Jeśli nie ma formatowania i to formatowanie tworzy samo calibre to oczywiste jest, że nie ma tu żadnego problemu, bo trudno tu mówić o kaleczeniu kodu. Choć to wynikowe formatowanie piękne nie jest niestety 🙁

      PS. W komentarzach nie można korzystać z kolorowania, a wtyczka to istotnie Crayon Syntax Highlighter, A coś z nią nie tak? 😉

  2. Sigil + wyrażenia regularne pozwalają w EPUB na w miarę bezpieczne usunięcie takich kwiatków jak: O. Często polskie litery w wyrazach są w ten sposób wyłączane z formatowania.

    1. Taki kwiatek jak O to efekt działania calibre na :first-letter i szczerze mówiąc zastanawiam się czego dotyczy twój komentarz? Przecież ja nie chcę mieć takiego kwiatka, dlatego przestrzegam przed korzystaniem z calibre 😉

  3. Chciałbym użyć automatora (OSX) do konwersji z kindlegen, ale nie mogę sobie poradzić ze skryptem. Czy możesz mi pomóc w tym temacie?

  4. Idea jest taka, żeby przez prawoklik na pliku .epub wywołać sekwencję konwersji do .mobi bez „ręcznego” otwierania terminala, wywoływania kindlegena i dodawania pliku wyjściowego.
    Coś takiego znalazłem tu: http://goo.gl/pWLGv , jednak nie działa to zgodnie z opisem, albo ja nie potrafię sobie z tym poradzić.

    Dzięki za zainteresowanie tematem 🙂

    1. Ok. Więc tak:
      1) w Automatorze musisz wybrać, że chcesz tworzyć „Service”
      2) Zmień opcję „Service receives selected” na „files and folders”
      3) Przeciągasz akcję: Run Shell Script
      4) W liście „Pass input:” w tej akcji zmieniasz na „as arguments”
      5) W samym okienku wklejasz ten tekst:

      6) Tam gdzie jest napisane sciezka_dostepu wklej prawidłową ścieżkę dostępu do programu kindlegen.

  5. Dziękuję ci bardzo – działa znakomicie! 🙂 Przy okazji, co sądzisz o używaniu w kindlegen opcji kompresji i ewentualnie gdzie w tym kodzie wstawić zalecany parametr (c0, c1, c2)?

    P.S. Myślę, że Twoja porada warta jest zapisania „złotymi zgłoskami” dla wszystkich, którzy borykają się czasami z konwersją ebooków – może wpis na blogu 🙂

    1. Opcje kompresji:
      -c0: no compression
      -c1: standard DOC compression
      -c2: Kindle huffdic compression

      Domyślnie program działa z opcją c1 i jest to jak najbardziej prawidłowe zachowanie. Opcja c0 jest całkowicie nie do przyjęcia dla mnie, ponieważ tworzy bardzo duże pliki, a szybkość jest porównywalna do opcji c1.
      Opcja c2 jest baaaaaaaaaardzo czasochłonna i szczerze mówiąc niezbyt opłacalna. Różnica wielkości względem przeciętnej książki jest znikoma. Ta opcja sprawdzi się w przypadku książek z baaaaaardzo dużą ilością tekstu.

      Jak zmodyfikować powyższy kod, żeby dodać opcje np. -c2? Bardzo prosto:

Dodaj komentarz