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:
- boy-marzenie-i-pysk.epub
- boy-marzenie-i-pysk_calibre.mobi (calibre było generatorem MOBI)
- 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <link rel="stylesheet" href="style.css" type="text/css"/> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/> <title> WolneLektury.pl </title> </head> <body> <div id="book-text"><h2 class="h3">Od autora</h2> <p class="paragraph">Oto, miły czytelniku, garść felietonów, których jesteś zazwyczaj dość chętnym odbiorcą. Tytuł, nieco ekspresjonistyczny, uprzedza cię dostatecznie, że znajdziesz tu rozmaitość wrażeń: ujrzysz to głowę miękko skłonioną do cichego <em class="author-emphasis">marzenia</em>, to <em class="author-emphasis">pysk</em> rozwarty, kłótliwy, zaczepny, tak jak się godzi w obronie dobrej sprawy. Ale czeka cię nie tylko pomieszanie tonów; także i pomieszanie epok: obok rzeczy świeżutkich, prosto z igły, znajdziesz tu drobiazgi pisane przed laty kilku, niemal dokumenty historyczne! Zdradzę ci tego sekret, miły czytelniku. W początkach mojej kariery pisarskiej byłem bardzo nieśmiały. Felietonów moich nie wydawałem wówczas oddzielnie; przemycałem je w poszczególnych tomach krytyk teatralnych, z którymi często nie miały nic wspólnego. Ponieważ groziło to pogrzebaniem wielu myśli, które mi są drogie (ot, taki niewinny sentymencik), przyszło mi do głowy wydobyć je z ukrycia i zamieszać między nowe. Jeżeli więc przypadkowo, zbyt pilny czytelniku, trafisz na artykulik, który ci jest znany, nie zżymaj się, ale odczytaj go jeszcze raz: pisarza — tak ktoś powiedział — którego nie warto przeczytać dwa razy, w ogóle nie warto czytać.</p> <p class="paragraph">Zresztą, wzorem niektórych codziennych pism, obmyśliłem dla was, mili czytelnicy, nagrodę „za uważne czytanie”. Ten, kto trafi na coś, co już skądś zna, zechce łaskawie zawiadomić autora (Warszawa, Smolna 11) skąd; a między tych, którzy nadeślą trafne odpowiedzi, nastąpi rozlosowanie trzech kompletów pierwszych sześciu tomów <em class="author-emphasis">Biblioteki Boya</em> w wykwintnej oprawie. Termin do końca roku 1930.</p> <p class="paragraph">A teraz, dobry czytelniku, przyjemnych marzeń i wesołego pyska.</p> <div class="note"><p class="paragraph">BOY</p></div> <div class="note"><p class="paragraph">Warszawa, w czerwcu 1930</p></div> </div> </body> </html> |
A teraz popatrzmy co z nim uczynił calibre:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<?xml version="1.0" encoding="UTF-8"?> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title> WolneLektury.pl </title> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/> <link href="../Styles/style0002.css" rel="stylesheet" type="text/css"/> <link href="../Styles/style0001.css" rel="stylesheet" type="text/css"/> </head> <body class="calibre"> <div class="calibre1" id="book-text"><h2 class="h">Od autora</h2> <p class="paragraph"><span class="calibre7">O</span>to, miły czytelniku, garść felietonów, których jesteś zazwyczaj dość chętnym odbiorcą. Tytuł, nieco ekspresjonistyczny, uprzedza cię dostatecznie, że znajdziesz tu rozmaitość wrażeń: ujrzysz to głowę miękko skłonioną do cichego <em class="author-emphasis">marzenia</em>, to <em class="author-emphasis">pysk</em> rozwarty, kłótliwy, zaczepny, tak jak się godzi w obronie dobrej sprawy. Ale czeka cię nie tylko pomieszanie tonów; także i pomieszanie epok: obok rzeczy świeżutkich, prosto z igły, znajdziesz tu drobiazgi pisane przed laty kilku, niemal dokumenty historyczne! Zdradzę ci tego sekret, miły czytelniku. W początkach mojej kariery pisarskiej byłem bardzo nieśmiały. Felietonów moich nie wydawałem wówczas oddzielnie; przemycałem je w poszczególnych tomach krytyk teatralnych, z którymi często nie miały nic wspólnego. Ponieważ groziło to pogrzebaniem wielu myśli, które mi są drogie (ot, taki niewinny sentymencik), przyszło mi do głowy wydobyć je z ukrycia i zamieszać między nowe. Jeżeli więc przypadkowo, zbyt pilny czytelniku, trafisz na artykulik, który ci jest znany, nie zżymaj się, ale odczytaj go jeszcze raz: pisarza — tak ktoś powiedział — którego nie warto przeczytać dwa razy, w ogóle nie warto czytać.</p> <p class="paragraph1">Zresztą, wzorem niektórych codziennych pism, obmyśliłem dla was, mili czytelnicy, nagrodę „za uważne czytanie”. Ten, kto trafi na coś, co już skądś zna, zechce łaskawie zawiadomić autora (Warszawa, Smolna 11) skąd; a między tych, którzy nadeślą trafne odpowiedzi, nastąpi rozlosowanie trzech kompletów pierwszych sześciu tomów <em class="author-emphasis">Biblioteki Boya</em> w wykwintnej oprawie. Termin do końca roku 1930.</p> <p class="paragraph1">A teraz, dobry czytelniku, przyjemnych marzeń i wesołego pyska.</p> <div class="note"><p class="paragraph1">BOY</p></div> <div class="note"><p class="paragraph1">Warszawa, w czerwcu 1930</p></div> </div> </body> </html> |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?xml version='1.0' encoding='utf-8'?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head> <link rel="stylesheet" href="../Styles/style0001.css" type="text/css"/> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/> <title> WolneLektury.pl </title> </head><body> <div id="book-text"><h2 class="h3">Od autora</h2> <p class="paragraph">Oto, miły czytelniku, garść felietonów, których jesteś zazwyczaj dość chętnym odbiorcą. Tytuł, nieco ekspresjonistyczny, uprzedza cię dostatecznie, że znajdziesz tu rozmaitość wrażeń: ujrzysz to głowę miękko skłonioną do cichego <em class="author-emphasis">marzenia</em>, to <em class="author-emphasis">pysk</em> rozwarty, kłótliwy, zaczepny, tak jak się godzi w obronie dobrej sprawy. Ale czeka cię nie tylko pomieszanie tonów; także i pomieszanie epok: obok rzeczy świeżutkich, prosto z igły, znajdziesz tu drobiazgi pisane przed laty kilku, niemal dokumenty historyczne! Zdradzę ci tego sekret, miły czytelniku. W początkach mojej kariery pisarskiej byłem bardzo nieśmiały. Felietonów moich nie wydawałem wówczas oddzielnie; przemycałem je w poszczególnych tomach krytyk teatralnych, z którymi często nie miały nic wspólnego. Ponieważ groziło to pogrzebaniem wielu myśli, które mi są drogie (ot, taki niewinny sentymencik), przyszło mi do głowy wydobyć je z ukrycia i zamieszać między nowe. Jeżeli więc przypadkowo, zbyt pilny czytelniku, trafisz na artykulik, który ci jest znany, nie zżymaj się, ale odczytaj go jeszcze raz: pisarza — tak ktoś powiedział — którego nie warto przeczytać dwa razy, w ogóle nie warto czytać.</p> <p class="paragraph">Zresztą, wzorem niektórych codziennych pism, obmyśliłem dla was, mili czytelnicy, nagrodę „za uważne czytanie”. Ten, kto trafi na coś, co już skądś zna, zechce łaskawie zawiadomić autora (Warszawa, Smolna 11) skąd; a między tych, którzy nadeślą trafne odpowiedzi, nastąpi rozlosowanie trzech kompletów pierwszych sześciu tomów <em class="author-emphasis">Biblioteki Boya</em> w wykwintnej oprawie. Termin do końca roku 1930.</p> <p class="paragraph">A teraz, dobry czytelniku, przyjemnych marzeń i wesołego pyska.</p> <div class="note"><p class="paragraph">BOY</p></div> <div class="note"><p class="paragraph">Warszawa, w czerwcu 1930</p></div> </div> </body></html> |
Nic, absolutnie nic.
To tylko małe preludium do masakry wykonanej na pliku ze stylami. Źródło z pliku EPUB:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 |
@font-face { font-family: "DejaVu Serif"; font-weight: normal; font-style: normal; src: url(DejaVuSerif.ttf); } @font-face { font-family: "DejaVu Serif"; font-weight: bold; font-style: normal; src: url(DejaVuSerif-Bold.ttf); } @font-face { font-family: "DejaVu Serif"; font-weight: normal; font-style: italic; src: url(DejaVuSerif-Italic.ttf); } @font-face { font-family: "DejaVu Serif"; font-weight: bold; font-style: italic; src: url(DejaVuSerif-BoldItalic.ttf); } body, p, h1, h2, h3, h4 { font-family: "DejaVu Serif", serif; } body { line-height: 1.5em; margin: 0; } a { text-decoration: none; color: #00e; } a img { border: 0; } #book-text { margin: 2em; } @media amzn-kf8 { #book-text { margin: 0; } } /* =================================================== */ /* = Common elements: headings, paragraphs and lines = */ /* =================================================== */ .h2 { font-size: 2em; margin: 0; margin-top: 1.5em; font-weight: bold; line-height: 1.5em; } .h3 { text-align:left; font-size: 1.5em; margin-top: 1.5em; font-weight: normal; line-height: 1.5em; } .h4 { font-size: 1em; margin: 0; margin-top: 1.5em; line-height: 1.5em; } p { margin: 0; } /* ======================== */ /* = Footnotes and themes = */ /* ======================== */ .theme-begin { border-left: 0.1em solid #DDDDDD; color: #777; padding: 0 0.5em; width: 7.5em; font-style: normal; font-weight: normal; font-size: 0.875em; float: right; margin-right: -9.5em; clear: both; left: 40em; line-height: 1.5em; text-align: left; } .annotation { margin-bottom: 0.3em; text-align: justify; } .block { font-size: 0.875em; padding: 1em; } /* ============= */ /* = Numbering = */ /* ============= */ .anchor sup { line-height: 0; font-size: 0.7em; } /* =================== */ /* = Custom elements = */ /* =================== */ .title-page { margin-top: 1.5em; } .title { font-size: 3em; text-align: center; line-height: 1.5em; font-weight: bold; } .author { margin: 0; text-align: center; font-weight: bold; font-size: 1.5em; line-height: 1.5em; margin-bottom: 0.25em; } .intitle { margin: 0; text-align: center; font-weight: bold; font-size: 1.5em; line-height: 1.5em; margin-bottom: 0.25em; } .insubtitle { margin: 0; text-align: center; font-weight: bold; font-size: 1em; line-height: 1.5em; margin-bottom: 0.25em; } .collection { margin: 0; text-align: center; font-weight: bold; font-size: 1.125em; line-height: 1.5em; margin-bottom: -0.25em; } .subtitle { margin: 0; text-align: center; font-weight: bold; font-size: 1.5em; line-height: 1.5em; margin-top: -0.25em; } div.didaskalia { font-style: italic; margin-top: 0.5em; margin-bottom: 0.5em; margin-left: 1.5em; } .kwestia { margin-top: 0.5em; } .paragraph { text-align: justify; margin: 0; text-indent: 1.2em; } h1 + .paragraph, h2 + .paragraph { text-indent: 0; } h2 + .paragraph:first-letter { font-size: 1.6em; } .motto { text-align: justify; font-style: italic; margin-top: 1.5em; } .motto_podpis, .motto_podpis .paragraph { font-size: 0.875em; text-align: right; font-style: italic; } .fragment { border-bottom: 0.1em solid #999; padding-bottom: 1.5em; } .note { text-align: right; font-style: italic; margin-top: 1em; margin-bottom: 0.5em; } .note .paragraph { text-align: justify; } .dedication, .dedication .paragraph { text-align: right; font-style: italic; } hr.spacer { height: 3em; visibility: hidden; } hr.spacer-line { margin: 0; margin-top: 1.5em; margin-bottom: 1.5em; border: none; border-bottom: 0.1em solid #000; } .spacer-asterisk { padding: 0; margin: 0; margin-top: 1.5em; margin-bottom: 1.5em; text-align: center; } div.person-list ol { list-style: none; padding: 0; padding-left: 1.5em; } .place-and-time { font-style: italic; } em.math { font-style: italic; } em.foreign-word { font-style: italic; } em.book-title { font-style: italic; } em.didaskalia { font-style: italic; } em.author-emphasis { letter-spacing: 0.1em; } .person-list em.person { font-style: normal; /*font-variant: small-caps;*/ text-transform: uppercase; } .info { text-align: center; margin-bottom: 1em; } .info div { text-align: center; } .info img { margin: 0; margin-left: 2em; margin-right: 2em; } p.minor-info { text-align: center; margin-bottom: 1em; font-size: 0.75em; } p.footer { margin-top: 2em; } |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
@page { margin-bottom: 5pt; margin-top: 5pt } @font-face { font-family: "DejaVu Serif"; font-weight: normal; font-style: normal; src: url(../Fonts/font00100.ttf) } @font-face { font-family: "DejaVu Serif"; font-weight: bold; font-style: normal; src: url(../Fonts/font00103.ttf) } @font-face { font-family: "DejaVu Serif"; font-weight: normal; font-style: italic; src: url(../Fonts/font00101.ttf) } @font-face { font-family: "DejaVu Serif"; font-weight: bold; font-style: italic; src: url(../Fonts/font00102.ttf) } |
A to drugi z nich:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 |
.annotation { display: block; font-family: "DejaVu Serif", serif; text-align: justify; margin: 0 0 0.3em } .author { display: block; font-family: "DejaVu Serif", serif; font-size: 1.41667em; font-weight: bold; line-height: 1.5em; text-align: center; margin: 0 0 0.25em } .author-emphasis { font-style: italic; letter-spacing: 0.1em } .block { display: block; font-size: 0.75em; padding: 1em } .block1 { display: block; font-size: 1em; padding: 1em } .book-title { font-style: italic } .calibre { display: block; font-family: "DejaVu Serif", serif; font-size: 1em; line-height: 1.5em; padding-left: 0; padding-right: 0; margin: 0 5pt } .calibre1 { display: block; margin-bottom: 2em; margin-top: 2em } .calibre2 { color: #00e; text-decoration: none } .calibre3 { height: auto; width: auto; border: currentColor none 0; margin: 0 2em } .calibre4 { display: block; font-family: "DejaVu Serif", serif; font-size: 2em; font-weight: bold; line-height: 1.2; margin: 0.67em 0 } .calibre5 { display: block; margin-left: 0 } .calibre6 { display: block; margin-left: 1em } .calibre7 { font-size: 1.66667em; line-height: 1.2 } .calibre8 { font-size: 0.75em; line-height: 1.2; vertical-align: super } .calibre9 { font-size: 0.77778em; line-height: 1.2; vertical-align: super } .calibre10 { font-size: 0.70588em; line-height: 1.2; vertical-align: super } .calibre11 { display: block; font-family: "DejaVu Serif", serif; font-size: 1.41667em; font-weight: bold; line-height: 1.2; margin: 0.83em 0 } .calibre12 { font-weight: bold } .calibre13 { height: auto; width: auto; margin: 0 2em } .footer { display: block; font-family: "DejaVu Serif", serif; text-align: center; margin: 2em 0 1em } .h { display: block; font-family: "DejaVu Serif", serif; font-size: 1.41667em; font-weight: normal; line-height: 1.5em; text-align: left; margin: 1.5em 0 0.83em } .h1 { display: block; font-family: "DejaVu Serif", serif; font-size: 1em; font-weight: bold; line-height: 1.5em; margin: 1.5em 0 0 } .info { display: block; font-family: "DejaVu Serif", serif; text-align: center; margin: 0 0 1em } .info1 { display: block; font-family: "DejaVu Serif", serif; font-size: 1.41667em; font-weight: bold; line-height: 1.2; text-align: center; margin: 0.83em 0 1em } .minor-info { display: block; font-family: "DejaVu Serif", serif; font-size: 0.75em; text-align: center; margin: 0 0 1em } .note { display: block; font-style: italic; margin-bottom: 0.5em; margin-top: 1em; text-align: right } .paragraph { display: block; font-family: "DejaVu Serif", serif; text-align: justify; text-indent: 0; margin: 0 } .paragraph1 { display: block; font-family: "DejaVu Serif", serif; text-align: justify; text-indent: 1.2em; margin: 0 } .spacer { display: block; font-family: "DejaVu Serif", serif; margin: 0 } .spacer-asterisk { display: block; font-family: "DejaVu Serif", serif; text-align: center; padding: 0; margin: 1.5em 0 } .stanza { display: block } .title { display: block; font-family: "DejaVu Serif", serif; font-size: 2em; font-weight: bold; line-height: 1.5em; text-align: center; margin: 0.67em 0 } .title-page { display: block; margin-top: 1.5em } |
A teraz popatrzmy na wynik działania kindlegena:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 |
@font-face { font-family: "DejaVu Serif"; font-weight: normal; font-style: normal; src: url(../Fonts/font00104.ttf); } @font-face { font-family: "DejaVu Serif"; font-weight: bold; font-style: normal; src: url(../Fonts/font00105.ttf); } @font-face { font-family: "DejaVu Serif"; font-weight: normal; font-style: italic; src: url(../Fonts/font00106.ttf); } @font-face { font-family: "DejaVu Serif"; font-weight: bold; font-style: italic; src: url(../Fonts/font00107.ttf); } body, p, h1, h2, h3, h4 { font-family: "DejaVu Serif", serif; } body { line-height: 1.5em; margin: 0; } a { text-decoration: none; color: #00e; } a img { border: 0; } #book-text { margin: 2em; } @media all{ #book-text { margin: 0; } } /* =================================================== */ /* = Common elements: headings, paragraphs and lines = */ /* =================================================== */ .h2 { font-size: 2em; margin: 0; margin-top: 1.5em; font-weight: bold; line-height: 1.5em; } .h3 { text-align:left; font-size: 1.5em; margin-top: 1.5em; font-weight: normal; line-height: 1.5em; } .h4 { font-size: 1em; margin: 0; margin-top: 1.5em; line-height: 1.5em; } p { margin: 0; } /* ======================== */ /* = Footnotes and themes = */ /* ======================== */ .theme-begin { border-left: 0.1em solid #DDDDDD; color: #777; padding: 0 0.5em; width: 7.5em; font-style: normal; font-weight: normal; font-size: 0.875em; float: right; margin-right: -9.5em; clear: both; left: 40em; line-height: 1.5em; text-align: left; } .annotation { margin-bottom: 0.3em; text-align: justify; } .block { font-size: 0.875em; padding: 1em; } /* ============= */ /* = Numbering = */ /* ============= */ .anchor sup { line-height: 0; font-size: 0.7em; } /* =================== */ /* = Custom elements = */ /* =================== */ .title-page { margin-top: 1.5em; } .title { font-size: 3em; text-align: center; line-height: 1.5em; font-weight: bold; } .author { margin: 0; text-align: center; font-weight: bold; font-size: 1.5em; line-height: 1.5em; margin-bottom: 0.25em; } .intitle { margin: 0; text-align: center; font-weight: bold; font-size: 1.5em; line-height: 1.5em; margin-bottom: 0.25em; } .insubtitle { margin: 0; text-align: center; font-weight: bold; font-size: 1em; line-height: 1.5em; margin-bottom: 0.25em; } .collection { margin: 0; text-align: center; font-weight: bold; font-size: 1.125em; line-height: 1.5em; margin-bottom: -0.25em; } .subtitle { margin: 0; text-align: center; font-weight: bold; font-size: 1.5em; line-height: 1.5em; margin-top: -0.25em; } div.didaskalia { font-style: italic; margin-top: 0.5em; margin-bottom: 0.5em; margin-left: 1.5em; } .kwestia { margin-top: 0.5em; } .paragraph { text-align: justify; margin: 0; text-indent: 1.2em; } h1 + .paragraph, h2 + .paragraph { text-indent: 0; } h2 + .paragraph:first-letter { font-size: 1.6em; } .motto { text-align: justify; font-style: italic; margin-top: 1.5em; } .motto_podpis, .motto_podpis .paragraph { font-size: 0.875em; text-align: right; font-style: italic; } .fragment { border-bottom: 0.1em solid #999; padding-bottom: 1.5em; } .note { text-align: right; font-style: italic; margin-top: 1em; margin-bottom: 0.5em; } .note .paragraph { text-align: justify; } .dedication, .dedication .paragraph { text-align: right; font-style: italic; } hr.spacer { height: 3em; visibility: hidden; } hr.spacer-line { margin: 0; margin-top: 1.5em; margin-bottom: 1.5em; border: none; border-bottom: 0.1em solid #000; } .spacer-asterisk { padding: 0; margin: 0; margin-top: 1.5em; margin-bottom: 1.5em; text-align: center; } div.person-list ol { list-style: none; padding: 0; padding-left: 1.5em; } .place-and-time { font-style: italic; } em.math { font-style: italic; } em.foreign-word { font-style: italic; } em.book-title { font-style: italic; } em.didaskalia { font-style: italic; } em.author-emphasis { letter-spacing: 0.1em; } .person-list em.person { font-style: normal; /*font-variant: small-caps;*/ text-transform: uppercase; } .info { text-align: center; margin-bottom: 1em; } .info div { text-align: center; } .info img { margin: 0; margin-left: 2em; margin-right: 2em; } p.minor-info { text-align: center; margin-bottom: 1em; font-size: 0.75em; } p.footer { margin-top: 2em; } |
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.
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?
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? 😉
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.
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 😉
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?
Co ten automator miałby robić?
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 🙂
To raczej nie powinno być skomplikowane. Obadam temat i dam znać wieczorem.
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.
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 🙂
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:
Osobny wpis już jest: https://blog.blaut.biz/2014/06/generowanie-plikow-mobi-za-pomoca-kindlegen-przy-wykorzystaniu-skryptu-automatora-z-mac-os-x.html
Jeszcze raz dziękuję za pomoc 🙂 Zapisywanie danych konwersji, bardzo przydatne. Pozdrawiam!
Witam. Czy obecnie ten problem nadal występuje czy może został naprawiony w którejś z aktualizacji?
Pozdrawiam