mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Merge from trunk
This commit is contained in:
commit
00ffb87d2e
@ -19,6 +19,49 @@
|
|||||||
# new recipes:
|
# new recipes:
|
||||||
# - title:
|
# - title:
|
||||||
|
|
||||||
|
- version: 0.8.43
|
||||||
|
date: 2012-03-16
|
||||||
|
|
||||||
|
new features:
|
||||||
|
- title: "Template language: Speedup evaluation of general program mode templates by pre-compiling them to python. If you experience errors with this optimization, you can turn it off via Preferences->Tweaks. Also other miscellaneous optimizations in evaluating templates with composite columns."
|
||||||
|
|
||||||
|
- title: "MOBI Output: Add an option to not convert all images to JPEG when creating MOBI files. For maximum compatibility of the produced MOBI files, do not use this option."
|
||||||
|
tickets: [954025]
|
||||||
|
|
||||||
|
- title: "Add iPad3 Output Profile"
|
||||||
|
|
||||||
|
bug fixes:
|
||||||
|
- title: "KF8 Input: Add support for KF8 files with obfuscated embedded fonts"
|
||||||
|
tickets: [953260]
|
||||||
|
|
||||||
|
- title: "Make the stars in the book list a little larger on windows >= vista"
|
||||||
|
|
||||||
|
- title: "Revised periodical Section layout, for touchscreen devices resolving iBooks problem with tables spanning multiple pages"
|
||||||
|
|
||||||
|
- title: "Read dc:contributor metadata from MOBI files"
|
||||||
|
|
||||||
|
- title: "MOBI Output: Fix a regression that caused the generated thumbnail embedded in calibre produced MOBI files to be a large, low quality image instead of a small, high quality image. You would have been affected by this bug only if you directly used the output from calibre, without exporting it via send to device or save to disk."
|
||||||
|
tickets: [954254]
|
||||||
|
|
||||||
|
- title: "KF8 Input: Recognize OpenType embedded fonts as well."
|
||||||
|
tickets: [954728]
|
||||||
|
|
||||||
|
- title: "Fix regression in 0.8.41 that caused file:/// URLs to stop working in the news download system on windows."
|
||||||
|
tickets: [955581]
|
||||||
|
|
||||||
|
- title: "When setting metadata in MOBI files fix cover not being updated if the mobi file has its first image record as the cover"
|
||||||
|
|
||||||
|
- title: "Fix column coloring rules based on the size column not working"
|
||||||
|
tickets: [953737]
|
||||||
|
|
||||||
|
improved recipes:
|
||||||
|
- Microwaves and RF
|
||||||
|
- idg.se
|
||||||
|
|
||||||
|
new recipes:
|
||||||
|
- title: SatMagazine
|
||||||
|
author: kiavash
|
||||||
|
|
||||||
- version: 0.8.42
|
- version: 0.8.42
|
||||||
date: 2012-03-12
|
date: 2012-03-12
|
||||||
|
|
||||||
|
@ -8,14 +8,14 @@ msgstr ""
|
|||||||
"Project-Id-Version: calibre\n"
|
"Project-Id-Version: calibre\n"
|
||||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"POT-Creation-Date: 2011-11-25 14:01+0000\n"
|
"POT-Creation-Date: 2011-11-25 14:01+0000\n"
|
||||||
"PO-Revision-Date: 2011-12-17 09:29+0000\n"
|
"PO-Revision-Date: 2012-03-11 10:13+0000\n"
|
||||||
"Last-Translator: Jellby <Unknown>\n"
|
"Last-Translator: Jellby <Unknown>\n"
|
||||||
"Language-Team: Spanish <es@li.org>\n"
|
"Language-Team: Spanish <es@li.org>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2011-12-18 04:37+0000\n"
|
"X-Launchpad-Export-Date: 2012-03-12 04:38+0000\n"
|
||||||
"X-Generator: Launchpad (build 14525)\n"
|
"X-Generator: Launchpad (build 14933)\n"
|
||||||
|
|
||||||
#. name for aaa
|
#. name for aaa
|
||||||
msgid "Ghotuo"
|
msgid "Ghotuo"
|
||||||
@ -1779,7 +1779,7 @@ msgstr "Awiyaana"
|
|||||||
|
|
||||||
#. name for auz
|
#. name for auz
|
||||||
msgid "Arabic; Uzbeki"
|
msgid "Arabic; Uzbeki"
|
||||||
msgstr "Árabe uzbeco"
|
msgstr "Árabe uzbeko"
|
||||||
|
|
||||||
#. name for ava
|
#. name for ava
|
||||||
msgid "Avaric"
|
msgid "Avaric"
|
||||||
@ -22207,7 +22207,7 @@ msgstr "Roglai septentrional"
|
|||||||
|
|
||||||
#. name for roh
|
#. name for roh
|
||||||
msgid "Romansh"
|
msgid "Romansh"
|
||||||
msgstr ""
|
msgstr "Romanche"
|
||||||
|
|
||||||
#. name for rol
|
#. name for rol
|
||||||
msgid "Romblomanon"
|
msgid "Romblomanon"
|
||||||
@ -22607,7 +22607,7 @@ msgstr ""
|
|||||||
|
|
||||||
#. name for sci
|
#. name for sci
|
||||||
msgid "Creole Malay; Sri Lankan"
|
msgid "Creole Malay; Sri Lankan"
|
||||||
msgstr "Malo criollo de Sri Lanka"
|
msgstr "Malayo criollo de Sri Lanka"
|
||||||
|
|
||||||
#. name for sck
|
#. name for sck
|
||||||
msgid "Sadri"
|
msgid "Sadri"
|
||||||
@ -26987,15 +26987,15 @@ msgstr ""
|
|||||||
|
|
||||||
#. name for uzb
|
#. name for uzb
|
||||||
msgid "Uzbek"
|
msgid "Uzbek"
|
||||||
msgstr "Uzbeco"
|
msgstr "Uzbeko"
|
||||||
|
|
||||||
#. name for uzn
|
#. name for uzn
|
||||||
msgid "Uzbek; Northern"
|
msgid "Uzbek; Northern"
|
||||||
msgstr "Uzbeco septentrional"
|
msgstr "Uzbeko septentrional"
|
||||||
|
|
||||||
#. name for uzs
|
#. name for uzs
|
||||||
msgid "Uzbek; Southern"
|
msgid "Uzbek; Southern"
|
||||||
msgstr "Uzbeco meridional"
|
msgstr "Uzbeko meridional"
|
||||||
|
|
||||||
#. name for vaa
|
#. name for vaa
|
||||||
msgid "Vaagri Booli"
|
msgid "Vaagri Booli"
|
||||||
@ -30319,7 +30319,7 @@ msgstr ""
|
|||||||
|
|
||||||
#. name for zhn
|
#. name for zhn
|
||||||
msgid "Zhuang; Nong"
|
msgid "Zhuang; Nong"
|
||||||
msgstr "Zhuang nong"
|
msgstr "Chuang nong"
|
||||||
|
|
||||||
#. name for zho
|
#. name for zho
|
||||||
msgid "Chinese"
|
msgid "Chinese"
|
||||||
|
@ -8,31 +8,31 @@ msgstr ""
|
|||||||
"Report-Msgid-Bugs-To: Debian iso-codes team <pkg-isocodes-"
|
"Report-Msgid-Bugs-To: Debian iso-codes team <pkg-isocodes-"
|
||||||
"devel@lists.alioth.debian.org>\n"
|
"devel@lists.alioth.debian.org>\n"
|
||||||
"POT-Creation-Date: 2011-11-25 14:01+0000\n"
|
"POT-Creation-Date: 2011-11-25 14:01+0000\n"
|
||||||
"PO-Revision-Date: 2012-03-03 21:35+0000\n"
|
"PO-Revision-Date: 2012-03-14 21:30+0000\n"
|
||||||
"Last-Translator: Иван Старчевић <ivanstar61@gmail.com>\n"
|
"Last-Translator: Иван Старчевић <ivanstar61@gmail.com>\n"
|
||||||
"Language-Team: Serbian <gnu@prevod.org>\n"
|
"Language-Team: Serbian <gnu@prevod.org>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2012-03-04 04:59+0000\n"
|
"X-Launchpad-Export-Date: 2012-03-15 04:45+0000\n"
|
||||||
"X-Generator: Launchpad (build 14886)\n"
|
"X-Generator: Launchpad (build 14933)\n"
|
||||||
"Language: sr\n"
|
"Language: sr\n"
|
||||||
|
|
||||||
#. name for aaa
|
#. name for aaa
|
||||||
msgid "Ghotuo"
|
msgid "Ghotuo"
|
||||||
msgstr "Ghotuo"
|
msgstr "Готуо"
|
||||||
|
|
||||||
#. name for aab
|
#. name for aab
|
||||||
msgid "Alumu-Tesu"
|
msgid "Alumu-Tesu"
|
||||||
msgstr "Alumu-Tesu"
|
msgstr "Алуму-Тесу"
|
||||||
|
|
||||||
#. name for aac
|
#. name for aac
|
||||||
msgid "Ari"
|
msgid "Ari"
|
||||||
msgstr ""
|
msgstr "Ари"
|
||||||
|
|
||||||
#. name for aad
|
#. name for aad
|
||||||
msgid "Amal"
|
msgid "Amal"
|
||||||
msgstr "Amal"
|
msgstr "Амал"
|
||||||
|
|
||||||
#. name for aae
|
#. name for aae
|
||||||
msgid "Albanian; Arbëreshë"
|
msgid "Albanian; Arbëreshë"
|
||||||
@ -52,7 +52,7 @@ msgstr "Арабеш; Абу'"
|
|||||||
|
|
||||||
#. name for aai
|
#. name for aai
|
||||||
msgid "Arifama-Miniafia"
|
msgid "Arifama-Miniafia"
|
||||||
msgstr "Орифама-Миниафиа"
|
msgstr "Арифама-Миниафиа"
|
||||||
|
|
||||||
#. name for aak
|
#. name for aak
|
||||||
msgid "Ankave"
|
msgid "Ankave"
|
||||||
@ -60,15 +60,15 @@ msgstr "Анкаве"
|
|||||||
|
|
||||||
#. name for aal
|
#. name for aal
|
||||||
msgid "Afade"
|
msgid "Afade"
|
||||||
msgstr ""
|
msgstr "Афаде"
|
||||||
|
|
||||||
#. name for aam
|
#. name for aam
|
||||||
msgid "Aramanik"
|
msgid "Aramanik"
|
||||||
msgstr ""
|
msgstr "Араманик"
|
||||||
|
|
||||||
#. name for aan
|
#. name for aan
|
||||||
msgid "Anambé"
|
msgid "Anambé"
|
||||||
msgstr ""
|
msgstr "Анамбе"
|
||||||
|
|
||||||
#. name for aao
|
#. name for aao
|
||||||
msgid "Arabic; Algerian Saharan"
|
msgid "Arabic; Algerian Saharan"
|
||||||
@ -76,11 +76,11 @@ msgstr "Арапски; Алжирска Сахара"
|
|||||||
|
|
||||||
#. name for aap
|
#. name for aap
|
||||||
msgid "Arára; Pará"
|
msgid "Arára; Pará"
|
||||||
msgstr ""
|
msgstr "Арара;Пара"
|
||||||
|
|
||||||
#. name for aaq
|
#. name for aaq
|
||||||
msgid "Abnaki; Eastern"
|
msgid "Abnaki; Eastern"
|
||||||
msgstr ""
|
msgstr "Абнаки;Источни"
|
||||||
|
|
||||||
#. name for aar
|
#. name for aar
|
||||||
msgid "Afar"
|
msgid "Afar"
|
||||||
@ -88,39 +88,39 @@ msgstr "Афар"
|
|||||||
|
|
||||||
#. name for aas
|
#. name for aas
|
||||||
msgid "Aasáx"
|
msgid "Aasáx"
|
||||||
msgstr ""
|
msgstr "Асакс"
|
||||||
|
|
||||||
#. name for aat
|
#. name for aat
|
||||||
msgid "Albanian; Arvanitika"
|
msgid "Albanian; Arvanitika"
|
||||||
msgstr ""
|
msgstr "Албански (арванитска)"
|
||||||
|
|
||||||
#. name for aau
|
#. name for aau
|
||||||
msgid "Abau"
|
msgid "Abau"
|
||||||
msgstr ""
|
msgstr "Абау"
|
||||||
|
|
||||||
#. name for aaw
|
#. name for aaw
|
||||||
msgid "Solong"
|
msgid "Solong"
|
||||||
msgstr ""
|
msgstr "Солонг"
|
||||||
|
|
||||||
#. name for aax
|
#. name for aax
|
||||||
msgid "Mandobo Atas"
|
msgid "Mandobo Atas"
|
||||||
msgstr ""
|
msgstr "Мандобо Атас"
|
||||||
|
|
||||||
#. name for aaz
|
#. name for aaz
|
||||||
msgid "Amarasi"
|
msgid "Amarasi"
|
||||||
msgstr ""
|
msgstr "Амараси"
|
||||||
|
|
||||||
#. name for aba
|
#. name for aba
|
||||||
msgid "Abé"
|
msgid "Abé"
|
||||||
msgstr ""
|
msgstr "Абе"
|
||||||
|
|
||||||
#. name for abb
|
#. name for abb
|
||||||
msgid "Bankon"
|
msgid "Bankon"
|
||||||
msgstr ""
|
msgstr "Банкон"
|
||||||
|
|
||||||
#. name for abc
|
#. name for abc
|
||||||
msgid "Ayta; Ambala"
|
msgid "Ayta; Ambala"
|
||||||
msgstr ""
|
msgstr "Аита;Амбала"
|
||||||
|
|
||||||
#. name for abd
|
#. name for abd
|
||||||
msgid "Manide"
|
msgid "Manide"
|
||||||
@ -132,11 +132,11 @@ msgstr "Абнаки; Западни"
|
|||||||
|
|
||||||
#. name for abf
|
#. name for abf
|
||||||
msgid "Abai Sungai"
|
msgid "Abai Sungai"
|
||||||
msgstr ""
|
msgstr "Абаи Сунгаи"
|
||||||
|
|
||||||
#. name for abg
|
#. name for abg
|
||||||
msgid "Abaga"
|
msgid "Abaga"
|
||||||
msgstr ""
|
msgstr "Абага"
|
||||||
|
|
||||||
#. name for abh
|
#. name for abh
|
||||||
msgid "Arabic; Tajiki"
|
msgid "Arabic; Tajiki"
|
||||||
@ -148,7 +148,7 @@ msgstr "Абиџи"
|
|||||||
|
|
||||||
#. name for abj
|
#. name for abj
|
||||||
msgid "Aka-Bea"
|
msgid "Aka-Bea"
|
||||||
msgstr ""
|
msgstr "Ака-Беа"
|
||||||
|
|
||||||
#. name for abk
|
#. name for abk
|
||||||
msgid "Abkhazian"
|
msgid "Abkhazian"
|
||||||
@ -156,31 +156,31 @@ msgstr "Абхазијски"
|
|||||||
|
|
||||||
#. name for abl
|
#. name for abl
|
||||||
msgid "Lampung Nyo"
|
msgid "Lampung Nyo"
|
||||||
msgstr ""
|
msgstr "Лампунг Нио"
|
||||||
|
|
||||||
#. name for abm
|
#. name for abm
|
||||||
msgid "Abanyom"
|
msgid "Abanyom"
|
||||||
msgstr ""
|
msgstr "Абањјом"
|
||||||
|
|
||||||
#. name for abn
|
#. name for abn
|
||||||
msgid "Abua"
|
msgid "Abua"
|
||||||
msgstr ""
|
msgstr "Абуа"
|
||||||
|
|
||||||
#. name for abo
|
#. name for abo
|
||||||
msgid "Abon"
|
msgid "Abon"
|
||||||
msgstr ""
|
msgstr "Абон"
|
||||||
|
|
||||||
#. name for abp
|
#. name for abp
|
||||||
msgid "Ayta; Abellen"
|
msgid "Ayta; Abellen"
|
||||||
msgstr ""
|
msgstr "Ајта (абелијска)"
|
||||||
|
|
||||||
#. name for abq
|
#. name for abq
|
||||||
msgid "Abaza"
|
msgid "Abaza"
|
||||||
msgstr ""
|
msgstr "Абаза"
|
||||||
|
|
||||||
#. name for abr
|
#. name for abr
|
||||||
msgid "Abron"
|
msgid "Abron"
|
||||||
msgstr ""
|
msgstr "Аброн"
|
||||||
|
|
||||||
#. name for abs
|
#. name for abs
|
||||||
msgid "Malay; Ambonese"
|
msgid "Malay; Ambonese"
|
||||||
@ -188,43 +188,43 @@ msgstr "Малајски; Амбонијски"
|
|||||||
|
|
||||||
#. name for abt
|
#. name for abt
|
||||||
msgid "Ambulas"
|
msgid "Ambulas"
|
||||||
msgstr ""
|
msgstr "Амбулас"
|
||||||
|
|
||||||
#. name for abu
|
#. name for abu
|
||||||
msgid "Abure"
|
msgid "Abure"
|
||||||
msgstr ""
|
msgstr "Абуре"
|
||||||
|
|
||||||
#. name for abv
|
#. name for abv
|
||||||
msgid "Arabic; Baharna"
|
msgid "Arabic; Baharna"
|
||||||
msgstr ""
|
msgstr "Арапски (Бахреин)"
|
||||||
|
|
||||||
#. name for abw
|
#. name for abw
|
||||||
msgid "Pal"
|
msgid "Pal"
|
||||||
msgstr ""
|
msgstr "Пал"
|
||||||
|
|
||||||
#. name for abx
|
#. name for abx
|
||||||
msgid "Inabaknon"
|
msgid "Inabaknon"
|
||||||
msgstr ""
|
msgstr "Инабакнон"
|
||||||
|
|
||||||
#. name for aby
|
#. name for aby
|
||||||
msgid "Aneme Wake"
|
msgid "Aneme Wake"
|
||||||
msgstr ""
|
msgstr "Анем Ваке"
|
||||||
|
|
||||||
#. name for abz
|
#. name for abz
|
||||||
msgid "Abui"
|
msgid "Abui"
|
||||||
msgstr ""
|
msgstr "Абуи"
|
||||||
|
|
||||||
#. name for aca
|
#. name for aca
|
||||||
msgid "Achagua"
|
msgid "Achagua"
|
||||||
msgstr ""
|
msgstr "Ачагуа"
|
||||||
|
|
||||||
#. name for acb
|
#. name for acb
|
||||||
msgid "Áncá"
|
msgid "Áncá"
|
||||||
msgstr ""
|
msgstr "Анка"
|
||||||
|
|
||||||
#. name for acd
|
#. name for acd
|
||||||
msgid "Gikyode"
|
msgid "Gikyode"
|
||||||
msgstr ""
|
msgstr "Гикиод"
|
||||||
|
|
||||||
#. name for ace
|
#. name for ace
|
||||||
msgid "Achinese"
|
msgid "Achinese"
|
||||||
@ -240,123 +240,123 @@ msgstr "Аколи"
|
|||||||
|
|
||||||
#. name for aci
|
#. name for aci
|
||||||
msgid "Aka-Cari"
|
msgid "Aka-Cari"
|
||||||
msgstr ""
|
msgstr "Ака-Кари"
|
||||||
|
|
||||||
#. name for ack
|
#. name for ack
|
||||||
msgid "Aka-Kora"
|
msgid "Aka-Kora"
|
||||||
msgstr ""
|
msgstr "Ака-Кора"
|
||||||
|
|
||||||
#. name for acl
|
#. name for acl
|
||||||
msgid "Akar-Bale"
|
msgid "Akar-Bale"
|
||||||
msgstr ""
|
msgstr "Акар-Бале"
|
||||||
|
|
||||||
#. name for acm
|
#. name for acm
|
||||||
msgid "Arabic; Mesopotamian"
|
msgid "Arabic; Mesopotamian"
|
||||||
msgstr ""
|
msgstr "Арапски (Месопотамија)"
|
||||||
|
|
||||||
#. name for acn
|
#. name for acn
|
||||||
msgid "Achang"
|
msgid "Achang"
|
||||||
msgstr ""
|
msgstr "Ачанг"
|
||||||
|
|
||||||
#. name for acp
|
#. name for acp
|
||||||
msgid "Acipa; Eastern"
|
msgid "Acipa; Eastern"
|
||||||
msgstr ""
|
msgstr "Акипа;Источни"
|
||||||
|
|
||||||
#. name for acq
|
#. name for acq
|
||||||
msgid "Arabic; Ta'izzi-Adeni"
|
msgid "Arabic; Ta'izzi-Adeni"
|
||||||
msgstr ""
|
msgstr "Арапски; Северни Јемен"
|
||||||
|
|
||||||
#. name for acr
|
#. name for acr
|
||||||
msgid "Achi"
|
msgid "Achi"
|
||||||
msgstr ""
|
msgstr "Ачи"
|
||||||
|
|
||||||
#. name for acs
|
#. name for acs
|
||||||
msgid "Acroá"
|
msgid "Acroá"
|
||||||
msgstr ""
|
msgstr "Акроа"
|
||||||
|
|
||||||
#. name for act
|
#. name for act
|
||||||
msgid "Achterhoeks"
|
msgid "Achterhoeks"
|
||||||
msgstr ""
|
msgstr "Ахтерхекс"
|
||||||
|
|
||||||
#. name for acu
|
#. name for acu
|
||||||
msgid "Achuar-Shiwiar"
|
msgid "Achuar-Shiwiar"
|
||||||
msgstr ""
|
msgstr "Ачуар-Шивиар"
|
||||||
|
|
||||||
#. name for acv
|
#. name for acv
|
||||||
msgid "Achumawi"
|
msgid "Achumawi"
|
||||||
msgstr ""
|
msgstr "Ачумави"
|
||||||
|
|
||||||
#. name for acw
|
#. name for acw
|
||||||
msgid "Arabic; Hijazi"
|
msgid "Arabic; Hijazi"
|
||||||
msgstr ""
|
msgstr "Арапски;Хиџази"
|
||||||
|
|
||||||
#. name for acx
|
#. name for acx
|
||||||
msgid "Arabic; Omani"
|
msgid "Arabic; Omani"
|
||||||
msgstr ""
|
msgstr "Арапски;Оман"
|
||||||
|
|
||||||
#. name for acy
|
#. name for acy
|
||||||
msgid "Arabic; Cypriot"
|
msgid "Arabic; Cypriot"
|
||||||
msgstr ""
|
msgstr "Арапски;Кипар"
|
||||||
|
|
||||||
#. name for acz
|
#. name for acz
|
||||||
msgid "Acheron"
|
msgid "Acheron"
|
||||||
msgstr ""
|
msgstr "Ачерон"
|
||||||
|
|
||||||
#. name for ada
|
#. name for ada
|
||||||
msgid "Adangme"
|
msgid "Adangme"
|
||||||
msgstr "адангме"
|
msgstr "Адангме"
|
||||||
|
|
||||||
#. name for adb
|
#. name for adb
|
||||||
msgid "Adabe"
|
msgid "Adabe"
|
||||||
msgstr ""
|
msgstr "Адабе"
|
||||||
|
|
||||||
#. name for add
|
#. name for add
|
||||||
msgid "Dzodinka"
|
msgid "Dzodinka"
|
||||||
msgstr ""
|
msgstr "Ђодинка"
|
||||||
|
|
||||||
#. name for ade
|
#. name for ade
|
||||||
msgid "Adele"
|
msgid "Adele"
|
||||||
msgstr ""
|
msgstr "Аделе"
|
||||||
|
|
||||||
#. name for adf
|
#. name for adf
|
||||||
msgid "Arabic; Dhofari"
|
msgid "Arabic; Dhofari"
|
||||||
msgstr ""
|
msgstr "Арапски;Дофари"
|
||||||
|
|
||||||
#. name for adg
|
#. name for adg
|
||||||
msgid "Andegerebinha"
|
msgid "Andegerebinha"
|
||||||
msgstr ""
|
msgstr "Андегеребина"
|
||||||
|
|
||||||
#. name for adh
|
#. name for adh
|
||||||
msgid "Adhola"
|
msgid "Adhola"
|
||||||
msgstr ""
|
msgstr "Адола"
|
||||||
|
|
||||||
#. name for adi
|
#. name for adi
|
||||||
msgid "Adi"
|
msgid "Adi"
|
||||||
msgstr ""
|
msgstr "Ади"
|
||||||
|
|
||||||
#. name for adj
|
#. name for adj
|
||||||
msgid "Adioukrou"
|
msgid "Adioukrou"
|
||||||
msgstr ""
|
msgstr "Адиокру"
|
||||||
|
|
||||||
#. name for adl
|
#. name for adl
|
||||||
msgid "Galo"
|
msgid "Galo"
|
||||||
msgstr ""
|
msgstr "Гало"
|
||||||
|
|
||||||
#. name for adn
|
#. name for adn
|
||||||
msgid "Adang"
|
msgid "Adang"
|
||||||
msgstr ""
|
msgstr "Аданг"
|
||||||
|
|
||||||
#. name for ado
|
#. name for ado
|
||||||
msgid "Abu"
|
msgid "Abu"
|
||||||
msgstr ""
|
msgstr "Абу"
|
||||||
|
|
||||||
#. name for adp
|
#. name for adp
|
||||||
msgid "Adap"
|
msgid "Adap"
|
||||||
msgstr ""
|
msgstr "Адап"
|
||||||
|
|
||||||
#. name for adq
|
#. name for adq
|
||||||
msgid "Adangbe"
|
msgid "Adangbe"
|
||||||
msgstr ""
|
msgstr "Адангбе"
|
||||||
|
|
||||||
#. name for adr
|
#. name for adr
|
||||||
msgid "Adonara"
|
msgid "Adonara"
|
||||||
@ -364,59 +364,59 @@ msgstr ""
|
|||||||
|
|
||||||
#. name for ads
|
#. name for ads
|
||||||
msgid "Adamorobe Sign Language"
|
msgid "Adamorobe Sign Language"
|
||||||
msgstr ""
|
msgstr "Адамороб знаковни језик"
|
||||||
|
|
||||||
#. name for adt
|
#. name for adt
|
||||||
msgid "Adnyamathanha"
|
msgid "Adnyamathanha"
|
||||||
msgstr ""
|
msgstr "Адњаматана"
|
||||||
|
|
||||||
#. name for adu
|
#. name for adu
|
||||||
msgid "Aduge"
|
msgid "Aduge"
|
||||||
msgstr ""
|
msgstr "Адуге"
|
||||||
|
|
||||||
#. name for adw
|
#. name for adw
|
||||||
msgid "Amundava"
|
msgid "Amundava"
|
||||||
msgstr ""
|
msgstr "Амундава"
|
||||||
|
|
||||||
#. name for adx
|
#. name for adx
|
||||||
msgid "Tibetan; Amdo"
|
msgid "Tibetan; Amdo"
|
||||||
msgstr ""
|
msgstr "Тибетански;Амдо"
|
||||||
|
|
||||||
#. name for ady
|
#. name for ady
|
||||||
msgid "Adyghe"
|
msgid "Adyghe"
|
||||||
msgstr ""
|
msgstr "Адиге"
|
||||||
|
|
||||||
#. name for adz
|
#. name for adz
|
||||||
msgid "Adzera"
|
msgid "Adzera"
|
||||||
msgstr ""
|
msgstr "Адзера"
|
||||||
|
|
||||||
#. name for aea
|
#. name for aea
|
||||||
msgid "Areba"
|
msgid "Areba"
|
||||||
msgstr ""
|
msgstr "Ареба"
|
||||||
|
|
||||||
#. name for aeb
|
#. name for aeb
|
||||||
msgid "Arabic; Tunisian"
|
msgid "Arabic; Tunisian"
|
||||||
msgstr ""
|
msgstr "Арапски;Туниски"
|
||||||
|
|
||||||
#. name for aec
|
#. name for aec
|
||||||
msgid "Arabic; Saidi"
|
msgid "Arabic; Saidi"
|
||||||
msgstr ""
|
msgstr "Арапски (Горњи Египат)"
|
||||||
|
|
||||||
#. name for aed
|
#. name for aed
|
||||||
msgid "Argentine Sign Language"
|
msgid "Argentine Sign Language"
|
||||||
msgstr ""
|
msgstr "Аргентински знаковни језик"
|
||||||
|
|
||||||
#. name for aee
|
#. name for aee
|
||||||
msgid "Pashayi; Northeast"
|
msgid "Pashayi; Northeast"
|
||||||
msgstr ""
|
msgstr "Пашаи (североисточни)"
|
||||||
|
|
||||||
#. name for aek
|
#. name for aek
|
||||||
msgid "Haeke"
|
msgid "Haeke"
|
||||||
msgstr ""
|
msgstr "Хаеке"
|
||||||
|
|
||||||
#. name for ael
|
#. name for ael
|
||||||
msgid "Ambele"
|
msgid "Ambele"
|
||||||
msgstr ""
|
msgstr "Амбеле"
|
||||||
|
|
||||||
#. name for aem
|
#. name for aem
|
||||||
msgid "Arem"
|
msgid "Arem"
|
||||||
@ -460,15 +460,15 @@ msgstr ""
|
|||||||
|
|
||||||
#. name for afd
|
#. name for afd
|
||||||
msgid "Andai"
|
msgid "Andai"
|
||||||
msgstr ""
|
msgstr "Андаи"
|
||||||
|
|
||||||
#. name for afe
|
#. name for afe
|
||||||
msgid "Putukwam"
|
msgid "Putukwam"
|
||||||
msgstr ""
|
msgstr "Путуквам"
|
||||||
|
|
||||||
#. name for afg
|
#. name for afg
|
||||||
msgid "Afghan Sign Language"
|
msgid "Afghan Sign Language"
|
||||||
msgstr ""
|
msgstr "Афганистански знаковни језик"
|
||||||
|
|
||||||
#. name for afh
|
#. name for afh
|
||||||
msgid "Afrihili"
|
msgid "Afrihili"
|
||||||
@ -476,7 +476,7 @@ msgstr "африхили"
|
|||||||
|
|
||||||
#. name for afi
|
#. name for afi
|
||||||
msgid "Akrukay"
|
msgid "Akrukay"
|
||||||
msgstr ""
|
msgstr "Акрукај"
|
||||||
|
|
||||||
#. name for afk
|
#. name for afk
|
||||||
msgid "Nanubae"
|
msgid "Nanubae"
|
||||||
@ -484,15 +484,15 @@ msgstr ""
|
|||||||
|
|
||||||
#. name for afn
|
#. name for afn
|
||||||
msgid "Defaka"
|
msgid "Defaka"
|
||||||
msgstr ""
|
msgstr "Дефака"
|
||||||
|
|
||||||
#. name for afo
|
#. name for afo
|
||||||
msgid "Eloyi"
|
msgid "Eloyi"
|
||||||
msgstr ""
|
msgstr "Елоји"
|
||||||
|
|
||||||
#. name for afp
|
#. name for afp
|
||||||
msgid "Tapei"
|
msgid "Tapei"
|
||||||
msgstr ""
|
msgstr "Тапеи"
|
||||||
|
|
||||||
#. name for afr
|
#. name for afr
|
||||||
msgid "Afrikaans"
|
msgid "Afrikaans"
|
||||||
@ -500,51 +500,51 @@ msgstr "африканс"
|
|||||||
|
|
||||||
#. name for afs
|
#. name for afs
|
||||||
msgid "Creole; Afro-Seminole"
|
msgid "Creole; Afro-Seminole"
|
||||||
msgstr ""
|
msgstr "Креолски;Афричко-Семинолслки"
|
||||||
|
|
||||||
#. name for aft
|
#. name for aft
|
||||||
msgid "Afitti"
|
msgid "Afitti"
|
||||||
msgstr ""
|
msgstr "Афити"
|
||||||
|
|
||||||
#. name for afu
|
#. name for afu
|
||||||
msgid "Awutu"
|
msgid "Awutu"
|
||||||
msgstr ""
|
msgstr "Авуту"
|
||||||
|
|
||||||
#. name for afz
|
#. name for afz
|
||||||
msgid "Obokuitai"
|
msgid "Obokuitai"
|
||||||
msgstr ""
|
msgstr "Обокуитаи"
|
||||||
|
|
||||||
#. name for aga
|
#. name for aga
|
||||||
msgid "Aguano"
|
msgid "Aguano"
|
||||||
msgstr ""
|
msgstr "Агвано"
|
||||||
|
|
||||||
#. name for agb
|
#. name for agb
|
||||||
msgid "Legbo"
|
msgid "Legbo"
|
||||||
msgstr ""
|
msgstr "Легбо"
|
||||||
|
|
||||||
#. name for agc
|
#. name for agc
|
||||||
msgid "Agatu"
|
msgid "Agatu"
|
||||||
msgstr ""
|
msgstr "Агату"
|
||||||
|
|
||||||
#. name for agd
|
#. name for agd
|
||||||
msgid "Agarabi"
|
msgid "Agarabi"
|
||||||
msgstr ""
|
msgstr "Агараби"
|
||||||
|
|
||||||
#. name for age
|
#. name for age
|
||||||
msgid "Angal"
|
msgid "Angal"
|
||||||
msgstr ""
|
msgstr "Ангал"
|
||||||
|
|
||||||
#. name for agf
|
#. name for agf
|
||||||
msgid "Arguni"
|
msgid "Arguni"
|
||||||
msgstr ""
|
msgstr "Аргуни"
|
||||||
|
|
||||||
#. name for agg
|
#. name for agg
|
||||||
msgid "Angor"
|
msgid "Angor"
|
||||||
msgstr ""
|
msgstr "Ангор"
|
||||||
|
|
||||||
#. name for agh
|
#. name for agh
|
||||||
msgid "Ngelima"
|
msgid "Ngelima"
|
||||||
msgstr ""
|
msgstr "Нгелима"
|
||||||
|
|
||||||
#. name for agi
|
#. name for agi
|
||||||
msgid "Agariya"
|
msgid "Agariya"
|
||||||
@ -588,15 +588,15 @@ msgstr ""
|
|||||||
|
|
||||||
#. name for agt
|
#. name for agt
|
||||||
msgid "Agta; Central Cagayan"
|
msgid "Agta; Central Cagayan"
|
||||||
msgstr ""
|
msgstr "Агта;Централно Кагајански"
|
||||||
|
|
||||||
#. name for agu
|
#. name for agu
|
||||||
msgid "Aguacateco"
|
msgid "Aguacateco"
|
||||||
msgstr ""
|
msgstr "Агвакатеко"
|
||||||
|
|
||||||
#. name for agv
|
#. name for agv
|
||||||
msgid "Dumagat; Remontado"
|
msgid "Dumagat; Remontado"
|
||||||
msgstr ""
|
msgstr "Думагат;Ремонтадо"
|
||||||
|
|
||||||
#. name for agw
|
#. name for agw
|
||||||
msgid "Kahua"
|
msgid "Kahua"
|
||||||
@ -604,27 +604,27 @@ msgstr ""
|
|||||||
|
|
||||||
#. name for agx
|
#. name for agx
|
||||||
msgid "Aghul"
|
msgid "Aghul"
|
||||||
msgstr ""
|
msgstr "Агхул"
|
||||||
|
|
||||||
#. name for agy
|
#. name for agy
|
||||||
msgid "Alta; Southern"
|
msgid "Alta; Southern"
|
||||||
msgstr ""
|
msgstr "Алта;Јужни"
|
||||||
|
|
||||||
#. name for agz
|
#. name for agz
|
||||||
msgid "Agta; Mt. Iriga"
|
msgid "Agta; Mt. Iriga"
|
||||||
msgstr ""
|
msgstr "Агта;Мт.Ирига"
|
||||||
|
|
||||||
#. name for aha
|
#. name for aha
|
||||||
msgid "Ahanta"
|
msgid "Ahanta"
|
||||||
msgstr ""
|
msgstr "Аханта"
|
||||||
|
|
||||||
#. name for ahb
|
#. name for ahb
|
||||||
msgid "Axamb"
|
msgid "Axamb"
|
||||||
msgstr ""
|
msgstr "Аксамб"
|
||||||
|
|
||||||
#. name for ahg
|
#. name for ahg
|
||||||
msgid "Qimant"
|
msgid "Qimant"
|
||||||
msgstr ""
|
msgstr "Кимант"
|
||||||
|
|
||||||
#. name for ahh
|
#. name for ahh
|
||||||
msgid "Aghu"
|
msgid "Aghu"
|
||||||
@ -668,95 +668,95 @@ msgstr ""
|
|||||||
|
|
||||||
#. name for aht
|
#. name for aht
|
||||||
msgid "Ahtena"
|
msgid "Ahtena"
|
||||||
msgstr ""
|
msgstr "Ахтена"
|
||||||
|
|
||||||
#. name for aia
|
#. name for aia
|
||||||
msgid "Arosi"
|
msgid "Arosi"
|
||||||
msgstr ""
|
msgstr "Ароси"
|
||||||
|
|
||||||
#. name for aib
|
#. name for aib
|
||||||
msgid "Ainu (China)"
|
msgid "Ainu (China)"
|
||||||
msgstr ""
|
msgstr "Аину(Кина)"
|
||||||
|
|
||||||
#. name for aic
|
#. name for aic
|
||||||
msgid "Ainbai"
|
msgid "Ainbai"
|
||||||
msgstr ""
|
msgstr "Аинбаи"
|
||||||
|
|
||||||
#. name for aid
|
#. name for aid
|
||||||
msgid "Alngith"
|
msgid "Alngith"
|
||||||
msgstr ""
|
msgstr "Алнгит"
|
||||||
|
|
||||||
#. name for aie
|
#. name for aie
|
||||||
msgid "Amara"
|
msgid "Amara"
|
||||||
msgstr ""
|
msgstr "Амара"
|
||||||
|
|
||||||
#. name for aif
|
#. name for aif
|
||||||
msgid "Agi"
|
msgid "Agi"
|
||||||
msgstr ""
|
msgstr "Аги"
|
||||||
|
|
||||||
#. name for aig
|
#. name for aig
|
||||||
msgid "Creole English; Antigua and Barbuda"
|
msgid "Creole English; Antigua and Barbuda"
|
||||||
msgstr ""
|
msgstr "Креолски Енглески;Антигва и Барбуда"
|
||||||
|
|
||||||
#. name for aih
|
#. name for aih
|
||||||
msgid "Ai-Cham"
|
msgid "Ai-Cham"
|
||||||
msgstr ""
|
msgstr "Аи-Чам"
|
||||||
|
|
||||||
#. name for aii
|
#. name for aii
|
||||||
msgid "Neo-Aramaic; Assyrian"
|
msgid "Neo-Aramaic; Assyrian"
|
||||||
msgstr ""
|
msgstr "Ново-Арамејски;Асирски"
|
||||||
|
|
||||||
#. name for aij
|
#. name for aij
|
||||||
msgid "Lishanid Noshan"
|
msgid "Lishanid Noshan"
|
||||||
msgstr ""
|
msgstr "Лианид Ношан"
|
||||||
|
|
||||||
#. name for aik
|
#. name for aik
|
||||||
msgid "Ake"
|
msgid "Ake"
|
||||||
msgstr ""
|
msgstr "Аке"
|
||||||
|
|
||||||
#. name for ail
|
#. name for ail
|
||||||
msgid "Aimele"
|
msgid "Aimele"
|
||||||
msgstr ""
|
msgstr "Ајмеле"
|
||||||
|
|
||||||
#. name for aim
|
#. name for aim
|
||||||
msgid "Aimol"
|
msgid "Aimol"
|
||||||
msgstr ""
|
msgstr "Ајмол"
|
||||||
|
|
||||||
#. name for ain
|
#. name for ain
|
||||||
msgid "Ainu (Japan)"
|
msgid "Ainu (Japan)"
|
||||||
msgstr ""
|
msgstr "Аину(Јапан)"
|
||||||
|
|
||||||
#. name for aio
|
#. name for aio
|
||||||
msgid "Aiton"
|
msgid "Aiton"
|
||||||
msgstr ""
|
msgstr "Аитон"
|
||||||
|
|
||||||
#. name for aip
|
#. name for aip
|
||||||
msgid "Burumakok"
|
msgid "Burumakok"
|
||||||
msgstr ""
|
msgstr "Бурумакок"
|
||||||
|
|
||||||
#. name for aiq
|
#. name for aiq
|
||||||
msgid "Aimaq"
|
msgid "Aimaq"
|
||||||
msgstr ""
|
msgstr "Ајмак"
|
||||||
|
|
||||||
#. name for air
|
#. name for air
|
||||||
msgid "Airoran"
|
msgid "Airoran"
|
||||||
msgstr ""
|
msgstr "Ајроран"
|
||||||
|
|
||||||
#. name for ais
|
#. name for ais
|
||||||
msgid "Amis; Nataoran"
|
msgid "Amis; Nataoran"
|
||||||
msgstr ""
|
msgstr "Амис;Натаоран"
|
||||||
|
|
||||||
#. name for ait
|
#. name for ait
|
||||||
msgid "Arikem"
|
msgid "Arikem"
|
||||||
msgstr ""
|
msgstr "Арикем"
|
||||||
|
|
||||||
#. name for aiw
|
#. name for aiw
|
||||||
msgid "Aari"
|
msgid "Aari"
|
||||||
msgstr ""
|
msgstr "Аари"
|
||||||
|
|
||||||
#. name for aix
|
#. name for aix
|
||||||
msgid "Aighon"
|
msgid "Aighon"
|
||||||
msgstr ""
|
msgstr "Аигхон"
|
||||||
|
|
||||||
#. name for aiy
|
#. name for aiy
|
||||||
msgid "Ali"
|
msgid "Ali"
|
||||||
@ -764,35 +764,35 @@ msgstr ""
|
|||||||
|
|
||||||
#. name for aja
|
#. name for aja
|
||||||
msgid "Aja (Sudan)"
|
msgid "Aja (Sudan)"
|
||||||
msgstr ""
|
msgstr "Аја(Судан)"
|
||||||
|
|
||||||
#. name for ajg
|
#. name for ajg
|
||||||
msgid "Aja (Benin)"
|
msgid "Aja (Benin)"
|
||||||
msgstr ""
|
msgstr "Аја(Бенин)"
|
||||||
|
|
||||||
#. name for aji
|
#. name for aji
|
||||||
msgid "Ajië"
|
msgid "Ajië"
|
||||||
msgstr ""
|
msgstr "Ајие"
|
||||||
|
|
||||||
#. name for ajp
|
#. name for ajp
|
||||||
msgid "Arabic; South Levantine"
|
msgid "Arabic; South Levantine"
|
||||||
msgstr ""
|
msgstr "Арапски;Јужно-Левантински"
|
||||||
|
|
||||||
#. name for ajt
|
#. name for ajt
|
||||||
msgid "Arabic; Judeo-Tunisian"
|
msgid "Arabic; Judeo-Tunisian"
|
||||||
msgstr ""
|
msgstr "Арапски;Јудео-Туниски"
|
||||||
|
|
||||||
#. name for aju
|
#. name for aju
|
||||||
msgid "Arabic; Judeo-Moroccan"
|
msgid "Arabic; Judeo-Moroccan"
|
||||||
msgstr ""
|
msgstr "Арапски;Јудео-Марокански"
|
||||||
|
|
||||||
#. name for ajw
|
#. name for ajw
|
||||||
msgid "Ajawa"
|
msgid "Ajawa"
|
||||||
msgstr ""
|
msgstr "Ајава"
|
||||||
|
|
||||||
#. name for ajz
|
#. name for ajz
|
||||||
msgid "Karbi; Amri"
|
msgid "Karbi; Amri"
|
||||||
msgstr ""
|
msgstr "Карби;Амри"
|
||||||
|
|
||||||
#. name for aka
|
#. name for aka
|
||||||
msgid "Akan"
|
msgid "Akan"
|
||||||
@ -800,35 +800,35 @@ msgstr "акан"
|
|||||||
|
|
||||||
#. name for akb
|
#. name for akb
|
||||||
msgid "Batak Angkola"
|
msgid "Batak Angkola"
|
||||||
msgstr ""
|
msgstr "Батак Ангкола"
|
||||||
|
|
||||||
#. name for akc
|
#. name for akc
|
||||||
msgid "Mpur"
|
msgid "Mpur"
|
||||||
msgstr ""
|
msgstr "Мпур"
|
||||||
|
|
||||||
#. name for akd
|
#. name for akd
|
||||||
msgid "Ukpet-Ehom"
|
msgid "Ukpet-Ehom"
|
||||||
msgstr ""
|
msgstr "Укпет-Ехом"
|
||||||
|
|
||||||
#. name for ake
|
#. name for ake
|
||||||
msgid "Akawaio"
|
msgid "Akawaio"
|
||||||
msgstr ""
|
msgstr "Акавајо"
|
||||||
|
|
||||||
#. name for akf
|
#. name for akf
|
||||||
msgid "Akpa"
|
msgid "Akpa"
|
||||||
msgstr ""
|
msgstr "Акипа"
|
||||||
|
|
||||||
#. name for akg
|
#. name for akg
|
||||||
msgid "Anakalangu"
|
msgid "Anakalangu"
|
||||||
msgstr ""
|
msgstr "Анакалангу"
|
||||||
|
|
||||||
#. name for akh
|
#. name for akh
|
||||||
msgid "Angal Heneng"
|
msgid "Angal Heneng"
|
||||||
msgstr ""
|
msgstr "Ангал Хененг"
|
||||||
|
|
||||||
#. name for aki
|
#. name for aki
|
||||||
msgid "Aiome"
|
msgid "Aiome"
|
||||||
msgstr ""
|
msgstr "Ајоме"
|
||||||
|
|
||||||
#. name for akj
|
#. name for akj
|
||||||
msgid "Aka-Jeru"
|
msgid "Aka-Jeru"
|
||||||
|
@ -4,7 +4,7 @@ __license__ = 'GPL v3'
|
|||||||
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
|
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
|
||||||
__docformat__ = 'restructuredtext en'
|
__docformat__ = 'restructuredtext en'
|
||||||
__appname__ = u'calibre'
|
__appname__ = u'calibre'
|
||||||
numeric_version = (0, 8, 42)
|
numeric_version = (0, 8, 43)
|
||||||
__version__ = u'.'.join(map(unicode, numeric_version))
|
__version__ = u'.'.join(map(unicode, numeric_version))
|
||||||
__author__ = u"Kovid Goyal <kovid@kovidgoyal.net>"
|
__author__ = u"Kovid Goyal <kovid@kovidgoyal.net>"
|
||||||
|
|
||||||
|
@ -379,6 +379,7 @@ class iPadOutput(OutputProfile):
|
|||||||
/* Feed summary formatting */
|
/* Feed summary formatting */
|
||||||
.article_summary {
|
.article_summary {
|
||||||
display:inline-block;
|
display:inline-block;
|
||||||
|
padding-bottom:0.5em;
|
||||||
}
|
}
|
||||||
.feed {
|
.feed {
|
||||||
font-family:sans-serif;
|
font-family:sans-serif;
|
||||||
@ -431,6 +432,15 @@ class iPadOutput(OutputProfile):
|
|||||||
'''
|
'''
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
|
class iPad3Output(iPadOutput):
|
||||||
|
|
||||||
|
screen_size = comic_screen_size = (2048, 1536)
|
||||||
|
dpi = 264.0
|
||||||
|
name = 'iPad 3'
|
||||||
|
short_name = 'ipad3'
|
||||||
|
description = _('Intended for the iPad 3 and similar devices with a '
|
||||||
|
'resolution of 1536x2048')
|
||||||
|
|
||||||
class TabletOutput(iPadOutput):
|
class TabletOutput(iPadOutput):
|
||||||
name = 'Tablet'
|
name = 'Tablet'
|
||||||
short_name = 'tablet'
|
short_name = 'tablet'
|
||||||
@ -754,7 +764,7 @@ class PocketBook900Output(OutputProfile):
|
|||||||
output_profiles = [OutputProfile, SonyReaderOutput, SonyReader300Output,
|
output_profiles = [OutputProfile, SonyReaderOutput, SonyReader300Output,
|
||||||
SonyReader900Output, MSReaderOutput, MobipocketOutput, HanlinV3Output,
|
SonyReader900Output, MSReaderOutput, MobipocketOutput, HanlinV3Output,
|
||||||
HanlinV5Output, CybookG3Output, CybookOpusOutput, KindleOutput,
|
HanlinV5Output, CybookG3Output, CybookOpusOutput, KindleOutput,
|
||||||
iPadOutput, KoboReaderOutput, TabletOutput, SamsungGalaxy,
|
iPadOutput, iPad3Output, KoboReaderOutput, TabletOutput, SamsungGalaxy,
|
||||||
SonyReaderLandscapeOutput, KindleDXOutput, IlliadOutput,
|
SonyReaderLandscapeOutput, KindleDXOutput, IlliadOutput,
|
||||||
IRexDR1000Output, IRexDR800Output, JetBook5Output, NookOutput,
|
IRexDR1000Output, IRexDR800Output, JetBook5Output, NookOutput,
|
||||||
BambookOutput, NookColorOutput, PocketBook900Output, GenericEink,
|
BambookOutput, NookColorOutput, PocketBook900Output, GenericEink,
|
||||||
|
@ -51,8 +51,9 @@ Run an embedded python interpreter.
|
|||||||
'with sqlite3 works.')
|
'with sqlite3 works.')
|
||||||
parser.add_option('-p', '--py-console', help='Run python console',
|
parser.add_option('-p', '--py-console', help='Run python console',
|
||||||
default=False, action='store_true')
|
default=False, action='store_true')
|
||||||
parser.add_option('-m', '--inspect-mobi',
|
parser.add_option('-m', '--inspect-mobi', action='store_true',
|
||||||
help='Inspect the MOBI file at the specified path', default=None)
|
default=False,
|
||||||
|
help='Inspect the MOBI file(s) at the specified path(s)')
|
||||||
parser.add_option('--test-build', help='Test binary modules in build',
|
parser.add_option('--test-build', help='Test binary modules in build',
|
||||||
action='store_true', default=False)
|
action='store_true', default=False)
|
||||||
|
|
||||||
@ -232,9 +233,13 @@ def main(args=sys.argv):
|
|||||||
if len(args) > 1 and os.access(args[-1], os.R_OK):
|
if len(args) > 1 and os.access(args[-1], os.R_OK):
|
||||||
sql_dump = args[-1]
|
sql_dump = args[-1]
|
||||||
reinit_db(opts.reinitialize_db, sql_dump=sql_dump)
|
reinit_db(opts.reinitialize_db, sql_dump=sql_dump)
|
||||||
elif opts.inspect_mobi is not None:
|
elif opts.inspect_mobi:
|
||||||
from calibre.ebooks.mobi.debug import inspect_mobi
|
from calibre.ebooks.mobi.debug import inspect_mobi
|
||||||
inspect_mobi(opts.inspect_mobi)
|
for path in args[1:]:
|
||||||
|
prints('Inspecting:', path)
|
||||||
|
inspect_mobi(path)
|
||||||
|
print
|
||||||
|
|
||||||
elif opts.test_build:
|
elif opts.test_build:
|
||||||
from calibre.test_build import test
|
from calibre.test_build import test
|
||||||
test()
|
test()
|
||||||
|
@ -14,6 +14,7 @@ from lxml import html
|
|||||||
|
|
||||||
from calibre.utils.date import utc_tz
|
from calibre.utils.date import utc_tz
|
||||||
from calibre.ebooks.mobi.langcodes import main_language, sub_language
|
from calibre.ebooks.mobi.langcodes import main_language, sub_language
|
||||||
|
from calibre.ebooks.mobi.reader.headers import NULL_INDEX
|
||||||
from calibre.ebooks.mobi.utils import (decode_hex_number, decint,
|
from calibre.ebooks.mobi.utils import (decode_hex_number, decint,
|
||||||
get_trailing_data, decode_tbs, read_font_record)
|
get_trailing_data, decode_tbs, read_font_record)
|
||||||
from calibre.utils.magick.draw import identify_data
|
from calibre.utils.magick.draw import identify_data
|
||||||
@ -151,6 +152,10 @@ class EXTHRecord(object):
|
|||||||
117 : 'adult',
|
117 : 'adult',
|
||||||
118 : 'retailprice',
|
118 : 'retailprice',
|
||||||
119 : 'retailpricecurrency',
|
119 : 'retailpricecurrency',
|
||||||
|
121 : 'KF8 header section index',
|
||||||
|
125 : 'KF8 resources (images/fonts) count',
|
||||||
|
129 : 'KF8 cover URI',
|
||||||
|
131 : 'KF8 unknown count',
|
||||||
201 : 'coveroffset',
|
201 : 'coveroffset',
|
||||||
202 : 'thumboffset',
|
202 : 'thumboffset',
|
||||||
203 : 'hasfakecover',
|
203 : 'hasfakecover',
|
||||||
@ -169,9 +174,10 @@ class EXTHRecord(object):
|
|||||||
503 : 'updatedtitle',
|
503 : 'updatedtitle',
|
||||||
}.get(self.type, repr(self.type))
|
}.get(self.type, repr(self.type))
|
||||||
|
|
||||||
if self.name in ('coveroffset', 'thumboffset', 'hasfakecover',
|
if (self.name in {'coveroffset', 'thumboffset', 'hasfakecover',
|
||||||
'Creator Major Version', 'Creator Minor Version',
|
'Creator Major Version', 'Creator Minor Version',
|
||||||
'Creator Build Number', 'Creator Software', 'startreading'):
|
'Creator Build Number', 'Creator Software', 'startreading'} or
|
||||||
|
self.type in {121, 125, 131}):
|
||||||
self.data, = struct.unpack(b'>I', self.data)
|
self.data, = struct.unpack(b'>I', self.data)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
@ -338,9 +344,9 @@ class MOBIHeader(object): # {{{
|
|||||||
ans.append('File version: %d'%self.file_version)
|
ans.append('File version: %d'%self.file_version)
|
||||||
ans.append('Reserved: %r'%self.reserved)
|
ans.append('Reserved: %r'%self.reserved)
|
||||||
ans.append('Secondary index record: %d (null val: %d)'%(
|
ans.append('Secondary index record: %d (null val: %d)'%(
|
||||||
self.secondary_index_record, 0xffffffff))
|
self.secondary_index_record, NULL_INDEX))
|
||||||
ans.append('Reserved2: %r'%self.reserved2)
|
ans.append('Reserved2: %r'%self.reserved2)
|
||||||
ans.append('First non-book record (null value: %d): %d'%(0xffffffff,
|
ans.append('First non-book record (null value: %d): %d'%(NULL_INDEX,
|
||||||
self.first_non_book_record))
|
self.first_non_book_record))
|
||||||
ans.append('Full name offset: %d'%self.fullname_offset)
|
ans.append('Full name offset: %d'%self.fullname_offset)
|
||||||
ans.append('Full name length: %d bytes'%self.fullname_length)
|
ans.append('Full name length: %d bytes'%self.fullname_length)
|
||||||
@ -379,7 +385,7 @@ class MOBIHeader(object): # {{{
|
|||||||
'(has indexing: %s) (has uncrossable breaks: %s)')%(
|
'(has indexing: %s) (has uncrossable breaks: %s)')%(
|
||||||
bin(self.extra_data_flags), self.has_multibytes,
|
bin(self.extra_data_flags), self.has_multibytes,
|
||||||
self.has_indexing_bytes, self.has_uncrossable_breaks ))
|
self.has_indexing_bytes, self.has_uncrossable_breaks ))
|
||||||
ans.append('Primary index record (null value: %d): %d'%(0xffffffff,
|
ans.append('Primary index record (null value: %d): %d'%(NULL_INDEX,
|
||||||
self.primary_index_record))
|
self.primary_index_record))
|
||||||
|
|
||||||
ans = '\n'.join(ans)
|
ans = '\n'.join(ans)
|
||||||
@ -399,7 +405,7 @@ class MOBIHeader(object): # {{{
|
|||||||
|
|
||||||
class TagX(object): # {{{
|
class TagX(object): # {{{
|
||||||
|
|
||||||
def __init__(self, raw, control_byte_count):
|
def __init__(self, raw):
|
||||||
self.tag = ord(raw[0])
|
self.tag = ord(raw[0])
|
||||||
self.num_values = ord(raw[1])
|
self.num_values = ord(raw[1])
|
||||||
self.bitmask = ord(raw[2])
|
self.bitmask = ord(raw[2])
|
||||||
@ -459,8 +465,7 @@ class SecondaryIndexHeader(object): # {{{
|
|||||||
num_tagx_entries = len(tag_table) // 4
|
num_tagx_entries = len(tag_table) // 4
|
||||||
self.tagx_entries = []
|
self.tagx_entries = []
|
||||||
for i in range(num_tagx_entries):
|
for i in range(num_tagx_entries):
|
||||||
self.tagx_entries.append(TagX(tag_table[i*4:(i+1)*4],
|
self.tagx_entries.append(TagX(tag_table[i*4:(i+1)*4]))
|
||||||
self.tagx_control_byte_count))
|
|
||||||
if self.tagx_entries and not self.tagx_entries[-1].is_eof:
|
if self.tagx_entries and not self.tagx_entries[-1].is_eof:
|
||||||
raise ValueError('TAGX last entry is not EOF')
|
raise ValueError('TAGX last entry is not EOF')
|
||||||
|
|
||||||
@ -563,8 +568,7 @@ class IndexHeader(object): # {{{
|
|||||||
num_tagx_entries = len(tag_table) // 4
|
num_tagx_entries = len(tag_table) // 4
|
||||||
self.tagx_entries = []
|
self.tagx_entries = []
|
||||||
for i in range(num_tagx_entries):
|
for i in range(num_tagx_entries):
|
||||||
self.tagx_entries.append(TagX(tag_table[i*4:(i+1)*4],
|
self.tagx_entries.append(TagX(tag_table[i*4:(i+1)*4]))
|
||||||
self.tagx_control_byte_count))
|
|
||||||
if self.tagx_entries and not self.tagx_entries[-1].is_eof:
|
if self.tagx_entries and not self.tagx_entries[-1].is_eof:
|
||||||
raise ValueError('TAGX last entry is not EOF')
|
raise ValueError('TAGX last entry is not EOF')
|
||||||
|
|
||||||
@ -634,57 +638,29 @@ class Tag(object): # {{{
|
|||||||
TAG_MAP = {
|
TAG_MAP = {
|
||||||
1: ('offset', 'Offset in HTML'),
|
1: ('offset', 'Offset in HTML'),
|
||||||
2: ('size', 'Size in HTML'),
|
2: ('size', 'Size in HTML'),
|
||||||
3: ('label_offset', 'Offset to label in CNCX'),
|
3: ('label_offset', 'Label offset in CNCX'),
|
||||||
4: ('depth', 'Depth of this entry in TOC'),
|
4: ('depth', 'Depth of this entry in TOC'),
|
||||||
|
5: ('class_offset', 'Class offset in CNCX'),
|
||||||
|
6: ('pos_fid', 'File Index'),
|
||||||
|
|
||||||
11: ('secondary', '[unknown, unknown, '
|
11: ('secondary', '[unknown, unknown, '
|
||||||
'tag type from TAGX in primary index header]'),
|
'tag type from TAGX in primary index header]'),
|
||||||
|
|
||||||
# The remaining tag types have to be interpreted subject to the type
|
21: ('parent_index', 'Parent'),
|
||||||
# of index entry they are present in
|
22: ('first_child_index', 'First child'),
|
||||||
|
23: ('last_child_index', 'Last child'),
|
||||||
|
|
||||||
|
69 : ('image_index', 'Offset from first image record to the'
|
||||||
|
' image record associated with this entry'
|
||||||
|
' (masthead for periodical or thumbnail for'
|
||||||
|
' article entry).'),
|
||||||
|
70 : ('desc_offset', 'Description offset in cncx'),
|
||||||
|
71 : ('author_offset', 'Author offset in cncx'),
|
||||||
|
72 : ('image_caption_offset', 'Image caption offset in cncx'),
|
||||||
|
73 : ('image_attr_offset', 'Image attribution offset in cncx'),
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
INTERPRET_MAP = {
|
|
||||||
'subchapter': {
|
|
||||||
21 : ('Parent chapter index', 'parent_index')
|
|
||||||
},
|
|
||||||
|
|
||||||
'article' : {
|
|
||||||
5 : ('Class offset in cncx', 'class_offset'),
|
|
||||||
21 : ('Parent section index', 'parent_index'),
|
|
||||||
69 : ('Offset from first image record num to the'
|
|
||||||
' image record associated with this article',
|
|
||||||
'image_index'),
|
|
||||||
70 : ('Description offset in cncx', 'desc_offset'),
|
|
||||||
71 : ('Author offset in cncx', 'author_offset'),
|
|
||||||
72 : ('Image caption offset in cncx',
|
|
||||||
'image_caption_offset'),
|
|
||||||
73 : ('Image attribution offset in cncx',
|
|
||||||
'image_attr_offset'),
|
|
||||||
},
|
|
||||||
|
|
||||||
'chapter_with_subchapters' : {
|
|
||||||
22 : ('First subchapter index', 'first_child_index'),
|
|
||||||
23 : ('Last subchapter index', 'last_child_index'),
|
|
||||||
},
|
|
||||||
|
|
||||||
'periodical' : {
|
|
||||||
5 : ('Class offset in cncx', 'class_offset'),
|
|
||||||
22 : ('First section index', 'first_child_index'),
|
|
||||||
23 : ('Last section index', 'last_child_index'),
|
|
||||||
69 : ('Offset from first image record num to masthead'
|
|
||||||
' record', 'image_index'),
|
|
||||||
},
|
|
||||||
|
|
||||||
'section' : {
|
|
||||||
5 : ('Class offset in cncx', 'class_offset'),
|
|
||||||
21 : ('Periodical index', 'parent_index'),
|
|
||||||
22 : ('First article index', 'first_child_index'),
|
|
||||||
23 : ('Last article index', 'last_child_index'),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def __init__(self, tagx, vals, entry_type, cncx):
|
def __init__(self, tagx, vals, entry_type, cncx):
|
||||||
self.value = vals if len(vals) > 1 else vals[0] if vals else None
|
self.value = vals if len(vals) > 1 else vals[0] if vals else None
|
||||||
self.entry_type = entry_type
|
self.entry_type = entry_type
|
||||||
@ -694,17 +670,12 @@ class Tag(object): # {{{
|
|||||||
if tag_type in self.TAG_MAP:
|
if tag_type in self.TAG_MAP:
|
||||||
self.attr, self.desc = self.TAG_MAP[tag_type]
|
self.attr, self.desc = self.TAG_MAP[tag_type]
|
||||||
else:
|
else:
|
||||||
try:
|
print ('Unknown tag value: %d in entry type: %s'%(tag_type,
|
||||||
td = self.INTERPRET_MAP[entry_type]
|
entry_type))
|
||||||
except:
|
|
||||||
raise ValueError('Unknown entry type: %s'%entry_type)
|
|
||||||
try:
|
|
||||||
self.desc, self.attr = td[tag_type]
|
|
||||||
except:
|
|
||||||
print ('Unknown tag value: %d'%tag_type)
|
|
||||||
self.desc = '??Unknown (tag value: %d type: %s)'%(
|
self.desc = '??Unknown (tag value: %d type: %s)'%(
|
||||||
tag_type, entry_type)
|
tag_type, entry_type)
|
||||||
self.attr = 'unknown'
|
self.attr = 'unknown'
|
||||||
|
|
||||||
if '_offset' in self.attr:
|
if '_offset' in self.attr:
|
||||||
self.cncx_value = cncx[self.value]
|
self.cncx_value = cncx[self.value]
|
||||||
|
|
||||||
@ -719,40 +690,21 @@ class IndexEntry(object): # {{{
|
|||||||
|
|
||||||
'''
|
'''
|
||||||
The index is made up of entries, each of which is represented by an
|
The index is made up of entries, each of which is represented by an
|
||||||
instance of this class. Index entries typically point to offsets int eh
|
instance of this class. Index entries typically point to offsets in the
|
||||||
HTML, specify HTML sizes and point to text strings in the CNCX that are
|
HTML, specify HTML sizes and point to text strings in the CNCX that are
|
||||||
used in the navigation UI.
|
used in the navigation UI.
|
||||||
'''
|
'''
|
||||||
|
|
||||||
TYPES = {
|
|
||||||
# Present in secondary index record
|
|
||||||
0x01 : 'null',
|
|
||||||
0x02 : 'publication_meta',
|
|
||||||
# Present in book type files
|
|
||||||
0x0f : 'chapter',
|
|
||||||
0x6f : 'chapter_with_subchapters',
|
|
||||||
0x1f : 'subchapter',
|
|
||||||
# Present in periodicals
|
|
||||||
0xdf : 'periodical',
|
|
||||||
0xff : 'section',
|
|
||||||
0x3f : 'article',
|
|
||||||
}
|
|
||||||
|
|
||||||
def __init__(self, ident, entry_type, raw, cncx, tagx_entries,
|
def __init__(self, ident, entry_type, raw, cncx, tagx_entries,
|
||||||
control_byte_count):
|
control_byte_count):
|
||||||
self.index = ident
|
self.index = ident
|
||||||
self.raw = raw
|
self.raw = raw
|
||||||
self.tags = []
|
self.tags = []
|
||||||
self.entry_type_raw = entry_type
|
self.entry_type = entry_type
|
||||||
self.byte_size = len(raw)
|
self.byte_size = len(raw)
|
||||||
|
|
||||||
orig_raw = raw
|
orig_raw = raw
|
||||||
|
|
||||||
try:
|
|
||||||
self.entry_type = self.TYPES[entry_type]
|
|
||||||
except KeyError:
|
|
||||||
raise ValueError('Unknown Index Entry type: %s'%bin(entry_type))
|
|
||||||
|
|
||||||
if control_byte_count not in (1, 2):
|
if control_byte_count not in (1, 2):
|
||||||
raise ValueError('Unknown control byte count: %d'%
|
raise ValueError('Unknown control byte count: %d'%
|
||||||
control_byte_count)
|
control_byte_count)
|
||||||
@ -770,7 +722,7 @@ class IndexEntry(object): # {{{
|
|||||||
for tag in expected_tags:
|
for tag in expected_tags:
|
||||||
vals = []
|
vals = []
|
||||||
|
|
||||||
if tag.tag > 64:
|
if tag.tag > 0b1000000: # 0b1000000 = 64
|
||||||
has_tag = flags & 0b1
|
has_tag = flags & 0b1
|
||||||
flags = flags >> 1
|
flags = flags >> 1
|
||||||
if not has_tag: continue
|
if not has_tag: continue
|
||||||
@ -837,10 +789,17 @@ class IndexEntry(object): # {{{
|
|||||||
return tag.value
|
return tag.value
|
||||||
return -1
|
return -1
|
||||||
|
|
||||||
|
@property
|
||||||
|
def pos_fid(self):
|
||||||
|
for tag in self.tags:
|
||||||
|
if tag.attr == 'pos_fid':
|
||||||
|
return tag.value
|
||||||
|
return [0, 0]
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
ans = ['Index Entry(index=%s, entry_type=%s, flags=%s, '
|
ans = ['Index Entry(index=%s, entry_type=%s, flags=%s, '
|
||||||
'length=%d, byte_size=%d)'%(
|
'length=%d, byte_size=%d)'%(
|
||||||
self.index, self.entry_type, bin(self.flags)[2:],
|
self.index, bin(self.entry_type), bin(self.flags)[2:],
|
||||||
len(self.tags), self.byte_size)]
|
len(self.tags), self.byte_size)]
|
||||||
for tag in self.tags:
|
for tag in self.tags:
|
||||||
if tag.value is not None:
|
if tag.value is not None:
|
||||||
@ -1401,7 +1360,7 @@ class MOBIFile(object): # {{{
|
|||||||
self.index_header = self.index_record = None
|
self.index_header = self.index_record = None
|
||||||
self.indexing_record_nums = set()
|
self.indexing_record_nums = set()
|
||||||
pir = self.mobi_header.primary_index_record
|
pir = self.mobi_header.primary_index_record
|
||||||
if pir != 0xffffffff:
|
if pir != NULL_INDEX:
|
||||||
self.index_header = IndexHeader(self.records[pir])
|
self.index_header = IndexHeader(self.records[pir])
|
||||||
self.cncx = CNCX(self.records[
|
self.cncx = CNCX(self.records[
|
||||||
pir+2:pir+2+self.index_header.num_of_cncx_blocks],
|
pir+2:pir+2+self.index_header.num_of_cncx_blocks],
|
||||||
@ -1412,7 +1371,7 @@ class MOBIFile(object): # {{{
|
|||||||
pir+2+self.index_header.num_of_cncx_blocks))
|
pir+2+self.index_header.num_of_cncx_blocks))
|
||||||
self.secondary_index_record = self.secondary_index_header = None
|
self.secondary_index_record = self.secondary_index_header = None
|
||||||
sir = self.mobi_header.secondary_index_record
|
sir = self.mobi_header.secondary_index_record
|
||||||
if sir != 0xffffffff:
|
if sir != NULL_INDEX:
|
||||||
self.secondary_index_header = SecondaryIndexHeader(self.records[sir])
|
self.secondary_index_header = SecondaryIndexHeader(self.records[sir])
|
||||||
self.indexing_record_nums.add(sir)
|
self.indexing_record_nums.add(sir)
|
||||||
self.secondary_index_record = SecondaryIndexRecord(
|
self.secondary_index_record = SecondaryIndexRecord(
|
||||||
@ -1423,7 +1382,7 @@ class MOBIFile(object): # {{{
|
|||||||
ntr = self.mobi_header.number_of_text_records
|
ntr = self.mobi_header.number_of_text_records
|
||||||
fntbr = self.mobi_header.first_non_book_record
|
fntbr = self.mobi_header.first_non_book_record
|
||||||
fii = self.mobi_header.first_image_index
|
fii = self.mobi_header.first_image_index
|
||||||
if fntbr == 0xffffffff:
|
if fntbr == NULL_INDEX:
|
||||||
fntbr = len(self.records)
|
fntbr = len(self.records)
|
||||||
self.text_records = [TextRecord(r, self.records[r],
|
self.text_records = [TextRecord(r, self.records[r],
|
||||||
self.mobi_header.extra_data_flags, decompress) for r in xrange(1,
|
self.mobi_header.extra_data_flags, decompress) for r in xrange(1,
|
||||||
|
@ -31,26 +31,26 @@ class EXTHHeader(object): # {{{
|
|||||||
|
|
||||||
while left > 0:
|
while left > 0:
|
||||||
left -= 1
|
left -= 1
|
||||||
id, size = struct.unpack('>LL', raw[pos:pos + 8])
|
idx, size = struct.unpack('>LL', raw[pos:pos + 8])
|
||||||
content = raw[pos + 8:pos + size]
|
content = raw[pos + 8:pos + size]
|
||||||
pos += size
|
pos += size
|
||||||
if id >= 100 and id < 200:
|
if idx >= 100 and idx < 200:
|
||||||
self.process_metadata(id, content, codec)
|
self.process_metadata(idx, content, codec)
|
||||||
elif id == 203:
|
elif idx == 203:
|
||||||
self.has_fake_cover = bool(struct.unpack('>L', content)[0])
|
self.has_fake_cover = bool(struct.unpack('>L', content)[0])
|
||||||
elif id == 201:
|
elif idx == 201:
|
||||||
co, = struct.unpack('>L', content)
|
co, = struct.unpack('>L', content)
|
||||||
if co < NULL_INDEX:
|
if co < NULL_INDEX:
|
||||||
self.cover_offset = co
|
self.cover_offset = co
|
||||||
elif id == 202:
|
elif idx == 202:
|
||||||
self.thumbnail_offset, = struct.unpack('>L', content)
|
self.thumbnail_offset, = struct.unpack('>L', content)
|
||||||
elif id == 501:
|
elif idx == 501:
|
||||||
# cdetype
|
# cdetype
|
||||||
pass
|
pass
|
||||||
elif id == 502:
|
elif idx == 502:
|
||||||
# last update time
|
# last update time
|
||||||
pass
|
pass
|
||||||
elif id == 503: # Long title
|
elif idx == 503: # Long title
|
||||||
# Amazon seems to regard this as the definitive book title
|
# Amazon seems to regard this as the definitive book title
|
||||||
# rather than the title from the PDB header. In fact when
|
# rather than the title from the PDB header. In fact when
|
||||||
# sending MOBI files through Amazon's email service if the
|
# sending MOBI files through Amazon's email service if the
|
||||||
@ -61,45 +61,45 @@ class EXTHHeader(object): # {{{
|
|||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
#else:
|
#else:
|
||||||
# print 'unknown record', id, repr(content)
|
# print 'unknown record', idx, repr(content)
|
||||||
if title:
|
if title:
|
||||||
self.mi.title = replace_entities(title)
|
self.mi.title = replace_entities(title)
|
||||||
|
|
||||||
def process_metadata(self, id, content, codec):
|
def process_metadata(self, idx, content, codec):
|
||||||
if id == 100:
|
if idx == 100:
|
||||||
if self.mi.authors == [_('Unknown')]:
|
if self.mi.is_null('authors'):
|
||||||
self.mi.authors = []
|
self.mi.authors = []
|
||||||
au = content.decode(codec, 'ignore').strip()
|
au = content.decode(codec, 'ignore').strip()
|
||||||
self.mi.authors.append(au)
|
self.mi.authors.append(au)
|
||||||
if re.match(r'\S+?\s*,\s+\S+', au.strip()):
|
if re.match(r'\S+?\s*,\s+\S+', au.strip()):
|
||||||
self.mi.author_sort = au.strip()
|
self.mi.author_sort = au.strip()
|
||||||
elif id == 101:
|
elif idx == 101:
|
||||||
self.mi.publisher = content.decode(codec, 'ignore').strip()
|
self.mi.publisher = content.decode(codec, 'ignore').strip()
|
||||||
elif id == 103:
|
elif idx == 103:
|
||||||
self.mi.comments = content.decode(codec, 'ignore')
|
self.mi.comments = content.decode(codec, 'ignore')
|
||||||
elif id == 104:
|
elif idx == 104:
|
||||||
self.mi.isbn = content.decode(codec, 'ignore').strip().replace('-', '')
|
self.mi.isbn = content.decode(codec, 'ignore').strip().replace('-', '')
|
||||||
elif id == 105:
|
elif idx == 105:
|
||||||
if not self.mi.tags:
|
if not self.mi.tags:
|
||||||
self.mi.tags = []
|
self.mi.tags = []
|
||||||
self.mi.tags.extend([x.strip() for x in content.decode(codec,
|
self.mi.tags.extend([x.strip() for x in content.decode(codec,
|
||||||
'ignore').split(';')])
|
'ignore').split(';')])
|
||||||
self.mi.tags = list(set(self.mi.tags))
|
self.mi.tags = list(set(self.mi.tags))
|
||||||
elif id == 106:
|
elif idx == 106:
|
||||||
try:
|
try:
|
||||||
self.mi.pubdate = parse_date(content, as_utc=False)
|
self.mi.pubdate = parse_date(content, as_utc=False)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
elif id == 108:
|
elif idx == 108:
|
||||||
pass # Producer
|
self.mi.book_producer = content.decode(codec, 'ignore').strip()
|
||||||
elif id == 113:
|
elif idx == 113:
|
||||||
pass # ASIN or UUID
|
pass # ASIN or UUID
|
||||||
elif id == 116:
|
elif idx == 116:
|
||||||
self.start_offset, = struct.unpack(b'>L', content)
|
self.start_offset, = struct.unpack(b'>L', content)
|
||||||
elif id == 121:
|
elif idx == 121:
|
||||||
self.kf8_header, = struct.unpack(b'>L', content)
|
self.kf8_header, = struct.unpack(b'>L', content)
|
||||||
#else:
|
#else:
|
||||||
# print 'unhandled metadata record', id, repr(content)
|
# print 'unhandled metadata record', idx, repr(content)
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
class BookHeader(object):
|
class BookHeader(object):
|
||||||
|
@ -105,9 +105,11 @@ def get_tag_map(control_byte_count, tags, data, start, end):
|
|||||||
if value != 0:
|
if value != 0:
|
||||||
if value == mask:
|
if value == mask:
|
||||||
if count_set_bits(mask) > 1:
|
if count_set_bits(mask) > 1:
|
||||||
# If all bits of masked value are set and the mask has more than one bit, a variable width value
|
# If all bits of masked value are set and the mask has more
|
||||||
# will follow after the control bytes which defines the length of bytes (NOT the value count!)
|
# than one bit, a variable width value will follow after
|
||||||
# which will contain the corresponding variable width values.
|
# the control bytes which defines the length of bytes (NOT
|
||||||
|
# the value count!) which will contain the corresponding
|
||||||
|
# variable width values.
|
||||||
value, consumed = decint(data[data_start:])
|
value, consumed = decint(data[data_start:])
|
||||||
data_start += consumed
|
data_start += consumed
|
||||||
ptags.append((tag, None, value, values_per_entry))
|
ptags.append((tag, None, value, values_per_entry))
|
||||||
|
@ -151,6 +151,7 @@ class MobiReader(object):
|
|||||||
self.processed_html = self.processed_html.replace('</</', '</')
|
self.processed_html = self.processed_html.replace('</</', '</')
|
||||||
self.processed_html = re.sub(r'</([a-zA-Z]+)<', r'</\1><',
|
self.processed_html = re.sub(r'</([a-zA-Z]+)<', r'</\1><',
|
||||||
self.processed_html)
|
self.processed_html)
|
||||||
|
self.processed_html = self.processed_html.replace(u'\ufeff', '')
|
||||||
# Remove tags of the form <xyz: ...> as they can cause issues further
|
# Remove tags of the form <xyz: ...> as they can cause issues further
|
||||||
# along the pipeline
|
# along the pipeline
|
||||||
self.processed_html = re.sub(r'</{0,1}[a-zA-Z]+:\s+[^>]*>', '',
|
self.processed_html = re.sub(r'</{0,1}[a-zA-Z]+:\s+[^>]*>', '',
|
||||||
|
@ -124,12 +124,18 @@ def rescale_image(data, maxsizeb=IMAGE_MAX_SIZE, dimen=None):
|
|||||||
to JPEG. Ensure the resultant image has a byte size less than
|
to JPEG. Ensure the resultant image has a byte size less than
|
||||||
maxsizeb.
|
maxsizeb.
|
||||||
|
|
||||||
If dimen is not None, generate a thumbnail of width=dimen, height=dimen
|
If dimen is not None, generate a thumbnail of
|
||||||
|
width=dimen, height=dimen or width, height = dimen (depending on the type
|
||||||
|
of dimen)
|
||||||
|
|
||||||
Returns the image as a bytestring
|
Returns the image as a bytestring
|
||||||
'''
|
'''
|
||||||
if dimen is not None:
|
if dimen is not None:
|
||||||
data = thumbnail(data, width=dimen, height=dimen,
|
if hasattr(dimen, '__len__'):
|
||||||
|
width, height = dimen
|
||||||
|
else:
|
||||||
|
width = height = dimen
|
||||||
|
data = thumbnail(data, width=width, height=height,
|
||||||
compression_quality=90)[-1]
|
compression_quality=90)[-1]
|
||||||
else:
|
else:
|
||||||
# Replace transparent pixels with white pixels and convert to JPEG
|
# Replace transparent pixels with white pixels and convert to JPEG
|
||||||
|
@ -352,9 +352,12 @@ def parse_html(data, log=None, decoder=None, preprocessor=None,
|
|||||||
title = etree.SubElement(head, XHTML('title'))
|
title = etree.SubElement(head, XHTML('title'))
|
||||||
title.text = _('Unknown')
|
title.text = _('Unknown')
|
||||||
elif not xpath(data, '/h:html/h:head/h:title'):
|
elif not xpath(data, '/h:html/h:head/h:title'):
|
||||||
log.warn('File %s missing <title/> element' % filename)
|
|
||||||
title = etree.SubElement(head, XHTML('title'))
|
title = etree.SubElement(head, XHTML('title'))
|
||||||
title.text = _('Unknown')
|
title.text = _('Unknown')
|
||||||
|
# Ensure <title> is not empty
|
||||||
|
title = xpath(data, '/h:html/h:head/h:title')[0]
|
||||||
|
if not title.text or not title.text.strip():
|
||||||
|
title.text = _('Unknown')
|
||||||
# Remove any encoding-specifying <meta/> elements
|
# Remove any encoding-specifying <meta/> elements
|
||||||
for meta in META_XP(data):
|
for meta in META_XP(data):
|
||||||
meta.getparent().remove(meta)
|
meta.getparent().remove(meta)
|
||||||
|
@ -242,11 +242,18 @@ class PocketBook900(PocketBook):
|
|||||||
|
|
||||||
class iPhone(Device):
|
class iPhone(Device):
|
||||||
|
|
||||||
name = 'iPad or iPhone/iTouch + Stanza'
|
name = 'iPhone/iTouch'
|
||||||
output_format = 'EPUB'
|
output_format = 'EPUB'
|
||||||
manufacturer = 'Apple'
|
manufacturer = 'Apple'
|
||||||
id = 'iphone'
|
id = 'iphone'
|
||||||
supports_color = True
|
supports_color = True
|
||||||
|
output_profile = 'ipad'
|
||||||
|
|
||||||
|
class iPad(iPhone):
|
||||||
|
|
||||||
|
name = 'iPad'
|
||||||
|
id = 'ipad'
|
||||||
|
output_profile = 'ipad3'
|
||||||
|
|
||||||
class Android(Device):
|
class Android(Device):
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -352,11 +352,9 @@ class TouchscreenFeedTemplate(Template):
|
|||||||
d.append(BR())
|
d.append(BR())
|
||||||
div.append(d)
|
div.append(d)
|
||||||
|
|
||||||
toc = TABLE(CLASS('toc'),width="100%",border="0",cellpadding="3px")
|
|
||||||
for i, article in enumerate(feed.articles):
|
for i, article in enumerate(feed.articles):
|
||||||
if not getattr(article, 'downloaded', False):
|
if not getattr(article, 'downloaded', False):
|
||||||
continue
|
continue
|
||||||
tr = TR()
|
|
||||||
|
|
||||||
div_td = DIV(CLASS('article_summary'),
|
div_td = DIV(CLASS('article_summary'),
|
||||||
A(article.title, CLASS('summary_headline','calibre_rescale_120',
|
A(article.title, CLASS('summary_headline','calibre_rescale_120',
|
||||||
@ -367,11 +365,8 @@ class TouchscreenFeedTemplate(Template):
|
|||||||
if article.summary:
|
if article.summary:
|
||||||
div_td.append(DIV(cutoff(article.text_summary),
|
div_td.append(DIV(cutoff(article.text_summary),
|
||||||
CLASS('summary_text', 'calibre_rescale_100')))
|
CLASS('summary_text', 'calibre_rescale_100')))
|
||||||
tr.append(TD(div_td))
|
div.append(div_td)
|
||||||
toc.append(tr)
|
|
||||||
|
|
||||||
div.append(toc)
|
|
||||||
div.append(BR())
|
|
||||||
div.append(bottom_navbar)
|
div.append(bottom_navbar)
|
||||||
self.root = HTML(head, body)
|
self.root = HTML(head, body)
|
||||||
if self.html_lang:
|
if self.html_lang:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user