From 1a10622b65fd3c434bee0c597f73e12cd34b3989 Mon Sep 17 00:00:00 2001 From: Translators <> Date: Fri, 17 Dec 2010 04:45:53 +0000 Subject: [PATCH 01/62] Launchpad automatic translations update. --- src/calibre/translations/bs.po | 6 +-- src/calibre/translations/ca.po | 4 +- src/calibre/translations/da.po | 6 +-- src/calibre/translations/de.po | 64 ++++++++++++++++++++----------- src/calibre/translations/en_GB.po | 6 +-- src/calibre/translations/eu.po | 4 +- src/calibre/translations/fr.po | 6 +-- src/calibre/translations/gl.po | 33 ++++++++-------- src/calibre/translations/it.po | 6 +-- src/calibre/translations/ja.po | 4 +- src/calibre/translations/ko.po | 6 +-- src/calibre/translations/ml.po | 6 +-- src/calibre/translations/pt_BR.po | 24 +++++++----- src/calibre/translations/ro.po | 6 +-- src/calibre/translations/ru.po | 6 +-- src/calibre/translations/sl.po | 6 +-- src/calibre/translations/sr.po | 6 +-- 17 files changed, 110 insertions(+), 89 deletions(-) diff --git a/src/calibre/translations/bs.po b/src/calibre/translations/bs.po index 96d9aa8e4f..8697b09317 100644 --- a/src/calibre/translations/bs.po +++ b/src/calibre/translations/bs.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-12-10 22:25+0000\n" -"PO-Revision-Date: 2010-12-14 19:28+0000\n" -"Last-Translator: Kenan Dervišević \n" +"PO-Revision-Date: 2010-12-16 22:50+0000\n" +"Last-Translator: Kovid Goyal \n" "Language-Team: Bosnian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-12-15 04:35+0000\n" +"X-Launchpad-Export-Date: 2010-12-17 04:42+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 diff --git a/src/calibre/translations/ca.po b/src/calibre/translations/ca.po index 0aa3925e02..cf18615439 100644 --- a/src/calibre/translations/ca.po +++ b/src/calibre/translations/ca.po @@ -11,13 +11,13 @@ msgstr "" "Project-Id-Version: ca\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:25+0000\n" -"PO-Revision-Date: 2010-12-13 17:37+0000\n" +"PO-Revision-Date: 2010-12-16 23:54+0000\n" "Last-Translator: FerranRius \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-12-14 04:50+0000\n" +"X-Launchpad-Export-Date: 2010-12-17 04:42+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 diff --git a/src/calibre/translations/da.po b/src/calibre/translations/da.po index b3e5174764..30735c0a66 100644 --- a/src/calibre/translations/da.po +++ b/src/calibre/translations/da.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-12-10 22:25+0000\n" -"PO-Revision-Date: 2010-12-11 22:59+0000\n" -"Last-Translator: Glenn \n" +"PO-Revision-Date: 2010-12-17 00:31+0000\n" +"Last-Translator: Kovid Goyal \n" "Language-Team: Danish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-12-13 04:57+0000\n" +"X-Launchpad-Export-Date: 2010-12-17 04:42+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 diff --git a/src/calibre/translations/de.po b/src/calibre/translations/de.po index 58a714522e..7b49dc71b3 100644 --- a/src/calibre/translations/de.po +++ b/src/calibre/translations/de.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: de\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:25+0000\n" -"PO-Revision-Date: 2010-12-11 02:44+0000\n" -"Last-Translator: Kovid Goyal \n" +"PO-Revision-Date: 2010-12-16 12:49+0000\n" +"Last-Translator: Manichean \n" "Language-Team: American English \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-12-12 04:35+0000\n" +"X-Launchpad-Export-Date: 2010-12-17 04:43+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" @@ -2470,23 +2470,23 @@ msgstr "Comic" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazonfr.py:26 msgid "Downloads metadata from amazon.fr" -msgstr "" +msgstr "Herunterladen der Metadaten von amazon.fr" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazonfr.py:43 msgid "Downloads metadata from amazon.com in spanish" -msgstr "" +msgstr "Herunterladen der spanischen Metadaten von amazon.com" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazonfr.py:60 msgid "Downloads metadata from amazon.com in english" -msgstr "" +msgstr "Herunterladen der englischen Metadaten von amazon.com" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazonfr.py:77 msgid "Downloads metadata from amazon.de" -msgstr "" +msgstr "Herunterladen der Metadaten von amazon.de" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazonfr.py:94 msgid "Downloads metadata from amazon.com" -msgstr "" +msgstr "Herunterladen der Metadaten von amazon.com" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazonfr.py:474 msgid "" @@ -2500,6 +2500,14 @@ msgid "" " All & english & french & german & spanish\n" " " msgstr "" +" %prog [Optionen]\n" +"\n" +" Lädt Metadaten von Amazon. Sie müssen einen Titel, Author,\n" +" ISBN, Herausgeber oder Stichwort angeben. Es werden maximal\n" +" 10 Treffer geladen, suchen Sie so spezifisch wie möglich.\n" +" Sie können die Sprache für die Metadaten auswählen:\n" +" Alle & Englisch & Französisch & Deutsch & Spanisch\n" +" " #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/archive.py:41 msgid "" @@ -2832,33 +2840,35 @@ msgstr "Lädt Reihe/Etiketten/Bewertung von librarything.com" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:25 msgid "Downloads metadata from Fictionwise" -msgstr "" +msgstr "Herunterladen der Metadaten von Fictionwise" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:90 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:108 msgid "Query: %s" -msgstr "" +msgstr "Abfrage: %s" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:100 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:285 msgid "Fictionwise timed out. Try again later." -msgstr "" +msgstr "Timeout bei Fictionwise. Bitte später nochmal versuchen." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:101 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:286 msgid "Fictionwise encountered an error." -msgstr "" +msgstr "Bei Fictionwise ist ein Fehler aufgetreten." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:219 msgid "" "SUMMARY:\n" " %s" msgstr "" +"INHALTSANGABE:\n" +" %s" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:316 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:333 msgid "Failed to get all details for an entry" -msgstr "" +msgstr "Konnte für einen Eintrag nicht alle Details holen" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:354 msgid "" @@ -2871,41 +2881,49 @@ msgid "" " so you should make your query as specific as possible.\n" " " msgstr "" +" %prog [Optionen]\n" +"\n" +" Holt Metadaten von Fictionwise. Sie müssen einen Titel, Autor oder " +"Stichwort\n" +" angeben. Angabe einer ISBN ist nicht möglich. Maximal werden 20 " +"Treffer geholt,\n" +" suchen Sie also möglichst spezifisch.\n" +" " #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:362 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:363 msgid "Book title" -msgstr "" +msgstr "Titel" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:363 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:364 msgid "Book author(s)" -msgstr "" +msgstr "Autor(en)" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:364 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:365 msgid "Book publisher" -msgstr "" +msgstr "Herausgeber" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:365 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:367 msgid "Keywords" -msgstr "" +msgstr "Schlüsselworte" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:367 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:373 msgid "Maximum number of results to fetch" -msgstr "" +msgstr "Maximale Anzahl an zu holenden Ergebnissen" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:369 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:375 msgid "Be more verbose about errors" -msgstr "" +msgstr "Fehler ausführlicher berichten" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:383 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:390 msgid "No result found for this search!" -msgstr "" +msgstr "Keine Ergebnisse für diese Suche gefunden!" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:107 msgid "" @@ -2983,11 +3001,11 @@ msgstr "Timeout von Nicebooks. Bitte versuchen Sie es später nochmal." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:119 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:243 msgid "Nicebooks encountered an error." -msgstr "" +msgstr "Bei Nicebooks ist ein Fehler aufgetreten." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:323 msgid "ISBN: %s not found." -msgstr "" +msgstr "ISBN: %s nicht gefunden." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:324 msgid "An errror occured with Nicebooks cover fetcher" @@ -3007,7 +3025,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:366 msgid "Book ISBN" -msgstr "" +msgstr "ISBN" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:369 msgid "Covers: 1-Check/ 2-Download" diff --git a/src/calibre/translations/en_GB.po b/src/calibre/translations/en_GB.po index aedf656daa..47196d454c 100644 --- a/src/calibre/translations/en_GB.po +++ b/src/calibre/translations/en_GB.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-12-10 22:25+0000\n" -"PO-Revision-Date: 2010-12-12 17:20+0000\n" -"Last-Translator: Vladimir Oka \n" +"PO-Revision-Date: 2010-12-16 23:27+0000\n" +"Last-Translator: Kovid Goyal \n" "Language-Team: English (United Kingdom) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-12-13 04:58+0000\n" +"X-Launchpad-Export-Date: 2010-12-17 04:45+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 diff --git a/src/calibre/translations/eu.po b/src/calibre/translations/eu.po index e8fcd22cab..199b5f9864 100644 --- a/src/calibre/translations/eu.po +++ b/src/calibre/translations/eu.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-12-10 22:25+0000\n" -"PO-Revision-Date: 2010-12-15 17:49+0000\n" +"PO-Revision-Date: 2010-12-16 23:28+0000\n" "Last-Translator: gorkaazk \n" "Language-Team: Basque \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-12-16 04:32+0000\n" +"X-Launchpad-Export-Date: 2010-12-17 04:42+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 diff --git a/src/calibre/translations/fr.po b/src/calibre/translations/fr.po index f16427ba9e..0bfeecba01 100644 --- a/src/calibre/translations/fr.po +++ b/src/calibre/translations/fr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre 0.4.22\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:25+0000\n" -"PO-Revision-Date: 2010-12-16 02:50+0000\n" -"Last-Translator: sengian \n" +"PO-Revision-Date: 2010-12-16 23:44+0000\n" +"Last-Translator: Kovid Goyal \n" "Language-Team: Français \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-12-16 04:33+0000\n" +"X-Launchpad-Export-Date: 2010-12-17 04:43+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Bookmarks: 1177,1104,-1,-1,-1,-1,-1,-1,-1,-1\n" "Generated-By: pygettext.py 1.5\n" diff --git a/src/calibre/translations/gl.po b/src/calibre/translations/gl.po index 989337deb4..926372905b 100644 --- a/src/calibre/translations/gl.po +++ b/src/calibre/translations/gl.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-12-10 22:25+0000\n" -"PO-Revision-Date: 2010-12-15 12:01+0000\n" +"PO-Revision-Date: 2010-12-17 00:16+0000\n" "Last-Translator: Miguel Anxo Bouzada \n" "Language-Team: dev@gl.openoffice.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-12-16 04:33+0000\n" +"X-Launchpad-Export-Date: 2010-12-17 04:43+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: gl\n" @@ -406,8 +406,8 @@ msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" msgstr "" -"Configura a compartición de libros por correo electrónico. Pódese usar para " -"enviar automaticamente as noticias descargadas aos seus dispositivos" +"Configura a compartición de libros por correo. Pódese usar para enviar " +"automaticamente as noticias descargadas aos seus dispositivos" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 msgid "Sharing over the net" @@ -8751,7 +8751,7 @@ msgstr "Código fonte das receitas (pytom)" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:145 msgid "Email %s to %s" -msgstr "Enviar por correo electrónico %s a %s" +msgstr "Enviar por correo %s a %s" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:187 msgid "News:" @@ -9932,13 +9932,13 @@ msgid "" "automatically sent for downloaded news to all email addresses that have Auto-" "send checked." msgstr "" -"O Calibre pode enviarlle os libros por correo-e. Enviaránselle correos " +"O Calibre pode enviarlle os libros por correo. Enviaránselle correos " "automaticamente coas novas descargadas que teñen marcada a opción Enviar " "automaticamente." #: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:67 msgid "Add an email address to which to send books" -msgstr "Engadir un enderezo de correo electrónico ao que enviar os libros" +msgstr "Engadir un enderezo de correo ao que enviar os libros" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:68 msgid "&Add email" @@ -9958,7 +9958,7 @@ msgstr "Enviar automaticamente" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 msgid "Email" -msgstr "Correo electrónico" +msgstr "Correo" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:29 msgid "Formats to email. The first matching format will be sent." @@ -11668,15 +11668,14 @@ msgid "" "button below. You will also have to register your gmail address in your " "Amazon account." msgstr "" -"

Calibre pode enviar libros automaticamente por correo electrónico ao seu " -"Kindle. Debe configurar o envío por correo electrónico. A forma más doada e " -"facerse cunha conta gratuíta de Gmail e " -"premer o botón Usar gmail. Tamén deberá rexistrar o enderezo de gmail na súa " -"conta de Amazon." +"

Calibre pode enviar libros automaticamente por correo ao seu Kindle. Debe " +"configurar o envío por correo. A forma más doada e facerse cunha conta gratuíta de Gmail e premer o botón Usar " +"gmail. Tamén deberá rexistrar o enderezo de gmail na súa conta de Amazon." #: /home/kovid/work/calibre/src/calibre/gui2/wizard/kindle_ui.py:50 msgid "&Kindle email:" -msgstr "Correo electrónico do &Kindle:" +msgstr "Correo do &Kindle:" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:57 msgid "Choose your &language:" @@ -11765,7 +11764,7 @@ msgstr "Configuración errada" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:197 msgid "You must set the From email address" -msgstr "Debe estabelecer o enderezo de correo-e remitente" +msgstr "Debe estabelecer o enderezo de correo remitente" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:204 msgid "You must set the username and password for the mail server." @@ -11781,8 +11780,8 @@ msgid "" "

This is what will be present in the From: field of emails sent by " "calibre.
Set it to your email address" msgstr "" -"

Isto é o que se mostrará no campo De: dos correos electrónicos enviados " -"por Calibre.
Poña o seu enderezo de correo-e." +"

Isto é o que se mostrará no campo De: dos correos enviados por " +"Calibre.
Poña o seu enderezo de correo." #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:126 msgid "" diff --git a/src/calibre/translations/it.po b/src/calibre/translations/it.po index 4dc9779d97..c749e0a652 100644 --- a/src/calibre/translations/it.po +++ b/src/calibre/translations/it.po @@ -9,13 +9,13 @@ msgstr "" "Project-Id-Version: calibre_calibre-it\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:25+0000\n" -"PO-Revision-Date: 2010-12-12 08:58+0000\n" -"Last-Translator: MeltingShell \n" +"PO-Revision-Date: 2010-12-16 23:08+0000\n" +"Last-Translator: Kovid Goyal \n" "Language-Team: italiano\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-12-13 04:57+0000\n" +"X-Launchpad-Export-Date: 2010-12-17 04:43+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Bookmarks: -1,-1,-1,-1,-1,1105,-1,1312,-1,-1\n" "Generated-By: pygettext.py 1.5\n" diff --git a/src/calibre/translations/ja.po b/src/calibre/translations/ja.po index a00a5e0be5..339e847ee8 100644 --- a/src/calibre/translations/ja.po +++ b/src/calibre/translations/ja.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-12-10 22:25+0000\n" -"PO-Revision-Date: 2010-12-12 12:28+0000\n" +"PO-Revision-Date: 2010-12-16 23:11+0000\n" "Last-Translator: Hiroshi Miura \n" "Language-Team: Japanese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-12-13 04:58+0000\n" +"X-Launchpad-Export-Date: 2010-12-17 04:44+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 diff --git a/src/calibre/translations/ko.po b/src/calibre/translations/ko.po index c0fe0e9c52..26da233882 100644 --- a/src/calibre/translations/ko.po +++ b/src/calibre/translations/ko.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-12-10 22:25+0000\n" -"PO-Revision-Date: 2010-12-11 02:28+0000\n" -"Last-Translator: Namsik Chu \n" +"PO-Revision-Date: 2010-12-17 01:06+0000\n" +"Last-Translator: Kovid Goyal \n" "Language-Team: Korean \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-12-12 04:37+0000\n" +"X-Launchpad-Export-Date: 2010-12-17 04:44+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 diff --git a/src/calibre/translations/ml.po b/src/calibre/translations/ml.po index 65613a9067..9fd18784eb 100644 --- a/src/calibre/translations/ml.po +++ b/src/calibre/translations/ml.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-12-10 22:25+0000\n" -"PO-Revision-Date: 2010-12-16 03:36+0000\n" -"Last-Translator: geordee \n" +"PO-Revision-Date: 2010-12-16 23:06+0000\n" +"Last-Translator: Kovid Goyal \n" "Language-Team: Malayalam \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-12-16 04:33+0000\n" +"X-Launchpad-Export-Date: 2010-12-17 04:44+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 diff --git a/src/calibre/translations/pt_BR.po b/src/calibre/translations/pt_BR.po index 9b209ace57..f7dbf3e250 100644 --- a/src/calibre/translations/pt_BR.po +++ b/src/calibre/translations/pt_BR.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-12-10 22:25+0000\n" -"PO-Revision-Date: 2010-12-05 04:33+0000\n" -"Last-Translator: Wespa Digital \n" +"PO-Revision-Date: 2010-12-16 16:26+0000\n" +"Last-Translator: marco cunha \n" "Language-Team: American English \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-12-11 04:44+0000\n" +"X-Launchpad-Export-Date: 2010-12-17 04:45+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -387,7 +387,7 @@ msgstr "Configuração dos Metadados" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 msgid "Change metadata fields before saving/sending" -msgstr "" +msgstr "Alterar campos de metadados antes de salvar / enviar" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 msgid "Sharing books by email" @@ -582,6 +582,7 @@ msgstr "Destinado ao iPad e dispositivos similares com resolução de 768x1024" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:437 msgid "Intended for generic tablet devices, does no resizing of images" msgstr "" +"Pretendido para dispositivos Tablets, não faz o redimensionamento de imagens" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:464 msgid "This profile is intended for the Kobo Reader." @@ -609,11 +610,11 @@ msgstr "Este perfil é destinado para o Kindle DX da Amazon." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:686 msgid "This profile is intended for the B&N Nook Color." -msgstr "" +msgstr "Este perfil é destinado para a B & N Nook Color." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:697 msgid "This profile is intended for the Sanda Bambook." -msgstr "" +msgstr "Este perfil é destinado para o Sanda Bambook" #: /home/kovid/work/calibre/src/calibre/customize/ui.py:34 msgid "Installed plugins" @@ -719,6 +720,9 @@ msgid "" "Cannot copy books directly from iDevice. Drag from iTunes Library to " "desktop, then add to calibre's Library window." msgstr "" +"Não é possível copiar livros diretamente do iDevice. Arraste a partir do " +"iTunes Library para o desktop, em seguida, adicione para a biblioteca " +"calibre." #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:260 #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:263 @@ -812,7 +816,7 @@ msgstr "Comunica-se com o leitor Cybook Gen 3 / Opus." #: /home/kovid/work/calibre/src/calibre/devices/cybook/driver.py:64 msgid "Communicate with the Cybook Orizon eBook reader." -msgstr "" +msgstr "Comunique-se com o leitor eBook Cybook Orizon." #: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:24 msgid "Communicate with the EB600 eBook reader." @@ -828,7 +832,7 @@ msgstr "Comunica-se com o leitor PocketBook 301" #: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:233 msgid "Communicate with the PocketBook 602 reader." -msgstr "" +msgstr "Comunique-se com o leitor PocketBook 602." #: /home/kovid/work/calibre/src/calibre/devices/edge/driver.py:17 msgid "Entourage Edge" @@ -917,7 +921,7 @@ msgstr "John Schember" #: /home/kovid/work/calibre/src/calibre/devices/interface.py:44 msgid "Cannot get files from this device" -msgstr "" +msgstr "Não é possível obter arquivos a partir deste dispositivo" #: /home/kovid/work/calibre/src/calibre/devices/irexdr/driver.py:16 msgid "Communicate with the IRex Digital Reader 1000 eBook reader." @@ -941,7 +945,7 @@ msgstr "Comunicar com o leitor MiBuk Wolder." #: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:116 msgid "Communicate with the JetBook Mini reader." -msgstr "" +msgstr "Comunique-se com o leitor Mini jetBook." #: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:43 msgid "Communicate with the Kindle eBook reader." diff --git a/src/calibre/translations/ro.po b/src/calibre/translations/ro.po index be60804288..2ac6e7dddd 100644 --- a/src/calibre/translations/ro.po +++ b/src/calibre/translations/ro.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-12-10 22:25+0000\n" -"PO-Revision-Date: 2010-12-12 15:48+0000\n" -"Last-Translator: Mircea Dochia \n" +"PO-Revision-Date: 2010-12-17 00:09+0000\n" +"Last-Translator: Kovid Goyal \n" "Language-Team: Romanian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-12-13 04:58+0000\n" +"X-Launchpad-Export-Date: 2010-12-17 04:44+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 diff --git a/src/calibre/translations/ru.po b/src/calibre/translations/ru.po index 6925ab4c23..f751b04c72 100644 --- a/src/calibre/translations/ru.po +++ b/src/calibre/translations/ru.po @@ -7,13 +7,13 @@ msgstr "" "Project-Id-Version: calibre 0.4.55\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:25+0000\n" -"PO-Revision-Date: 2010-12-14 16:19+0000\n" -"Last-Translator: Konstantin \n" +"PO-Revision-Date: 2010-12-16 22:56+0000\n" +"Last-Translator: Kovid Goyal \n" "Language-Team: American English \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-12-15 04:36+0000\n" +"X-Launchpad-Export-Date: 2010-12-17 04:44+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Country: RUSSIAN FEDERATION\n" "X-Poedit-Language: Russian\n" diff --git a/src/calibre/translations/sl.po b/src/calibre/translations/sl.po index 93283e2a4e..b8f9379684 100644 --- a/src/calibre/translations/sl.po +++ b/src/calibre/translations/sl.po @@ -7,13 +7,13 @@ msgstr "" "Project-Id-Version: calibre 0.4.17\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:25+0000\n" -"PO-Revision-Date: 2010-12-14 10:17+0000\n" -"Last-Translator: Stane Accetto \n" +"PO-Revision-Date: 2010-12-16 22:54+0000\n" +"Last-Translator: Kovid Goyal \n" "Language-Team: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-12-15 04:37+0000\n" +"X-Launchpad-Export-Date: 2010-12-17 04:45+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" diff --git a/src/calibre/translations/sr.po b/src/calibre/translations/sr.po index d4dca1eca2..0c646212dc 100644 --- a/src/calibre/translations/sr.po +++ b/src/calibre/translations/sr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-12-10 22:25+0000\n" -"PO-Revision-Date: 2010-12-13 11:44+0000\n" -"Last-Translator: Vladimir Oka \n" +"PO-Revision-Date: 2010-12-16 23:13+0000\n" +"Last-Translator: Kovid Goyal \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-12-14 04:51+0000\n" +"X-Launchpad-Export-Date: 2010-12-17 04:45+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 From 201e4ed09b5e0808de76c32c34635a2a2784476e Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 17 Dec 2010 09:44:51 +0000 Subject: [PATCH 02/62] Make title_sort editable in metadata_single --- src/calibre/gui2/dialogs/metadata_single.py | 61 ++++++++++++++--- src/calibre/gui2/dialogs/metadata_single.ui | 76 +++++++++++++++------ src/calibre/library/database2.py | 14 ++++ src/calibre/library/schema_upgrades.py | 10 +++ 4 files changed, 131 insertions(+), 30 deletions(-) diff --git a/src/calibre/gui2/dialogs/metadata_single.py b/src/calibre/gui2/dialogs/metadata_single.py index 4a9bb784c8..7c6da7c1f9 100644 --- a/src/calibre/gui2/dialogs/metadata_single.py +++ b/src/calibre/gui2/dialogs/metadata_single.py @@ -23,7 +23,7 @@ from calibre.gui2.dialogs.tag_editor import TagEditor from calibre.gui2.widgets import ProgressIndicator from calibre.ebooks import BOOK_EXTENSIONS from calibre.ebooks.metadata import string_to_authors, \ - authors_to_string, check_isbn + authors_to_string, check_isbn, title_sort from calibre.ebooks.metadata.covers import download_cover from calibre.ebooks.metadata.meta import get_metadata from calibre.ebooks.metadata import MetaInformation @@ -444,13 +444,24 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): self.cover_fetcher = None self.bc_box.layout().setAlignment(self.cover, Qt.AlignCenter|Qt.AlignHCenter) base = unicode(self.author_sort.toolTip()) - self.ok_aus_tooltip = '

' + textwrap.fill(base+'

'+ + ok_tooltip = '

' + textwrap.fill(base+'

'+ _(' The green color indicates that the current ' 'author sort matches the current author')) - self.bad_aus_tooltip = '

'+textwrap.fill(base + '

'+ + bad_tooltip = '

'+textwrap.fill(base + '

'+ _(' The red color indicates that the current ' - 'author sort does not match the current author')) + 'author sort does not match the current author. ' + 'No action is required if this is what you want.')) + self.aus_tooltips = (ok_tooltip, bad_tooltip) + base = unicode(self.title_sort.toolTip()) + ok_tooltip = '

' + textwrap.fill(base+'

'+ + _(' The green color indicates that the current ' + 'title sort matches the current title')) + bad_tooltip = '

'+textwrap.fill(base + '

'+ + _(' The red color warns that the current ' + 'title sort does not match the current title. ' + 'No action is required if this is what you want.')) + self.ts_tooltips = (ok_tooltip, bad_tooltip) self.row_delta = 0 if prev: self.prev_button = QPushButton(QIcon(I('back.png')), _('Previous'), @@ -506,7 +517,13 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): self.remove_unused_series) QObject.connect(self.auto_author_sort, SIGNAL('clicked()'), self.deduce_author_sort) + QObject.connect(self.auto_title_sort, SIGNAL('clicked()'), + self.deduce_title_sort) self.trim_cover_button.clicked.connect(self.trim_cover) + self.connect(self.title_sort, SIGNAL('textChanged(const QString&)'), + self.title_sort_box_changed) + self.connect(self.title, SIGNAL('textChanged(const QString&)'), + self.title_box_changed) self.connect(self.author_sort, SIGNAL('textChanged(const QString&)'), self.author_sort_box_changed) self.connect(self.authors, SIGNAL('editTextChanged(const QString&)'), @@ -523,6 +540,7 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): self.title.setText(db.title(row)) + self.title_sort.setText(db.title_sort(row)) isbn = db.isbn(self.id, index_is_id=True) if not isbn: isbn = '' @@ -610,27 +628,40 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): for c in range(2, len(ans[i].widgets), 2): w.setTabOrder(ans[i].widgets[c-1], ans[i].widgets[c+1]) + def title_box_changed(self, txt): + ts = unicode(txt) + ts = title_sort(ts) + self.mark_box_as_ok(control = self.title_sort, tt=self.ts_tooltips, + normal=(unicode(self.title_sort.text()) == ts)) + + def title_sort_box_changed(self, txt): + ts = unicode(txt) + self.mark_box_as_ok(control = self.title_sort, tt=self.ts_tooltips, + normal=(title_sort(unicode(self.title.text())) == ts)) + def authors_box_changed(self, txt): aus = unicode(txt) aus = re.sub(r'\s+et al\.$', '', aus) aus = self.db.author_sort_from_authors(string_to_authors(aus)) - self.mark_author_sort(normal=(unicode(self.author_sort.text()) == aus)) + self.mark_box_as_ok(control = self.author_sort, tt=self.aus_tooltips, + normal=(unicode(self.author_sort.text()) == aus)) def author_sort_box_changed(self, txt): au = unicode(self.authors.text()) au = re.sub(r'\s+et al\.$', '', au) au = self.db.author_sort_from_authors(string_to_authors(au)) - self.mark_author_sort(normal=(au == txt)) + self.mark_box_as_ok(control = self.author_sort, tt=self.aus_tooltips, + normal=(au == txt)) - def mark_author_sort(self, normal=True): + def mark_box_as_ok(self, control, tt, normal=True): if normal: col = 'rgb(0, 255, 0, 20%)' else: col = 'rgb(255, 0, 0, 20%)' - self.author_sort.setStyleSheet('QLineEdit { color: black; ' - 'background-color: %s; }'%col) - tt = self.ok_aus_tooltip if normal else self.bad_aus_tooltip - self.author_sort.setToolTip(tt) + control.setStyleSheet('QLineEdit { color: black; ' + 'background-color: %s; }'%col) + tt = tt[0] if normal else tt[1] + control.setToolTip(tt) def validate_isbn(self, isbn): isbn = unicode(isbn).strip() @@ -652,6 +683,10 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): authors = string_to_authors(au) self.author_sort.setText(self.db.author_sort_from_authors(authors)) + def deduce_title_sort(self): + ts = unicode(self.title.text()) + self.title_sort.setText(title_sort(ts)) + def swap_title_author(self): title = self.title.text() self.title.setText(self.authors.text()) @@ -838,6 +873,10 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): title = unicode(self.title.text()).strip() if title != self.original_title: self.db.set_title(self.id, title, notify=False) + # This must be after setting the title because of the DB update trigger + ts = unicode(self.title_sort.text()).strip() + if ts: + self.db.set_title_sort(self.id, ts, notify=False, commit=False) au = unicode(self.authors.text()).strip() if au and au != self.original_author: self.db.set_authors(self.id, string_to_authors(au), notify=False) diff --git a/src/calibre/gui2/dialogs/metadata_single.ui b/src/calibre/gui2/dialogs/metadata_single.ui index 2bd85e30bb..02e6eb01e2 100644 --- a/src/calibre/gui2/dialogs/metadata_single.ui +++ b/src/calibre/gui2/dialogs/metadata_single.ui @@ -100,7 +100,7 @@ - + Swap the author and title @@ -121,6 +121,41 @@ + + + Title sort: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + title_sort + + + + + + + Specify how this book should be sorted when by title. For example, The Exorcist might be sorted as Exorcist, The. + + + + + + + Automatically create the title sort entry based on the current title entry. +Using this button to create title sort will change title sort from red to green. + + + ... + + + + :/images/auto_author_sort.png:/images/auto_author_sort.png + + + + &Author(s): @@ -133,7 +168,7 @@ - + Author S&ort: @@ -146,7 +181,7 @@ - + @@ -173,7 +208,7 @@ Using this button to create author sort will change author sort from red to gree - + &Rating: @@ -186,7 +221,7 @@ Using this button to create author sort will change author sort from red to gree - + Rating of this book. 0-5 stars @@ -205,7 +240,7 @@ Using this button to create author sort will change author sort from red to gree - + &Publisher: @@ -218,7 +253,7 @@ Using this button to create author sort will change author sort from red to gree - + Ta&gs: @@ -231,7 +266,7 @@ Using this button to create author sort will change author sort from red to gree - + @@ -256,7 +291,7 @@ Using this button to create author sort will change author sort from red to gree - + &Series: @@ -272,7 +307,7 @@ Using this button to create author sort will change author sort from red to gree - + 5 @@ -309,7 +344,7 @@ Using this button to create author sort will change author sort from red to gree - + IS&BN: @@ -322,10 +357,10 @@ Using this button to create author sort will change author sort from red to gree - + - + Publishe&d: @@ -338,14 +373,14 @@ Using this button to create author sort will change author sort from red to gree - + true - + false @@ -358,7 +393,7 @@ Using this button to create author sort will change author sort from red to gree - + MMM yyyy @@ -368,14 +403,14 @@ Using this button to create author sort will change author sort from red to gree - + true - + dd MMM yyyy @@ -385,7 +420,7 @@ Using this button to create author sort will change author sort from red to gree - + &Date: @@ -744,8 +779,11 @@ Using this button to create author sort will change author sort from red to gree title + title_sort + auto_title_sort swap_button authors + swap_button author_sort auto_author_sort rating diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 23375995ae..b09c2bfc7c 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -1565,6 +1565,20 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): if notify: self.notify('metadata', [id]) + def set_title_sort(self, id, title_sort, notify=True, commit=True): + if not title_sort: + return False + if isbytestring(title_sort): + title_sort = title_sort.decode(preferred_encoding, 'replace') + self.conn.execute('UPDATE books SET sort=? WHERE id=?', (title_sort, id)) + self.data.set(id, self.FIELD_MAP['sort'], title_sort, row_is_id=True) + self.dirtied([id], commit=False) + if commit: + self.conn.commit() + if notify: + self.notify('metadata', [id]) + return True + def _set_title(self, id, title): if not title: return False diff --git a/src/calibre/library/schema_upgrades.py b/src/calibre/library/schema_upgrades.py index 5e581e3f86..4bf7e0ac6a 100644 --- a/src/calibre/library/schema_upgrades.py +++ b/src/calibre/library/schema_upgrades.py @@ -429,3 +429,13 @@ class SchemaUpgrade(object): 'Remove commas from tags' self.conn.execute("UPDATE tags SET name=REPLACE(name, ',', ';')") + def upgrade_version_16(self): + self.conn.executescript(''' + DROP TRIGGER IF EXISTS books_update_trg; + CREATE TRIGGER books_update_trg + AFTER UPDATE ON books + BEGIN + UPDATE books SET sort=title_sort(NEW.title) + WHERE id=NEW.id AND OLD.title <> NEW.title; + END; + ''') From 95fcf6d3affb9d8057bfb248cf72b521232e13bb Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 17 Dec 2010 10:10:43 +0000 Subject: [PATCH 03/62] Enhancement #7920 (Tab for custom MetaData) -- added a tweak to switch to single-column mode --- resources/default_tweaks.py | 6 ++++++ src/calibre/gui2/dialogs/metadata_single.py | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/resources/default_tweaks.py b/resources/default_tweaks.py index 081112444a..cd746ccdaa 100644 --- a/resources/default_tweaks.py +++ b/resources/default_tweaks.py @@ -235,3 +235,9 @@ doubleclick_on_library_view = 'open_viewer' # Example: locale_for_sorting = 'fr' -- sort using French rules. # Example: locale_for_sorting = 'nb' -- sort using Norwegian rules. locale_for_sorting = '' + + +# Set whether to use one or two columns for custom metadata when editing +# metadata one book at a time. If True, then the fields are laid out using two +# columns. If False, one column is used. +metadata_single_use_2_cols_for_custom_fields = True \ No newline at end of file diff --git a/src/calibre/gui2/dialogs/metadata_single.py b/src/calibre/gui2/dialogs/metadata_single.py index 7c6da7c1f9..99fe2017dd 100644 --- a/src/calibre/gui2/dialogs/metadata_single.py +++ b/src/calibre/gui2/dialogs/metadata_single.py @@ -616,8 +616,8 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): w = self.central_widget.widget(1) layout = w.layout() self.custom_column_widgets, self.__cc_spacers = \ - populate_metadata_page(layout, self.db, self.id, - parent=w, bulk=False, two_column=True) + populate_metadata_page(layout, self.db, self.id, parent=w, bulk=False, + two_column=tweaks['metadata_single_use_2_cols_for_custom_fields']) self.__custom_col_layouts = [layout] ans = self.custom_column_widgets for i in range(len(ans)-1): From b12e505f5c24b27dc24ccdd87c383ed781be86e8 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 17 Dec 2010 11:50:50 +0000 Subject: [PATCH 04/62] Enhancement #7892: New tweak options for series number increment --- resources/default_tweaks.py | 15 ++++++- src/calibre/gui2/custom_column_widgets.py | 8 ++-- src/calibre/gui2/dialogs/metadata_single.py | 2 +- src/calibre/gui2/library/models.py | 2 +- src/calibre/library/cli.py | 2 +- src/calibre/library/custom_columns.py | 16 +++---- src/calibre/library/database2.py | 48 ++++++++++++++++----- 7 files changed, 65 insertions(+), 28 deletions(-) diff --git a/resources/default_tweaks.py b/resources/default_tweaks.py index cd746ccdaa..750af9efa7 100644 --- a/resources/default_tweaks.py +++ b/resources/default_tweaks.py @@ -12,13 +12,24 @@ defaults. # The algorithm used to assign a new book in an existing series a series number. +# New series numbers assigned using this tweak are always integer values, except +# if a constant non-integer is specified. # Possible values are: -# next - Next available number +# next - First available integer larger than the largest existing number +# first_free - First available integer larger than 0 +# next_free - First available integer larger than the smallest existing number +# last_free - First available integer smaller than the largest existing number +# Return largest existing + 1 if no free number is found # const - Assign the number 1 always +# a number - Assign that number always. The number is not in quotes. Note that +# 0.0 can be used here. +# Examples: +# series_index_auto_increment = 'next' +# series_index_auto_increment = 'next_free' +# series_index_auto_increment = 16.5 series_index_auto_increment = 'next' - # The algorithm used to copy author to author_sort # Possible values are: # invert: use "fn ln" -> "ln, fn" (the original algorithm) diff --git a/src/calibre/gui2/custom_column_widgets.py b/src/calibre/gui2/custom_column_widgets.py index 5ab8bb6940..6e4fc0a0ac 100644 --- a/src/calibre/gui2/custom_column_widgets.py +++ b/src/calibre/gui2/custom_column_widgets.py @@ -303,7 +303,7 @@ class Series(Base): if val == '': val = s_index = None elif s_index == 0.0: - if tweaks['series_index_auto_increment'] == 'next': + if tweaks['series_index_auto_increment'] != 'const': s_index = self.db.get_next_cc_series_num_for(val, num=self.col_id) else: @@ -572,7 +572,6 @@ class BulkSeries(BulkBase): val = None if clear else self.normalize_ui_val(val) if clear or val != '': extras = [] - next_index = self.db.get_next_cc_series_num_for(val, num=self.col_id) for book_id in book_ids: if clear: extras.append(None) @@ -581,9 +580,8 @@ class BulkSeries(BulkBase): if force_start: s_index = at_value at_value += 1 - elif tweaks['series_index_auto_increment'] == 'next': - s_index = next_index - next_index += 1 + elif tweaks['series_index_auto_increment'] != 'const': + s_index = self.db.get_next_cc_series_num_for(val, num=self.col_id) else: s_index = 1.0 else: diff --git a/src/calibre/gui2/dialogs/metadata_single.py b/src/calibre/gui2/dialogs/metadata_single.py index 99fe2017dd..133f449550 100644 --- a/src/calibre/gui2/dialogs/metadata_single.py +++ b/src/calibre/gui2/dialogs/metadata_single.py @@ -839,7 +839,7 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): series = unicode(self.series.text()).strip() if series and series != self.original_series_name: ns = 1 - if tweaks['series_index_auto_increment'] == 'next': + if tweaks['series_index_auto_increment'] != 'const': ns = self.db.get_next_series_num_for(series) self.series_index.setValue(ns) self.original_series_name = series diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index e0d5c64961..661f21e53d 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -772,7 +772,7 @@ class BooksModel(QAbstractTableModel): # {{{ self.db.set_series_index(id, float(match.group(1))) val = pat.sub('', val).strip() elif val: - if tweaks['series_index_auto_increment'] == 'next': + if tweaks['series_index_auto_increment'] != 'const': ni = self.db.get_next_series_num_for(val) if ni != 1: self.db.set_series_index(id, ni) diff --git a/src/calibre/library/cli.py b/src/calibre/library/cli.py index 01e8ad449b..c98b3be4d3 100644 --- a/src/calibre/library/cli.py +++ b/src/calibre/library/cli.py @@ -707,7 +707,7 @@ def parse_series_string(db, label, value): val = pat.sub('', val).strip() s_index = float(match.group(1)) elif val: - if tweaks['series_index_auto_increment'] == 'next': + if tweaks['series_index_auto_increment'] != 'const': s_index = db.get_next_cc_series_num_for(val, label=label) else: s_index = 1.0 diff --git a/src/calibre/library/custom_columns.py b/src/calibre/library/custom_columns.py index f544a9bf7e..e95ace2cd4 100644 --- a/src/calibre/library/custom_columns.py +++ b/src/calibre/library/custom_columns.py @@ -8,12 +8,12 @@ __docformat__ = 'restructuredtext en' import json, re from functools import partial -from math import floor from calibre import prints from calibre.constants import preferred_encoding from calibre.library.field_metadata import FieldMetadata from calibre.utils.date import parse_date +from calibre.utils.config import tweaks class CustomColumns(object): @@ -261,15 +261,15 @@ class CustomColumns(object): series_id = self.conn.get('SELECT id from %s WHERE value=?'%table, (series,), all=False) if series_id is None: + if isinstance(tweaks['series_index_auto_increment'], (int, float)): + return float(tweaks['series_index_auto_increment']) return 1.0 - # get the label of the associated series number table - series_num = self.conn.get(''' - SELECT MAX({lt}.extra) FROM {lt} + series_indices = self.conn.get(''' + SELECT {lt}.extra FROM {lt} WHERE {lt}.book IN (SELECT book FROM {lt} where value=?) - '''.format(lt=lt), (series_id,), all=False) - if series_num is None: - return 1.0 - return floor(series_num+1) + ORDER BY {lt}.extra + '''.format(lt=lt), (series_id,)) + return self._get_next_series_num_for_list(series_indices) def all_custom(self, label=None, num=None): if label is not None: diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index b09c2bfc7c..b9ab54b80a 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -8,7 +8,7 @@ The database used to store ebook metadata ''' import os, sys, shutil, cStringIO, glob, time, functools, traceback, re from itertools import repeat -from math import floor +from math import ceil from Queue import Queue from PyQt4.QtGui import QImage @@ -1365,14 +1365,43 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): series_id = self.conn.get('SELECT id from series WHERE name=?', (series,), all=False) if series_id is None: + if isinstance(tweaks['series_index_auto_increment'], (int, float)): + return float(tweaks['series_index_auto_increment']) return 1.0 - series_num = self.conn.get( - ('SELECT MAX(series_index) FROM books WHERE id IN ' - '(SELECT book FROM books_series_link where series=?)'), - (series_id,), all=False) - if series_num is None: + series_indices = self.conn.get( + ('SELECT series_index FROM books WHERE id IN ' + '(SELECT book FROM books_series_link where series=?) ' + 'ORDER BY series_index'), + (series_id,)) + return self._get_next_series_num_for_list(series_indices) + + def _get_next_series_num_for_list(self, series_indices): + if not series_indices: + if isinstance(tweaks['series_index_auto_increment'], (int, float)): + return float(tweaks['series_index_auto_increment']) return 1.0 - return floor(series_num+1) + series_indices = [x[0] for x in series_indices] + print series_indices + if tweaks['series_index_auto_increment'] == 'next': + return series_indices[-1] + 1 + if tweaks['series_index_auto_increment'] == 'first_free': + for i in range(1, 10000): + if i not in series_indices: + return i + # really shouldn't get here. + if tweaks['series_index_auto_increment'] == 'next_free': + for i in range(int(ceil(series_indices[0])), 10000): + if i not in series_indices: + return i + # really shouldn't get here. + if tweaks['series_index_auto_increment'] == 'last_free': + for i in range(int(ceil(series_indices[-1])), 0, -1): + if i not in series_indices: + return i + return series_indices[-1] + 1 + if isinstance(tweaks['series_index_auto_increment'], (int, float)): + return float(tweaks['series_index_auto_increment']) + return 1.0 def set(self, row, column, val): ''' @@ -1760,18 +1789,17 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): FROM books, books_series_link as lt WHERE books.id = lt.book AND lt.series=? ORDER BY books.series_index''', (old_id,)) - # Get the next series index - index = self.get_next_series_num_for(new_name) # Now update the link table self.conn.execute('''UPDATE books_series_link SET series=? WHERE series=?''',(new_id, old_id,)) # Now set the indices for (book_id,) in books: + # Get the next series index + index = self.get_next_series_num_for(new_name) self.conn.execute('''UPDATE books SET series_index=? WHERE id=?''',(index, book_id,)) - index = index + 1 self.dirty_books_referencing('series', new_id, commit=False) self.conn.commit() From a93200983246cf28ee8931f853184e6ea13ced19 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 17 Dec 2010 13:26:37 +0000 Subject: [PATCH 05/62] #7643: option to copy one db's 'structure' to the new DB when creating a new library. --- src/calibre/gui2/dialogs/choose_library.py | 7 +++++- src/calibre/gui2/dialogs/choose_library.ui | 25 +++++++++++++++++----- src/calibre/gui2/ui.py | 7 ++++-- src/calibre/library/database2.py | 21 +++++++++++++++++- 4 files changed, 51 insertions(+), 9 deletions(-) diff --git a/src/calibre/gui2/dialogs/choose_library.py b/src/calibre/gui2/dialogs/choose_library.py index 32d45c6043..033b038b65 100644 --- a/src/calibre/gui2/dialogs/choose_library.py +++ b/src/calibre/gui2/dialogs/choose_library.py @@ -32,6 +32,11 @@ class ChooseLibrary(QDialog, Ui_Dialog): loc = unicode(self.old_location.text()).format(lp) self.old_location.setText(loc) self.browse_button.clicked.connect(self.choose_loc) + self.empty_library.toggled.connect(self.empty_library_toggled) + self.copy_structure.setEnabled(False) + + def empty_library_toggled(self, to_what): + self.copy_structure.setEnabled(to_what) def choose_loc(self, *args): loc = choose_dir(self, 'choose library location', @@ -64,7 +69,7 @@ class ChooseLibrary(QDialog, Ui_Dialog): def perform_action(self, ac, loc): if ac in ('new', 'existing'): prefs['library_path'] = loc - self.callback(loc) + self.callback(loc, copy_structure=self.copy_structure.isChecked()) else: move_library(self.db.library_path, loc, self.parent(), self.callback) diff --git a/src/calibre/gui2/dialogs/choose_library.ui b/src/calibre/gui2/dialogs/choose_library.ui index 6cf1b4386c..c281ecc0f4 100644 --- a/src/calibre/gui2/dialogs/choose_library.ui +++ b/src/calibre/gui2/dialogs/choose_library.ui @@ -49,11 +49,26 @@ - - - &Create an empty library at the new location - - + + + + + &Create an empty library at the new location + + + + + + + &Copy structure from the current library + + + Copy the custom columns, saved searches, column widths, plugboards, +user categories, and other information from the old to the new library + + + + diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py index dd3925e732..f97589e466 100644 --- a/src/calibre/gui2/ui.py +++ b/src/calibre/gui2/ui.py @@ -378,13 +378,16 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, EmailMixin, # {{{ def booklists(self): return self.memory_view.model().db, self.card_a_view.model().db, self.card_b_view.model().db - def library_moved(self, newloc): + def library_moved(self, newloc, copy_structure=False): if newloc is None: return + default_prefs = None try: olddb = self.library_view.model().db + if copy_structure: + default_prefs = olddb.prefs except: olddb = None - db = LibraryDatabase2(newloc) + db = LibraryDatabase2(newloc, default_prefs=default_prefs) if self.content_server is not None: self.content_server.set_database(db) self.library_path = newloc diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index b9ab54b80a..27266f2f9a 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -113,7 +113,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): def exists_at(cls, path): return path and os.path.exists(os.path.join(path, 'metadata.db')) - def __init__(self, library_path, row_factory=False): + def __init__(self, library_path, row_factory=False, default_prefs=None): self.field_metadata = FieldMetadata() self.dirtied_queue = Queue() if not os.path.exists(library_path): @@ -127,10 +127,29 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): if isinstance(self.dbpath, unicode) and not iswindows: self.dbpath = self.dbpath.encode(filesystem_encoding) + apply_default_prefs = not os.path.exists(self.dbpath) self.connect() + self.is_case_sensitive = not iswindows and not isosx and \ not os.path.exists(self.dbpath.replace('metadata.db', 'MeTAdAtA.dB')) SchemaUpgrade.__init__(self) + + # if we are to copy the prefs and structure from some other DB, then + # we need to do it before we call initialize_dynamic + if apply_default_prefs and default_prefs is not None: + prefs = DBPrefs(self) + for key in default_prefs: + # be sure that prefs not to be copied are listed below + if key in ['news_to_be_synced']: + continue + try: + prefs[key] = default_prefs[key] + except: + pass # ignore options that don't exist anymore + fmvals = [f for f in default_prefs['field_metadata'].values() if f['is_custom']] + for f in fmvals: + self.create_custom_column(f['label'], f['name'], f['datatype'], + f['is_multiple'] is not None, f['is_editable'], f['display']) self.initialize_dynamic() def get_property(self, idx, index_is_id=False, loc=-1): From 286a1fc22ebb34b45d82b83f14b6e24b0cd51d4a Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 17 Dec 2010 09:12:11 -0700 Subject: [PATCH 06/62] run in debug mode: Add a sleep --- src/calibre/gui2/main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index d355fe600e..d8316cbf68 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -266,6 +266,7 @@ def run_in_debug_mode(logpath=None): exe = base + '-debug' + ext print 'Starting debug executable:', exe subprocess.Popen([exe, '--gui-debug', logpath], stdout=fd, stderr=fd) + time.sleep(1) # Give subprocess a change to launch, before fd is closed def run_gui(opts, args, actions, listener, app, gui_debug=None): initialize_file_icon_provider() From 49c9cea7b06ef7f86e480d54c0499fb2a4f5a6c6 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 17 Dec 2010 10:27:37 -0700 Subject: [PATCH 07/62] Fix debug process launching on windows --- src/calibre/gui2/main.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index d8316cbf68..371c4df701 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -254,6 +254,7 @@ def run_in_debug_mode(logpath=None): e = sys.executable if getattr(sys, 'frozen', False) else sys.argv[0] import tempfile, subprocess fd, logpath = tempfile.mkstemp('.txt') + os.close(fd) if hasattr(sys, 'frameworks_dir'): base = os.path.dirname(sys.frameworks_dir) @@ -265,8 +266,13 @@ def run_in_debug_mode(logpath=None): base, ext = os.path.splitext(e) exe = base + '-debug' + ext print 'Starting debug executable:', exe - subprocess.Popen([exe, '--gui-debug', logpath], stdout=fd, stderr=fd) - time.sleep(1) # Give subprocess a change to launch, before fd is closed + creationflags = 0 + if iswindows: + import win32process + creationflags = win32process.CREATE_NO_WINDOW + subprocess.Popen([exe, '--gui-debug', logpath], stdout=open(logpath, 'w'), + stderr=subprocess.STDOUT, stdin=open(os.devnull, 'r'), + creationflags=creationflags) def run_gui(opts, args, actions, listener, app, gui_debug=None): initialize_file_icon_provider() @@ -300,7 +306,13 @@ def run_gui(opts, args, actions, listener, app, gui_debug=None): if runner.main.gui_debug is not None: e = sys.executable if getattr(sys, 'frozen', False) else sys.argv[0] import subprocess - subprocess.Popen([e, '--show-gui-debug', runner.main.gui_debug]) + creationflags = 0 + if iswindows: + import win32process + creationflags = win32process.CREATE_NO_WINDOW + subprocess.Popen([e, '--show-gui-debug', runner.main.gui_debug], + creationflags=creationflags, stdout=open(os.devnull, 'w'), + stderr=subprocess.PIPE, stdin=open(os.devnull, 'r')) return ret def cant_start(msg=_('If you are sure it is not running')+', ', From bccd4a60ae3f4beda069a9d53207e8c1f71416af Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 17 Dec 2010 10:34:58 -0700 Subject: [PATCH 08/62] oops --- src/calibre/gui2/dialogs/metadata_single.ui | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/calibre/gui2/dialogs/metadata_single.ui b/src/calibre/gui2/dialogs/metadata_single.ui index 770807b2d7..0355dc0fe6 100644 --- a/src/calibre/gui2/dialogs/metadata_single.ui +++ b/src/calibre/gui2/dialogs/metadata_single.ui @@ -358,8 +358,8 @@ If the box is colored green, then text matches the individual author's sort stri - Automatically create the author sort entry based on the current author entry. -Using this button to create author sort will change author sort from red to green. + Automatically create the title sort entry based on the current title entry. +Using this button to create title sort will change title sort from red to green. ... @@ -419,8 +419,8 @@ Using this button to create author sort will change author sort from red to gree - Automatically create the title sort entry based on the current title entry. -Using this button to create title sort will change title sort from red to green. + Automatically create the author sort entry based on the current author entry. +Using this button to create author sort will change author sort from red to green. ... From 79232c3d7c495aea5f1ddd82731070c362450dc1 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 17 Dec 2010 12:05:01 -0700 Subject: [PATCH 09/62] version 0.7.34 --- Changelog.yaml | 118 ++ src/calibre/constants.py | 2 +- src/calibre/translations/calibre.pot | 1947 ++++++++++++++------------ 3 files changed, 1167 insertions(+), 900 deletions(-) diff --git a/Changelog.yaml b/Changelog.yaml index 12f1b570bc..5c3f238b11 100644 --- a/Changelog.yaml +++ b/Changelog.yaml @@ -4,6 +4,124 @@ # for important features/bug fixes. # Also, each release can have new and improved recipes. +- version: 0.7.34 + date: 2010-12-17 + + new features: + - title: "Page turn animations in the e-book viewer" + type: major + description: > + "Now when you use the Page Down/Page Up keys or the next/previous page buttons in the viewer, page turning will be animated. The duration of the animation can be controlled in the viewer preferences. Setting it to o disables the animation completely." + + - title: "Conversion pipeline: Add an option to set the minimum line height of all elemnts as a percentage of the computed font size. By default, calibre now sets the line height to 120% of the computed font size." + + - title: "Large speedup in startup times and post metadata edit wait for large libraries" + + - title: "Allow changing the font used in the calibre interface via Preferences->Look and feel" + + - title: "Allow editing of the title sort value for a book via the edit metadata dialog" + + - title: "Disable the cover cache. This means that if you are running calibre on an underpowered machine, you might notice some slow down in the cover browser. On the other hand, calibre's memory consumption is reduced." + + - title: "You can now restart calibre in debug mode by clicking the arrow next to the Preferences button. In debug mode, after you quit calibre, a diagnostic log will popup" + tickets: [7359] + + - title: "When creating a new calibre library add an option to copy the custom column, saved searches, etc from the current library." + tickets: [7643] + + - title: "Add more tweaks to control how the next available series number is calculated." + tickets: [7892] + + - title: "Add a tweak to control layout of the custom metadata tab in the edit metadata dialog" + + - title: "Apple driver: Set series number as track number on windows when sending books to iTunes" + + - title: "Drivers for PocketBook 701 and Samsung E65" + + - title: "E-book viewer: Add option to have the mouse wheel flip pages" + + - title: "Add a load_resources method to the InterfaceAction and Plugin classes to facilitate loading of resources from plugin ZIP files" + + - title: "E-book viewer: Add option to not remember position in book when quitting." + tickets: [7699] + + - title: "When sorting the book list, keep the current book visible after the sort completes." + tickets: [7504] + + - title: "EPUB Output: Add an option to flatten the EPUB file structure, specially for FBReaderJ." + tickets: [7788] + + - title: "EPUB Output: Ensure all files inside the generated EPUB have unique filenames, to support broken EPUB readers like Stanza, Aldiko, FBReader and Sigil" + + - title: "FB2 Output: Add support for some 2.1 style tags." + + - title: "Bulk metadata edit: Add options to delete cover/generate default cover." + tickets: [7885] + + - title: "Fix a regression in 0.7.33 that broke updating covers in ebook files when saving to disk." + tickets: [7886] + + - title: "Don't refresh the Tag browser if it is hidden. Speeds up metadata editing with large libraries, if you hide teh Tag Browser." + + - title: "MOBI Output: Add option to ignore margins in input document" + tickets: [7877] + + bug fixes: + - title: "Fix various memory leaks introduced in the last couple of releases" + + - title: "EPUB metadata: When rendering first page as the cover, handle embedded svg correctly." + tickets: [7909] + + - title: "Disable multiple library support when the CALIBRE_OVERRIDE_DATABASE_PATH env var is set" + + - title: "Content server: Fix bug that could cause saved search based restrictions to not exclude all books" + tickets: [7876] + + - title: "Topaz metadata: Read metadata correctly from Topaz files that have MOBI file extensions" + + - title: "MOBI Input: Handle the (rare) MOBI files that do not specify per paragraph text indents correctly." + tickets: [7869] + + - title: "MOBI metadata reader: Handle invalid PRC files with spurious image_offset headers" + + - title: "Fix drag/drop of new cover to book detail panel does not update cover browser" + tickets: [7890] + + - title: "Do not open the book details dialog when double click on the scrollbars in the book details panel" + tickets: [7826] + + - title: "Templates: Fix {tags} not working when no tags are present" + tickets: [7888] + + - title: "HTML metadata: Fix regression that broke parsing of some meta tags" + tickets: [7851] + + - title: "Preferences: Add tooltips to buddy labels as well." + tickets: [7873] + + - title: "Content server: Fix handling of root URL when using --url-prefix" + + - title: "Ensure that the default encoding used by python is never ASCII (needed when running a non frozen version of calibre on linux)" + + improved recipes: + - Astronomy Picture of the day + - New Scientist + - Radikal + - Times of India + - Economic Times + - Zeit Online + - Dilbert + + new recipes: + - title: "Various Japanes news sources, National Geographic and paper.li" + author: "Hiroshi Miura" + + - title: "Science based medicine" + author: "BuzzKill" + + - title: "Kompiutierra" + author: "Vadim Dyadkin" + - version: 0.7.33 date: 2010-12-10 diff --git a/src/calibre/constants.py b/src/calibre/constants.py index 9cc67b39e4..7f4d085b6a 100644 --- a/src/calibre/constants.py +++ b/src/calibre/constants.py @@ -2,7 +2,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' __docformat__ = 'restructuredtext en' __appname__ = 'calibre' -__version__ = '0.7.33' +__version__ = '0.7.34' __author__ = "Kovid Goyal " import re diff --git a/src/calibre/translations/calibre.pot b/src/calibre/translations/calibre.pot index df4cd9f764..6be44b3a3c 100644 --- a/src/calibre/translations/calibre.pot +++ b/src/calibre/translations/calibre.pot @@ -4,9 +4,9 @@ # msgid "" msgstr "" -"Project-Id-Version: calibre 0.7.33\n" -"POT-Creation-Date: 2010-12-10 14:25+MST\n" -"PO-Revision-Date: 2010-12-10 14:25+MST\n" +"Project-Id-Version: calibre 0.7.34\n" +"POT-Creation-Date: 2010-12-17 11:41+MST\n" +"PO-Revision-Date: 2010-12-17 11:41+MST\n" "Last-Translator: Automatically generated\n" "Language-Team: LANGUAGE\n" "MIME-Version: 1.0\n" @@ -25,7 +25,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:74 #: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:76 #: /home/kovid/work/calibre/src/calibre/devices/kobo/books.py:24 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:465 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:466 #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:70 #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:71 #: /home/kovid/work/calibre/src/calibre/devices/prs500/books.py:267 @@ -35,11 +35,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/metadata.py:56 #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:407 -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/periodical.py:126 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/periodical.py:127 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:93 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:95 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:338 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:341 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:332 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:335 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1894 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1896 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:24 @@ -53,7 +53,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:61 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:50 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:357 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:358 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:64 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:66 @@ -62,19 +62,19 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1022 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1134 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdb.py:39 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:28 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:29 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pml.py:23 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pml.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/snb.py:16 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/txt.py:14 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:39 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:65 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:119 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:153 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:631 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:837 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:839 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:42 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:68 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:81 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:122 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:156 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:634 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:849 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:851 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:914 @@ -109,40 +109,40 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:98 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:305 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:307 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:357 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:364 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:329 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:332 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:358 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:365 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:331 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:334 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:160 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:42 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:140 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:142 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1039 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1050 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1053 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:163 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:714 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:193 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:235 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:244 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:415 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:942 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1135 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:381 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:902 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1095 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:190 #: /home/kovid/work/calibre/src/calibre/library/cli.py:215 #: /home/kovid/work/calibre/src/calibre/library/database.py:914 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:375 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:387 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1264 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1365 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2162 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2164 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2295 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:393 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:405 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1471 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1572 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2388 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2390 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2521 #: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:229 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:140 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:143 @@ -160,32 +160,32 @@ msgstr "" msgid "Base" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:172 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:200 msgid "File type" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:208 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:236 msgid "Metadata reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:238 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:266 msgid "Metadata writer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:268 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:296 msgid "Catalog generator" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:369 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:397 msgid "User Interface Action" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:395 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:17 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:22 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:423 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:18 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:23 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:189 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:261 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:301 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:206 msgid "Preferences" msgstr "" @@ -249,163 +249,163 @@ msgstr "" msgid "Set metadata from %s files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:716 msgid "Look and Feel" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:719 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:731 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:742 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:753 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 msgid "Interface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:723 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:722 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:729 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:728 msgid "Behavior" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:735 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 msgid "Change the way calibre behaves" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:211 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:739 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:212 msgid "Add your own columns" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:746 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 msgid "Add/remove your own columns to the calibre book list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:750 msgid "Customize the toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:757 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:756 msgid "Customize the toolbars and context menus, changing which actions are available in each" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:762 msgid "Input Options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:765 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:776 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:787 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:764 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:786 msgid "Conversion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:768 msgid "Set conversion options specific to each input format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:774 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:773 msgid "Common Options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:780 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 msgid "Set conversion options common to all formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:784 msgid "Output Options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:790 msgid "Set conversion options specific to each output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:796 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:795 msgid "Adding books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:798 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:810 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:822 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:834 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:833 msgid "Import/Export" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:802 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:801 msgid "Control how calibre reads metadata from files when adding books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:808 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:807 msgid "Saving books to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:814 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:813 msgid "Control how calibre exports files from its database to disk when using Save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:819 msgid "Sending books to devices" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:825 msgid "Control how calibre transfers files to your ebook reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:831 msgid "Metadata plugboards" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:837 msgid "Change metadata fields before saving/sending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:842 msgid "Sharing books by email" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:845 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:857 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:844 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:856 msgid "Sharing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:849 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:848 msgid "Setup sharing of books via email. Can be used for automatic sending of downloaded news to your devices" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:854 msgid "Sharing over the net" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:861 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:860 msgid "Setup the calibre Content Server which will give you access to your calibre library from anywhere, on any device, over the internet" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:868 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:867 msgid "Plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:870 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:882 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:893 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:869 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:881 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:892 msgid "Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:874 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:873 msgid "Add/remove/customize various bits of calibre functionality" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:880 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:879 msgid "Tweaks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:886 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:885 msgid "Fine tune how calibre behaves in various contexts" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:891 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:890 msgid "Miscellaneous" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:897 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:896 msgid "Miscellaneous advanced configuration" msgstr "" @@ -606,6 +606,10 @@ msgstr "" msgid "Disable the named plugin" msgstr "" +#: /home/kovid/work/calibre/src/calibre/debug.py:148 +msgid "Debug log" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:13 msgid "Communicate with Android phones." msgstr "" @@ -643,14 +647,14 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:378 #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:947 #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:987 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2956 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2996 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2972 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3012 msgid "%d of %d" msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:385 #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:992 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3002 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3018 msgid "finished" msgstr "" @@ -682,9 +686,9 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:888 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:918 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:264 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:189 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:202 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2026 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:207 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:220 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2252 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:150 msgid "News" msgstr "" @@ -692,12 +696,12 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2554 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:21 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:560 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1989 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2007 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2215 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2233 msgid "Catalog" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2860 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2876 msgid "Communicate with iTunes." msgstr "" @@ -710,6 +714,7 @@ msgid "Communicate with the Blackberry smart phone." msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/blackberry/driver.py:14 +#: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:253 #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:18 #: /home/kovid/work/calibre/src/calibre/devices/prs500/driver.py:90 msgid "Kovid Goyal" @@ -739,6 +744,10 @@ msgstr "" msgid "Communicate with the PocketBook 602 reader." msgstr "" +#: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:252 +msgid "Communicate with the PocketBook 701" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/edge/driver.py:17 msgid "Entourage Edge" msgstr "" @@ -895,12 +904,12 @@ msgstr "" msgid "Adding books to device metadata listing..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:445 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:272 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:446 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:279 msgid "Not Implemented" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:446 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:447 msgid "\".kobo\" files do not exist on the device as books instead, they are rows in the sqlite database. Currently they cannot be exported or viewed." msgstr "" @@ -1270,241 +1279,245 @@ msgstr "" msgid "Disable all rescaling of font sizes." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:166 -msgid "The line height in pts. Controls spacing between consecutive lines of text. By default no line height manipulation is performed." +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:165 +msgid "The minimum line height, as a percentage of the element's calculated font size. calibre will ensure that every element has a line height of at least this setting, irrespective of what the input document specifies. Set to zero to disable. Default is 120%. Use this setting in preference to the direct line height specification, unless you know what you are doing. For example, you can achieve \"double spaced\" text by setting this to 240." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:174 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:180 +msgid "The line height in pts. Controls spacing between consecutive lines of text. Only applies to elements that do not define their own line height. In most cases, the minimum line height option is more useful. By default no line height manipulation is performed." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:191 msgid "Some badly designed documents use tables to control the layout of text on the page. When converted these documents often have text that runs off the page and other artifacts. This option will extract the content from the tables and present it in a linear fashion." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:184 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:201 msgid "XPath expression that specifies all tags that should be added to the Table of Contents at level one. If this is specified, it takes precedence over other forms of auto-detection." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:193 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:210 msgid "XPath expression that specifies all tags that should be added to the Table of Contents at level two. Each entry is added under the previous level one entry." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:201 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:218 msgid "XPath expression that specifies all tags that should be added to the Table of Contents at level three. Each entry is added under the previous level two entry." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:209 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:226 msgid "Normally, if the source file already has a Table of Contents, it is used in preference to the auto-generated one. With this option, the auto-generated one is always used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:217 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:234 msgid "Don't add auto-detected chapters to the Table of Contents." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:224 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:241 msgid "If fewer than this number of chapters is detected, then links are added to the Table of Contents. Default: %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:231 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:248 msgid "Maximum number of links to insert into the TOC. Set to 0 to disable. Default is: %default. Links are only added to the TOC if less than the threshold number of chapters were detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:239 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:256 msgid "Remove entries from the Table of Contents whose titles match the specified regular expression. Matching entries and all their children are removed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:250 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:267 msgid "An XPath expression to detect chapter titles. The default is to consider

or

tags that contain the words \"chapter\",\"book\",\"section\" or \"part\" as chapter titles as well as any tags that have class=\"chapter\". The expression used must evaluate to a list of elements. To disable chapter detection, use the expression \"/\". See the XPath Tutorial in the calibre User Manual for further help on using this feature." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:264 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:281 msgid "Specify how to mark detected chapters. A value of \"pagebreak\" will insert page breaks before chapters. A value of \"rule\" will insert a line before chapters. A value of \"none\" will disable chapter marking and a value of \"both\" will use both page breaks and lines to mark chapters." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:274 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:291 msgid "Either the path to a CSS stylesheet or raw CSS. This CSS will be appended to the style rules from the source file, so it can be used to override those rules." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:283 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:300 msgid "An XPath expression. Page breaks are inserted before the specified elements." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:289 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:306 msgid "Set the top margin in pts. Default is %default. Note: 72 pts equals 1 inch" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:294 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:311 msgid "Set the bottom margin in pts. Default is %default. Note: 72 pts equals 1 inch" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:299 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:316 msgid "Set the left margin in pts. Default is %default. Note: 72 pts equals 1 inch" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:304 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:321 msgid "Set the right margin in pts. Default is %default. Note: 72 pts equals 1 inch" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:310 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:327 msgid "Change text justification. A value of \"left\" converts all justified text in the source to left aligned (i.e. unjustified) text. A value of \"justify\" converts all unjustified text to justified. A value of \"original\" (the default) does not change justification in the source file. Note that only some output formats support justification." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:320 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:337 msgid "Remove spacing between paragraphs. Also sets an indent on paragraphs of 1.5em. Spacing removal will not work if the source file does not use paragraphs (

or

tags)." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:327 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:344 msgid "When calibre removes inter paragraph spacing, it automatically sets a paragraph indent, to ensure that paragraphs can be easily distinguished. This option controls the width of that indent." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:334 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:351 msgid "Use the cover detected from the source file in preference to the specified cover." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:340 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:357 msgid "Insert a blank line between paragraphs. Will not work if the source file does not use paragraphs (

or

tags)." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:347 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:364 msgid "Remove the first image from the input ebook. Useful if the first image in the source file is a cover and you are specifying an external cover." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:355 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:372 msgid "Insert the book metadata at the start of the book. This is useful if your ebook reader does not support displaying/searching metadata directly." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:363 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:380 msgid "Attempt to detect and correct hard line breaks and other problems in the source file. This may make things worse, so use with care." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:371 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:388 msgid "Scale used to determine the length at which a line should be unwrapped if preprocess is enabled. Valid values are a decimal between 0 and 1. The default is 0.40, just below the median line length. This will unwrap typical books with hard line breaks, but should be reduced if the line length is variable." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:380 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:397 msgid "Convert plain quotes, dashes and ellipsis to their typographically correct equivalents. For details, see http://daringfireball.net/projects/smartypants" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:388 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:405 msgid "Use a regular expression to try and remove the header." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:395 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:412 msgid "The regular expression to use to remove the header." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:401 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:418 msgid "Use a regular expression to try and remove the footer." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:408 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:425 msgid "The regular expression to use to remove the footer." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:415 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:432 msgid "Read metadata from the specified OPF file. Metadata read from this file will override any metadata in the source file." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:422 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:439 msgid "Transliterate unicode characters to an ASCII representation. Use with care because this will replace unicode characters with ASCII. For instance it will replace \"%s\" with \"Mikhail Gorbachiov\". Also, note that in cases where there are multiple representations of a character (characters shared by Chinese and Japanese for instance) the representation used by the largest number of people will be used (Chinese in the previous example)." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:437 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:454 msgid "Preserve ligatures present in the input document. A ligature is a special rendering of a pair of characters like ff, fi, fl et cetera. Most readers do not have support for ligatures in their default fonts, so they are unlikely to render correctly. By default, calibre will turn a ligature into the corresponding pair of normal characters. This option will preserve them instead." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:449 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:466 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:38 msgid "Set the title." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:453 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:470 msgid "Set the authors. Multiple authors should be separated by ampersands." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:458 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:475 msgid "The version of the title to be used for sorting. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:462 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:479 msgid "String to be used when sorting by author. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:466 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:483 msgid "Set the cover to the specified file or URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:470 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:487 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:54 msgid "Set the ebook description." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:474 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:491 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:56 msgid "Set the ebook publisher." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:478 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:495 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:60 msgid "Set the series this ebook belongs to." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:482 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:499 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:62 msgid "Set the index of the book in this series." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:486 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:503 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:64 msgid "Set the rating. Should be a number between 1 and 5." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:490 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:507 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:66 msgid "Set the ISBN of the book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:494 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:511 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:68 msgid "Set the tags for the book. Should be a comma separated list." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:498 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:515 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:70 msgid "Set the book producer." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:502 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:519 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:72 msgid "Set the language." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:506 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:523 msgid "Set the publication date." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:510 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:527 msgid "Set the book timestamp (used by the date column in calibre)." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:610 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:627 msgid "Could not find an ebook inside the archive" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:668 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:685 msgid "Values of series index and rating must be numbers. Ignoring" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:675 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:692 msgid "Failed to parse date/time" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:830 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:847 msgid "Converting input to HTML..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:858 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:875 msgid "Running transforms on ebook..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:945 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:962 msgid "Creating" msgstr "" @@ -1573,7 +1586,11 @@ msgstr "" msgid "When using an SVG cover, this option will cause the cover to scale to cover the available screen area, but still preserve its aspect ratio (ratio of width to height). That means there may be white borders at the sides or top and bottom of the image, but the image will never be distorted. Without this option the image may be slightly distorted, but there will be no borders." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:173 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:105 +msgid "This option is needed only if you intend to use the EPUB with FBReaderJ. It will flatten the file system inside the EPUB, putting all files into the top level." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:184 #: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:203 msgid "Start" msgstr "" @@ -1927,13 +1944,13 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:607 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:106 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:108 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:75 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:59 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:66 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:393 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:947 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:359 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:907 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:304 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:570 msgid "Title" @@ -1942,8 +1959,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:608 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:68 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:398 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:948 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:364 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:908 msgid "Author(s)" msgstr "" @@ -1962,10 +1979,10 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:40 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:211 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:189 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:109 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:79 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:342 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1154 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1114 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:188 msgid "Comments" msgstr "" @@ -1975,10 +1992,10 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:30 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:330 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1150 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:312 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1110 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:161 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:650 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:652 msgid "Tags" msgstr "" @@ -1987,8 +2004,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:29 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:347 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1159 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:329 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1119 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:109 msgid "Series" msgstr "" @@ -1998,7 +2015,7 @@ msgid "Language" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:618 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1142 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1102 msgid "Timestamp" msgstr "" @@ -2393,11 +2410,15 @@ msgstr "" msgid "Tag marking book to be filed with Personal Docs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:107 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:44 +msgid "Ignore margins in the input document. If False, then the MOBI output plugin will try to convert margins specified in the input document, otherwise it will ignore them." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:113 msgid "All articles" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:262 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:265 msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "" @@ -2473,6 +2494,7 @@ msgid "%s format books are not supported" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/cover.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:141 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:218 msgid "Book %s of %s" msgstr "" @@ -2487,7 +2509,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:165 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:72 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:648 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:650 msgid "Rating" msgstr "" @@ -2648,7 +2670,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:46 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:34 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:35 msgid "Author" msgstr "" @@ -2845,133 +2867,133 @@ msgstr "" msgid "Do not remove image references within the document. This is only useful when paired with the markdown-format option becauseimage references are always removed with plain text output." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:68 msgid "Send file to storage card instead of main memory by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:70 msgid "Confirm before deleting" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:72 msgid "Main window geometry" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:74 msgid "Notify when a new version is available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:76 msgid "Use Roman numerals for series number" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:78 msgid "Sort tags list by name, popularity, or rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:80 msgid "Number of covers to show in the cover browsing mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:82 msgid "Defaults for conversion to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:84 msgid "Options for the LRF ebook viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:87 msgid "Formats that are viewed using the internal viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 msgid "Columns to be displayed in the book list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:90 msgid "Automatically launch content server on application startup" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:91 msgid "Oldest news kept in database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:92 msgid "Show system tray icon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:94 msgid "Upload downloaded news to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:96 msgid "Delete books from library after uploading to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:98 msgid "Show the cover flow in a separate window instead of in the main calibre window" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:100 msgid "Disable notifications from the system tray icon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:102 msgid "Default action to perform when send to device button is clicked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:122 msgid "Maximum number of waiting worker processes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:124 msgid "Download social metadata (tags/rating/etc.)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:126 msgid "Overwrite author and title with new metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:101 msgid "Automatically download the cover, if available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:130 msgid "Limit max simultaneous jobs to number of CPUs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:132 msgid "tag browser categories not to display" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:134 msgid "The layout of the user interface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:136 msgid "Show the average rating per item indication in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:138 msgid "Disable UI animations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:186 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:509 msgid "Copied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:220 msgid "Copy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:220 msgid "Copy to Clipboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:468 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:469 msgid "Choose Files" msgstr "" @@ -3015,87 +3037,87 @@ msgstr "" msgid "How many empty books should be added?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:154 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:220 msgid "Uploading books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:306 msgid "Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:177 msgid "EPUB Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:178 msgid "LRF Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:179 msgid "HTML Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:180 msgid "LIT Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:181 msgid "MOBI Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:182 msgid "Topaz books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:178 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:183 msgid "Text books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:184 msgid "PDF Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:185 msgid "SNB Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:186 msgid "Comics" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:187 msgid "Archives" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:191 msgid "Supported books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:230 msgid "Merged some books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:231 msgid "Some duplicates were found and merged into the following existing books:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:240 msgid "Failed to read metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:241 msgid "Failed to read metadata from the following" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:255 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:260 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:286 msgid "Add to library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:267 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:110 #: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:85 @@ -3103,11 +3125,11 @@ msgstr "" msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:280 msgid "The following books are virtual and cannot be added to the calibre library:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:286 msgid "No book files found" msgstr "" @@ -3120,7 +3142,7 @@ msgid "Add books to your calibre library from the connected device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:542 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:549 msgid "Fetch annotations (experimental)" msgstr "" @@ -3137,11 +3159,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:30 #: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:87 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:127 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:80 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:127 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:185 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:224 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:92 msgid "No books selected" msgstr "" @@ -3215,7 +3237,7 @@ msgid "Checking database integrity" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:128 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:593 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:599 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:41 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 msgid "Error" @@ -3248,124 +3270,130 @@ msgstr "" msgid "Switch/create library..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:168 #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:77 msgid "Quick switch" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:170 #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:78 msgid "Rename library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:172 #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:79 msgid "Delete library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:189 msgid "Library Maintenance" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:190 msgid "Library metadata backup status" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:194 msgid "Start backing up metadata of all books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:198 msgid "Check library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:202 msgid "Check database integrity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:204 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:343 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:347 msgid "Recover database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:273 msgid "Rename" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:274 msgid "Choose a new name for the library %s. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:275 msgid "Note that the actual library folder will be renamed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:282 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:191 msgid "Already exists" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:283 msgid "The folder %s already exists. Delete it first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:289 msgid "Rename failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:290 msgid "Failed to rename the library at %s. The most common cause for this is if one of the files in the library is open in another program." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:300 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:53 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns.py:102 msgid "Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:301 msgid "All files from %s will be permanently deleted. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:316 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:320 msgid "none" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:317 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:321 msgid "Backup status" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:318 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:322 msgid "Book metadata files remaining to be written: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:328 msgid "Backup metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:325 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:329 msgid "Metadata will be backed up while calibre is running, at the rate of approximately 1 book per second." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:344 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:348 msgid "This command rebuilds your calibre database from the information stored by calibre in the OPF files.

This function is not currently available in the GUI. You can recover your database using the 'calibredb restore_database' command line function." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:358 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:362 msgid "No library found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:359 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:363 msgid "No existing calibre library was found at %s. It will be removed from the list of known libraries." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:748 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:750 msgid "Not allowed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:392 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:396 +msgid "You cannot change libraries while using the environment variable CALIBRE_OVERRIDE_DATABASE_PATH." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:401 msgid "You cannot change libraries while jobs are running." msgstr "" @@ -3405,42 +3433,46 @@ msgstr "" msgid "Copy selected books to the specified library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:117 msgid "(delete after copy)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:126 msgid "Cannot copy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:131 msgid "No library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:132 msgid "No library found at %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:139 msgid "Copying" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:150 msgid "Could not copy books: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:147 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:664 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:701 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:723 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:190 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:153 msgid "Copied %d books to %s" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:168 +msgid "You cannot use other libraries while using the environment variable CALIBRE_OVERRIDE_DATABASE_PATH." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:31 msgid "Deleting..." msgstr "" @@ -3510,14 +3542,14 @@ msgid "Main memory" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:170 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:467 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:476 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:474 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:483 msgid "Storage Card A" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:478 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:476 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:485 msgid "Storage Card B" msgstr "" @@ -3667,32 +3699,32 @@ msgid "Downloading %s for %d book(s)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:126 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:186 msgid "Cannot edit metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:221 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:226 msgid "Cannot merge books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:227 msgid "At least two books must be selected for merging" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:230 msgid "You are about to merge more than 5 books. Are you sure you want to proceed?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:238 msgid "Book formats and metadata from the selected books will be added to the first selected book (%s). ISBN will not be merged.

The second and subsequently selected books will not be deleted or changed.

Please confirm you want to proceed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:250 msgid "Book formats from the selected books will be merged into the first selected book (%s). Metadata in the first selected book will not be changed.Author, Title, ISBN and all other metadata will not be merged.

After merger the second and subsequently selected books, with any metadata they have will be deleted.

All book formats of the first selected book will be kept and any duplicate formats in the second and subsequently selected books will be permanently deleted from your calibre library.

Are you sure you want to proceed?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:266 msgid "Book formats and metadata from the selected books will be merged into the first selected book (%s). ISBN will not be merged.

After merger the second and subsequently selected books will be deleted.

All book formats of the first selected book will be kept and any duplicate formats in the second and subsequently selected books will be permanently deleted from your calibre library.

Are you sure you want to proceed?" msgstr "" @@ -3732,25 +3764,29 @@ msgstr "" msgid "O" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:17 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:18 msgid "Ctrl+P" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:24 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:200 msgid "Run welcome wizard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:28 +msgid "Restart in debug mode" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:38 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:43 msgid "Cannot configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:34 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:39 msgid "Cannot configure while there are running jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:44 msgid "Cannot configure before calibre is restarted." msgstr "" @@ -3820,7 +3856,7 @@ msgid "Click the show details button to see which ones." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:16 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:655 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:657 msgid "Show book details" msgstr "" @@ -3962,7 +3998,7 @@ msgid "The specified directory could not be processed." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/add.py:250 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:813 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:824 msgid "No books" msgstr "" @@ -3990,11 +4026,11 @@ msgstr "" msgid "Adding duplicates..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:408 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:417 msgid "Saving..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:483 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:492 msgid "Saved" msgstr "" @@ -4070,19 +4106,20 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:71 #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:57 #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:142 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:176 #: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:84 #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:85 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:77 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:376 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:412 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:422 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:424 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:432 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:437 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:439 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:441 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:449 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:92 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:95 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:161 @@ -4136,32 +4173,32 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:50 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:418 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:423 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:124 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:136 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:337 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1140 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:319 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1100 msgid "Path" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:53 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:128 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:336 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:318 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:118 msgid "Formats" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:28 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:951 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1143 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:911 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1103 msgid "Collections" msgstr "" @@ -4171,11 +4208,11 @@ msgid "Click to open" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:53 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:329 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:335 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:341 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1149 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1153 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:311 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:317 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:323 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1109 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1113 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:48 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:83 @@ -4183,7 +4220,7 @@ msgstr "" msgid "None" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:417 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:422 msgid "Double-click to open Book Details window" msgstr "" @@ -4234,13 +4271,13 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:32 #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:93 #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:54 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:56 #: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input_ui.py:33 #: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:39 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:136 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:120 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:74 #: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:120 #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input_ui.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output_ui.py:40 @@ -4264,7 +4301,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/conversion_ui.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:81 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:65 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:119 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:113 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins_ui.py:81 @@ -4556,30 +4593,34 @@ msgstr "" msgid "EPUB Output" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:57 msgid "Do not &split on page breaks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:58 msgid "No default &cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:59 msgid "No &SVG cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:60 msgid "Preserve cover &aspect ratio" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:61 msgid "Split files &larger than:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:62 msgid " KB" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:63 +msgid "&Flatten EPUB file structure" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input.py:12 msgid "FB2 Input" msgstr "" @@ -4625,15 +4666,15 @@ msgid "&Base font size:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:110 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:140 msgid "Font size &key:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:111 #: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:130 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:144 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:123 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:130 @@ -4684,70 +4725,78 @@ msgstr "" msgid "Justify text" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:137 msgid "&Disable font size rescaling" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:138 msgid "Base &font size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:141 msgid "Wizard to help you choose an appropriate font size key" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:143 msgid "Line &height:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:145 msgid "Input character &encoding:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:146 msgid "Remove &spacing between paragraphs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:147 msgid "Indent size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:148 msgid "

When calibre removes inter paragraph spacing, it automatically sets a paragraph indent, to ensure that paragraphs can be easily distinguished. This option controls the width of that indent." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:140 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:149 msgid " em" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:150 msgid "Text justification:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:142 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:151 msgid "&Linearize tables" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:152 msgid "Extra &CSS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:144 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:153 msgid "&Transliterate unicode characters to ASCII" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:154 msgid "Insert &blank line" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:155 msgid "Keep &ligatures" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:156 msgid "Smarten &punctuation" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:157 +msgid "Minimum &line height:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:158 +msgid " %" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output.py:19 msgid "LRF Output" msgstr "" @@ -4842,7 +4891,7 @@ msgid " is not a valid picture" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:414 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:443 msgid "Book Cover" msgstr "" @@ -4851,7 +4900,7 @@ msgid "Use cover from &source file" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:415 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:444 msgid "Change &cover image:" msgstr "" @@ -4860,18 +4909,18 @@ msgid "Browse for an image to use as the cover of this book." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:373 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397 msgid "&Title: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398 msgid "Change the title of this book" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:336 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:347 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:401 msgid "&Author(s): " msgstr "" @@ -4884,40 +4933,40 @@ msgid "Change the author(s) of this book. Multiple authors should be separated b msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:182 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:345 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:356 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 msgid "&Publisher: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:183 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:389 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 msgid "Ta&gs: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:347 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:358 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:428 msgid "Tags categorize the book. This is particularly useful while searching.

They can be any words or phrases, separated by commas." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:185 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:354 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:365 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:411 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:214 msgid "&Series:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:186 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:187 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:355 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:356 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:394 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:366 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:367 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:412 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:413 msgid "List of known series. You can add new series." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:188 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:414 msgid "Book " msgstr "" @@ -4925,42 +4974,46 @@ msgstr "" msgid "MOBI Output" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output.py:44 msgid "Default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:75 msgid "&Title for Table of Contents:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:76 msgid "Rescale images for &Palm devices" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:77 msgid "Use author &sort for author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:78 msgid "Disable compression of the file contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:79 msgid "Do not add Table of Contents to book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:80 msgid "Kindle options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:81 msgid "Periodical masthead font:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:82 msgid "Personal Doc tag:" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:83 +msgid "Ignore &margins" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup.py:35 msgid "Page Setup" msgstr "" @@ -5444,23 +5497,23 @@ msgid "Automatically number books" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:547 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:367 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:378 msgid "Force numbers to start with " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:609 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:607 msgid "The enumeration \"{0}\" contains invalid values that will not appear in the list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:665 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:663 msgid "Remove all tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:686 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:684 msgid "tags to add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:689 msgid "tags to remove" msgstr "" @@ -5469,162 +5522,162 @@ msgstr "" msgid "No details available." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:190 msgid "Device no longer connected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:301 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:308 msgid "Get device information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:312 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:319 msgid "Get list of books on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:329 msgid "Get annotations from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:334 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:341 msgid "Send metadata to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:339 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:346 msgid "Send collections to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:381 msgid "Upload %d books to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:389 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:396 msgid "Delete books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:413 msgid "Download books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:416 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:423 msgid "View book on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:450 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:457 msgid "Set default send to device action" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:456 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:463 msgid "Send to main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:458 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:465 msgid "Send to storage card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:460 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:467 msgid "Send to storage card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:465 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:474 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:472 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:481 msgid "Main Memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:486 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:493 msgid "Send specific format to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:487 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:494 msgid "Send and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:537 msgid "Eject device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:594 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:600 msgid "Error communicating with device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:605 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:616 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1100 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:296 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:623 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:634 msgid "Select folder to open as device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:670 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:681 msgid "Error talking to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:671 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:682 msgid "There was a temporary error talking to the device. Please unplug and reconnect the device and or reboot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:714 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:725 msgid "Device: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:716 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:727 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:814 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:825 msgid "selected to send" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:819 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:830 msgid "Choose format to send to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:828 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:839 msgid "No device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:829 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:840 msgid "Cannot send: No device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:832 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:836 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:843 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:847 msgid "No card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:833 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:837 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:844 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:848 msgid "Cannot send: Device has no storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:883 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:966 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:894 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:977 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1094 msgid "Auto convert the following books before uploading to the device?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:912 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:923 msgid "Sending catalogs to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1008 msgid "Sending news to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1050 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1061 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1101 msgid "Could not upload the following books to the device, as no suitable formats were found. Convert the book(s) to a format supported by your device first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1154 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1165 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1166 msgid "

Cannot upload books to device there is no more free space available " msgstr "" @@ -5695,7 +5748,7 @@ msgid "My Books" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:74 -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:304 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:308 msgid "Generate catalog" msgstr "" @@ -5777,72 +5830,82 @@ msgstr "" msgid "Choose Format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:38 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:43 msgid "Choose location for calibre library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:50 msgid "Same as current" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:51 msgid "The location %s contains the current calibre library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:56 msgid "No existing library found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:57 msgid "There is no existing calibre library at %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:61 msgid "Not empty" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:62 msgid "The folder %s is not empty. Please choose an empty folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:85 msgid "No location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:85 msgid "No location selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:89 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:654 msgid "Bad location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:90 msgid "%s is not an existing folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:77 msgid "Choose your calibre library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:78 msgid "Your calibre library is currently located at {0}" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:79 msgid "New &Location:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:80 msgid "Use &existing library at the new location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:81 msgid "&Create an empty library at the new location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:82 +msgid "&Copy structure from the current library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:83 +msgid "" +"Copy the custom columns, saved searches, column widths, plugboards,\n" +"user categories, and other information from the old to the new library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:85 msgid "&Move current library to new location" msgstr "" @@ -5902,7 +5965,7 @@ msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:949 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:909 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:33 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:295 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:569 @@ -5911,7 +5974,7 @@ msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1139 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1099 msgid "Format" msgstr "" @@ -5920,19 +5983,19 @@ msgstr "" msgid "Delete from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:34 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:35 msgid "Author sort" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:689 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:697 msgid "Invalid author name" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:690 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:698 msgid "Author names cannot contain & characters." msgstr "" @@ -6078,170 +6141,170 @@ msgstr "" msgid "Working" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:204 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:386 msgid "Lower Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:205 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:385 msgid "Upper Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:206 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:388 msgid "Title Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:190 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:207 msgid "Capitalize" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:210 msgid "Character match" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:211 msgid "Regular Expression" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:197 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:214 msgid "Replace field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:198 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:215 msgid "Prepend to field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:216 msgid "Append to field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:227 msgid "Editing meta information for %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:256 msgid "Immediately make all changes without closing the dialog. This operation cannot be canceled or undone" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:292 msgid "Book %d:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:307 msgid "You can destroy your library using this feature. Changes are permanent. There is no undo function. You are strongly encouraged to back up your library before proceeding.

Search and replace in text fields using character matching or regular expressions. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:298 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:315 msgid "In character mode, the field is searched for the entered search text. The text is replaced by the specified replacement text everywhere it is found in the specified field. After replacement is finished, the text can be changed to upper-case, lower-case, or title-case. If the case-sensitive check box is checked, the search text must match exactly. If it is unchecked, the search text will match both upper- and lower-case letters" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:309 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:326 msgid "In regular expression mode, the search text is an arbitrary python-compatible regular expression. The replacement text can contain backreferences to parenthesized expressions in the pattern. The search is not anchored, and can match and replace multiple times on the same string. The modification functions (lower-case etc) are applied to the matched text, not to the field as a whole. The destination box specifies the field where the result after matching and replacement is to be assigned. You can replace the text in the field, or prepend or append the matched text. See this reference for more information on python's regular expressions, and in particular the 'sub' function." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:454 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:471 msgid "You must specify a destination when source is a composite field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:546 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:554 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:649 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:563 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:571 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:666 msgid "Search/replace invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:564 msgid "Authors cannot be set to the empty string. Book title %s not processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:555 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:572 msgid "Title cannot be set to the empty string. Book title %s not processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:650 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:667 msgid "Search pattern is invalid: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:687 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:709 msgid "" "Applying changes to %d books.\n" "Phase {0} {1}%%." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:335 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:346 msgid "Edit Meta information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:337 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:348 msgid "A&utomatically set author sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:338 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:349 msgid "Author s&ort: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:339 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:350 msgid "Specify how the author(s) of this book should be sorted. For example Charles Dickens should be sorted as Dickens, Charles." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:340 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:351 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:405 msgid "&Rating:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:341 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:342 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:352 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:353 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:407 msgid "Rating of this book. 0-5 stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:343 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:354 msgid "No change" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:344 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:355 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408 msgid " stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:346 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:357 msgid "Add ta&gs: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:348 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:349 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:392 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:359 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:430 msgid "Open Tag Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:350 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:361 msgid "&Remove tags:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:351 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:362 msgid "Comma separated list of tags to remove from the books. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:352 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:363 msgid "Check this box to remove all tags from the books." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:353 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:364 msgid "Remove all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:357 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:368 msgid "If checked, the series will be cleared" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:358 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:369 msgid "Clear series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:359 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:370 msgid "" "If not checked, the series number for the books will be set to 1.\n" "If checked, selected books will be automatically numbered, in the order\n" @@ -6249,145 +6312,157 @@ msgid "" "Book A will have series number 1 and Book B series number 2." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:363 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:374 msgid "Automatically number books in this series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:364 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:375 msgid "" "Series will normally be renumbered from the highest number in the database\n" "for that series. Checking this box will tell calibre to start numbering\n" "from the value in the box" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:379 msgid "Remove &format:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:369 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:380 msgid "&Swap title and author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:370 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:381 msgid "" "Force the title to be in title case. If both this and swap authors are checked,\n" "title and author are swapped before the title case is set" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:372 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:383 msgid "Change title to title case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:373 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:384 msgid "" "Remove stored conversion settings for the selected books.\n" "\n" "Future conversion of these books will use the default settings." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:387 msgid "Remove &stored conversion settings for the selected books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:377 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:424 -msgid "&Basic metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:378 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:425 -msgid "&Custom metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:379 -msgid "Search &field:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:380 -msgid "The name of the field that you want to search" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:381 -msgid "Search mode:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:382 -msgid "Choose whether to use basic text matching or advanced regular expression matching" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:383 -msgid "&Search for:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:384 -msgid "Enter the what you are looking for, either plain text or a regular expression, depending on the mode" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:385 -msgid "Check this box if the search string must match exactly upper and lower case. Uncheck it if case is to be ignored" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:386 -msgid "Case sensitive" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:387 -msgid "&Replace with:" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:388 -msgid "The replacement text. The matched search text will be replaced with this string" +msgid "Change &cover" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:389 -msgid "Apply function after replace:" +msgid "&Generate default cover" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:390 +msgid "&Remove cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:453 +msgid "&Basic metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:392 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:454 +msgid "&Custom metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:393 +msgid "Search &field:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:394 +msgid "The name of the field that you want to search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:395 +msgid "Search mode:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:396 +msgid "Choose whether to use basic text matching or advanced regular expression matching" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:397 +msgid "&Search for:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:398 +msgid "Enter the what you are looking for, either plain text or a regular expression, depending on the mode" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:399 +msgid "Check this box if the search string must match exactly upper and lower case. Uncheck it if case is to be ignored" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:400 +msgid "Case sensitive" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:401 +msgid "&Replace with:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:402 +msgid "The replacement text. The matched search text will be replaced with this string" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:403 +msgid "Apply function after replace:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:404 msgid "" "Specify how the text is to be processed after matching and replacement. In character mode, the entire\n" "field is processed. In regular expression mode, only the matched text is processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:392 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:406 msgid "&Destination field:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:407 msgid "The field that the text will be put into after all replacements. If blank, the source field is used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:394 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:408 msgid "Mode:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:409 msgid "Specify how the text should be copied into the destination." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:396 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:410 msgid "" "If the replace mode is prepend or append, then this box indicates whether a comma or\n" "nothing should be put between the original text and the inserted text" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:398 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:412 msgid "use comma" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:399 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:413 msgid "Test &text" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:414 msgid "Test re&sult" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:415 msgid "Your test:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:416 msgid "&Search and replace" msgstr "" @@ -6424,237 +6499,259 @@ msgstr "" msgid "You must specify a title and author before generating a cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:247 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:244 msgid "Downloading cover..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:258 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:269 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:276 msgid "Cannot fetch cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:259 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:270 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:277 msgid "Could not fetch cover.
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:262 msgid "The download timed out." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:266 msgid "Could not find cover for this book. Try specifying the ISBN first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:278 msgid "For the error message from each cover source, click Show details below." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:285 msgid "Bad cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:286 msgid "The cover is not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:302 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:305 msgid "Choose formats for " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:333 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:336 msgid "No permission" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:334 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:337 msgid "You do not have permission to read the following files:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:361 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:364 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:365 msgid "No format selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:373 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:376 msgid "Could not read metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:377 msgid "Could not read metadata from %s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:445 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:448 msgid " The green color indicates that the current author sort matches the current author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:448 -msgid " The red color indicates that the current author sort does not match the current author" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:451 +msgid " The red color indicates that the current author sort does not match the current author. No action is required if this is what you want." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:453 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:458 +msgid " The green color indicates that the current title sort matches the current title" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:461 +msgid " The red color warns that the current title sort does not match the current title. No action is required if this is what you want." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:467 #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:102 #: /home/kovid/work/calibre/src/calibre/web/feeds/templates.py:221 #: /home/kovid/work/calibre/src/calibre/web/feeds/templates.py:384 msgid "Previous" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:456 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:464 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:470 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:478 msgid "Save changes and edit the metadata of %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:461 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:475 #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:103 #: /home/kovid/work/calibre/src/calibre/web/feeds/templates.py:211 #: /home/kovid/work/calibre/src/calibre/web/feeds/templates.py:401 msgid "Next" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:635 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:640 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:670 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:675 msgid "This ISBN number is valid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:643 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:678 msgid "This ISBN number is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:715 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:754 msgid "Tags changed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:716 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:755 msgid "You have changed the tags. In order to use the tags editor, you must either discard or apply these changes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:754 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:793 msgid "There were errors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:755 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:794 msgid "There were errors downloading social metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:789 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:828 msgid "Cannot fetch metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:790 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:829 msgid "You must specify at least one of ISBN, Title, Authors or Publisher" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:885 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:924 msgid "Permission denied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:886 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:925 msgid "Could not open %s. Is it being used by another program?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:371 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395 msgid "Edit Meta Information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396 msgid "Meta information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375 -msgid "Swap the author and title" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:399 +msgid "Title &sort: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:400 +msgid "Specify how this book should be sorted when by title. For example, The Exorcist might be sorted as Exorcist, The." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 msgid "Author S&ort: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:379 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles Dickens should be sorted as Dickens, Charles.\n" "If the box is colored green, then text matches the individual author's sort strings. If it is colored red, then the authors and this text do not match." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:381 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:415 +msgid "IS&BN:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:416 +msgid "&Date:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:417 +msgid "dd MMM yyyy" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:418 +msgid "Publishe&d:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:420 +msgid "" +"Automatically create the title sort entry based on the current title entry.\n" +"Using this button to create title sort will change title sort from red to green." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:423 +msgid "Swap the author and title" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:425 msgid "" "Automatically create the author sort entry based on the current author entry.\n" "Using this button to create author sort will change author sort from red to green." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:431 msgid "Remove unused series (Series that have no books)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398 -msgid "IS&BN:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:399 -msgid "Publishe&d:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 -msgid "dd MMM yyyy" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403 -msgid "&Date:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404 -msgid "&Comments" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:433 msgid "&Fetch metadata from server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:434 +msgid "&Comments" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:435 msgid "Available Formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:436 msgid "Add a new format for this book to the database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:438 msgid "Remove the selected formats for this book from the database." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:440 msgid "Set the cover for the book from the selected format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:413 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:442 msgid "Update metadata from the metadata in the selected format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:416 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:445 msgid "&Browse" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:417 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:446 msgid "Remove border (if any) from cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:418 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:447 msgid "T&rim" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:419 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:448 msgid "Reset cover to default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:421 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:450 msgid "Download co&ver" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:422 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:451 msgid "Generate a default cover based on the title and author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:423 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:452 msgid "&Generate cover" msgstr "" @@ -7119,12 +7216,12 @@ msgid "%s (was %s)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:74 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:679 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:687 msgid "Item is blank" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:680 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:688 msgid "An item cannot be set to nothing. Delete it instead." msgstr "" @@ -7515,34 +7612,34 @@ msgstr "" msgid "Shift+Alt+T" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:147 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:29 msgid "version" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:148 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:30 msgid "created by Kovid Goyal" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:166 msgid "Connected " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:178 msgid "Update found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:211 -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:223 msgid "Book Details" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:215 msgid "Alt+D" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:225 msgid "Shift+Alt+D" msgstr "" @@ -7631,7 +7728,7 @@ msgid "Show books in the main memory of the device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:67 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:828 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:846 msgid "Card A" msgstr "" @@ -7640,7 +7737,7 @@ msgid "Show books in storage card A" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:69 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:830 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:848 msgid "Card B" msgstr "" @@ -7714,82 +7811,82 @@ msgstr "" msgid "Size (MB)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:348 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:330 msgid "Book %s of %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:713 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1259 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:454 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:673 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1219 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:462 msgid "The lookup/search name is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:719 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1261 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:679 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1221 msgid "This book's UUID is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:946 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:906 msgid "In Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:950 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:910 msgid "Size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1159 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1119 msgid "Book %s of %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1239 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1199 msgid "Marked for deletion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1242 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1202 msgid "Double click to edit me

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:150 msgid "Hide column %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:154 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:155 msgid "Sort on %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:156 msgid "Ascending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:159 msgid "Descending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:171 msgid "Change text alignment for %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:173 msgid "Left" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:173 msgid "Right" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:174 msgid "Center" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:193 msgid "Show column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:205 msgid "Restore default layout" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:749 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:751 msgid "Dropping onto a device is not supported. First add the book to the calibre library." msgstr "" @@ -7818,7 +7915,7 @@ msgid "No matches for the search phrase %s were found." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:160 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:448 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:453 msgid "No matches found" msgstr "" @@ -7835,12 +7932,12 @@ msgid "LRF Viewer toolbar" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:503 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:522 msgid "Next Page" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:504 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:523 msgid "Previous Page" msgstr "" @@ -7901,81 +7998,81 @@ msgid "Failed to create calibre library at: %r." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/main.py:99 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:185 msgid "Choose a location for your new calibre e-book library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:153 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:154 msgid "Initializing user interface..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:178 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:179 msgid "Repairing failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:180 msgid "The database repair failed. Starting with a new empty library." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:193 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:227 msgid "Bad database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:195 msgid "Bad database location %r. calibre will now quit." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:208 msgid "Corrupted database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:209 msgid "Your calibre database appears to be corrupted. Do you want calibre to try and repair it automatically? If you say No, a new empty calibre library will be created." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:215 msgid "Repairing database. This can take a very long time for a large collection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:228 msgid "Bad database location %r. Will start with a new, empty calibre library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:238 msgid "Starting %s: Loading books..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:318 msgid "If you are sure it is not running" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:320 msgid "Cannot Start " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:321 msgid "%s is already running." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:324 msgid "may be running in the system tray, in the" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:326 msgid "upper right region of the screen." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:328 msgid "lower right region of the screen." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:331 msgid "try rebooting your computer." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:297 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:309 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:333 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:345 msgid "try deleting the file" msgstr "" @@ -8034,7 +8131,7 @@ msgid "Successfully downloaded metadata for %d out of %d books" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:291 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:654 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:656 msgid "Details" msgstr "" @@ -8470,102 +8567,110 @@ msgstr "" msgid "new email address" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:24 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:25 msgid "Narrow" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:24 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:25 msgid "Wide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:52 msgid "Medium" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:52 msgid "Small" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:53 msgid "Large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:56 msgid "Always" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:56 msgid "Automatic" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:57 msgid "Never" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:120 msgid "User Interface &layout (needs restart):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:121 msgid "&Number of covers to show in browse mode (needs restart):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:122 msgid "Choose &language (requires restart):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:123 msgid "Show &average ratings in the tags browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:124 msgid "Disable all animations. Useful if you have a slow/old computer." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:125 msgid "Disable &animations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:126 msgid "Enable system &tray icon (needs restart)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:127 msgid "Show &splash screen at startup" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:128 msgid "Disable ¬ifications in system tray" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:129 msgid "Use &Roman numerals for series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:130 msgid "Show cover &browser in a separate window (needs restart)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:131 msgid "Search as you type" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:132 msgid "&Toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:133 msgid "&Icon size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:134 msgid "Show &text under icons:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:135 msgid "&Split the toolbar into two toolbars" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:136 +msgid "Interface font:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:137 +msgid "Change &font (needs restart)" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:222 msgid "&Apply" msgstr "" @@ -8582,19 +8687,19 @@ msgstr "" msgid "Cancel and return to overview" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:287 msgid "Restoring to defaults not supported for" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:304 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:322 msgid "Some of the changes you made require a restart. Please restart calibre as soon as possible." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:325 msgid "The changes you have made require calibre be restarted immediately. You will not be allowed set any more preferences, until you restart." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:312 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:330 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:120 msgid "Restart needed" msgstr "" @@ -8875,7 +8980,7 @@ msgid "Here you can control how calibre will save your books when you click the msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:329 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:340 msgid "Failed to start content server" msgstr "" @@ -9150,94 +9255,94 @@ msgstr "" msgid "&Alternate shortcut:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:225 msgid "Rename '%s'" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:229 msgid "Edit sort for '%s'" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:234 msgid "Hide category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:237 msgid "Show category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:238 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:242 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:246 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:250 msgid "Manage %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:245 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:253 msgid "Manage Saved Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:252 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:264 msgid "Manage User Categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:271 msgid "Show all categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:549 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:557 msgid "Changing the authors for several books can take a while. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:562 msgid "Changing the metadata for that many books can take a while. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:611 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:619 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:314 msgid "Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:694 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:702 msgid "Duplicate search name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:695 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:703 msgid "The saved search name %s is already used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:985 msgid "Sort by name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:985 msgid "Sort by popularity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:977 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:986 msgid "Sort by average rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:980 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:989 msgid "Set the sort order for entries in the Tag Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:986 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:995 msgid "Match all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:986 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:995 msgid "Match any" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:991 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1000 msgid "When selecting multiple entries in the Tag Browser match any or all of them" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:995 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1004 msgid "Manage &user categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:998 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1007 msgid "Add your own categories to the Tag Browser" msgstr "" @@ -9264,71 +9369,79 @@ msgstr "" msgid "Queueing " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:246 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:250 msgid "Fetch news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:316 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:320 msgid "Convert existing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:317 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:321 msgid "The following books have already been converted to %s format. Do you wish to reconvert them?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:171 msgid "&Restore" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:173 msgid "&Donate to support calibre" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:177 msgid "&Eject connected device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:218 msgid "Calibre Quick Start Guide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:437 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:448 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:266 +msgid "Debug mode" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:267 +msgid "You have started calibre in debug mode. After you quit calibre, the debug log will be available in the file: %s

The log will be displayed automatically." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:451 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:462 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:449 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:463 msgid "

Could not convert: %s

It is a DRMed book. You must first remove the DRM using third party tools." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:463 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:477 msgid "Recipe Disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:479 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:493 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:530 msgid "is the result of the efforts of many volunteers from all over the world. If you find it useful, please consider donating to support its development. Your donation helps keep calibre development going." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:541 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:556 msgid "There are active jobs. Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:559 msgid "" " is communicating with the device!
\n" " Quitting may cause corruption on the device.
\n" " Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:563 msgid "WARNING: Active jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:626 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:638 msgid "will keep running in the system tray. To close it, choose Quit in the context menu of the system tray." msgstr "" @@ -9400,188 +9513,224 @@ msgstr "" msgid "Import" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:178 msgid "Configure Ebook viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:179 msgid "&Font options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:180 msgid "Se&rif family:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:181 msgid "&Sans family:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:182 msgid "&Monospace family:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:183 msgid "&Default font size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:165 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:167 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:201 msgid " px" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:185 msgid "Monospace &font size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:187 msgid "S&tandard font:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:188 msgid "Serif" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:189 msgid "Sans-serif" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:190 msgid "Monospace" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:191 msgid "Remember last used &window size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:174 -msgid "Maximum &view width:" +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:192 +msgid "Remember the ¤t page when quitting" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:193 msgid "H&yphenate (break line in the middle of large words)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:194 msgid "The default language to use for hyphenation rules. If the book does not specify a language, this will be used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:195 msgid "Default &language for hyphenation:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:178 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:196 msgid "&Resize images larger than the viewer window (needs restart)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:179 -msgid "&User stylesheet" +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:197 +msgid "Page flip &duration:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:198 +msgid "disabled" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:199 +msgid " secs" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:200 +msgid "Mouse &wheel flips pages" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:202 +msgid "Maximum &view width:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:203 msgid "&General" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:204 msgid "Double click to change a keyboard shortcut" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:205 msgid "&Keyboard shortcuts" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:206 +msgid "

A CSS stylesheet that can be used to control the look and feel of books. For examples, click here." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:207 +msgid "User &Stylesheet" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/viewer/dictionary.py:53 msgid "No results found for:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:36 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:37 msgid "Options to customize the ebook viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:43 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:720 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:728 msgid "Remember last used window size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:45 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:93 msgid "Set the user CSS stylesheet. This can be used to customize the look of all books." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:48 msgid "Maximum width of the viewer window, in pixels." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:50 msgid "Resize images larger than the viewer window to fit inside it" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:51 msgid "Hyphenate text" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:53 msgid "Default language for hyphenation rules" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:54 -msgid "Font options" +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:55 +msgid "Save the current position in the document, when quitting" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:56 -msgid "The serif font family" +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:57 +msgid "Have the mouse wheel turn pages" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:58 -msgid "The sans-serif font family" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:60 -msgid "The monospaced font family" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:61 -msgid "The standard font size in px" +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:59 +msgid "The time, in seconds, for the page flip animation. Default is half a second." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:62 +msgid "Font options" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:64 +msgid "The serif font family" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:66 +msgid "The sans-serif font family" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:68 +msgid "The monospaced font family" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:69 +msgid "The standard font size in px" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:70 msgid "The monospaced font size in px" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:71 msgid "The standard font type" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:479 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:498 msgid "&Lookup in dictionary" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:482 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:501 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:138 msgid "Go to..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:494 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:513 msgid "Next Section" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:495 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:514 msgid "Previous Section" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:497 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:516 msgid "Document Start" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:498 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:517 msgid "Document End" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:519 msgid "Section Start" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:520 msgid "Section End" msgstr "" @@ -9657,75 +9806,75 @@ msgstr "" msgid "Connecting to dict.org to lookup: %s…" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:415 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:420 msgid "Choose ebook" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:416 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:421 msgid "Ebooks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:449 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:454 msgid "No matches found for: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:492 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:497 msgid "Loading flow..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:535 msgid "Laying out %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:566 msgid "Bookmark #%d" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:565 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:570 msgid "Add bookmark" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:566 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:571 msgid "Enter title for bookmark:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:576 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:581 msgid "Manage Bookmarks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:621 msgid "Loading ebook..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:621 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:629 msgid "DRM Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:622 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:630 msgid "

This book is protected by DRM" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:626 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:634 msgid "Could not open ebook" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:707 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:715 msgid "Options to control the ebook viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:714 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:722 msgid "If specified, viewer window will try to come to the front when started." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:717 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:725 msgid "If specified, viewer window will try to open full screen when started." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:722 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:730 msgid "Print javascript alert and console messages to the console" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:728 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:736 msgid "" "%prog [options] file\n" "\n" @@ -10099,50 +10248,50 @@ msgstr "" msgid "Turn on the &content server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:373 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:264 msgid "today" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:376 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:267 msgid "yesterday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:379 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:270 msgid "thismonth" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:382 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:383 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:273 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:274 msgid "daysago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:562 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:572 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:453 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:463 msgid "unchecked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:562 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:572 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:184 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:453 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:463 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:183 msgid "no" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:565 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:575 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:456 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:466 msgid "checked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:565 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:575 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:184 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:456 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:466 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:183 msgid "yes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:569 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:460 msgid "blank" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:569 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:460 msgid "empty" msgstr "" @@ -10807,35 +10956,35 @@ msgstr "" msgid "The label must contain only lower case letters, digits and underscores, and start with a letter" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:59 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:58 msgid "%sAverage rating is %3.1f" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:826 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:844 msgid "Main" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2321 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2547 msgid "

Migrating old database to ebook library in %s

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2350 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2576 msgid "Copying %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2367 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2593 msgid "Compacting database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2460 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2686 msgid "Checking SQL integrity..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2499 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2725 msgid "Checking for missing files." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2527 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2753 msgid "Checked id" msgstr "" @@ -10948,8 +11097,8 @@ msgstr "" msgid "Replace whitespace with underscores." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:350 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:374 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:352 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:376 msgid "Requested formats not available" msgstr "" @@ -11071,43 +11220,43 @@ msgstr "" msgid "Up" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:574 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:576 msgid "in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:577 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:579 msgid "Books in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:629 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:631 msgid "Other formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:636 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:638 msgid "Read %s in the %s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:641 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:643 msgid "Get" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:656 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:658 msgid "Permalink" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:657 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:659 msgid "A permanent link to this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:668 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:670 msgid "This book has been deleted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:752 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:754 msgid "in search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:754 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:756 msgid "Matching books" msgstr "" From 21d940db2f7b2e447653f1cc809c8ece723f3148 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 17 Dec 2010 12:23:53 -0700 Subject: [PATCH 10/62] IGN:Tag release From fcb501c1aa5ddc9a0fac1bf77cc525564bd960af Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 17 Dec 2010 13:18:13 -0700 Subject: [PATCH 11/62] ... --- Changelog.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Changelog.yaml b/Changelog.yaml index 5c3f238b11..7f7afc117a 100644 --- a/Changelog.yaml +++ b/Changelog.yaml @@ -66,6 +66,8 @@ - title: "MOBI Output: Add option to ignore margins in input document" tickets: [7877] + - title: "Kobo driver: Add support for 1.8.x firmware" + bug fixes: - title: "Fix various memory leaks introduced in the last couple of releases" From 7ab3ce7fe46ba7c271a7f4894253b1b5d3902c15 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 17 Dec 2010 19:06:32 -0700 Subject: [PATCH 12/62] ... --- resources/recipes/nejm.recipe | 91 +++++++++++++++-------------------- src/calibre/web/feeds/news.py | 1 + 2 files changed, 41 insertions(+), 51 deletions(-) diff --git a/resources/recipes/nejm.recipe b/resources/recipes/nejm.recipe index c860413926..35098c92cb 100644 --- a/resources/recipes/nejm.recipe +++ b/resources/recipes/nejm.recipe @@ -38,61 +38,50 @@ class NYTimes(BasicNewsRecipe): #TO GET ARTICLE TOC def nejm_get_index(self): - return self.index_to_soup('http://content.nejm.org/current.dtl') + return self.index_to_soup('http://content.nejm.org/current.dtl') # To parse artice toc def parse_index(self): - parse_soup = self.nejm_get_index() + parse_soup = self.nejm_get_index() - div = parse_soup.find(id='centerTOC') + feeds = [] - current_section = None - current_articles = [] - feeds = [] - for x in div.findAll(True): - if x.name == 'img' and '/toc/' in x.get('src', '') and 'uarrow.gif' not in x.get('src', ''): - # Section heading found - if current_articles and current_section and 'Week in the' not in current_section: - feeds.append((current_section, current_articles)) - current_section = x.get('alt') - current_articles = [] - self.log('\tFound section:', current_section) - if current_section is not None and x.name == 'strong': - title = self.tag_to_string(x) - a = x.parent.find('a', href=lambda x: x and '/full/' in x) - if a is None: - continue - url = a.get('href', False) - if not url or not title: - continue - if url.startswith('/'): - url = 'http://content.nejm.org'+url - self.log('\t\tFound article:', title) - self.log('\t\t\t', url) - if url.startswith('/'): - url = 'http://online.wsj.com'+url - current_articles.append({'title': title, 'url':url, - 'description':'', 'date':''}) - - if current_articles and current_section: - feeds.append((current_section, current_articles)) - - return feeds - - def preprocess_html(self, soup): - for a in soup.findAll(text=lambda x: x and '[in this window]' in x): - a = a.findParent('a') - url = a.get('href', None) - if not url: + div = parse_soup.find(attrs={'class':'tocContent'}) + for group in div.findAll(attrs={'class':'articleGrouping'}): + feed_title = group.find(attrs={'class':'articleType'}) + if feed_title is None: continue - if url.startswith('/'): - url = 'http://content.nejm.org'+url - isoup = self.index_to_soup(url) - img = isoup.find('img', src=lambda x: x and - x.startswith('/content/')) - if img is not None: - img.extract() - table = a.findParent('table') - table.replaceWith(img) - return soup + feed_title = self.tag_to_string(feed_title) + articles = [] + self.log('Found section:', feed_title) + for art in group.findAll(attrs={'class':lambda x: x and 'articleEntry' + in x}): + link = art.find(attrs={'class':lambda x:x and 'articleLink' in + x}) + if link is None: + continue + a = link.find('a', href=True) + if a is None: + continue + url = a.get('href') + if url.startswith('/'): + url = 'http://www.nejm.org'+url + title = self.tag_to_string(a) + self.log.info('\tFound article:', title, 'at', url) + article = {'title':title, 'url':url, 'date':''} + au = art.find(attrs={'class':'articleAuthors'}) + if au is not None: + article['author'] = self.tag_to_string(au) + desc = art.find(attrs={'class':'hover_text'}) + if desc is not None: + desc = self.tag_to_string(desc) + if 'author' in article: + desc = ' by ' + article['author'] + ' ' +desc + article['description'] = desc + articles.append(article) + if articles: + feeds.append((feed_title, articles)) + + return feeds + diff --git a/src/calibre/web/feeds/news.py b/src/calibre/web/feeds/news.py index ad2991d620..7bd5301dfb 100644 --- a/src/calibre/web/feeds/news.py +++ b/src/calibre/web/feeds/news.py @@ -548,6 +548,7 @@ class BasicNewsRecipe(Recipe): } For an example, see the recipe for downloading `The Atlantic`. + In addition, you can add 'author' for the author of the article. ''' raise NotImplementedError From b2ace1e470c67f40648dad5d8f98ed1bb249f27d Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 17 Dec 2010 19:15:32 -0700 Subject: [PATCH 13/62] ... --- resources/recipes/nejm.recipe | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/resources/recipes/nejm.recipe b/resources/recipes/nejm.recipe index 35098c92cb..a6580a5232 100644 --- a/resources/recipes/nejm.recipe +++ b/resources/recipes/nejm.recipe @@ -11,16 +11,7 @@ class NYTimes(BasicNewsRecipe): language = 'en' no_stylesheets = True - remove_tags_before = dict(name='div', attrs={'align':'center'}) - remove_tags_after = dict(name='ol', attrs={'compact':'COMPACT'}) - remove_tags = [ - dict(name='iframe'), - #dict(name='div', attrs={'class':'related-articles'}), - dict(name='div', attrs={'id':['sidebar']}), - #dict(name='form', attrs={'onsubmit':"return verifySearch(this.w,'Keyword, citation, or author')"}), - dict(name='table', attrs={'align':'RIGHT'}), - ] - + keep_only_tags = dict(id='content') #TO LOGIN From 3cc953d621c6bd4a00040601a5050d8dbb067fc7 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 17 Dec 2010 20:21:12 -0700 Subject: [PATCH 14/62] Fix #7934 (Database corruption error) --- src/calibre/library/database2.py | 2 +- src/calibre/library/schema_upgrades.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 1557f5065e..35ef8c1f58 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -1967,7 +1967,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): @classmethod def cleanup_tags(cls, tags): - tags = [x.strip() for x in tags if x.strip()] + tags = [x.strip().replace(',', ';') for x in tags if x.strip()] tags = [x.decode(preferred_encoding, 'replace') \ if isbytestring(x) else x for x in tags] tags = [u' '.join(x.split()) for x in tags] diff --git a/src/calibre/library/schema_upgrades.py b/src/calibre/library/schema_upgrades.py index 597cee8cfd..1483743e4a 100644 --- a/src/calibre/library/schema_upgrades.py +++ b/src/calibre/library/schema_upgrades.py @@ -427,7 +427,9 @@ class SchemaUpgrade(object): def upgrade_version_15(self): 'Remove commas from tags' - self.conn.execute("UPDATE tags SET name=REPLACE(name, ',', ';')") + self.conn.execute("UPDATE OR IGNORE tags SET name=REPLACE(name, ',', ';')") + self.conn.execute("UPDATE OR IGNORE tags SET name=REPLACE(name, ',', ';;')") + self.conn.execute("UPDATE OR IGNORE tags SET name=REPLACE(name, ',', '')") def upgrade_version_16(self): self.conn.executescript(''' From b9f2346cba22abbf5881735fb75f6a440a73fb38 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 17 Dec 2010 20:59:48 -0700 Subject: [PATCH 15/62] Fix #7938 (Stanza shows some authors as "catalog is empty") --- resources/recipes/johm.recipe | 78 +++++++++++++----------------- src/calibre/library/server/opds.py | 14 +++--- 2 files changed, 41 insertions(+), 51 deletions(-) diff --git a/resources/recipes/johm.recipe b/resources/recipes/johm.recipe index ee162b27c2..6930f05a50 100644 --- a/resources/recipes/johm.recipe +++ b/resources/recipes/johm.recipe @@ -12,16 +12,6 @@ class JournalofHospitalMedicine(BasicNewsRecipe): language = 'en' no_stylesheets = True - #remove_tags_before = dict(name='div', attrs={'align':'center'}) - #remove_tags_after = dict(name='ol', attrs={'compact':'COMPACT'}) - remove_tags = [ - dict(name='iframe'), - dict(name='div', attrs={'class':'subContent'}), - dict(name='div', attrs={'id':['contentFrame']}), - #dict(name='form', attrs={'onsubmit':"return verifySearch(this.w,'Keyword, citation, or author')"}), - #dict(name='table', attrs={'align':'RIGHT'}), - ] - # TO LOGIN @@ -39,47 +29,47 @@ class JournalofHospitalMedicine(BasicNewsRecipe): #TO GET ARTICLE TOC def johm_get_index(self): - return self.index_to_soup('http://www3.interscience.wiley.com/journal/111081937/home') + return self.index_to_soup('http://www3.interscience.wiley.com/journal/111081937/home') # To parse artice toc def parse_index(self): - parse_soup = self.johm_get_index() + parse_soup = self.johm_get_index() - div = parse_soup.find(id='contentCell') + div = parse_soup.find(id='contentCell') - current_section = None - current_articles = [] - feeds = [] - for x in div.findAll(True): - if x.name == 'h4': - # Section heading found - if current_articles and current_section: - feeds.append((current_section, current_articles)) - current_section = self.tag_to_string(x) - current_articles = [] - self.log('\tFound section:', current_section) - if current_section is not None and x.name == 'strong': - title = self.tag_to_string(x) - p = x.parent.parent.find('a', href=lambda x: x and '/HTMLSTART' in x) - if p is None: - continue - url = p.get('href', False) - if not url or not title: - continue - if url.startswith('/'): - url = 'http://www3.interscience.wiley.com'+url - url = url.replace('/HTMLSTART', '/main.html,ftx_abs') - self.log('\t\tFound article:', title) - self.log('\t\t\t', url) - #if url.startswith('/'): - #url = 'http://online.wsj.com'+url - current_articles.append({'title': title, 'url':url, - 'description':'', 'date':''}) + current_section = None + current_articles = [] + feeds = [] + for x in div.findAll(True): + if x.name == 'h4': + # Section heading found + if current_articles and current_section: + feeds.append((current_section, current_articles)) + current_section = self.tag_to_string(x) + current_articles = [] + self.log('\tFound section:', current_section) + if current_section is not None and x.name == 'strong': + title = self.tag_to_string(x) + p = x.parent.parent.find('a', href=lambda x: x and '/HTMLSTART' in x) + if p is None: + continue + url = p.get('href', False) + if not url or not title: + continue + if url.startswith('/'): + url = 'http://www3.interscience.wiley.com'+url + url = url.replace('/HTMLSTART', '/main.html,ftx_abs') + self.log('\t\tFound article:', title) + self.log('\t\t\t', url) + #if url.startswith('/'): + #url = 'http://online.wsj.com'+url + current_articles.append({'title': title, 'url':url, + 'description':'', 'date':''}) - if current_articles and current_section: - feeds.append((current_section, current_articles)) + if current_articles and current_section: + feeds.append((current_section, current_articles)) - return feeds + return feeds def preprocess_html(self, soup): for img in soup.findAll('img', src=True): diff --git a/src/calibre/library/server/opds.py b/src/calibre/library/server/opds.py index af635ebf48..cd0b80d4f0 100644 --- a/src/calibre/library/server/opds.py +++ b/src/calibre/library/server/opds.py @@ -19,7 +19,7 @@ from calibre.ebooks.metadata import fmt_sidx from calibre.library.comments import comments_to_html from calibre.library.server import custom_fields_to_display from calibre.library.server.utils import format_tag_string, Offsets -from calibre import guess_type +from calibre import guess_type, prepare_string_for_xml as xml from calibre.utils.icu import sort_key from calibre.utils.ordered_dict import OrderedDict @@ -150,13 +150,13 @@ def ACQUISITION_ENTRY(item, version, db, updated, CFM, CKEYS, prefix): extra.append(_('RATING: %s
')%rating) tags = item[FM['tags']] if tags: - extra.append(_('TAGS: %s
')%format_tag_string(tags, ',', + extra.append(_('TAGS: %s
')%xml(format_tag_string(tags, ',', ignore_max=True, - no_tag_count=True)) + no_tag_count=True))) series = item[FM['series']] if series: extra.append(_('SERIES: %s [%s]
')%\ - (series, + (xml(series), fmt_sidx(float(item[FM['series_index']])))) for key in CKEYS: mi = db.get_metadata(item[CFM['id']['rec_index']], index_is_id=True) @@ -164,11 +164,11 @@ def ACQUISITION_ENTRY(item, version, db, updated, CFM, CKEYS, prefix): if val: datatype = CFM[key]['datatype'] if datatype == 'text' and CFM[key]['is_multiple']: - extra.append('%s: %s
'%(name, format_tag_string(val, ',', + extra.append('%s: %s
'%(xml(name), xml(format_tag_string(val, ',', ignore_max=True, - no_tag_count=True))) + no_tag_count=True)))) else: - extra.append('%s: %s
'%(name, val)) + extra.append('%s: %s
'%(xml(name), xml(unicode(val)))) comments = item[FM['comments']] if comments: comments = comments_to_html(comments) From 545cdfd00d14f9bdab4967318ea5edcf8d6bb24c Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sat, 18 Dec 2010 09:43:11 +0000 Subject: [PATCH 16/62] Enhancement #7931: add tweak to change display in tags pane from author to author_sort. --- resources/default_tweaks.py | 14 ++++++++++++++ src/calibre/gui2/tag_view.py | 29 ++++++++++++++++++++++------- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/resources/default_tweaks.py b/resources/default_tweaks.py index 750af9efa7..6d4f7a405f 100644 --- a/resources/default_tweaks.py +++ b/resources/default_tweaks.py @@ -41,6 +41,20 @@ series_index_auto_increment = 'next' # selecting 'manage authors', and pressing 'Recalculate all author sort values'. author_sort_copy_method = 'invert' +# Set which author field to display in the tags pane (the list of authors, +# series, publishers etc on the left hand side). The choices are author and +# author_sort. This tweak affects only the tags pane, and only what is displayed +# under the authors category. Please note that if you set this to author_sort, +# it is very possible to see duplicate names in the list becasue although it is +# guaranteed that author names are unique, there is no such guarantee for +# author_sort values. Showing duplicates won't break anything, but it could +# lead to some confusion. When using 'author_sort', the tooltip will show the +# author's name. +# Examples: +# tags_pane_use_field_for_author_name = 'author' +# tags_pane_use_field_for_author_name = 'author_sort' +tags_pane_use_field_for_author_name = 'author' + # Set whether boolean custom columns are two- or three-valued. # Two-values for true booleans diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index f75061da12..a0e26cf77c 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -18,6 +18,7 @@ from PyQt4.Qt import Qt, QTreeView, QApplication, pyqtSignal, \ from calibre.ebooks.metadata import title_sort from calibre.gui2 import config, NONE from calibre.library.field_metadata import TagsIcons, category_icon_map +from calibre.utils.config import tweaks from calibre.utils.icu import sort_key from calibre.utils.search_query_parser import saved_searches from calibre.gui2 import error_dialog @@ -409,17 +410,31 @@ class TagTreeItem(object): # {{{ return NONE def tag_data(self, role): + tag = self.tag + if tag.category == 'authors' and \ + tweaks['tags_pane_use_field_for_author_name'] == 'author_sort': + name = tag.sort + tt_author = True + else: + name = tag.name + tt_author = False if role == Qt.DisplayRole: - if self.tag.count == 0: - return QVariant('%s'%(self.tag.name)) + if tag.count == 0: + return QVariant('%s'%(name)) else: - return QVariant('[%d] %s'%(self.tag.count, self.tag.name)) + return QVariant('[%d] %s'%(tag.count, name)) if role == Qt.EditRole: - return QVariant(self.tag.name) + return QVariant(tag.name) if role == Qt.DecorationRole: - return self.icon_state_map[self.tag.state] - if role == Qt.ToolTipRole and self.tag.tooltip is not None: - return QVariant(self.tag.tooltip) + return self.icon_state_map[tag.state] + if role == Qt.ToolTipRole: + if tt_author: + if tag.tooltip is not None: + return QVariant('(%s) %s'%(tag.name, tag.tooltip)) + else: + return QVariant(tag.name) + if tag.tooltip is not None: + return QVariant(tag.tooltip) return NONE def toggle(self): From e9cdd3d2402eed396df918a18d0d3014ce137c88 Mon Sep 17 00:00:00 2001 From: John Schember Date: Sat, 18 Dec 2010 09:22:16 -0500 Subject: [PATCH 17/62] Remove 2.1 tags. --- src/calibre/ebooks/fb2/fb2ml.py | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/calibre/ebooks/fb2/fb2ml.py b/src/calibre/ebooks/fb2/fb2ml.py index 5efc360f1f..89c12db103 100644 --- a/src/calibre/ebooks/fb2/fb2ml.py +++ b/src/calibre/ebooks/fb2/fb2ml.py @@ -297,18 +297,6 @@ class FB2MLizer(object): s_out, s_tags = self.handle_simple_tag('emphasis', tag_stack+tags) fb2_out += s_out tags += s_tags - elif tag in ('del', 'strike'): - s_out, s_tags = self.handle_simple_tag('strikethrough', tag_stack+tags) - fb2_out += s_out - tags += s_tags - elif tag == 'sub': - s_out, s_tags = self.handle_simple_tag('sub', tag_stack+tags) - fb2_out += s_out - tags += s_tags - elif tag == 'sup': - s_out, s_tags = self.handle_simple_tag('sup', tag_stack+tags) - fb2_out += s_out - tags += s_tags # Processes style information. if style['font-style'] == 'italic': @@ -319,10 +307,6 @@ class FB2MLizer(object): s_out, s_tags = self.handle_simple_tag('strong', tag_stack+tags) fb2_out += s_out tags += s_tags - elif style['text-decoration'] == 'line-through': - s_out, s_tags = self.handle_simple_tag('strikethrough', tag_stack+tags) - fb2_out += s_out - tags += s_tags # Process element text. if hasattr(elem_tree, 'text') and elem_tree.text: From d45398fe478b88930f68a4a2c1052fb5bb9405f2 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 18 Dec 2010 09:40:45 -0700 Subject: [PATCH 18/62] ... --- src/calibre/manual/conversion.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/calibre/manual/conversion.rst b/src/calibre/manual/conversion.rst index fea20a3163..3a7ae16598 100644 --- a/src/calibre/manual/conversion.rst +++ b/src/calibre/manual/conversion.rst @@ -541,7 +541,9 @@ Use the options to remove headers and footers to mitigate this issue. If the hea removed from the text it can throw off the paragraph unwrapping. Some limitations of PDF input is complex, multi-column, and image based documents are not supported. -Extraction of vector images and tables from within the document is also not supported. +Extraction of vector images and tables from within the document is also not supported. Some PDFs use special glyphs to +represent double ll or doubfle ff or fi,etc. Conversion of these may or may not work depending on jusy how they are +represented internally in the PDF. Comic Book Collections ~~~~~~~~~~~~~~~~~~~~~~~~~ From 3d03f5c4a4a7886834e06281b21e6ed2f780d73b Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 18 Dec 2010 10:03:56 -0700 Subject: [PATCH 19/62] Content server: Fix regression that broke browsing by rating --- src/calibre/library/server/browse.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/calibre/library/server/browse.py b/src/calibre/library/server/browse.py index 37f024c08d..485601a311 100644 --- a/src/calibre/library/server/browse.py +++ b/src/calibre/library/server/browse.py @@ -373,13 +373,18 @@ class BrowseServer(object): script='toplevel();', main=main) def browse_sort_categories(self, items, sort): - if sort not in ('rating', 'name', 'popularity'): - sort = 'name' - items.sort(key=lambda x: sort_key(getattr(x, 'sort', x.name))) + def keyg(x): + x = getattr(x, 'sort', x.name) + if isinstance(x, unicode): + return sort_key(x) + return x + if sort == 'popularity': items.sort(key=operator.attrgetter('count'), reverse=True) elif sort == 'rating': items.sort(key=operator.attrgetter('avg_rating'), reverse=True) + else: + items.sort(key=keyg) return sort def browse_category(self, category, sort): From 13e83afab8ddc523087d3c4f92f83e162a289230 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sat, 18 Dec 2010 17:22:26 +0000 Subject: [PATCH 20/62] Fix problem where ratings have non-string sort values --- src/calibre/library/database2.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 35ef8c1f58..2848e8ebb3 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -1128,6 +1128,10 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): for l in list: (id, val, sort_val) = (l[0], l[1], l[2]) tids[category][val] = (id, sort_val) + elif cat['datatype'] == 'rating': + for l in list: + (id, val) = (l[0], l[1]) + tids[category][val] = (id, '{0:05.2f}'.format(val)) else: for l in list: (id, val) = (l[0], l[1]) @@ -1256,12 +1260,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): # sort the list if sort == 'name': - def get_sort_key(x): - sk = x.s - if isinstance(sk, unicode): - sk = sort_key(sk) - return sk - kf = get_sort_key + kf = lambda x :sort_key(x.s) reverse=False elif sort == 'popularity': kf = lambda x: x.c From 20d7b486e4f6e2761c129a8e3b5dbb6d3ed8fee3 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sat, 18 Dec 2010 17:30:12 +0000 Subject: [PATCH 21/62] Revert changes from browse.py --- src/calibre/library/server/browse.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/calibre/library/server/browse.py b/src/calibre/library/server/browse.py index 485601a311..37f024c08d 100644 --- a/src/calibre/library/server/browse.py +++ b/src/calibre/library/server/browse.py @@ -373,18 +373,13 @@ class BrowseServer(object): script='toplevel();', main=main) def browse_sort_categories(self, items, sort): - def keyg(x): - x = getattr(x, 'sort', x.name) - if isinstance(x, unicode): - return sort_key(x) - return x - + if sort not in ('rating', 'name', 'popularity'): + sort = 'name' + items.sort(key=lambda x: sort_key(getattr(x, 'sort', x.name))) if sort == 'popularity': items.sort(key=operator.attrgetter('count'), reverse=True) elif sort == 'rating': items.sort(key=operator.attrgetter('avg_rating'), reverse=True) - else: - items.sort(key=keyg) return sort def browse_category(self, category, sort): From 1ee512bf23272388c97e208719abc10efc52352c Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 18 Dec 2010 10:47:16 -0700 Subject: [PATCH 22/62] Fix #7935 (Changed device ID's for SWEEX MM300) --- src/calibre/devices/misc.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/calibre/devices/misc.py b/src/calibre/devices/misc.py index e27aee4393..68f4dba9a9 100644 --- a/src/calibre/devices/misc.py +++ b/src/calibre/devices/misc.py @@ -62,9 +62,9 @@ class SWEEX(USBMS): # Ordered list of supported formats FORMATS = ['epub', 'prc', 'fb2', 'html', 'rtf', 'chm', 'pdf', 'txt'] - VENDOR_ID = [0x0525] - PRODUCT_ID = [0xa4a5] - BCD = [0x0319] + VENDOR_ID = [0x0525, 0x177f] + PRODUCT_ID = [0xa4a5, 0x300] + BCD = [0x0319, 0x110] VENDOR_NAME = 'SWEEX' WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = 'EBOOKREADER' From c68a36d3c18e93c6f967695f6fe46b90a968d6d3 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sat, 18 Dec 2010 18:14:40 +0000 Subject: [PATCH 23/62] Make the author_sort display tweak work in the content server --- resources/default_tweaks.py | 20 ++++++++++---------- src/calibre/gui2/tag_view.py | 2 +- src/calibre/library/server/browse.py | 8 ++++++-- src/calibre/library/server/opds.py | 8 +++++++- 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/resources/default_tweaks.py b/resources/default_tweaks.py index 6d4f7a405f..a420cd7d44 100644 --- a/resources/default_tweaks.py +++ b/resources/default_tweaks.py @@ -43,17 +43,17 @@ author_sort_copy_method = 'invert' # Set which author field to display in the tags pane (the list of authors, # series, publishers etc on the left hand side). The choices are author and -# author_sort. This tweak affects only the tags pane, and only what is displayed -# under the authors category. Please note that if you set this to author_sort, -# it is very possible to see duplicate names in the list becasue although it is -# guaranteed that author names are unique, there is no such guarantee for -# author_sort values. Showing duplicates won't break anything, but it could -# lead to some confusion. When using 'author_sort', the tooltip will show the -# author's name. +# author_sort. This tweak affects only what is displayed under the authors +# category in the tags pane and content server. Please note that if you set this +# to author_sort, it is very possible to see duplicate names in the list because +# although it is guaranteed that author names are unique, there is no such +# guarantee for author_sort values. Showing duplicates won't break anything, but +# it could lead to some confusion. When using 'author_sort', the tooltip will +# show the author's name. # Examples: -# tags_pane_use_field_for_author_name = 'author' -# tags_pane_use_field_for_author_name = 'author_sort' -tags_pane_use_field_for_author_name = 'author' +# categories_use_field_for_author_name = 'author' +# categories_use_field_for_author_name = 'author_sort' +categories_use_field_for_author_name = 'author' # Set whether boolean custom columns are two- or three-valued. diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index a0e26cf77c..478f6b042f 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -412,7 +412,7 @@ class TagTreeItem(object): # {{{ def tag_data(self, role): tag = self.tag if tag.category == 'authors' and \ - tweaks['tags_pane_use_field_for_author_name'] == 'author_sort': + tweaks['categories_use_field_for_author_name'] == 'author_sort': name = tag.sort tt_author = True else: diff --git a/src/calibre/library/server/browse.py b/src/calibre/library/server/browse.py index 37f024c08d..b1c4a4c2f9 100644 --- a/src/calibre/library/server/browse.py +++ b/src/calibre/library/server/browse.py @@ -15,7 +15,7 @@ from calibre import isbytestring, force_unicode, fit_image, \ prepare_string_for_xml as xml from calibre.utils.ordered_dict import OrderedDict from calibre.utils.filenames import ascii_filename -from calibre.utils.config import prefs +from calibre.utils.config import prefs, tweaks from calibre.utils.icu import sort_key from calibre.utils.magick import Image from calibre.library.comments import comments_to_html @@ -151,7 +151,11 @@ def get_category_items(category, items, restriction, datatype, prefix): # {{{ '
{1}
' '
{2}
') rating, rstring = render_rating(i.avg_rating, prefix) - name = xml(i.name) + if i.category == 'authors' and \ + tweaks['categories_use_field_for_author_name'] == 'author_sort': + name = xml(i.sort) + else: + name = xml(i.name) if datatype == 'rating': name = xml(_('%d stars')%int(i.avg_rating)) id_ = i.id diff --git a/src/calibre/library/server/opds.py b/src/calibre/library/server/opds.py index cd0b80d4f0..e447c6966c 100644 --- a/src/calibre/library/server/opds.py +++ b/src/calibre/library/server/opds.py @@ -22,6 +22,7 @@ from calibre.library.server.utils import format_tag_string, Offsets from calibre import guess_type, prepare_string_for_xml as xml from calibre.utils.icu import sort_key from calibre.utils.ordered_dict import OrderedDict +from calibre.utils.config import tweaks BASE_HREFS = { 0 : '/stanza', @@ -113,8 +114,13 @@ def CATALOG_ENTRY(item, item_kind, base_href, version, updated, count = (_('%d books') if item.count > 1 else _('%d book'))%item.count if ignore_count: count = '' + if item.category == 'authors' and \ + tweaks['categories_use_field_for_author_name'] == 'author_sort': + name = xml(item.sort) + else: + name = xml(item.name) return E.entry( - TITLE(item.name + ('' if not add_kind else ' (%s)'%item_kind)), + TITLE(name + ('' if not add_kind else ' (%s)'%item_kind)), ID(id_), UPDATED(updated), E.content(count, type='text'), From 66f9313ac94886c45e7dd1cb94a3c38e306d5ba1 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 18 Dec 2010 11:19:12 -0700 Subject: [PATCH 24/62] ... --- Changelog.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Changelog.yaml b/Changelog.yaml index 7f7afc117a..bcf58ae03d 100644 --- a/Changelog.yaml +++ b/Changelog.yaml @@ -11,7 +11,7 @@ - title: "Page turn animations in the e-book viewer" type: major description: > - "Now when you use the Page Down/Page Up keys or the next/previous page buttons in the viewer, page turning will be animated. The duration of the animation can be controlled in the viewer preferences. Setting it to o disables the animation completely." + "Now when you use the Page Down/Page Up keys or the next/previous page buttons in the viewer, page turning will be animated. The duration of the animation can be controlled in the viewer preferences. Setting it to 0 disables the animation completely." - title: "Conversion pipeline: Add an option to set the minimum line height of all elemnts as a percentage of the computed font size. By default, calibre now sets the line height to 120% of the computed font size." From 2ba5caa9514b1e203ff46971e5be8b3d1fb7ece4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 18 Dec 2010 15:57:32 -0700 Subject: [PATCH 25/62] ... --- setup/installer/windows/notes.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/setup/installer/windows/notes.rst b/setup/installer/windows/notes.rst index af4c871dac..b9aef39657 100644 --- a/setup/installer/windows/notes.rst +++ b/setup/installer/windows/notes.rst @@ -36,6 +36,16 @@ Install BeautifulSoup 3.0.x manually into site-packages (3.1.x parses broken HTM Install pywin32 and edit win32com\__init__.py setting _frozen = True and __gen_path__ to a temp dir (otherwise it tries to set it to a dir in the install tree which leads to permission errors) +Note that you should use:: + + import tempfile + __gen_path__ = os.path.join( + tempfile.gettempdir(), "gen_py", + "%d.%d" % (sys.version_info[0], sys.version_info[1])) + +Use gettempdir instead of the win32 api method as gettempdir returns a temp dir that is guaranteed to actually work. + + Also edit win32com\client\gencache.py and change the except IOError on line 57 to catch all exceptions. SQLite From 281058618c072d5e3a8fea24a49d37c3a9b7c325 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 18 Dec 2010 17:52:17 -0700 Subject: [PATCH 26/62] Fix #7955 (Bug with convert in 0.7.34) --- src/calibre/ebooks/rtf/input.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/calibre/ebooks/rtf/input.py b/src/calibre/ebooks/rtf/input.py index 57903a6711..8c7561f68c 100644 --- a/src/calibre/ebooks/rtf/input.py +++ b/src/calibre/ebooks/rtf/input.py @@ -245,7 +245,7 @@ class RTFInput(InputFormatPlugin): from calibre.ebooks.metadata.meta import get_metadata from calibre.ebooks.metadata.opf2 import OPFCreator from calibre.ebooks.rtf2xml.ParseRtf import RtfInvalidCodeException - self.options = options + self.opts = options self.log = log self.log('Converting RTF to XML...') #Name of the preprocesssed RTF file @@ -290,12 +290,12 @@ class RTFInput(InputFormatPlugin): res = transform.tostring(result) res = res[:100].replace('xmlns:html', 'xmlns') + res[100:] # Replace newlines inserted by the 'empty_paragraphs' option in rtf2xml with html blank lines - if not getattr(self.options, 'remove_paragraph_spacing', False): + if not getattr(self.opts, 'remove_paragraph_spacing', False): res = re.sub('\s*', '', res) res = re.sub('(?<=\n)\n{2}', u'

\u00a0

\n'.encode('utf-8'), res) - if self.options.preprocess_html: - preprocessor = PreProcessor(self.options, log=getattr(self, 'log', None)) + if self.opts.preprocess_html: + preprocessor = PreProcessor(self.opts, log=getattr(self, 'log', None)) res = preprocessor(res) f.write(res) self.write_inline_css(inline_class, border_styles) From a202b5bc0e58b03ac4be370301ea4550542a77b9 Mon Sep 17 00:00:00 2001 From: John Schember Date: Sat, 18 Dec 2010 20:17:32 -0500 Subject: [PATCH 27/62] Restore 2.1 features. --- src/calibre/ebooks/fb2/fb2ml.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/calibre/ebooks/fb2/fb2ml.py b/src/calibre/ebooks/fb2/fb2ml.py index 89c12db103..5efc360f1f 100644 --- a/src/calibre/ebooks/fb2/fb2ml.py +++ b/src/calibre/ebooks/fb2/fb2ml.py @@ -297,6 +297,18 @@ class FB2MLizer(object): s_out, s_tags = self.handle_simple_tag('emphasis', tag_stack+tags) fb2_out += s_out tags += s_tags + elif tag in ('del', 'strike'): + s_out, s_tags = self.handle_simple_tag('strikethrough', tag_stack+tags) + fb2_out += s_out + tags += s_tags + elif tag == 'sub': + s_out, s_tags = self.handle_simple_tag('sub', tag_stack+tags) + fb2_out += s_out + tags += s_tags + elif tag == 'sup': + s_out, s_tags = self.handle_simple_tag('sup', tag_stack+tags) + fb2_out += s_out + tags += s_tags # Processes style information. if style['font-style'] == 'italic': @@ -307,6 +319,10 @@ class FB2MLizer(object): s_out, s_tags = self.handle_simple_tag('strong', tag_stack+tags) fb2_out += s_out tags += s_tags + elif style['text-decoration'] == 'line-through': + s_out, s_tags = self.handle_simple_tag('strikethrough', tag_stack+tags) + fb2_out += s_out + tags += s_tags # Process element text. if hasattr(elem_tree, 'text') and elem_tree.text: From 2d9f56ffb9f3899b34cf6355d84ac3a4d6388ac0 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 18 Dec 2010 18:23:33 -0700 Subject: [PATCH 28/62] Fix New England Journal of Medicine and Journal of Hospital Medicine --- resources/recipes/johm.recipe | 84 ++++++++++++++++------------------- resources/recipes/nejm.recipe | 2 +- 2 files changed, 40 insertions(+), 46 deletions(-) diff --git a/resources/recipes/johm.recipe b/resources/recipes/johm.recipe index 6930f05a50..0f5625b806 100644 --- a/resources/recipes/johm.recipe +++ b/resources/recipes/johm.recipe @@ -1,78 +1,72 @@ -# -*- coding: utf-8 -*- - +import re from calibre.web.feeds.recipes import BasicNewsRecipe class JournalofHospitalMedicine(BasicNewsRecipe): title = 'Journal of Hospital Medicine' - __author__ = 'Krittika Goyal' + __author__ = 'Kovid Goyal' description = 'Medical news' timefmt = ' [%d %b, %Y]' needs_subscription = True language = 'en' no_stylesheets = True + keep_only_tags = [dict(id=['articleTitle', 'articleMeta', 'fulltext'])] + remove_tags = [dict(attrs={'class':'licensedContent'})] # TO LOGIN def get_browser(self): br = BasicNewsRecipe.get_browser() br.open('http://www3.interscience.wiley.com/cgi-bin/home') - br.select_form(name='siteLogin') - br['LoginName'] = self.username - br['Password'] = self.password + br.select_form(nr=0) + br['j_username'] = self.username + br['j_password'] = self.password response = br.submit() raw = response.read() - if 'userName = ""' in raw: + if '

LOGGED IN

' not in raw: raise Exception('Login failed. Check your username and password') return br #TO GET ARTICLE TOC def johm_get_index(self): - return self.index_to_soup('http://www3.interscience.wiley.com/journal/111081937/home') + return self.index_to_soup('http://onlinelibrary.wiley.com/journal/10.1002/(ISSN)1553-5606/currentissue') # To parse artice toc def parse_index(self): - parse_soup = self.johm_get_index() - - div = parse_soup.find(id='contentCell') - - current_section = None - current_articles = [] + soup = self.johm_get_index() + toc = soup.find(id='issueTocGroups') feeds = [] - for x in div.findAll(True): - if x.name == 'h4': - # Section heading found - if current_articles and current_section: - feeds.append((current_section, current_articles)) - current_section = self.tag_to_string(x) - current_articles = [] - self.log('\tFound section:', current_section) - if current_section is not None and x.name == 'strong': - title = self.tag_to_string(x) - p = x.parent.parent.find('a', href=lambda x: x and '/HTMLSTART' in x) - if p is None: - continue - url = p.get('href', False) - if not url or not title: + for group in toc.findAll('li', id=re.compile(r'group\d+')): + gtitle = group.find(attrs={'class':'subSectionHeading'}) + if gtitle is None: + continue + gtitle = self.tag_to_string(gtitle) + arts = group.find(attrs={'class':'articles'}) + if arts is None: + continue + self.log('Found section:', gtitle) + articles = [] + for art in arts.findAll(attrs={'class':lambda x: x and 'tocArticle' + in x}): + a = art.find('a', href=True) + if a is None: continue + url = a.get('href') if url.startswith('/'): - url = 'http://www3.interscience.wiley.com'+url - url = url.replace('/HTMLSTART', '/main.html,ftx_abs') - self.log('\t\tFound article:', title) - self.log('\t\t\t', url) - #if url.startswith('/'): - #url = 'http://online.wsj.com'+url - current_articles.append({'title': title, 'url':url, - 'description':'', 'date':''}) - - if current_articles and current_section: - feeds.append((current_section, current_articles)) + url = 'http://onlinelibrary.wiley.com' + url + url = url.replace('/abstract', '/full') + title = self.tag_to_string(a) + a.extract() + pm = art.find(attrs={'class':'productMenu'}) + if pm is not None: + pm.extract() + desc = self.tag_to_string(art) + self.log('\tFound article:', title, 'at', url) + articles.append({'title':title, 'url':url, 'description':desc, + 'date':''}) + if articles: + feeds.append((gtitle, articles)) return feeds - def preprocess_html(self, soup): - for img in soup.findAll('img', src=True): - img['src'] = img['src'].replace('tfig', 'nfig') - return soup - diff --git a/resources/recipes/nejm.recipe b/resources/recipes/nejm.recipe index a6580a5232..bc12fbcedf 100644 --- a/resources/recipes/nejm.recipe +++ b/resources/recipes/nejm.recipe @@ -4,7 +4,7 @@ from calibre.web.feeds.recipes import BasicNewsRecipe class NYTimes(BasicNewsRecipe): title = 'New England Journal of Medicine' - __author__ = 'Krittika Goyal' + __author__ = 'Kovid Goyal' description = 'Medical news' timefmt = ' [%d %b, %Y]' needs_subscription = True From e03114bed4f0153a2f12ec890065409a0d74dd52 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 18 Dec 2010 18:32:14 -0700 Subject: [PATCH 29/62] Fix #7956 (Motorola Droid 2) --- src/calibre/devices/android/driver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/devices/android/driver.py b/src/calibre/devices/android/driver.py index 8b30631528..f2a5752bd4 100644 --- a/src/calibre/devices/android/driver.py +++ b/src/calibre/devices/android/driver.py @@ -28,7 +28,7 @@ class ANDROID(USBMS): # Motorola 0x22b8 : { 0x41d9 : [0x216], 0x2d67 : [0x100], 0x41db : [0x216], - 0x4285 : [0x216]}, + 0x4285 : [0x216], 0x42a3 : [0x216] }, # Sony Ericsson 0xfce : { 0xd12e : [0x0100]}, From 0bc4a7a7f4e1dd72e52ff9adb518ee9eee6091ac Mon Sep 17 00:00:00 2001 From: John Schember Date: Sat, 18 Dec 2010 20:47:12 -0500 Subject: [PATCH 30/62] FB2 Output: Implement bug #7936: Sectionize TOC entries --- src/calibre/ebooks/fb2/fb2ml.py | 102 +++++++++++++++++++++---- src/calibre/ebooks/fb2/output.py | 18 ++--- src/calibre/gui2/convert/fb2_output.py | 4 +- src/calibre/gui2/convert/fb2_output.ui | 32 ++++---- 4 files changed, 113 insertions(+), 43 deletions(-) diff --git a/src/calibre/ebooks/fb2/fb2ml.py b/src/calibre/ebooks/fb2/fb2ml.py index 5efc360f1f..90c88c3cd0 100644 --- a/src/calibre/ebooks/fb2/fb2ml.py +++ b/src/calibre/ebooks/fb2/fb2ml.py @@ -27,13 +27,10 @@ class FB2MLizer(object): ''' Todo: * Include more FB2 specific tags in the conversion. * Handle a tags. - * Figure out some way to turn oeb_book.toc items into
- <p> to allow for readers to generate toc from the document. ''' def __init__(self, log): self.log = log - self.image_hrefs = {} self.reset_state() def reset_state(self): @@ -43,17 +40,25 @@ class FB2MLizer(object): # in different directories. FB2 images are all in a flat layout so we rename all images # into a sequential numbering system to ensure there are no collisions between image names. self.image_hrefs = {} + # Mapping of toc items and their + self.toc = {} + # Used to see whether a new <section> needs to be opened + self.section_level = 0 def extract_content(self, oeb_book, opts): self.log.info('Converting XHTML to FB2 markup...') self.oeb_book = oeb_book self.opts = opts + self.reset_state() + + # Used for adding <section>s and <title>s to allow readers + # to generate toc from the document. + if self.opts.sectionize == 'toc': + self.create_flat_toc(self.oeb_book.toc, 1) return self.fb2mlize_spine() def fb2mlize_spine(self): - self.reset_state() - output = [self.fb2_header()] output.append(self.get_text()) output.append(self.fb2mlize_images()) @@ -66,13 +71,19 @@ class FB2MLizer(object): return u'<?xml version="1.0" encoding="UTF-8"?>' + output def clean_text(self, text): - text = re.sub(r'(?miu)<section>\s*</section>', '', text) - text = re.sub(r'(?miu)\s+</section>', '</section>', text) - text = re.sub(r'(?miu)</section><section>', '</section>\n\n<section>', text) - text = re.sub(r'(?miu)<p>\s*</p>', '', text) - text = re.sub(r'(?miu)\s+</p>', '</p>', text) - text = re.sub(r'(?miu)</p><p>', '</p>\n\n<p>', text) + text = re.sub(r'(?miu)\s*</p>', '</p>', text) + text = re.sub(r'(?miu)</p>\s*<p>', '</p>\n\n<p>', text) + + text = re.sub(r'(?miu)<title>\s*', '', text) + text = re.sub(r'(?miu)\s+', '', text) + + text = re.sub(r'(?miu)
\s*
', '', text) + text = re.sub(r'(?miu)\s*
', '\n', text) + text = re.sub(r'(?miu)\s*', '\n\n', text) + text = re.sub(r'(?miu)\s*
', '\n
', text) + text = re.sub(r'(?miu)
\s*', '
\n', text) + text = re.sub(r'(?miu)
', '
\n\n
', text) if self.opts.insert_blank_line: text = re.sub(r'(?miu)

', '

', text) @@ -144,12 +155,34 @@ class FB2MLizer(object): def get_text(self): text = [''] + + # Create main section if there are no others to create + if self.opts.sectionize == 'nothing': + text.append('
') + self.section_level += 1 + for item in self.oeb_book.spine: self.log.debug('Converting %s to FictionBook2 XML' % item.href) stylizer = Stylizer(item.data, item.href, self.oeb_book, self.opts, self.opts.output_profile) - text.append('
') + + # Start a
if we must sectionize each file or if the TOC references this page + page_section_open = False + if self.opts.sectionize == 'files' or self.toc.get(item.href) == 'page': + text.append('
') + page_section_open = True + self.section_level += 1 + text += self.dump_text(item.data.find(XHTML('body')), stylizer, item) + + if page_section_open: + text.append('
') + self.section_level -= 1 + + # Close any open sections + while self.section_level > 0: text.append('
') + self.section_level -= 1 + return ''.join(text) + '' def fb2mlize_images(self): @@ -184,6 +217,17 @@ class FB2MLizer(object): '%s.' % (item.href, e)) return ''.join(images) + def create_flat_toc(self, nodes, level): + for item in nodes: + href, mid, id = item.href.partition('#') + if not id: + self.toc[href] = 'page' + else: + if not self.toc.get(href, None): + self.toc[href] = {} + self.toc[href][id] = level + self.create_flat_toc(item.nodes, level + 1) + def ensure_p(self): if self.in_p: return [], [] @@ -254,10 +298,38 @@ class FB2MLizer(object): # First tag in tree tag = barename(elem_tree.tag) + # Convert TOC entries to s and add <section>s + if self.opts.sectionize == 'toc': + # A section cannot be a child of any other element than another section, + # so leave the tag alone if there are parents + if not tag_stack: + # There are two reasons to start a new section here: the TOC pointed to + # this page (then we use the first non-<body> on the page as a <title>), or + # the TOC pointed to a specific element + newlevel = 0 + toc_entry = self.toc.get(page.href, None) + if toc_entry == 'page': + if tag != 'body' and hasattr(elem_tree, 'text') and elem_tree.text: + newlevel = 1 + self.toc[page.href] = None + elif toc_entry and elem_tree.attrib.get('id', None): + newlevel = toc_entry.get(elem_tree.attrib.get('id', None), None) + + # Start a new section if necessary + if newlevel: + if not (newlevel > self.section_level): + fb2_out.append('</section>') + self.section_level -= 1 + fb2_out.append('<section>') + self.section_level += 1 + fb2_out.append('<title>') + tags.append('title') + if self.section_level == 0: + # If none of the prior processing made a section, make one now to be FB2 spec compliant + fb2_out.append('<section>') + self.section_level += 1 + # Process the XHTML tag if it needs to be converted to an FB2 tag. - if tag == 'h1' and self.opts.h1_to_title or tag == 'h2' and self.opts.h2_to_title or tag == 'h3' and self.opts.h3_to_title: - fb2_out.append('<title>') - tags.append('title') if tag == 'img': if elem_tree.attrib.get('src', None): # Only write the image tag if it is in the manifest. diff --git a/src/calibre/ebooks/fb2/output.py b/src/calibre/ebooks/fb2/output.py index 33714c6e6e..e8b50d6f77 100644 --- a/src/calibre/ebooks/fb2/output.py +++ b/src/calibre/ebooks/fb2/output.py @@ -16,15 +16,15 @@ class FB2Output(OutputFormatPlugin): file_type = 'fb2' options = set([ - OptionRecommendation(name='h1_to_title', - recommended_value=False, level=OptionRecommendation.LOW, - help=_('Wrap all h1 tags with fb2 title elements.')), - OptionRecommendation(name='h2_to_title', - recommended_value=False, level=OptionRecommendation.LOW, - help=_('Wrap all h2 tags with fb2 title elements.')), - OptionRecommendation(name='h3_to_title', - recommended_value=False, level=OptionRecommendation.LOW, - help=_('Wrap all h3 tags with fb2 title elements.')), + OptionRecommendation(name='sectionize', + recommended_value='files', level=OptionRecommendation.LOW, + choices=['toc', 'files', 'nothing'], + help=_('Specify the sectionization of elements. ' + 'A value of "nothing" turns the book into a single section. ' + 'A value of "files" turns each file into a separate section; use this if your device is having trouble. ' + 'A value of "Table of Contents" turns the entries in the Table of Contents into titles and creates sections; ' + 'if it fails, adjust the "Structure Detection" and/or "Table of Contents" settings ' + '(turn on "Force use of auto-generated Table of Contents).')), ]) def convert(self, oeb_book, output_path, input_plugin, opts, log): diff --git a/src/calibre/gui2/convert/fb2_output.py b/src/calibre/gui2/convert/fb2_output.py index 6b1497a9db..66296ee666 100644 --- a/src/calibre/gui2/convert/fb2_output.py +++ b/src/calibre/gui2/convert/fb2_output.py @@ -17,6 +17,8 @@ class PluginWidget(Widget, Ui_Form): ICON = I('mimetypes/fb2.png') def __init__(self, parent, get_option, get_help, db=None, book_id=None): - Widget.__init__(self, parent, ['h1_to_title', 'h2_to_title', 'h3_to_title']) + Widget.__init__(self, parent, ['sectionize']) self.db, self.book_id = db, book_id + for x in ('toc', 'files', 'nothing'): + self.opt_sectionize.addItem(x) self.initialize_options(get_option, get_help, db, book_id) diff --git a/src/calibre/gui2/convert/fb2_output.ui b/src/calibre/gui2/convert/fb2_output.ui index 436719aed4..891aa29857 100644 --- a/src/calibre/gui2/convert/fb2_output.ui +++ b/src/calibre/gui2/convert/fb2_output.ui @@ -14,7 +14,7 @@ <string>Form</string> </property> <layout class="QGridLayout" name="gridLayout"> - <item row="3" column="0"> + <item row="1" column="0"> <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> @@ -28,23 +28,19 @@ </spacer> </item> <item row="0" column="0"> - <widget class="QCheckBox" name="opt_h1_to_title"> - <property name="text"> - <string>Wrap h1 tags with <title> elements</string> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QCheckBox" name="opt_h2_to_title"> - <property name="text"> - <string>Wrap h2 tags with <title> elements</string> - </property> - </widget> - </item> - <item row="2" column="0"> - <widget class="QCheckBox" name="opt_h3_to_title"> - <property name="text"> - <string>Wrap h3 tags with <title> elements</string> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Sectionize:</string> + </property> + <property name="buddy"> + <cstring>opt_sectionize</cstring> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QComboBox" name="opt_sectionize"> + <property name="minimumContentsLength"> + <number>20</number> </property> </widget> </item> From 19c4afd22212c34a1da81e400806a8d1675c8952 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 19 Dec 2010 09:53:12 +0000 Subject: [PATCH 31/62] Fix #7949: Plug Board vs Series metadata change - bad behavior in 0.7.34 --- src/calibre/ebooks/metadata/book/base.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index f0844e3711..22752ca09e 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -463,6 +463,8 @@ class Metadata(object): other_lang = getattr(other, 'language', None) if other_lang and other_lang.lower() != 'und': self.language = other_lang + if not getattr(self, 'series', None): + self.series_index = None def format_series_index(self, val=None): from calibre.ebooks.metadata import fmt_sidx From fb1c5286ceaab21af850864bbd02a0c9763d9509 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sun, 19 Dec 2010 09:13:10 -0700 Subject: [PATCH 32/62] Fix #7960 (Updated recipe for La Nacion) --- resources/recipes/lanacion.recipe | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/recipes/lanacion.recipe b/resources/recipes/lanacion.recipe index 19f6c1c897..050cb2e79c 100644 --- a/resources/recipes/lanacion.recipe +++ b/resources/recipes/lanacion.recipe @@ -78,4 +78,6 @@ class Lanacion(BasicNewsRecipe): ] def preprocess_html(self, soup): + for item in soup.findAll(style=True): + del item['style'] return self.adeify_images(soup) From d76a416eb2b97708d7f493b6bc82c54ce6f724b0 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sun, 19 Dec 2010 09:54:00 -0700 Subject: [PATCH 33/62] PocketBook 701 driver: Swap the main memory and card drives on windows --- src/calibre/devices/eb600/driver.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/calibre/devices/eb600/driver.py b/src/calibre/devices/eb600/driver.py index bc8b87533c..246b753fa8 100644 --- a/src/calibre/devices/eb600/driver.py +++ b/src/calibre/devices/eb600/driver.py @@ -266,3 +266,12 @@ class POCKETBOOK701(USBMS): VENDOR_NAME = 'ANDROID' WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = '__UMS_COMPOSITE' + def windows_sort_drives(self, drives): + if len(drives) < 2: return drives + main = drives.get('main', None) + carda = drives.get('carda', None) + if main and carda: + drives['main'] = carda + drives['carda'] = main + return drives + From 4f9b1dd20a3f60b38b943434afc24b73662d4244 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sun, 19 Dec 2010 11:16:11 -0700 Subject: [PATCH 34/62] E-book viewer: Remove workaround for font-face rules as QtWebKit supports loading fonts directly as of Qt 4.7 --- src/calibre/ebooks/oeb/iterator.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/calibre/ebooks/oeb/iterator.py b/src/calibre/ebooks/oeb/iterator.py index 10180541a1..6820709b3e 100644 --- a/src/calibre/ebooks/oeb/iterator.py +++ b/src/calibre/ebooks/oeb/iterator.py @@ -257,7 +257,6 @@ class EbookIterator(object): s.max_page = s.start_page + s.pages - 1 self.toc = self.opf.toc - self.find_embedded_fonts() self.read_bookmarks() return self From a5410546c14f4326d5f07da8f82dad0d0f535a3f Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sun, 19 Dec 2010 11:53:06 -0700 Subject: [PATCH 35/62] Fix #7973 (Support for LG Optimus S (LS670) Running Android 2.2.1) --- src/calibre/devices/android/driver.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/calibre/devices/android/driver.py b/src/calibre/devices/android/driver.py index f2a5752bd4..fecfa88ea5 100644 --- a/src/calibre/devices/android/driver.py +++ b/src/calibre/devices/android/driver.py @@ -24,7 +24,7 @@ class ANDROID(USBMS): 0xc92 : [0x100], 0xc97: [0x226]}, # Eken - 0x040d : { 0x8510 : [0x0001] }, + 0x040d : { 0x8510 : [0x0001], 0x0851 : [0x1] }, # Motorola 0x22b8 : { 0x41d9 : [0x216], 0x2d67 : [0x100], 0x41db : [0x216], @@ -49,8 +49,9 @@ class ANDROID(USBMS): # Dell 0x413c : { 0xb007 : [0x0100, 0x0224]}, - # Eken? - 0x040d : { 0x0851 : [0x0001]}, + # LG + 0x1004 : { 0x61cc : [0x100] }, + } EBOOK_DIR_MAIN = ['eBooks/import', 'wordplayer/calibretransfer', 'Books'] EXTRA_CUSTOMIZATION_MESSAGE = _('Comma separated list of directories to ' @@ -59,7 +60,7 @@ class ANDROID(USBMS): EXTRA_CUSTOMIZATION_DEFAULT = ', '.join(EBOOK_DIR_MAIN) VENDOR_NAME = ['HTC', 'MOTOROLA', 'GOOGLE_', 'ANDROID', 'ACER', - 'GT-I5700', 'SAMSUNG', 'DELL', 'LINUX'] + 'GT-I5700', 'SAMSUNG', 'DELL', 'LINUX', 'GOOGLE'] WINDOWS_MAIN_MEM = ['ANDROID_PHONE', 'A855', 'A853', 'INC.NEXUS_ONE', '__UMS_COMPOSITE', '_MB200', 'MASS_STORAGE', '_-_CARD', 'SGH-I897', 'GT-I9000', 'FILE-STOR_GADGET', 'SGH-T959', 'SAMSUNG_ANDROID', From c4ff92af86e14d8627ef58266a69737aaea414a7 Mon Sep 17 00:00:00 2001 From: John Schember <john@nachtimwald.com> Date: Sun, 19 Dec 2010 17:19:30 -0500 Subject: [PATCH 36/62] GUI: Dialog to ask the user where they want to delete selected books from when they are listed on a connected device. --- src/calibre/gui2/actions/delete.py | 27 +++- .../gui2/dialogs/confirm_delete_location.py | 41 +++++++ .../gui2/dialogs/confirm_delete_location.ui | 116 ++++++++++++++++++ src/calibre/gui2/library/views.py | 4 +- 4 files changed, 185 insertions(+), 3 deletions(-) create mode 100644 src/calibre/gui2/dialogs/confirm_delete_location.py create mode 100644 src/calibre/gui2/dialogs/confirm_delete_location.ui diff --git a/src/calibre/gui2/actions/delete.py b/src/calibre/gui2/actions/delete.py index a0f49a7e9a..24dd1d3e5c 100644 --- a/src/calibre/gui2/actions/delete.py +++ b/src/calibre/gui2/actions/delete.py @@ -12,6 +12,7 @@ from PyQt4.Qt import QMenu, QObject, QTimer from calibre.gui2 import error_dialog from calibre.gui2.dialogs.delete_matching_from_device import DeleteMatchingFromDeviceDialog from calibre.gui2.dialogs.confirm_delete import confirm +from calibre.gui2.dialogs.confirm_delete_location import confirm_location from calibre.gui2.actions import InterfaceAction single_shot = partial(QTimer.singleShot, 10) @@ -223,7 +224,31 @@ class DeleteAction(InterfaceAction): rows = view.selectionModel().selectedRows() if not rows or len(rows) == 0: return + # Library view is visible. if self.gui.stack.currentIndex() == 0: + # Ask the user if they want to delete the book from the library or device if it is in both. + if self.gui.device_manager.is_device_connected: + on_device = False + on_device_ids = self._get_selected_ids() + for id in on_device_ids: + res = self.gui.book_on_device(id) + if res[0] or res[1] or res[2]: + on_device = True + if on_device: + break + if on_device: + loc = confirm_location('<p>' + _('Some of the selected books are on the attached device. ' + '<b>Where</b> do you want the selected files deleted from?'), + self.gui) + if not loc: + return + elif loc == 'dev': + self.remove_matching_books_from_device() + return + elif loc == 'both': + self.remove_matching_books_from_device() + # The following will run if the selected books are not on a connected device. + # The user has selected to delete from the library or the device and library. if not confirm('<p>'+_('The selected books will be ' '<b>permanently deleted</b> and the files ' 'removed from your calibre library. Are you sure?') @@ -239,7 +264,7 @@ class DeleteAction(InterfaceAction): else: self.__md = MultiDeleter(self.gui, rows, partial(self.library_ids_deleted, current_row=row)) - + # Device view is visible. else: if not confirm('<p>'+_('The selected books will be ' '<b>permanently deleted</b> ' diff --git a/src/calibre/gui2/dialogs/confirm_delete_location.py b/src/calibre/gui2/dialogs/confirm_delete_location.py new file mode 100644 index 0000000000..58580ad4d8 --- /dev/null +++ b/src/calibre/gui2/dialogs/confirm_delete_location.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python +__license__ = 'GPL v3' +__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' \ + '2010, John Schember <john@nachtimwald.com>' +__docformat__ = 'restructuredtext en' + +from functools import partial + +from calibre.gui2.dialogs.confirm_delete_location_ui import Ui_Dialog +from PyQt4.Qt import QDialog, Qt, QPixmap, QIcon + +class Dialog(QDialog, Ui_Dialog): + + def __init__(self, msg, name, parent): + QDialog.__init__(self, parent) + self.setupUi(self) + + self.loc = None + self.msg.setText(msg) + self.name = name + self.buttonBox.setFocus(Qt.OtherFocusReason) + self.button_lib.clicked.connect(partial(self.set_loc, 'lib')) + self.button_device.clicked.connect(partial(self.set_loc, 'dev')) + self.button_both.clicked.connect(partial(self.set_loc, 'both')) + + def set_loc(self, loc): + self.loc = loc + self.accept() + + def choice(self): + return self.loc + + +def confirm_location(msg, name, parent=None, pixmap='dialog_warning.png'): + d = Dialog(msg, name, parent) + d.label.setPixmap(QPixmap(I(pixmap))) + d.setWindowIcon(QIcon(I(pixmap))) + d.resize(d.sizeHint()) + if d.exec_() == d.Accepted: + return d.choice() + return None diff --git a/src/calibre/gui2/dialogs/confirm_delete_location.ui b/src/calibre/gui2/dialogs/confirm_delete_location.ui new file mode 100644 index 0000000000..70d6bc631b --- /dev/null +++ b/src/calibre/gui2/dialogs/confirm_delete_location.ui @@ -0,0 +1,116 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>Dialog</class> + <widget class="QDialog" name="Dialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>459</width> + <height>300</height> + </rect> + </property> + <property name="windowTitle"> + <string>Where do you want to delete from?</string> + </property> + <property name="windowIcon"> + <iconset> + <normaloff>:/images/dialog_warning.png</normaloff>:/images/dialog_warning.png</iconset> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLabel" name="label"> + <property name="pixmap"> + <pixmap>:/images/dialog_warning.png</pixmap> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="msg"> + <property name="text"> + <string>TextLabel</string> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </item> + <item row="1" column="0"> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QPushButton" name="button_lib"> + <property name="text"> + <string>Library</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="button_device"> + <property name="text"> + <string>Device</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="button_both"> + <property name="text"> + <string>Library and Device</string> + </property> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel</set> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + <resources> + <include location="../../../../resources/images.qrc"/> + </resources> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>Dialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>Dialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/calibre/gui2/library/views.py b/src/calibre/gui2/library/views.py index 0e0cc0eec2..a6285c6656 100644 --- a/src/calibre/gui2/library/views.py +++ b/src/calibre/gui2/library/views.py @@ -123,8 +123,8 @@ class BooksView(QTableView): # {{{ elif action == 'show': h.setSectionHidden(idx, False) if h.sectionSize(idx) < 3: - sz = h.sectionSizeHint(idx) - h.resizeSection(idx, sz) + sz = h.sectionSizeHint(idx) + h.resizeSection(idx, sz) elif action == 'ascending': self.sortByColumn(idx, Qt.AscendingOrder) elif action == 'descending': From 7bc9608367f528632be7cf589878e26a4259a5c4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sun, 19 Dec 2010 17:41:12 -0700 Subject: [PATCH 37/62] Fix #7966 (Request for Samsung Galaxy Tab Support) --- src/calibre/devices/android/driver.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/calibre/devices/android/driver.py b/src/calibre/devices/android/driver.py index fecfa88ea5..492b00617d 100644 --- a/src/calibre/devices/android/driver.py +++ b/src/calibre/devices/android/driver.py @@ -64,9 +64,9 @@ class ANDROID(USBMS): WINDOWS_MAIN_MEM = ['ANDROID_PHONE', 'A855', 'A853', 'INC.NEXUS_ONE', '__UMS_COMPOSITE', '_MB200', 'MASS_STORAGE', '_-_CARD', 'SGH-I897', 'GT-I9000', 'FILE-STOR_GADGET', 'SGH-T959', 'SAMSUNG_ANDROID', - 'SCH-I500_CARD', 'SPH-D700_CARD', 'MB810'] + 'SCH-I500_CARD', 'SPH-D700_CARD', 'MB810', 'GT-P1000'] WINDOWS_CARD_A_MEM = ['ANDROID_PHONE', 'GT-I9000_CARD', 'SGH-I897', - 'FILE-STOR_GADGET', 'SGH-T959', 'SAMSUNG_ANDROID'] + 'FILE-STOR_GADGET', 'SGH-T959', 'SAMSUNG_ANDROID', 'GT-P1000_CARD'] OSX_MAIN_MEM = 'HTC Android Phone Media' From ff466758af508b73259c8ea037339229e057b498 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sun, 19 Dec 2010 17:46:00 -0700 Subject: [PATCH 38/62] ... --- src/calibre/devices/misc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/devices/misc.py b/src/calibre/devices/misc.py index 68f4dba9a9..52952356f8 100644 --- a/src/calibre/devices/misc.py +++ b/src/calibre/devices/misc.py @@ -104,7 +104,7 @@ class PDNOVEL(USBMS): VENDOR_NAME = 'ANDROID' WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = '__UMS_COMPOSITE' - THUMBNAIL_HEIGHT = 144 + THUMBNAIL_HEIGHT = 130 EBOOK_DIR_MAIN = 'eBooks' SUPPORTS_SUB_DIRS = False From 9582cded9d429a86cba155ded434b32e78a3a5aa Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sun, 19 Dec 2010 18:57:11 -0700 Subject: [PATCH 39/62] More work on the comments editor --- imgsrc/{edit_copy.svg => edit-copy.svg} | 0 imgsrc/edit-cut.svg | 831 +++++ imgsrc/edit-paste.svg | 3302 +++++++++++++++++ imgsrc/swap.svg | 722 ---- .../images/{edit_copy.png => edit-copy.png} | Bin resources/images/edit-cut.png | Bin 0 -> 11657 bytes resources/images/edit-paste.png | Bin 0 -> 4949 bytes resources/images/edit-redo.png | Bin 0 -> 3383 bytes resources/images/edit-undo.png | Bin 0 -> 1986 bytes resources/images/format-text-subscript.png | Bin 0 -> 7332 bytes resources/images/format-text-superscript.png | Bin 0 -> 7279 bytes resources/images/swap.png | Bin 13638 -> 10850 bytes src/calibre/gui2/comments_editor.py | 64 +- src/calibre/gui2/viewer/main.ui | 2 +- 14 files changed, 4183 insertions(+), 738 deletions(-) rename imgsrc/{edit_copy.svg => edit-copy.svg} (100%) create mode 100644 imgsrc/edit-cut.svg create mode 100644 imgsrc/edit-paste.svg delete mode 100644 imgsrc/swap.svg rename resources/images/{edit_copy.png => edit-copy.png} (100%) create mode 100644 resources/images/edit-cut.png create mode 100644 resources/images/edit-paste.png create mode 100644 resources/images/edit-redo.png create mode 100644 resources/images/edit-undo.png create mode 100644 resources/images/format-text-subscript.png create mode 100644 resources/images/format-text-superscript.png diff --git a/imgsrc/edit_copy.svg b/imgsrc/edit-copy.svg similarity index 100% rename from imgsrc/edit_copy.svg rename to imgsrc/edit-copy.svg diff --git a/imgsrc/edit-cut.svg b/imgsrc/edit-cut.svg new file mode 100644 index 0000000000..f078b52e04 --- /dev/null +++ b/imgsrc/edit-cut.svg @@ -0,0 +1,831 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="128" + height="128" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.45.1" + version="1.0" + sodipodi:docbase="/home/david/Oxygen/trunk/scalable/actions" + sodipodi:docname="edit-cut.svgz" + inkscape:output_extension="org.inkscape.output.svgz.inkscape" + inkscape:export-filename="edit-cut.png" + inkscape:export-xdpi="22.5" + inkscape:export-ydpi="22.5"> + <defs + id="defs4"> + <linearGradient + inkscape:collect="always" + id="linearGradient4792"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop4794" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop4796" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient4758"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop4760" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop4762" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient4722"> + <stop + style="stop-color:#dfdfdf;stop-opacity:1" + offset="0" + id="stop4724" /> + <stop + style="stop-color:#606060;stop-opacity:1" + offset="1" + id="stop4726" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient4635"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop4637" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop4639" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient4618"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop4620" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop4622" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient4488"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop4490" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop4492" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient4445"> + <stop + style="stop-color:#606060;stop-opacity:1" + offset="0" + id="stop4447" /> + <stop + style="stop-color:#343434;stop-opacity:1" + offset="1" + id="stop4449" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient4253"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop4255" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop4257" /> + </linearGradient> + <linearGradient + id="linearGradient3792" + inkscape:collect="always"> + <stop + id="stop3794" + offset="0" + style="stop-color:#ffffff;stop-opacity:1" /> + <stop + id="stop3796" + offset="1" + style="stop-color:#e7e7e7;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3631"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop3633" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop3635" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3475"> + <stop + style="stop-color:#eeeeee;stop-opacity:1;" + offset="0" + id="stop3477" /> + <stop + style="stop-color:#cbcbcb;stop-opacity:1" + offset="1" + id="stop3479" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3467"> + <stop + style="stop-color:#e8e8e8;stop-opacity:1" + offset="0" + id="stop3469" /> + <stop + style="stop-color:#888888;stop-opacity:0.53714287" + offset="1" + id="stop3471" /> + </linearGradient> + <linearGradient + id="linearGradient3176" + inkscape:collect="always"> + <stop + id="stop3178" + offset="0" + style="stop-color:#323232;stop-opacity:1;" /> + <stop + id="stop3180" + offset="1" + style="stop-color:#000000;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3176" + id="linearGradient3516" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.7547529,-0.4357568,0.4357568,0.7547529,-12.315637,39.880442)" + x1="63.245899" + y1="107.23933" + x2="58.32019" + y2="107.5107" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3176" + id="linearGradient3518" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.7547529,-0.4357568,0.4357568,0.7547529,-12.315636,39.008928)" + x1="69.501228" + y1="109.56824" + x2="56.484062" + y2="117.84955" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3176" + id="linearGradient3520" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.5000017,0.8660252)" + x1="63.245899" + y1="107.23933" + x2="58.32019" + y2="107.5107" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3176" + id="linearGradient3522" + gradientUnits="userSpaceOnUse" + x1="69.501228" + y1="109.56824" + x2="56.484062" + y2="117.84955" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3475" + id="linearGradient3524" + gradientUnits="userSpaceOnUse" + x1="62.646275" + y1="53.750923" + x2="52.066586" + y2="53.750923" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3176" + id="linearGradient3526" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.5000017,0.8660252)" + x1="63.245899" + y1="107.23933" + x2="58.32019" + y2="107.5107" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3467" + id="linearGradient3530" + gradientUnits="userSpaceOnUse" + x1="63.553711" + y1="16.056862" + x2="63.553711" + y2="63.136379" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3467" + id="linearGradient3609" + gradientUnits="userSpaceOnUse" + x1="63.553711" + y1="16.056862" + x2="63.553711" + y2="63.136379" + gradientTransform="matrix(0.8715135,3.655296e-8,-3.655296e-8,0.8715135,8.2476912,8.4795979)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3176" + id="linearGradient3614" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.7547529,-0.4357568,0.4357568,0.7547529,-12.315637,39.880442)" + x1="63.245899" + y1="107.23933" + x2="58.32019" + y2="107.5107" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3792" + id="linearGradient3617" + gradientUnits="userSpaceOnUse" + x1="62.646275" + y1="53.750923" + x2="52.066586" + y2="53.750923" + gradientTransform="matrix(0.8513047,-0.4911732,0.4915009,0.850737,-22.138279,32.363934)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3176" + id="linearGradient3625" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.7547529,-0.4357568,0.4357568,0.7547529,-12.315637,39.880442)" + x1="63.245899" + y1="107.23933" + x2="58.32019" + y2="107.5107" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3176" + id="linearGradient3627" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.7547529,-0.4357568,0.4357568,0.7547529,-12.315636,39.008928)" + x1="69.501228" + y1="109.56824" + x2="56.484062" + y2="117.84955" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3631" + id="linearGradient3637" + x1="61.911907" + y1="72.456772" + x2="59.719414" + y2="73.709625" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.8541426,0,0,1.8529064,-52.138638,-62.025773)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3631" + id="linearGradient3641" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-5.0049887,0.680543,-0.6885831,-4.9465506,418.08891,395.15615)" + x1="61.911907" + y1="72.456772" + x2="59.719414" + y2="73.709625" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3467" + id="linearGradient3644" + gradientUnits="userSpaceOnUse" + x1="63.553711" + y1="16.056862" + x2="63.553711" + y2="63.136379" + gradientTransform="matrix(-0.8715135,3.655296e-8,3.655296e-8,0.8715135,120.39367,8.4795979)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3176" + id="linearGradient3649" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.7547529,-0.4357568,-0.4357568,0.7547529,140.957,39.880442)" + x1="63.245899" + y1="107.23933" + x2="58.32019" + y2="107.5107" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3475" + id="linearGradient3652" + gradientUnits="userSpaceOnUse" + x1="62.646275" + y1="53.750923" + x2="52.066586" + y2="53.750923" + gradientTransform="matrix(-0.7547529,-0.4357568,-0.4357568,0.7547529,140.957,39.008928)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3176" + id="linearGradient3655" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.7547529,-0.4357568,-0.4357568,0.7547529,140.957,38.380442)" + x1="63.245899" + y1="107.23933" + x2="58.32019" + y2="107.5107" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3176" + id="linearGradient3657" + gradientUnits="userSpaceOnUse" + x1="69.501228" + y1="109.56824" + x2="56.484062" + y2="117.84955" + gradientTransform="matrix(-0.7547529,-0.4357568,-0.4357568,0.7547529,140.957,37.508928)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3176" + id="linearGradient3669" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.7547529,-0.4357568,0.4357568,0.7547529,-12.315637,39.880442)" + x1="63.245899" + y1="107.23933" + x2="58.32019" + y2="107.5107" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3176" + id="linearGradient3671" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.7547529,-0.4357568,0.4357568,0.7547529,-12.315636,39.008928)" + x1="69.501228" + y1="109.56824" + x2="56.484062" + y2="117.84955" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3792" + id="linearGradient3802" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.8513047,-0.4911732,-0.4915009,0.850737,150.74175,32.363934)" + x1="62.646275" + y1="53.750923" + x2="52.066586" + y2="53.750923" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3176" + id="linearGradient3838" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.7547529,-0.4357568,-0.4357568,0.7547529,140.957,40.880442)" + x1="63.245899" + y1="107.23933" + x2="58.32019" + y2="107.5107" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3176" + id="linearGradient3847" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.7547529,-0.4357568,0.4357568,0.7547529,-12.013047,38.380442)" + x1="63.245899" + y1="107.23933" + x2="58.32019" + y2="107.5107" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3176" + id="linearGradient3849" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.7547529,-0.4357568,0.4357568,0.7547529,-12.013047,37.508928)" + x1="69.501228" + y1="109.56824" + x2="56.484062" + y2="117.84955" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3176" + id="linearGradient3881" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.7547529,-0.4357568,-0.4357568,0.7547529,140.957,37.508928)" + x1="69.501228" + y1="109.56824" + x2="56.484062" + y2="117.84955" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3176" + id="linearGradient3887" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.7547529,-0.4357568,0.4357568,0.7547529,-12.013047,37.508928)" + x1="69.501228" + y1="109.56824" + x2="56.484062" + y2="117.84955" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3176" + id="linearGradient4006" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.8513047,-0.4911732,-0.4915009,0.850737,150.74175,33.346282)" + x1="63.245899" + y1="107.23933" + x2="58.32019" + y2="107.5107" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3176" + id="linearGradient4085" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.8513047,-0.4911732,-0.4915009,0.850737,149.24175,36.346282)" + x1="63.245899" + y1="107.23933" + x2="58.32019" + y2="107.5107" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3176" + id="linearGradient4087" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.8513047,-0.4911732,-0.4915009,0.850737,150.74175,33.346282)" + x1="63.245899" + y1="107.23933" + x2="58.32019" + y2="107.5107" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3792" + id="linearGradient4250" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.8513047,-0.4911732,-0.4915009,0.850737,150.74175,32.363934)" + x1="62.646275" + y1="53.750923" + x2="52.066586" + y2="53.750923" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4253" + id="linearGradient4259" + x1="65.414917" + y1="63.2187" + x2="71.566734" + y2="58.624897" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4445" + id="linearGradient4443" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.8513046,-0.4911732,0.4915009,0.850737,-21.796979,30.673174)" + x1="66.410789" + y1="111.09748" + x2="56.771309" + y2="111.40427" /> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath4455"> + <path + style="fill:#343434;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 75.1875,70.0625 C 74.330819,70.112586 73.601545,70.703549 73.375,71.53125 L 71.21875,79.59375 C 71.09204,80.103085 71.170605,80.641816 71.4375,81.09375 L 89.625,112.5625 C 91.972816,116.62633 95.167933,119.72417 98.625,121.46875 C 102.08207,123.21333 105.97364,123.61751 109.15625,121.78125 C 112.33881,119.94502 113.935,116.36699 114.15625,112.5 C 114.3775,108.63301 113.28602,104.31505 110.9375,100.25 C 108.5891,96.185153 105.39577,93.080216 101.9375,91.34375 C 98.479225,89.607284 94.586162,89.2278 91.40625,91.0625 C 90.654039,91.496499 90.578013,91.480641 90,91.1875 C 89.421987,90.894359 88.429852,89.981353 87.25,88.34375 C 84.890296,85.068543 81.724299,79.185679 77.03125,71.0625 C 76.654739,70.40782 75.941586,70.021025 75.1875,70.0625 z M 97.9375,99.03125 C 99.847583,98.899901 103.29363,100.88292 105.4375,104.59375 C 106.75724,106.8781 107.33023,109.26773 107.25,111.125 C 107.16977,112.98227 106.50165,114.13243 105.59375,114.65625 C 104.68591,115.18004 103.39934,115.17251 101.75,114.3125 C 100.10066,113.45249 98.288767,111.75356 96.96875,109.46875 C 95.649001,107.18439 95.076021,104.76352 95.15625,102.90625 C 95.236479,101.04898 95.873353,99.898826 96.78125,99.375 C 97.154526,99.159631 97.520851,99.0599 97.9375,99.03125 z " + id="path4457" + sodipodi:nodetypes="cccccsssssssscccsssssssc" /> + </clipPath> + <filter + inkscape:collect="always" + id="filter4475"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="0.47498194" + id="feGaussianBlur4477" /> + </filter> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4488" + id="linearGradient4494" + x1="100.23751" + y1="84.952927" + x2="115.33315" + y2="111.09933" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.1304268,0,0,1.1304268,-12.155804,-11.996273)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4445" + id="linearGradient4572" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.8513046,-0.4911732,-0.4915009,0.850737,150.64081,30.673174)" + x1="66.410789" + y1="111.09748" + x2="56.771309" + y2="111.40427" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4488" + id="linearGradient4574" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.1304268,0,0,1.1304268,140.99964,-11.996273)" + x1="100.23751" + y1="84.952927" + x2="115.33315" + y2="111.09933" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4618" + id="linearGradient4624" + x1="39.66201" + y1="99.394554" + x2="32.5625" + y2="108.58216" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.7874752,0.1143529,-0.1388531,-0.6485276,62.315135,175.57221)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4445" + id="linearGradient4630" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.8513046,-0.4911732,-0.4915009,0.850737,150.14081,34.173174)" + x1="66.410789" + y1="111.09748" + x2="56.771309" + y2="111.40427" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4445" + id="linearGradient4632" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.8513046,-0.4911732,-0.4915009,0.850737,150.64081,30.673174)" + x1="66.410789" + y1="111.09748" + x2="56.771309" + y2="111.40427" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4635" + id="linearGradient4641" + x1="24.636236" + y1="118.53715" + x2="24.636236" + y2="110.80067" + gradientUnits="userSpaceOnUse" /> + <filter + inkscape:collect="always" + id="filter4691"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="0.41898454" + id="feGaussianBlur4693" /> + </filter> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4635" + id="linearGradient4701" + gradientUnits="userSpaceOnUse" + x1="24.636236" + y1="118.53715" + x2="24.636236" + y2="110.80067" /> + <filter + inkscape:collect="always" + id="filter4711"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="0.71627592" + id="feGaussianBlur4713" /> + </filter> + <filter + inkscape:collect="always" + id="filter4715"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="0.71627592" + id="feGaussianBlur4717" /> + </filter> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4722" + id="radialGradient4728" + cx="66" + cy="54" + fx="66.495979" + fy="53.140942" + r="2" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.0315502,-0.5959631,0.5955656,1.0308618,-34.242853,37.667027)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4758" + id="linearGradient4764" + x1="51.619904" + y1="81.644371" + x2="46.564438" + y2="99.975533" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(3.132137,-2.5057096)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4792" + id="linearGradient4798" + x1="64.46875" + y1="67.044975" + x2="65.410522" + y2="80.970673" + gradientUnits="userSpaceOnUse" /> + <filter + inkscape:collect="always" + id="filter4821"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="0.98653907" + id="feGaussianBlur4823" /> + </filter> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="4.7890625" + inkscape:cx="64" + inkscape:cy="64" + inkscape:document-units="px" + inkscape:current-layer="g3690" + width="128px" + height="128px" + showgrid="false" + gridspacingx="2px" + gridspacingy="2px" + gridempspacing="4" + inkscape:grid-points="true" + showborder="false" + borderlayer="false" + inkscape:showpageshadow="false" + inkscape:window-width="794" + inkscape:window-height="730" + inkscape:window-x="0" + inkscape:window-y="0" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g3690"> + <path + style="opacity:0.5;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4798);stroke-width:3.54751818;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4821)" + d="M 35.28125,14.46875 C 34.326418,15.020173 34.451101,16.184543 34.6875,16.78125 C 41.824923,35.39161 48.223262,52.347787 58.15625,70.75 L 56.625,73.21875 C 56.244936,72.547795 55.487111,72.144016 54.6875,72.21875 C 54.034234,72.275803 53.450423,72.649442 53.125,73.21875 C 48.962268,80.428813 46.167367,85.651204 44.09375,88.53125 C 43.056941,89.971273 42.203917,90.769641 41.75,91 C 41.296083,91.230359 41.306883,91.263851 40.6875,90.90625 C 37.787275,89.231804 34.269689,89.591888 31.15625,91.15625 C 28.042811,92.720612 25.164593,95.484072 23.0625,99.125 C 20.960291,102.76613 19.988354,106.64212 20.1875,110.125 C 20.386646,113.60788 21.847132,116.85528 24.75,118.53125 C 27.652918,120.20725 31.200269,119.82161 34.3125,118.25 C 37.424731,116.67839 40.273497,113.92116 42.375,110.28125 L 58.5,82.34375 C 58.674659,82.047999 58.772646,81.71253 58.78125,81.375 C 60.494006,80.173524 62.436255,79.043092 64.3125,78.25 C 66.301575,79.090643 68.394793,80.309785 70.1875,81.59375 C 70.216655,81.858831 70.304417,82.106865 70.4375,82.34375 L 86.5625,110.28125 C 88.664002,113.92116 91.544019,116.67839 94.65625,118.25 C 97.768481,119.82161 101.28458,120.20725 104.1875,118.53125 C 107.09037,116.85528 108.55085,113.60788 108.75,110.125 C 108.94915,106.64212 107.97721,102.76613 105.875,99.125 C 103.77291,95.484072 100.89469,92.720612 97.78125,91.15625 C 94.667811,89.591888 91.150225,89.231804 88.25,90.90625 C 87.630617,91.263851 87.641417,91.230359 87.1875,91 C 86.733583,90.769641 85.880559,89.971273 84.84375,88.53125 C 82.770133,85.651204 79.975232,80.428813 75.8125,73.21875 C 75.435989,72.56407 74.722836,72.177275 73.96875,72.21875 C 73.178739,72.268279 72.494718,72.772672 72.21875,73.5 L 70.5,70.75 C 80.43299,52.347791 86.83133,35.391608 93.96875,16.78125 C 94.205146,16.184543 94.329835,15.020174 93.375,14.46875 L 64.3125,60.875 L 35.28125,14.46875 z M 34.78125,98.375 C 35.1163,98.398055 35.384215,98.481147 35.6875,98.65625 C 36.408735,99.072656 36.962348,100.02888 37.03125,101.625 C 37.100152,103.22112 36.619402,105.28826 35.46875,107.28125 C 34.317829,109.27471 32.759661,110.76121 31.34375,111.5 C 29.927839,112.23879 28.846185,112.22887 28.125,111.8125 C 27.40377,111.3961 26.850153,110.47112 26.78125,108.875 C 26.712347,107.27888 27.193102,105.18048 28.34375,103.1875 C 30.21285,99.950123 33.224696,98.267893 34.78125,98.375 z M 94.15625,98.375 C 95.712802,98.267893 98.724654,99.950125 100.59375,103.1875 C 101.7444,105.18048 102.22515,107.27888 102.15625,108.875 C 102.08735,110.47112 101.56498,111.3961 100.84375,111.8125 C 100.12257,112.22887 99.04091,112.23879 97.625,111.5 C 96.20909,110.76121 94.650922,109.27471 93.5,107.28125 C 92.349349,105.28826 91.837348,103.22112 91.90625,101.625 C 91.975152,100.02888 92.528765,99.072656 93.25,98.65625 C 93.553281,98.48115 93.8212,98.398055 94.15625,98.375 z " + id="path3483" + transform="matrix(1.1279249,0,0,1.1271729,-8.2471649,-11.605871)" /> + <path + sodipodi:nodetypes="cccccsssssssscccsssssssc" + id="path4566" + d="M 53.65633,70.0625 C 54.51301,70.112586 55.24229,70.703549 55.46883,71.53125 L 57.62508,79.59375 C 57.75179,80.103085 57.67323,80.641816 57.40633,81.09375 L 39.218832,112.5625 C 36.871016,116.62633 33.675899,119.72417 30.218832,121.46875 C 26.761762,123.21333 22.870192,123.61751 19.687582,121.78125 C 16.505022,119.94502 14.908832,116.36699 14.687582,112.5 C 14.466332,108.63301 15.557812,104.31505 17.906332,100.25 C 20.254732,96.185153 23.448062,93.080216 26.906332,91.34375 C 30.364607,89.607284 34.25767,89.2278 37.437582,91.0625 C 38.189793,91.496499 38.265819,91.480641 38.843832,91.1875 C 39.421845,90.894359 40.41398,89.981353 41.593832,88.34375 C 43.95354,85.068543 47.11953,79.185679 51.81258,71.0625 C 52.18909,70.40782 52.90225,70.021025 53.65633,70.0625 z M 30.906332,99.03125 C 28.996249,98.899901 25.550202,100.88292 23.406332,104.59375 C 22.086592,106.8781 21.513602,109.26773 21.593832,111.125 C 21.674062,112.98227 22.342182,114.13243 23.250082,114.65625 C 24.157922,115.18004 25.444492,115.17251 27.093832,114.3125 C 28.743172,113.45249 30.555065,111.75356 31.875082,109.46875 C 33.194831,107.18439 33.767811,104.76352 33.687582,102.90625 C 33.607353,101.04898 32.970479,99.898826 32.062582,99.375 C 31.689306,99.159631 31.322981,99.0599 30.906332,99.03125 z " + style="fill:url(#linearGradient4572);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccscssssccsssscc" + id="path4568" + d="M 55.65241,70.312928 C 56.57508,70.366873 57.35134,71.011135 57.59533,71.902591 L 57.66599,72.185197 C 57.29393,71.760421 56.80725,71.477828 56.21763,71.443355 C 55.40545,71.398686 54.60957,71.798027 54.20405,72.50313 C 49.14952,81.252005 45.75918,87.592357 43.217718,91.119846 C 41.946986,92.883587 40.872884,93.877473 40.250348,94.193194 C 39.627813,94.508912 39.541489,94.519318 38.731337,94.051891 C 35.306492,92.075871 31.1164,92.499608 27.391742,94.369823 C 23.667082,96.240042 20.241732,99.5652 17.712462,103.94313 L 17.147252,102.8127 C 19.676522,98.434769 23.101862,95.109615 26.826532,93.239397 C 30.551186,91.369181 34.741278,90.945444 38.166123,92.921464 C 38.976275,93.388891 39.062599,93.378485 39.685134,93.062767 C 40.307671,92.747046 41.381773,91.75316 42.652505,89.989419 C 45.19396,86.461931 48.58431,80.121578 53.63884,71.372703 C 54.04436,70.667601 54.84024,70.268259 55.65241,70.312928 z " + style="opacity:0.77227723;fill:url(#linearGradient4574);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + clip-path="url(#clipPath4455)" + style="opacity:0.70297032;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4475)" + d="M 75.1875,70.0625 C 74.330819,70.112586 73.601545,70.703549 73.375,71.53125 L 71.21875,79.59375 C 71.09204,80.103085 71.170605,80.641816 71.4375,81.09375 L 89.625,112.5625 C 91.972816,116.62633 95.167933,119.72417 98.625,121.46875 C 102.08207,123.21333 105.97364,123.61751 109.15625,121.78125 C 112.33881,119.94502 113.935,116.36699 114.15625,112.5 C 114.3775,108.63301 113.28602,104.31505 110.9375,100.25 C 108.5891,96.185153 105.39577,93.080216 101.9375,91.34375 C 98.479225,89.607284 94.586162,89.2278 91.40625,91.0625 C 90.654039,91.496499 90.578013,91.480641 90,91.1875 C 89.421987,90.894359 88.429852,89.981353 87.25,88.34375 C 84.890296,85.068543 81.724299,79.185679 77.03125,71.0625 C 76.654739,70.40782 75.941586,70.021025 75.1875,70.0625 z M 97.9375,99.03125 C 99.847583,98.899901 103.29363,100.88292 105.4375,104.59375 C 106.75724,106.8781 107.33023,109.26773 107.25,111.125 C 107.16977,112.98227 106.50165,114.13243 105.59375,114.65625 C 104.68591,115.18004 103.39934,115.17251 101.75,114.3125 C 100.10066,113.45249 98.288767,111.75356 96.96875,109.46875 C 95.649001,107.18439 95.076021,104.76352 95.15625,102.90625 C 95.236479,101.04898 95.873353,99.898826 96.78125,99.375 C 97.154526,99.159631 97.520851,99.0599 97.9375,99.03125 z " + id="path4570" + sodipodi:nodetypes="cccccsssssssscccsssssssc" + transform="matrix(-1,0,0,1,128.84383,0)" /> + <path + style="fill:url(#linearGradient4443);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:3.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 75.1875,70.0625 C 74.330819,70.112586 73.601545,70.703549 73.375,71.53125 L 71.21875,79.59375 C 71.09204,80.103085 71.170605,80.641816 71.4375,81.09375 L 89.625,112.5625 C 91.972816,116.62633 95.167933,119.72417 98.625,121.46875 C 102.08207,123.21333 105.97364,123.61751 109.15625,121.78125 C 112.33881,119.94502 113.935,116.36699 114.15625,112.5 C 114.3775,108.63301 113.28602,104.31505 110.9375,100.25 C 108.5891,96.185153 105.39577,93.080216 101.9375,91.34375 C 98.479225,89.607284 94.586162,89.2278 91.40625,91.0625 C 90.654039,91.496499 90.578013,91.480641 90,91.1875 C 89.421987,90.894359 88.429852,89.981353 87.25,88.34375 C 84.890296,85.068543 81.724299,79.185679 77.03125,71.0625 C 76.654739,70.40782 75.941586,70.021025 75.1875,70.0625 z M 97.9375,99.03125 C 99.847583,98.899901 103.29363,100.88292 105.4375,104.59375 C 106.75724,106.8781 107.33023,109.26773 107.25,111.125 C 107.16977,112.98227 106.50165,114.13243 105.59375,114.65625 C 104.68591,115.18004 103.39934,115.17251 101.75,114.3125 C 100.10066,113.45249 98.288767,111.75356 96.96875,109.46875 C 95.649001,107.18439 95.076021,104.76352 95.15625,102.90625 C 95.236479,101.04898 95.873353,99.898826 96.78125,99.375 C 97.154526,99.159631 97.520851,99.0599 97.9375,99.03125 z " + id="path3845" + sodipodi:nodetypes="cccccsssssssscccsssssssc" /> + <path + style="opacity:0.77227723;fill:url(#linearGradient4494);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 73.191419,70.312928 C 72.268749,70.366873 71.492489,71.011135 71.248498,71.902591 L 71.177846,72.185197 C 71.549903,71.760421 72.036582,71.477828 72.626206,71.443355 C 73.438379,71.398686 74.234264,71.798027 74.639778,72.50313 C 79.694311,81.252005 83.084654,87.592357 85.626114,91.119846 C 86.896846,92.883587 87.970948,93.877473 88.593484,94.193194 C 89.216019,94.508912 89.302343,94.519318 90.112495,94.051891 C 93.53734,92.075871 97.727432,92.499608 101.45209,94.369823 C 105.17675,96.240042 108.6021,99.5652 111.13137,103.94313 L 111.69658,102.8127 C 109.16731,98.434769 105.74197,95.109615 102.0173,93.239397 C 98.292646,91.369181 94.102554,90.945444 90.677709,92.921464 C 89.867557,93.388891 89.781233,93.378485 89.158698,93.062767 C 88.536161,92.747046 87.462059,91.75316 86.191327,89.989419 C 83.649868,86.461931 80.259524,80.121578 75.204992,71.372703 C 74.799477,70.667601 74.003592,70.268259 73.191419,70.312928 z " + id="path4479" + sodipodi:nodetypes="cccscssssccsssscc" /> + <path + sodipodi:nodetypes="cccccsssssssscccsssssssc" + id="path4451" + d="M 75.1875,70.0625 C 74.330819,70.112586 73.601545,70.703549 73.375,71.53125 L 71.21875,79.59375 C 71.09204,80.103085 71.170605,80.641816 71.4375,81.09375 L 89.625,112.5625 C 91.972816,116.62633 95.167933,119.72417 98.625,121.46875 C 102.08207,123.21333 105.97364,123.61751 109.15625,121.78125 C 112.33881,119.94502 113.935,116.36699 114.15625,112.5 C 114.3775,108.63301 113.28602,104.31505 110.9375,100.25 C 108.5891,96.185153 105.39577,93.080216 101.9375,91.34375 C 98.479225,89.607284 94.586162,89.2278 91.40625,91.0625 C 90.654039,91.496499 90.578013,91.480641 90,91.1875 C 89.421987,90.894359 88.429852,89.981353 87.25,88.34375 C 84.890296,85.068543 81.724299,79.185679 77.03125,71.0625 C 76.654739,70.40782 75.941586,70.021025 75.1875,70.0625 z M 97.9375,99.03125 C 99.847583,98.899901 103.29363,100.88292 105.4375,104.59375 C 106.75724,106.8781 107.33023,109.26773 107.25,111.125 C 107.16977,112.98227 106.50165,114.13243 105.59375,114.65625 C 104.68591,115.18004 103.39934,115.17251 101.75,114.3125 C 100.10066,113.45249 98.288767,111.75356 96.96875,109.46875 C 95.649001,107.18439 95.076021,104.76352 95.15625,102.90625 C 95.236479,101.04898 95.873353,99.898826 96.78125,99.375 C 97.154526,99.159631 97.520851,99.0599 97.9375,99.03125 z " + style="fill:none;fill-opacity:1.0;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4475);opacity:0.7029703" + clip-path="url(#clipPath4455)" /> + <path + style="fill:url(#linearGradient3802);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 97.96087,1.9111929 L 53.629372,72.750318 L 52.479384,84.564291 C 54.445388,81.161344 61.782615,76.320141 67.153838,74.881885 C 81.238527,50.502756 89.411871,28.739567 98.680477,4.5950145 C 98.954672,3.9035524 99.068368,2.5501817 97.96087,1.9111929 z " + id="path3506" + sodipodi:nodetypes="cccccc" /> + <path + sodipodi:nodetypes="cc" + id="path4269" + d="M 97.692496,2.3849918 L 61.738989,59.428222" + style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + style="fill:url(#linearGradient3637);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 59.75 65.65625 L 57.71875 66.21875 L 56.28125 68.5 L 60.59375 77.71875 C 62.419602 76.674902 64.33553 75.770565 66.09375 75.1875 L 59.75 65.65625 z " + id="path3629" /> + <path + style="fill:url(#linearGradient4259);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 67.1875 51.0625 L 59 64.15625 L 66.1875 75.15625 C 66.513817 75.049746 66.842006 74.959145 67.15625 74.875 C 69.715966 70.444398 72.069962 66.100297 74.28125 61.8125 L 67.1875 51.0625 z " + id="path4248" /> + <path + sodipodi:nodetypes="cccccc" + id="path2160" + d="M 30.642611,1.9111929 L 74.974109,72.750318 L 76.124096,84.564291 C 74.158093,81.161344 66.820866,76.320141 61.449644,74.881885 C 47.364955,50.502756 39.191609,28.739567 29.923004,4.5950145 C 29.648808,3.9035524 29.535112,2.5501817 30.642611,1.9111929 z " + style="fill:url(#linearGradient3617);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 30.738989,2.3849918 L 64.192496,55.928222" + id="path4267" + sodipodi:nodetypes="cc" /> + <path + transform="matrix(1.4403715,-0.8310572,0.8315989,1.4394331,-75.999063,45.513227)" + d="M 68 54 A 2 2 0 1 1 64,54 A 2 2 0 1 1 68 54 z" + sodipodi:ry="2" + sodipodi:rx="2" + sodipodi:cy="54" + sodipodi:cx="66" + id="path3146" + style="opacity:0.96000001;fill:url(#radialGradient4728);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + sodipodi:type="arc" /> + <image + y="0" + x="160" + id="image4278" + height="128" + width="128" + sodipodi:absref="/home/david/Oxygen/trunk/32x32/actions/edit-copy.png" + xlink:href="/home/david/Oxygen/trunk/32x32/actions/edit-copy.png" /> + <image + y="0" + x="288" + id="image4288" + height="128" + width="128" + sodipodi:absref="/home/david/Oxygen/trunk/32x32/actions/edit-paste.png" + xlink:href="/home/david/Oxygen/trunk/32x32/actions/edit-paste.png" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;opacity:0.70792079;filter:url(#filter4715)" + d="M 57.53125 79.25 L 39.71875 110.0625 C 37.370936 114.12633 34.175817 117.22417 30.71875 118.96875 C 27.26168 120.71333 23.37011 121.11751 20.1875 119.28125 C 17.00494 117.44502 15.40875 113.86699 15.1875 110 C 15.119229 108.80676 15.194921 107.57094 15.375 106.3125 C 14.812237 108.42607 14.574653 110.52767 14.6875 112.5 C 14.90875 116.36699 16.50494 119.94502 19.6875 121.78125 C 22.87011 123.61751 26.76168 123.21333 30.21875 121.46875 C 33.675817 119.72417 36.870936 116.62633 39.21875 112.5625 L 57.40625 81.09375 C 57.67315 80.641816 57.75171 80.103085 57.625 79.59375 L 57.53125 79.25 z M 31.40625 96.53125 C 29.496167 96.399901 26.05012 98.38292 23.90625 102.09375 C 22.840787 103.93797 22.266248 105.85407 22.125 107.5 C 22.422918 106.54782 22.850187 105.55624 23.40625 104.59375 C 25.55012 100.88292 28.996167 98.899901 30.90625 99.03125 C 31.322899 99.0599 31.689226 99.159631 32.0625 99.375 C 32.970397 99.898826 33.607273 101.04898 33.6875 102.90625 C 33.703141 103.26833 33.690955 103.66277 33.65625 104.0625 C 34.065399 102.74599 34.233925 101.48097 34.1875 100.40625 C 34.107273 98.54898 33.470397 97.398826 32.5625 96.875 C 32.189226 96.659631 31.822899 96.5599 31.40625 96.53125 z " + id="path4576" /> + <path + id="path4609" + d="M 57.53125,79.25 L 39.71875,110.0625 C 37.370936,114.12633 34.175817,117.22417 30.71875,118.96875 C 27.26168,120.71333 23.37011,121.11751 20.1875,119.28125 C 17.00494,117.44502 15.40875,113.86699 15.1875,110 C 15.119229,108.80676 15.194921,107.57094 15.375,106.3125 C 14.812237,108.42607 14.574653,110.52767 14.6875,112.5 C 14.90875,116.36699 16.50494,119.94502 19.6875,121.78125 C 22.87011,123.61751 26.76168,123.21333 30.21875,121.46875 C 33.675817,119.72417 36.870936,116.62633 39.21875,112.5625 L 57.40625,81.09375 C 57.67315,80.641816 57.75171,80.103085 57.625,79.59375 L 57.53125,79.25 z M 31.40625,96.53125 C 29.496167,96.399901 26.05012,98.38292 23.90625,102.09375 C 22.840787,103.93797 22.266248,105.85407 22.125,107.5 C 22.422918,106.54782 22.850187,105.55624 23.40625,104.59375 C 25.55012,100.88292 28.996167,98.899901 30.90625,99.03125 C 31.322899,99.0599 31.689226,99.159631 32.0625,99.375 C 32.970397,99.898826 33.607273,101.04898 33.6875,102.90625 C 33.703141,103.26833 33.690955,103.66277 33.65625,104.0625 C 34.065399,102.74599 34.233925,101.48097 34.1875,100.40625 C 34.107273,98.54898 33.470397,97.398826 32.5625,96.875 C 32.189226,96.659631 31.822899,96.5599 31.40625,96.53125 z " + style="opacity:0.70792081;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4711)" + transform="matrix(-1,0,0,1,128.84431,0)" /> + <path + style="opacity:0.48514851;fill:url(#linearGradient4641);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4691)" + d="M 33.1875,106.4375 C 32.888012,107.43505 32.455199,108.46448 31.875,109.46875 C 30.554983,111.75356 28.74309,113.45249 27.09375,114.3125 C 25.44441,115.17251 24.15784,115.18004 23.25,114.65625 C 22.3421,114.13243 21.67398,112.98227 21.59375,111.125 C 21.212006,112.3879 21.048791,113.58424 21.09375,114.625 C 21.17398,116.48227 21.8421,117.63243 22.75,118.15625 C 23.65784,118.68004 24.94441,118.67251 26.59375,117.8125 C 28.24309,116.95249 30.054983,115.25356 31.375,112.96875 C 32.687576,110.6968 33.260229,108.29075 33.1875,106.4375 z " + id="path4626" + sodipodi:nodetypes="cssscssssc" + transform="matrix(1.6395402,0,0,1.5188129,-15.9999,-58.979717)" /> + <path + transform="matrix(-1.6395402,0,0,1.5188129,144.99452,-58.979717)" + sodipodi:nodetypes="cssscssssc" + id="path4699" + d="M 33.1875,106.4375 C 32.888012,107.43505 32.455199,108.46448 31.875,109.46875 C 30.554983,111.75356 28.74309,113.45249 27.09375,114.3125 C 25.44441,115.17251 24.15784,115.18004 23.25,114.65625 C 22.3421,114.13243 21.67398,112.98227 21.59375,111.125 C 21.212006,112.3879 21.048791,113.58424 21.09375,114.625 C 21.17398,116.48227 21.8421,117.63243 22.75,118.15625 C 23.65784,118.68004 24.94441,118.67251 26.59375,117.8125 C 28.24309,116.95249 30.054983,115.25356 31.375,112.96875 C 32.687576,110.6968 33.260229,108.29075 33.1875,106.4375 z " + style="opacity:0.48514851;fill:url(#linearGradient4701);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4691)" /> + <path + style="opacity:0.77722772;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 65.770092,66.282577 L 62.183456,70.557029" + id="path4730" /> + </g> + </g> +</svg> diff --git a/imgsrc/edit-paste.svg b/imgsrc/edit-paste.svg new file mode 100644 index 0000000000..d22a8bb7dd --- /dev/null +++ b/imgsrc/edit-paste.svg @@ -0,0 +1,3302 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 12.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 51448) --> +<svg + xmlns:ns="http://ns.adobe.com/SaveForWeb/1.0/" + xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + id="Layer_1" + width="128" + height="128" + viewBox="0 0 128 128" + overflow="visible" + enable-background="new 0 0 128 128" + xml:space="preserve" + sodipodi:version="0.32" + inkscape:version="0.45+devel" + sodipodi:docname="edit-paste.svg" + sodipodi:docbase="/home/pinheiro/Documents/pics/trabalhos pagos2007/gexcon/128x128" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/home/pinheiro/pics/oxygen/scalable/actions/edit-paste.png" + inkscape:export-xdpi="33.75" + inkscape:export-ydpi="33.75"><defs + id="defs105"><linearGradient + inkscape:collect="always" + id="linearGradient3400"><stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop3402" /><stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop3404" /></linearGradient><linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient3368"> + <stop + id="stop3370" + style="stop-color:#595959;stop-opacity:1;" + offset="0" /> + <stop + id="stop3372" + style="stop-color:#222222;stop-opacity:1;" + offset="1" /> + </linearGradient><linearGradient + inkscape:collect="always" + id="linearGradient4811"><stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop4813" /><stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop4815" /></linearGradient><linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient4207"> + <stop + id="stop4209" + style="stop-color:#FFEA00" + offset="0" /> + <stop + id="stop4211" + style="stop-color:#c17900;stop-opacity:1" + offset="1" /> + </linearGradient><linearGradient + inkscape:collect="always" + id="linearGradient4077"><stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop4079" /><stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop4081" /></linearGradient><linearGradient + inkscape:collect="always" + id="linearGradient4005"><stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop4007" /><stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop4009" /></linearGradient><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3368" + id="linearGradient3816" + x1="28.364862" + y1="12" + x2="77.328758" + y2="122.48434" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-8.000004,0)" /><linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient3287"> + <stop + id="stop3289" + style="stop-color:#FFEA00" + offset="0" /> + <stop + id="stop3291" + style="stop-color:#ffa000;stop-opacity:1;" + offset="1" /> + </linearGradient><linearGradient + id="linearGradient3291"><stop + style="stop-color:black;stop-opacity:1" + offset="0" + id="stop3293" /><stop + style="stop-color:black;stop-opacity:0" + offset="1" + id="stop3295" /></linearGradient><linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient18668"> + <stop + id="stop18670" + style="stop-color:#fff8a8;stop-opacity:1;" + offset="0" /> + <stop + id="stop18672" + style="stop-color:white;stop-opacity:0;" + offset="1" /> + </linearGradient><linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient15967"> + <stop + id="stop15969" + style="stop-color:white;stop-opacity:1;" + offset="0" /> + <stop + id="stop15971" + style="stop-color:white;stop-opacity:0;" + offset="1" /> + </linearGradient><linearGradient + id="XMLID_2_" + gradientUnits="userSpaceOnUse" + x1="28" + y1="57.5" + x2="28" + y2="0"> + <stop + offset="0" + style="stop-color:#FFEA00" + id="stop12" /> + <stop + offset="1" + style="stop-color:#FFCC00" + id="stop14" /> + </linearGradient><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_9_" + id="linearGradient2391" + gradientUnits="userSpaceOnUse" + x1="94.3438" + y1="102.3447" + x2="86.5356" + y2="94.5366" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_10_" + id="linearGradient2393" + gradientUnits="userSpaceOnUse" + x1="95" + y1="103" + x2="86.5865" + y2="94.5865" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_11_" + id="linearGradient2395" + gradientUnits="userSpaceOnUse" + x1="95" + y1="103" + x2="87.293" + y2="95.293" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_12_" + id="linearGradient2397" + gradientUnits="userSpaceOnUse" + x1="96" + y1="104" + x2="88.0002" + y2="96.0002" /><radialGradient + inkscape:collect="always" + xlink:href="#XMLID_7_" + id="radialGradient2465" + gradientUnits="userSpaceOnUse" + cx="102" + cy="112.3047" + r="139.5585" /><radialGradient + inkscape:collect="always" + xlink:href="#XMLID_8_" + id="radialGradient2467" + gradientUnits="userSpaceOnUse" + cx="102" + cy="112.3047" + r="139.55859" /> + <foreignObject + requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/" + x="0" + y="0" + width="1" + height="1" + id="foreignObject7"> + <i:pgfRef + xlink:href="#adobe_illustrator_pgf"> + </i:pgfRef> + </foreignObject> + +<linearGradient + inkscape:collect="always" + xlink:href="#XMLID_2_" + id="linearGradient12378" + gradientUnits="userSpaceOnUse" + x1="28" + y1="57.5" + x2="28" + y2="0" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2309" + id="linearGradient14180" + gradientUnits="userSpaceOnUse" + x1="-74.820707" + y1="100.82378" + x2="-18.121965" + y2="100.82378" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2309" + id="linearGradient14189" + gradientUnits="userSpaceOnUse" + x1="-74.820707" + y1="100.82378" + x2="-18.121965" + y2="100.82378" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient15967" + id="linearGradient15973" + gradientUnits="userSpaceOnUse" + x1="27.719746" + y1="7.881104" + x2="27.719746" + y2="30.441185" + gradientTransform="translate(1.470416e-5,0)" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2309" + id="linearGradient15977" + gradientUnits="userSpaceOnUse" + x1="-74.820707" + y1="100.82378" + x2="-18.121965" + y2="100.82378" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient15967" + id="radialGradient15986" + cx="26.954102" + cy="31.045055" + fx="26.954102" + fy="31.045055" + r="8.968153" + gradientTransform="matrix(0.754978,-2.959381e-2,0,0.905772,7.650275,10.87807)" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_2_" + id="linearGradient18657" + gradientUnits="userSpaceOnUse" + x1="28" + y1="57.5" + x2="28" + y2="0" /> + <linearGradient + id="linearGradient18649" + gradientUnits="userSpaceOnUse" + x1="28" + y1="57.5" + x2="28" + y2="0"> + <stop + offset="0" + style="stop-color:#FFEA00" + id="stop18651" /> + <stop + offset="1" + style="stop-color:#FFCC00" + id="stop18653" /> + </linearGradient> + + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient18668" + id="linearGradient18674" + gradientUnits="userSpaceOnUse" + x1="-39.53125" + y1="78" + x2="-39.53125" + y2="51.1875" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_2_" + id="linearGradient18744" + gradientUnits="userSpaceOnUse" + x1="28" + y1="57.5" + x2="28" + y2="0" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient18668" + id="linearGradient18746" + gradientUnits="userSpaceOnUse" + x1="-39.53125" + y1="78" + x2="-39.53125" + y2="51.1875" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient18668" + id="linearGradient18749" + gradientUnits="userSpaceOnUse" + x1="-39.53125" + y1="78" + x2="-39.53125" + y2="51.1875" + gradientTransform="translate(69.54139,-45.18897)" /> + + + + +<linearGradient + inkscape:collect="always" + xlink:href="#linearGradient18668" + id="linearGradient4708" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(69.54139,-45.18897)" + x1="-39.53125" + y1="78" + x2="-39.53125" + y2="51.1875" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3287" + id="linearGradient3456" + gradientUnits="userSpaceOnUse" + x1="28" + y1="57.5" + x2="28" + y2="0" /> + <linearGradient + id="linearGradient3446" + gradientUnits="userSpaceOnUse" + x1="28" + y1="57.5" + x2="28" + y2="0"> + <stop + offset="0" + style="stop-color:#FFEA00" + id="stop3448" /> + <stop + offset="1" + style="stop-color:#FFCC00" + id="stop3450" /> + </linearGradient> + + <radialGradient + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.1822917,0,36.388019)" + r="48" + fy="44.499996" + fx="-85.9375" + cy="44.499996" + cx="-85.9375" + id="radialGradient4153" + xlink:href="#linearGradient3290" + inkscape:collect="always" /><linearGradient + y2="96.142189" + x2="78.843246" + y1="139.71719" + x1="78.843246" + gradientTransform="matrix(1,0,0,1.016882,-149.9375,-1.0166985)" + gradientUnits="userSpaceOnUse" + id="linearGradient4150" + xlink:href="#linearGradient3291" + inkscape:collect="always" /><linearGradient + y2="56.623283" + x2="-22.311716" + y1="56.623283" + x1="75.130096" + gradientTransform="matrix(1,0,0,1.016882,-149.9375,-1.0166985)" + gradientUnits="userSpaceOnUse" + id="linearGradient4148" + xlink:href="#radialGradient3888" + inkscape:collect="always" /><radialGradient + r="52" + fy="3.9355147" + fx="54.254757" + cy="3.9355147" + cx="54.254757" + gradientTransform="matrix(1.23137,0,0,1.730769,-165.54517,-5.5510275)" + gradientUnits="userSpaceOnUse" + id="radialGradient4146" + xlink:href="#radialGradient4016" + inkscape:collect="always" /><linearGradient + y2="116.65697" + x2="63.9995" + y1="25.1577" + x1="63.9995" + gradientTransform="matrix(1,0,0,1.016882,-149.9375,-1.0166985)" + gradientUnits="userSpaceOnUse" + id="linearGradient4144" + xlink:href="#linearGradient3287" + inkscape:collect="always" /><radialGradient + r="52" + fy="0.17394008" + fx="64" + cy="0.17394008" + cx="64" + gradientTransform="matrix(1.23137,0,0,1.730769,-164.74518,-7.0510245)" + gradientUnits="userSpaceOnUse" + id="radialGradient4140" + xlink:href="#linearGradient3785" + inkscape:collect="always" /><linearGradient + inkscape:collect="always" + id="linearGradient3465"><stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop3467" /><stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop3469" /></linearGradient><linearGradient + id="linearGradient3443"><stop + style="stop-color:#747474;stop-opacity:1;" + offset="0" + id="stop3445" /><stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="1" + id="stop3447" /></linearGradient><linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient3785"> + <stop + id="stop3787" + style="stop-color:#FFEA00" + offset="0" /> + <stop + id="stop3789" + style="stop-color:#f49900;stop-opacity:1;" + offset="1" /> + </linearGradient><linearGradient + id="linearGradient3791"><stop + style="stop-color:black;stop-opacity:1" + offset="0" + id="stop3793" /><stop + style="stop-color:black;stop-opacity:0" + offset="1" + id="stop3795" /></linearGradient><linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient3797"> + <stop + id="stop3799" + style="stop-color:#fff8a8;stop-opacity:1;" + offset="0" /> + <stop + id="stop3801" + style="stop-color:white;stop-opacity:0;" + offset="1" /> + </linearGradient><linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient3803"> + <stop + id="stop3805" + style="stop-color:white;stop-opacity:1;" + offset="0" /> + <stop + id="stop3807" + style="stop-color:white;stop-opacity:0;" + offset="1" /> + </linearGradient><linearGradient + id="linearGradient3809" + gradientUnits="userSpaceOnUse" + x1="28" + y1="57.5" + x2="28" + y2="0"> + <stop + offset="0" + style="stop-color:#FFEA00" + id="stop3811" /> + <stop + offset="1" + style="stop-color:#FFCC00" + id="stop3813" /> + </linearGradient><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_9_" + id="linearGradient3815" + gradientUnits="userSpaceOnUse" + x1="94.3438" + y1="102.3447" + x2="86.5356" + y2="94.5366" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_10_" + id="linearGradient3817" + gradientUnits="userSpaceOnUse" + x1="95" + y1="103" + x2="86.5865" + y2="94.5865" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_11_" + id="linearGradient3819" + gradientUnits="userSpaceOnUse" + x1="95" + y1="103" + x2="87.293" + y2="95.293" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_12_" + id="linearGradient3821" + gradientUnits="userSpaceOnUse" + x1="96" + y1="104" + x2="88.0002" + y2="96.0002" /><radialGradient + inkscape:collect="always" + xlink:href="#XMLID_7_" + id="radialGradient3823" + gradientUnits="userSpaceOnUse" + cx="102" + cy="112.3047" + r="139.5585" /><radialGradient + inkscape:collect="always" + xlink:href="#XMLID_8_" + id="radialGradient3825" + gradientUnits="userSpaceOnUse" + cx="102" + cy="112.3047" + r="139.55859" /> + <foreignObject + requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/" + x="0" + y="0" + width="1" + height="1" + id="foreignObject3827"> + <i:pgfRef + xlink:href="#adobe_illustrator_pgf"> + </i:pgfRef> + </foreignObject> + +<linearGradient + inkscape:collect="always" + xlink:href="#XMLID_2_" + id="linearGradient3829" + gradientUnits="userSpaceOnUse" + x1="28" + y1="57.5" + x2="28" + y2="0" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2309" + id="linearGradient3831" + gradientUnits="userSpaceOnUse" + x1="-74.820707" + y1="100.82378" + x2="-18.121965" + y2="100.82378" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2309" + id="linearGradient3833" + gradientUnits="userSpaceOnUse" + x1="-74.820707" + y1="100.82378" + x2="-18.121965" + y2="100.82378" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient15967" + id="linearGradient3835" + gradientUnits="userSpaceOnUse" + x1="27.719746" + y1="7.881104" + x2="27.719746" + y2="30.441185" + gradientTransform="translate(1.470416e-5,0)" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2309" + id="linearGradient3837" + gradientUnits="userSpaceOnUse" + x1="-74.820707" + y1="100.82378" + x2="-18.121965" + y2="100.82378" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient15967" + id="radialGradient3839" + cx="26.954102" + cy="31.045055" + fx="26.954102" + fy="31.045055" + r="8.968153" + gradientTransform="matrix(0.754978,-2.959381e-2,0,0.905772,7.650275,10.87807)" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_2_" + id="linearGradient3841" + gradientUnits="userSpaceOnUse" + x1="28" + y1="57.5" + x2="28" + y2="0" /> + <linearGradient + id="linearGradient3843" + gradientUnits="userSpaceOnUse" + x1="28" + y1="57.5" + x2="28" + y2="0"> + <stop + offset="0" + style="stop-color:#FFEA00" + id="stop3845" /> + <stop + offset="1" + style="stop-color:#FFCC00" + id="stop3847" /> + </linearGradient> + + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient18668" + id="linearGradient3849" + gradientUnits="userSpaceOnUse" + x1="-39.53125" + y1="78" + x2="-39.53125" + y2="51.1875" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_2_" + id="linearGradient3851" + gradientUnits="userSpaceOnUse" + x1="28" + y1="57.5" + x2="28" + y2="0" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient18668" + id="linearGradient3853" + gradientUnits="userSpaceOnUse" + x1="-39.53125" + y1="78" + x2="-39.53125" + y2="51.1875" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient18668" + id="linearGradient3855" + gradientUnits="userSpaceOnUse" + x1="-39.53125" + y1="78" + x2="-39.53125" + y2="51.1875" + gradientTransform="translate(69.54139,-45.18897)" /><radialGradient + inkscape:collect="always" + xlink:href="#XMLID_8_" + id="radialGradient3857" + gradientUnits="userSpaceOnUse" + cx="102" + cy="112.3047" + r="139.55859" + fx="101.5" + fy="112" + gradientTransform="translate(-8,0)" /><radialGradient + inkscape:collect="always" + xlink:href="#XMLID_7_" + id="radialGradient3859" + gradientUnits="userSpaceOnUse" + cx="102" + cy="112.3047" + r="139.5585" + gradientTransform="translate(-8,0)" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_12_" + id="linearGradient3861" + gradientUnits="userSpaceOnUse" + x1="96" + y1="104" + x2="88.0002" + y2="96.0002" + gradientTransform="translate(-2,4)" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_11_" + id="linearGradient3863" + gradientUnits="userSpaceOnUse" + x1="95" + y1="103" + x2="87.293" + y2="95.293" + gradientTransform="translate(-2,4)" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_10_" + id="linearGradient3865" + gradientUnits="userSpaceOnUse" + x1="95" + y1="103" + x2="86.5865" + y2="94.5865" + gradientTransform="translate(-2,4)" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_9_" + id="linearGradient3867" + gradientUnits="userSpaceOnUse" + x1="94.3438" + y1="102.3447" + x2="86.5356" + y2="94.5366" + gradientTransform="translate(-2,4)" /> + + + + +<linearGradient + inkscape:collect="always" + xlink:href="#linearGradient18668" + id="linearGradient3869" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(69.54139,-45.18897)" + x1="-39.53125" + y1="78" + x2="-39.53125" + y2="51.1875" /> + <linearGradient + id="linearGradient3875" + gradientUnits="userSpaceOnUse" + x1="28" + y1="57.5" + x2="28" + y2="0"> + <stop + offset="0" + style="stop-color:#FFEA00" + id="stop3877" /> + <stop + offset="1" + style="stop-color:#FFCC00" + id="stop3879" /> + </linearGradient> + + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath3560"><path + sodipodi:nodetypes="cccc" + id="path3562" + d="M 174,120 C 150.49117,120 164,89.333333 159,74 C 175.06733,78.466333 206,73.457434 206,88 L 174,120 z " + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3554)" /></clipPath><radialGradient + r="122.3935" + fy="24.1598" + fx="63.066601" + cy="6.0488" + cx="42.378899" + gradientTransform="matrix(1.0151,0,0,1.0491,-1.0186,-1.3463)" + gradientUnits="userSpaceOnUse" + id="radialGradient3954" + xlink:href="#XMLID_6_" + inkscape:collect="always" /><linearGradient + y2="157.6319" + x2="63.9995" + y1="25.1577" + x1="63.9995" + gradientTransform="matrix(1,0,0,0.635551,0,42.02081)" + gradientUnits="userSpaceOnUse" + id="linearGradient1922" + xlink:href="#XMLID_7_" + inkscape:collect="always" /><linearGradient + y2="56.623283" + x2="129.05333" + y1="56.623283" + x1="0" + gradientTransform="matrix(1,0,0,1.016882,0,-0.766697)" + gradientUnits="userSpaceOnUse" + id="linearGradient5885" + xlink:href="#XMLID_8_" + inkscape:collect="always" /> + + <radialGradient + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.0151,0,0,1.0491,-1.0186,-1.3463)" + fy="24.1598" + fx="63.066601" + r="122.3935" + cy="6.0488" + cx="42.378899" + id="radialGradient3888"> + <stop + id="stop3890" + style="stop-color:#FFFFFF" + offset="0" /> + <stop + id="stop3892" + style="stop-color:#DDDDDD" + offset="1" /> + + + </radialGradient> + + + + + + <linearGradient + id="linearGradient2355" + gradientUnits="userSpaceOnUse" + x1="-37.875" + y1="48.787102" + x2="230.237" + y2="48.787102"> + <stop + offset="0" + style="stop-color:#a2c3eb;stop-opacity:0.50196081;" + id="stop2357" /> + <stop + offset="0.12634172" + style="stop-color:white;stop-opacity:1;" + id="stop2359" /><stop + id="stop3897" + style="stop-color:white;stop-opacity:1;" + offset="0.80858696" /> + <stop + offset="1" + style="stop-color:#a7cbf7;stop-opacity:0.50196081;" + id="stop2362" /> + </linearGradient> + + <linearGradient + id="linearGradient2345" + gradientUnits="userSpaceOnUse" + x1="63.9995" + y1="25.1577" + x2="63.9995" + y2="157.6319"> + <stop + offset="0" + style="stop-color:#BFD9FF" + id="stop2347" /> + <stop + offset="0.2189" + style="stop-color:#80B3FF" + id="stop2349" /> + <stop + offset="0.2933" + style="stop-color:#6EA5F3" + id="stop3903" /> + <stop + offset="0.4426" + style="stop-color:#3E80D3" + id="stop3905" /> + <stop + offset="0.4941" + style="stop-color:#2C72C7" + id="stop3907" /> + <stop + offset="0.7" + style="stop-color:#00438A" + id="stop3909" /> + </linearGradient> + + + + + + + <radialGradient + gradientTransform="translate(-103.157,-34.959)" + id="radialGradient3911" + cx="51.9995" + cy="-9" + r="111.0006" + gradientUnits="userSpaceOnUse"> + <stop + offset="0.15" + style="stop-color:#80B3FF" + id="stop2338" /> + <stop + offset="0.316" + style="stop-color:#69A1F0" + id="stop2340" /> + <stop + offset="0.6029" + style="stop-color:#4888DA" + id="stop3915" /> + <stop + offset="0.8412" + style="stop-color:#3378CC" + id="stop3917" /> + <stop + offset="1" + style="stop-color:#2C72C7" + id="stop3919" /> + </radialGradient> + + + + + + <foreignObject + requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/" + x="0" + y="0" + width="1" + height="1" + id="foreignObject2335"> + <i:pgfRef + xlink:href="#adobe_illustrator_pgf"> + </i:pgfRef> + </foreignObject> + <radialGradient + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.0151,0,0,1.0491,-1.0186,-1.3463)" + fy="24.1598" + fx="63.066601" + r="122.3935" + cy="6.0488" + cx="42.378899" + id="radialGradient3922"> + <stop + id="stop3924" + style="stop-color:#FFFFFF" + offset="0" /><stop + offset="0.59375" + style="stop-color:white;stop-opacity:1;" + id="stop3926" /> + <stop + id="stop3928" + style="stop-color:white;stop-opacity:0.70886075;" + offset="1" /> + + + </radialGradient><radialGradient + id="radialGradient3930" + cx="42.378899" + cy="6.0488" + r="122.3935" + fx="63.066601" + fy="24.1598" + gradientTransform="matrix(1.0151,0,0,1.0491,-1.0186,-1.3463)" + gradientUnits="userSpaceOnUse"> + <stop + offset="0" + style="stop-color:#00438a;stop-opacity:0;" + id="stop3932" /> + + + <stop + offset="1" + style="stop-color:#00438a;stop-opacity:1;" + id="stop3934" /> + </radialGradient><linearGradient + id="linearGradient2321"><stop + id="stop2323" + offset="0" + style="stop-color:black;stop-opacity:1" /><stop + id="stop2325" + offset="1" + style="stop-color:black;stop-opacity:0" /></linearGradient><linearGradient + inkscape:collect="always" + xlink:href="#radialGradient4962" + id="linearGradient2396" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-147.5,22.440458)" + x1="64" + y1="39.358757" + x2="55.187801" + y2="72.246338" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient18649" + id="linearGradient2400" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.635551,-147.5,42.461268)" + x1="63.9995" + y1="25.1577" + x2="63.9995" + y2="157.6319" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2321" + id="linearGradient2403" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-147.5,22.440458)" + x1="66.82843" + y1="73.299881" + x2="66.82843" + y2="36" /><radialGradient + inkscape:collect="always" + xlink:href="#radialGradient4016" + id="radialGradient2413" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.23137,0,0,1.730769,-161.30768,-3.860568)" + cx="31.268095" + cy="5.2808232" + fx="31.268095" + fy="5.2808232" + r="52" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3287" + id="linearGradient2416" + gradientUnits="userSpaceOnUse" + x1="61.572254" + y1="-16" + x2="61.803467" + y2="-98.624275" + gradientTransform="translate(-147.5,-2.440458)" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3443" + id="linearGradient3449" + x1="-147.5" + y1="74.268583" + x2="-108.55761" + y2="74.268585" + gradientUnits="userSpaceOnUse" /><radialGradient + inkscape:collect="always" + xlink:href="#radialGradient4016" + id="radialGradient3453" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.23137,0,0,-1.730769,-51.782417,67.30103)" + cx="31.268095" + cy="5.2808232" + fx="31.268095" + fy="5.2808232" + r="52" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3465" + id="linearGradient3471" + x1="-83.500114" + y1="127.94046" + x2="-83.500114" + y2="104.94046" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3287" + id="linearGradient3473" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-147.5,-2.440458)" + x1="61.572254" + y1="-16" + x2="61.803467" + y2="-98.624275" /><radialGradient + inkscape:collect="always" + xlink:href="#radialGradient4016" + id="radialGradient3475" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.23137,0,0,1.730769,-161.30768,-3.860568)" + cx="31.268095" + cy="5.2808232" + fx="31.268095" + fy="5.2808232" + r="52" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2321" + id="linearGradient3477" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-147.5,22.440458)" + x1="66.82843" + y1="73.299881" + x2="66.82843" + y2="36" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient18649" + id="linearGradient3479" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.635551,-147.5,42.461268)" + x1="63.9995" + y1="25.1577" + x2="63.9995" + y2="157.6319" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3443" + id="linearGradient3481" + gradientUnits="userSpaceOnUse" + x1="-147.5" + y1="74.268583" + x2="-108.55761" + y2="74.268585" /><clipPath + id="clipPath2536" + clipPathUnits="userSpaceOnUse"><path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3554)" + d="M 174,120 C 150.49117,120 164,89.333333 159,74 C 175.06733,78.466333 206,73.457434 206,88 L 174,120 z " + id="path2538" + sodipodi:nodetypes="cccc" /></clipPath> + + <linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient2525"> + <stop + id="stop2527" + style="stop-color:#FFEA00" + offset="0" /> + <stop + id="stop2529" + style="stop-color:#FFCC00" + offset="1" /> + </linearGradient> + <linearGradient + y2="51.1875" + x2="-39.53125" + y1="78" + x1="-39.53125" + gradientTransform="translate(69.54139,-45.18897)" + gradientUnits="userSpaceOnUse" + id="linearGradient2516" + xlink:href="#linearGradient18668" + inkscape:collect="always" /> + + + + +<linearGradient + gradientTransform="translate(8,0)" + y2="94.5366" + x2="86.5356" + y1="102.3447" + x1="94.3438" + gradientUnits="userSpaceOnUse" + id="linearGradient2514" + xlink:href="#XMLID_9_" + inkscape:collect="always" /><linearGradient + gradientTransform="translate(8,0)" + y2="94.5865" + x2="86.5865" + y1="103" + x1="95" + gradientUnits="userSpaceOnUse" + id="linearGradient2512" + xlink:href="#XMLID_10_" + inkscape:collect="always" /><linearGradient + gradientTransform="translate(8,0)" + y2="95.293" + x2="87.293" + y1="103" + x1="95" + gradientUnits="userSpaceOnUse" + id="linearGradient2510" + xlink:href="#XMLID_11_" + inkscape:collect="always" /><linearGradient + gradientTransform="translate(8,0)" + y2="96.0002" + x2="88.0002" + y1="104" + x1="96" + gradientUnits="userSpaceOnUse" + id="linearGradient2508" + xlink:href="#XMLID_12_" + inkscape:collect="always" /><radialGradient + r="139.5585" + cy="112.3047" + cx="102" + gradientTransform="translate(8,0)" + gradientUnits="userSpaceOnUse" + id="radialGradient2506" + xlink:href="#XMLID_7_" + inkscape:collect="always" /><radialGradient + fy="112" + fx="101.5" + r="139.55859" + cy="112.3047" + cx="102" + gradientTransform="translate(8,0)" + gradientUnits="userSpaceOnUse" + id="radialGradient2504" + xlink:href="#XMLID_8_" + inkscape:collect="always" /><linearGradient + gradientTransform="translate(69.54139,-45.18897)" + y2="51.1875" + x2="-39.53125" + y1="78" + x1="-39.53125" + gradientUnits="userSpaceOnUse" + id="linearGradient2502" + xlink:href="#linearGradient18668" + inkscape:collect="always" /><linearGradient + y2="51.1875" + x2="-39.53125" + y1="78" + x1="-39.53125" + gradientUnits="userSpaceOnUse" + id="linearGradient2500" + xlink:href="#linearGradient18668" + inkscape:collect="always" /><linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient2498" + xlink:href="#XMLID_2_" + inkscape:collect="always" /><linearGradient + y2="51.1875" + x2="-39.53125" + y1="78" + x1="-39.53125" + gradientUnits="userSpaceOnUse" + id="linearGradient2496" + xlink:href="#linearGradient18668" + inkscape:collect="always" /> + + <linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient2490"> + <stop + id="stop2492" + style="stop-color:#FFEA00" + offset="0" /> + <stop + id="stop2494" + style="stop-color:#FFCC00" + offset="1" /> + </linearGradient> + <linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient2488" + xlink:href="#XMLID_2_" + inkscape:collect="always" /><radialGradient + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.754978,-2.959381e-2,0,0.905772,7.650275,10.87807)" + r="8.968153" + fy="31.045055" + fx="26.954102" + cy="31.045055" + cx="26.954102" + id="radialGradient2486" + xlink:href="#linearGradient15967" + inkscape:collect="always" /><linearGradient + y2="100.82378" + x2="-18.121965" + y1="100.82378" + x1="-74.820707" + gradientUnits="userSpaceOnUse" + id="linearGradient2484" + xlink:href="#linearGradient2309" + inkscape:collect="always" /><linearGradient + gradientTransform="translate(1.470416e-5,0)" + y2="30.441185" + x2="27.719746" + y1="7.881104" + x1="27.719746" + gradientUnits="userSpaceOnUse" + id="linearGradient2482" + xlink:href="#linearGradient15967" + inkscape:collect="always" /><linearGradient + y2="100.82378" + x2="-18.121965" + y1="100.82378" + x1="-74.820707" + gradientUnits="userSpaceOnUse" + id="linearGradient2480" + xlink:href="#linearGradient2309" + inkscape:collect="always" /><linearGradient + y2="100.82378" + x2="-18.121965" + y1="100.82378" + x1="-74.820707" + gradientUnits="userSpaceOnUse" + id="linearGradient2478" + xlink:href="#linearGradient2309" + inkscape:collect="always" /><linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient2476" + xlink:href="#XMLID_2_" + inkscape:collect="always" /> + +<foreignObject + id="foreignObject2474" + height="1" + width="1" + y="0" + x="0" + requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/"> + <i:pgfRef + xlink:href="#adobe_illustrator_pgf"> + </i:pgfRef> + </foreignObject> + <radialGradient + r="139.55859" + cy="112.3047" + cx="102" + gradientUnits="userSpaceOnUse" + id="radialGradient2472" + xlink:href="#XMLID_8_" + inkscape:collect="always" /><radialGradient + r="139.5585" + cy="112.3047" + cx="102" + gradientUnits="userSpaceOnUse" + id="radialGradient2470" + xlink:href="#XMLID_7_" + inkscape:collect="always" /><linearGradient + y2="96.0002" + x2="88.0002" + y1="104" + x1="96" + gradientUnits="userSpaceOnUse" + id="linearGradient2468" + xlink:href="#XMLID_12_" + inkscape:collect="always" /><linearGradient + y2="95.293" + x2="87.293" + y1="103" + x1="95" + gradientUnits="userSpaceOnUse" + id="linearGradient2466" + xlink:href="#XMLID_11_" + inkscape:collect="always" /><linearGradient + y2="94.5865" + x2="86.5865" + y1="103" + x1="95" + gradientUnits="userSpaceOnUse" + id="linearGradient2464" + xlink:href="#XMLID_10_" + inkscape:collect="always" /><linearGradient + y2="94.5366" + x2="86.5356" + y1="102.3447" + x1="94.3438" + gradientUnits="userSpaceOnUse" + id="linearGradient2462" + xlink:href="#XMLID_9_" + inkscape:collect="always" /><linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient2456"> + <stop + id="stop2458" + style="stop-color:#FFEA00" + offset="0" /> + <stop + id="stop2460" + style="stop-color:#FFCC00" + offset="1" /> + </linearGradient><linearGradient + id="linearGradient2450" + gradientUnits="userSpaceOnUse" + x1="28" + y1="57.5" + x2="28" + y2="0"> + <stop + offset="0" + style="stop-color:white;stop-opacity:1;" + id="stop2452" /> + <stop + offset="1" + style="stop-color:white;stop-opacity:0;" + id="stop2454" /> + </linearGradient><linearGradient + id="linearGradient2444" + gradientUnits="userSpaceOnUse" + x1="28" + y1="57.5" + x2="28" + y2="0"> + <stop + offset="0" + style="stop-color:#fff8a8;stop-opacity:1;" + id="stop2446" /> + <stop + offset="1" + style="stop-color:white;stop-opacity:0;" + id="stop4003" /> + </linearGradient><linearGradient + id="linearGradient2438"><stop + id="stop2440" + offset="0" + style="stop-color:black;stop-opacity:1" /><stop + id="stop2442" + offset="1" + style="stop-color:black;stop-opacity:0" /></linearGradient><linearGradient + id="linearGradient2432" + gradientUnits="userSpaceOnUse" + x1="28" + y1="57.5" + x2="28" + y2="0"> + <stop + offset="0" + style="stop-color:#FFEA00" + id="stop2434" /> + <stop + offset="1" + style="stop-color:#ffa000;stop-opacity:1;" + id="stop2436" /> + </linearGradient><linearGradient + id="linearGradient1563"><stop + id="stop1565" + offset="0" + style="stop-color:#ffffff;stop-opacity:1;" /><stop + id="stop1567" + offset="1" + style="stop-color:white;stop-opacity:0;" /></linearGradient><linearGradient + id="linearGradient12948"><stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop12950" /><stop + style="stop-color:#c0c0c0;stop-opacity:0;" + offset="1" + id="stop12952" /></linearGradient><linearGradient + id="linearGradient3638"><stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="0" + id="stop3640" /><stop + id="stop3661" + offset="0.06868132" + style="stop-color:#ffffff;stop-opacity:1;" /><stop + id="stop3659" + offset="0.5" + style="stop-color:#ffffff;stop-opacity:1;" /><stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop3642" /></linearGradient><linearGradient + id="linearGradient3273"><stop + id="stop3275" + offset="0" + style="stop-color:#ffffff;stop-opacity:0.55035973;" /><stop + id="stop3277" + offset="1" + style="stop-color:#ffffff;stop-opacity:0;" /></linearGradient><linearGradient + id="linearGradient3290"><stop + style="stop-color:yellow;stop-opacity:1;" + offset="0" + id="stop3292" /><stop + style="stop-color:#ffb66d;stop-opacity:1;" + offset="1" + id="stop3294" /></linearGradient><linearGradient + id="linearGradient2407"><stop + style="stop-color:black;stop-opacity:1" + offset="0" + id="stop2409" /><stop + style="stop-color:black;stop-opacity:0" + offset="1" + id="stop2411" /></linearGradient><radialGradient + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.0151,0,0,1.0491,-1.0186,-1.3463)" + fy="24.1598" + fx="63.066601" + r="122.3935" + cy="6.0488" + cx="42.378899" + id="radialGradient4962"> + <stop + id="stop4964" + style="stop-color:#00438a;stop-opacity:0;" + offset="0" /> + + + <stop + id="stop4970" + style="stop-color:#00438a;stop-opacity:1;" + offset="1" /> + </radialGradient><radialGradient + id="radialGradient4016" + cx="42.378899" + cy="6.0488" + r="122.3935" + fx="63.066601" + fy="24.1598" + gradientTransform="matrix(1.0151,0,0,1.0491,-1.0186,-1.3463)" + gradientUnits="userSpaceOnUse"> + <stop + offset="0" + style="stop-color:#FFFFFF" + id="stop4018" /><stop + id="stop4026" + style="stop-color:white;stop-opacity:1;" + offset="0.59375" /> + <stop + offset="1" + style="stop-color:white;stop-opacity:0.70886075;" + id="stop4020" /> + + + </radialGradient> + <foreignObject + id="foreignObject2421" + height="1" + width="1" + y="0" + x="0" + requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/"> + <i:pgfRef + xlink:href="#adobe_illustrator_pgf"> + </i:pgfRef> + </foreignObject> + + + + + + <radialGradient + gradientUnits="userSpaceOnUse" + r="111.0006" + cy="-9" + cx="51.9995" + id="XMLID_5_" + gradientTransform="translate(-103.157,-34.959)"> + <stop + id="stop2424" + style="stop-color:#80B3FF" + offset="0.15" /> + <stop + id="stop2426" + style="stop-color:#69A1F0" + offset="0.316" /> + <stop + id="stop18" + style="stop-color:#4888DA" + offset="0.6029" /> + <stop + id="stop20" + style="stop-color:#3378CC" + offset="0.8412" /> + <stop + id="stop22" + style="stop-color:#2C72C7" + offset="1" /> + </radialGradient> + + + + + + + <linearGradient + y2="157.6319" + x2="63.9995" + y1="25.1577" + x1="63.9995" + gradientUnits="userSpaceOnUse" + id="linearGradient2431"> + <stop + id="stop2433" + style="stop-color:#BFD9FF" + offset="0" /> + <stop + id="stop2435" + style="stop-color:#80B3FF" + offset="0.2189" /> + <stop + id="stop80" + style="stop-color:#6EA5F3" + offset="0.2933" /> + <stop + id="stop82" + style="stop-color:#3E80D3" + offset="0.4426" /> + <stop + id="stop84" + style="stop-color:#2C72C7" + offset="0.4941" /> + <stop + id="stop86" + style="stop-color:#00438A" + offset="0.7" /> + </linearGradient> + + <linearGradient + y2="48.787102" + x2="230.237" + y1="48.787102" + x1="-37.875" + gradientUnits="userSpaceOnUse" + id="linearGradient2441"> + <stop + id="stop2443" + style="stop-color:#a2c3eb;stop-opacity:0.50196081;" + offset="0" /> + <stop + id="stop2445" + style="stop-color:#FFFFFF" + offset="0.12634172" /><stop + offset="0.80858696" + style="stop-color:white;stop-opacity:1;" + id="stop4930" /> + <stop + id="stop2448" + style="stop-color:#a7cbf7;stop-opacity:0.50196081;" + offset="1" /> + </linearGradient> + + + + + + <radialGradient + id="XMLID_6_" + cx="42.378899" + cy="6.0488" + r="122.3935" + fx="63.066601" + fy="24.1598" + gradientTransform="matrix(1.0151,0,0,1.0491,-1.0186,-1.3463)" + gradientUnits="userSpaceOnUse"> + <stop + offset="0" + style="stop-color:#FFFFFF" + id="stop33" /> + <stop + offset="0.3728" + style="stop-color:#DDDDDD" + id="stop35" /> + <stop + offset="0.7692" + style="stop-color:#BABDB6" + id="stop2456" /> + <stop + offset="1" + style="stop-color:#888888" + id="stop39" /> + </radialGradient> + + + + <linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient2667"> + <stop + id="stop2669" + style="stop-color:#FFEA00" + offset="0" /> + <stop + id="stop2671" + style="stop-color:#FFCC00" + offset="1" /> + </linearGradient> + <linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient2665" + xlink:href="#linearGradient3287" + inkscape:collect="always" /><linearGradient + y2="51.1875" + x2="-39.53125" + y1="78" + x1="-39.53125" + gradientTransform="translate(69.54139,-45.18897)" + gradientUnits="userSpaceOnUse" + id="linearGradient2659" + xlink:href="#linearGradient18668" + inkscape:collect="always" /> + + + + +<linearGradient + gradientTransform="translate(-12,0)" + y2="94.5366" + x2="86.5356" + y1="102.3447" + x1="94.3438" + gradientUnits="userSpaceOnUse" + id="linearGradient2657" + xlink:href="#XMLID_9_" + inkscape:collect="always" /><linearGradient + gradientTransform="translate(-12,0)" + y2="94.5865" + x2="86.5865" + y1="103" + x1="95" + gradientUnits="userSpaceOnUse" + id="linearGradient2655" + xlink:href="#XMLID_10_" + inkscape:collect="always" /><linearGradient + gradientTransform="translate(-12,0)" + y2="95.293" + x2="87.293" + y1="103" + x1="95" + gradientUnits="userSpaceOnUse" + id="linearGradient2653" + xlink:href="#XMLID_11_" + inkscape:collect="always" /><linearGradient + gradientTransform="translate(-12,0)" + y2="96.0002" + x2="88.0002" + y1="104" + x1="96" + gradientUnits="userSpaceOnUse" + id="linearGradient2651" + xlink:href="#XMLID_12_" + inkscape:collect="always" /><radialGradient + gradientTransform="translate(-12,0)" + r="139.5585" + cy="112.3047" + cx="102" + gradientUnits="userSpaceOnUse" + id="radialGradient2649" + xlink:href="#XMLID_7_" + inkscape:collect="always" /><radialGradient + gradientTransform="translate(-12,0)" + r="139.55859" + cy="112.3047" + cx="102" + gradientUnits="userSpaceOnUse" + id="radialGradient2647" + xlink:href="#XMLID_8_" + inkscape:collect="always" /><linearGradient + gradientTransform="translate(69.54139,-45.18897)" + y2="51.1875" + x2="-39.53125" + y1="78" + x1="-39.53125" + gradientUnits="userSpaceOnUse" + id="linearGradient2645" + xlink:href="#linearGradient18668" + inkscape:collect="always" /><linearGradient + y2="51.1875" + x2="-39.53125" + y1="78" + x1="-39.53125" + gradientUnits="userSpaceOnUse" + id="linearGradient2643" + xlink:href="#linearGradient18668" + inkscape:collect="always" /><linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient2641" + xlink:href="#XMLID_2_" + inkscape:collect="always" /><linearGradient + y2="51.1875" + x2="-39.53125" + y1="78" + x1="-39.53125" + gradientUnits="userSpaceOnUse" + id="linearGradient2639" + xlink:href="#linearGradient18668" + inkscape:collect="always" /> + + <linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient2633"> + <stop + id="stop2635" + style="stop-color:#FFEA00" + offset="0" /> + <stop + id="stop2637" + style="stop-color:#FFCC00" + offset="1" /> + </linearGradient> + <linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient2631" + xlink:href="#XMLID_2_" + inkscape:collect="always" /><radialGradient + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.754978,-2.959381e-2,0,0.905772,7.650275,10.87807)" + r="8.968153" + fy="31.045055" + fx="26.954102" + cy="31.045055" + cx="26.954102" + id="radialGradient2629" + xlink:href="#linearGradient15967" + inkscape:collect="always" /><linearGradient + y2="100.82378" + x2="-18.121965" + y1="100.82378" + x1="-74.820707" + gradientUnits="userSpaceOnUse" + id="linearGradient2627" + xlink:href="#linearGradient2309" + inkscape:collect="always" /><linearGradient + gradientTransform="translate(1.470416e-5,0)" + y2="30.441185" + x2="27.719746" + y1="7.881104" + x1="27.719746" + gradientUnits="userSpaceOnUse" + id="linearGradient2625" + xlink:href="#linearGradient15967" + inkscape:collect="always" /><linearGradient + y2="100.82378" + x2="-18.121965" + y1="100.82378" + x1="-74.820707" + gradientUnits="userSpaceOnUse" + id="linearGradient2623" + xlink:href="#linearGradient2309" + inkscape:collect="always" /><linearGradient + y2="100.82378" + x2="-18.121965" + y1="100.82378" + x1="-74.820707" + gradientUnits="userSpaceOnUse" + id="linearGradient2621" + xlink:href="#linearGradient2309" + inkscape:collect="always" /><linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient2619" + xlink:href="#XMLID_2_" + inkscape:collect="always" /> + +<foreignObject + id="foreignObject2617" + height="1" + width="1" + y="0" + x="0" + requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/"> + <i:pgfRef + xlink:href="#adobe_illustrator_pgf"> + </i:pgfRef> + </foreignObject> + <radialGradient + r="139.55859" + cy="112.3047" + cx="102" + gradientUnits="userSpaceOnUse" + id="radialGradient2615" + xlink:href="#XMLID_8_" + inkscape:collect="always" /><radialGradient + r="139.5585" + cy="112.3047" + cx="102" + gradientUnits="userSpaceOnUse" + id="radialGradient2613" + xlink:href="#XMLID_7_" + inkscape:collect="always" /><linearGradient + y2="96.0002" + x2="88.0002" + y1="104" + x1="96" + gradientUnits="userSpaceOnUse" + id="linearGradient2611" + xlink:href="#XMLID_12_" + inkscape:collect="always" /><linearGradient + y2="95.293" + x2="87.293" + y1="103" + x1="95" + gradientUnits="userSpaceOnUse" + id="linearGradient2609" + xlink:href="#XMLID_11_" + inkscape:collect="always" /><linearGradient + y2="94.5865" + x2="86.5865" + y1="103" + x1="95" + gradientUnits="userSpaceOnUse" + id="linearGradient2607" + xlink:href="#XMLID_10_" + inkscape:collect="always" /><linearGradient + y2="94.5366" + x2="86.5356" + y1="102.3447" + x1="94.3438" + gradientUnits="userSpaceOnUse" + id="linearGradient2605" + xlink:href="#XMLID_9_" + inkscape:collect="always" /><linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient2599"> + <stop + id="stop2601" + style="stop-color:#FFEA00" + offset="0" /> + <stop + id="stop2603" + style="stop-color:#FFCC00" + offset="1" /> + </linearGradient><linearGradient + id="linearGradient2593" + gradientUnits="userSpaceOnUse" + x1="28" + y1="57.5" + x2="28" + y2="0"> + <stop + offset="0" + style="stop-color:white;stop-opacity:1;" + id="stop2595" /> + <stop + offset="1" + style="stop-color:white;stop-opacity:0;" + id="stop2597" /> + </linearGradient><linearGradient + id="linearGradient2587" + gradientUnits="userSpaceOnUse" + x1="28" + y1="57.5" + x2="28" + y2="0"> + <stop + offset="0" + style="stop-color:#fff8a8;stop-opacity:1;" + id="stop2589" /> + <stop + offset="1" + style="stop-color:white;stop-opacity:0;" + id="stop2591" /> + </linearGradient><linearGradient + id="linearGradient2581"><stop + id="stop2583" + offset="0" + style="stop-color:black;stop-opacity:1" /><stop + id="stop2585" + offset="1" + style="stop-color:black;stop-opacity:0" /></linearGradient><linearGradient + id="linearGradient2575" + gradientUnits="userSpaceOnUse" + x1="28" + y1="57.5" + x2="28" + y2="0"> + <stop + offset="0" + style="stop-color:#474747;stop-opacity:1;" + id="stop2577" /> + <stop + offset="1" + style="stop-color:#000000;stop-opacity:1;" + id="stop2579" /> + </linearGradient><radialGradient + inkscape:collect="always" + xlink:href="#XMLID_7_" + id="radialGradient2910" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-12,-4)" + cx="102" + cy="112.3047" + r="139.5585" /><radialGradient + inkscape:collect="always" + xlink:href="#XMLID_8_" + id="radialGradient2912" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-12,-4)" + cx="102" + cy="112.3047" + r="139.55859" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_9_" + id="linearGradient2914" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-12,-4)" + x1="94.3438" + y1="102.3447" + x2="86.5356" + y2="94.5366" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_10_" + id="linearGradient2916" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-12,-4)" + x1="95" + y1="103" + x2="86.5865" + y2="94.5865" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_11_" + id="linearGradient2918" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-12,-4)" + x1="95" + y1="103" + x2="87.293" + y2="95.293" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_12_" + id="linearGradient2920" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-12,-4)" + x1="96" + y1="104" + x2="88.0002" + y2="96.0002" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_12_" + id="linearGradient3899" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-185.19828,-18.5)" + x1="96" + y1="104" + x2="88.0002" + y2="96.0002" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_11_" + id="linearGradient3902" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-185.19828,-18.5)" + x1="95" + y1="103" + x2="87.293" + y2="95.293" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_10_" + id="linearGradient3905" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-185.19828,-18.5)" + x1="95" + y1="103" + x2="86.5865" + y2="94.5865" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_9_" + id="linearGradient3908" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-185.19828,-18.5)" + x1="94.3438" + y1="102.3447" + x2="86.5356" + y2="94.5366" /><radialGradient + inkscape:collect="always" + xlink:href="#XMLID_8_" + id="radialGradient3912" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-337.44962,-79.054366)" + cx="102" + cy="112.3047" + r="139.55859" /><radialGradient + inkscape:collect="always" + xlink:href="#XMLID_7_" + id="radialGradient3915" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-337.44962,-79.054366)" + cx="102" + cy="112.3047" + r="139.5585" /><linearGradient + id="linearGradient3075"><stop + id="stop3077" + offset="0" + style="stop-color:#ffffff;stop-opacity:1;" /><stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0.42597079" + id="stop3093" /><stop + style="stop-color:#f1f1f1;stop-opacity:1;" + offset="0.5892781" + id="stop3085" /><stop + id="stop3087" + offset="0.80219781" + style="stop-color:#eaeaea;stop-opacity:1;" /><stop + id="stop3079" + offset="1" + style="stop-color:#dfdfdf;stop-opacity:1;" /></linearGradient><linearGradient + id="linearGradient3139"><stop + id="stop3141" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /><stop + style="stop-color:#000000;stop-opacity:0.68235294;" + offset="0.40659341" + id="stop3162" /><stop + id="stop3164" + offset="0.45329672" + style="stop-color:#000000;stop-opacity:0.48736462;" /><stop + style="stop-color:#000000;stop-opacity:0.36101082;" + offset="0.5" + id="stop3158" /><stop + id="stop3160" + offset="0.70604396" + style="stop-color:#000000;stop-opacity:0.15162455;" /><stop + id="stop3143" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /></linearGradient><linearGradient + id="linearGradient3149"><stop + id="stop3151" + offset="0" + style="stop-color:#454545;stop-opacity:1;" /><stop + style="stop-color:#cacaca;stop-opacity:1;" + offset="0.48275861" + id="stop3920" /><stop + id="stop3153" + offset="1" + style="stop-color:#f8f8f8;stop-opacity:1;" /></linearGradient><linearGradient + id="linearGradient2763"><stop + id="stop2765" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /><stop + id="stop2767" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /></linearGradient><linearGradient + id="linearGradient3235" + inkscape:collect="always"><stop + id="stop3237" + offset="0" + style="stop-color:#ffffff;stop-opacity:1;" /><stop + id="stop3239" + offset="1" + style="stop-color:#ffffff;stop-opacity:0;" /></linearGradient><linearGradient + id="linearGradient4181"><stop + id="stop4183" + offset="0" + style="stop-color:#000000;stop-opacity:0.29602888;" /><stop + id="stop4185" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /></linearGradient><linearGradient + id="linearGradient4206"><stop + id="stop4208" + offset="0" + style="stop-color:#f7f7f7;stop-opacity:1;" /><stop + id="stop4210" + offset="1" + style="stop-color:#f7f7f7;stop-opacity:0;" /></linearGradient><linearGradient + id="linearGradient4221"><stop + style="stop-color:#f7f7f7;stop-opacity:1;" + offset="0" + id="stop4223" /><stop + style="stop-color:#f7f7f7;stop-opacity:0;" + offset="1" + id="stop4225" /></linearGradient><linearGradient + id="linearGradient2741"><stop + id="stop2743" + offset="0" + style="stop-color:black;stop-opacity:1" /><stop + id="stop2745" + offset="1" + style="stop-color:black;stop-opacity:0" /></linearGradient><linearGradient + id="linearGradient2898"><stop + style="stop-color:black;stop-opacity:0;" + offset="0" + id="stop2900" /><stop + id="stop2738" + offset="0" + style="stop-color:#262626;stop-opacity:1;" /><stop + style="stop-color:#4c4c4c;stop-opacity:1;" + offset="1" + id="stop2902" /></linearGradient><linearGradient + id="linearGradient6456"><stop + style="stop-color:#888;stop-opacity:1;" + offset="0" + id="stop6458" /><stop + style="stop-color:#b6b6b6;stop-opacity:1;" + offset="1" + id="stop6460" /></linearGradient><radialGradient + gradientUnits="userSpaceOnUse" + r="139.5585" + cy="112.3047" + cx="102" + id="radialGradient2714"><stop + id="stop2716" + style="stop-color:#00537D" + offset="0" /><stop + id="stop2718" + style="stop-color:#186389" + offset="0.0151" /><stop + id="stop2720" + style="stop-color:#558CA8" + offset="0.0558" /><stop + id="stop2722" + style="stop-color:#89AFC3" + offset="0.0964" /><stop + id="stop24" + style="stop-color:#B3CCD8" + offset="0.1357" /><stop + id="stop2725" + style="stop-color:#D4E2E9" + offset="0.1737" /><stop + id="stop2727" + style="stop-color:#ECF2F5" + offset="0.2099" /><stop + id="stop2729" + style="stop-color:#FAFCFD" + offset="0.2435" /><stop + id="stop2731" + style="stop-color:#FFFFFF" + offset="0.2722" /></radialGradient><radialGradient + gradientUnits="userSpaceOnUse" + r="139.55859" + cy="112.3047" + cx="102" + id="radialGradient2696"><stop + id="stop2698" + style="stop-color:#535557" + offset="0" /><stop + id="stop2700" + style="stop-color:#898A8C" + offset="0.11366145" /><stop + id="stop2702" + style="stop-color:#ECECEC" + offset="0.20296688" /><stop + id="stop2704" + style="stop-color:#FAFAFA" + offset="0.2363" /><stop + id="stop2706" + style="stop-color:#FFFFFF" + offset="0.2722" /><stop + id="stop2708" + style="stop-color:#FAFAFA" + offset="0.5313" /><stop + id="stop2710" + style="stop-color:#EBECEC" + offset="0.8449" /><stop + id="stop2712" + style="stop-color:#E1E2E3" + offset="1" /></radialGradient><linearGradient + y2="94.536598" + x2="86.535599" + y1="102.3447" + x1="94.343803" + gradientUnits="userSpaceOnUse" + id="linearGradient2690"><stop + id="stop2692" + style="stop-color:#FFFFFF" + offset="0" /><stop + id="stop2694" + style="stop-color:#555753" + offset="1" /></linearGradient><linearGradient + y2="94.586502" + x2="86.586502" + y1="103" + x1="95" + gradientUnits="userSpaceOnUse" + id="linearGradient2684"><stop + id="stop2686" + style="stop-color:#FFFFFF" + offset="0" /><stop + id="stop2688" + style="stop-color:#555753" + offset="1" /></linearGradient><linearGradient + y2="95.292999" + x2="87.292999" + y1="103" + x1="95" + gradientUnits="userSpaceOnUse" + id="linearGradient2678"><stop + id="stop2680" + style="stop-color:#FFFFFF" + offset="0" /><stop + id="stop2682" + style="stop-color:#393B38" + offset="1" /></linearGradient><linearGradient + y2="96.000198" + x2="88.000198" + y1="104" + x1="96" + gradientUnits="userSpaceOnUse" + id="linearGradient2658"><stop + id="stop2660" + style="stop-color:#888A85" + offset="0" /><stop + id="stop2662" + style="stop-color:#8C8E89" + offset="0.0072" /><stop + id="stop2664" + style="stop-color:#ABACA9" + offset="0.0673" /><stop + id="stop2666" + style="stop-color:#C5C6C4" + offset="0.1347" /><stop + id="stop2668" + style="stop-color:#DBDBDA" + offset="0.2115" /><stop + id="stop2670" + style="stop-color:#EBEBEB" + offset="0.3012" /><stop + id="stop2672" + style="stop-color:#F7F7F6" + offset="0.4122" /><stop + id="stop2674" + style="stop-color:#FDFDFD" + offset="0.5679" /><stop + id="stop2676" + style="stop-color:#FFFFFF" + offset="1" /></linearGradient><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3149" + id="linearGradient3884" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.1111117,0,0,1.6,-12.8889,-0.81587)" + spreadMethod="reflect" + x1="58.073513" + y1="5.5073318" + x2="58.073513" + y2="12.044647" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3149" + id="linearGradient3891" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.227818,0,0,1.286432,98.3596,13.42714)" + x1="-34.499901" + y1="-1.3553318" + x2="-34.499901" + y2="-11.966981" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3235" + id="linearGradient3931" + x1="48.61359" + y1="10.752187" + x2="84" + y2="10.752187" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.1303775,0,0,1,-18.951707,-0.5)" /><filter + inkscape:collect="always" + x="-0.018968365" + width="1.0379367" + y="-0.34415792" + height="1.6883158" + id="filter3999"><feGaussianBlur + inkscape:collect="always" + stdDeviation="0.31613941" + id="feGaussianBlur4001" /></filter><filter + inkscape:collect="always" + x="-0.035955056" + width="1.0719101" + y="-0.25168539" + height="1.5033708" + id="filter4033"><feGaussianBlur + inkscape:collect="always" + stdDeviation="0.6349485" + id="feGaussianBlur4035" /></filter><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4077" + id="linearGradient4083" + x1="56.827953" + y1="-34.582161" + x2="54.1763" + y2="32.055855" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3235" + id="linearGradient4135" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.1489125,-138.10679,0)" + x1="56.623783" + y1="21.105345" + x2="101.6466" + y2="21.381557" /><mask + maskUnits="userSpaceOnUse" + id="mask4131"><rect + style="opacity:1;fill:url(#linearGradient4135);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1" + id="rect4133" + width="65.186401" + height="28.561073" + x="-101.64659" + y="10.285005" + transform="matrix(-1,0,-0.3481553,0.9374369,0,0)" /></mask><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3235" + id="linearGradient4147" + x1="48.461166" + y1="1.3560734" + x2="75.130096" + y2="1.3560734" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-7.8,1.3)" /><filter + inkscape:collect="always" + x="-0.014460673" + width="1.0289213" + y="-0.19945781" + height="1.3989156" + id="filter4177"><feGaussianBlur + inkscape:collect="always" + stdDeviation="0.16068779" + id="feGaussianBlur4179" /></filter><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2575" + id="linearGradient4190" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-7.9976205,0)" + x1="79.587105" + y1="-25.960203" + x2="110.8327" + y2="90.649948" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2575" + id="linearGradient4194" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,119.99651,0)" + x1="79.587105" + y1="-25.960203" + x2="110.8327" + y2="90.649948" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3638" + id="linearGradient4215" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-8.000004,-0.9999969)" + x1="73.615906" + y1="97.608109" + x2="73.943695" + y2="138.20813" /><filter + inkscape:collect="always" + x="-0.023605747" + width="1.0472115" + y="-0.46785067" + height="1.9357013" + id="filter4253"><feGaussianBlur + inkscape:collect="always" + stdDeviation="0.94422987" + id="feGaussianBlur4255" /></filter><linearGradient + gradientTransform="translate(-127.99999,0)" + gradientUnits="userSpaceOnUse" + y2="53.669254" + x2="157.3817" + y1="7.9986315" + x1="157.3817" + id="linearGradient3470" + xlink:href="#linearGradient3464" + inkscape:collect="always" /> + + <linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient4477"> + <stop + id="stop4479" + style="stop-color:#FFEA00" + offset="0" /> + <stop + id="stop4481" + style="stop-color:#FFCC00" + offset="1" /> + </linearGradient> + <linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient4475" + xlink:href="#linearGradient3287" + inkscape:collect="always" /><linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient2298" + xlink:href="#linearGradient3287" + inkscape:collect="always" /><linearGradient + y2="51.1875" + x2="-39.53125" + y1="78" + x1="-39.53125" + gradientTransform="translate(69.54139,-45.18897)" + gradientUnits="userSpaceOnUse" + id="linearGradient4468" + xlink:href="#linearGradient18668" + inkscape:collect="always" /> + + + + +<linearGradient + gradientTransform="translate(-20,-16)" + y2="94.5366" + x2="86.5356" + y1="102.3447" + x1="94.3438" + gradientUnits="userSpaceOnUse" + id="linearGradient4466" + xlink:href="#XMLID_9_" + inkscape:collect="always" /><linearGradient + gradientTransform="translate(-20,-16)" + y2="94.5865" + x2="86.5865" + y1="103" + x1="95" + gradientUnits="userSpaceOnUse" + id="linearGradient4464" + xlink:href="#XMLID_10_" + inkscape:collect="always" /><linearGradient + gradientTransform="translate(-20,-16)" + y2="95.293" + x2="87.293" + y1="103" + x1="95" + gradientUnits="userSpaceOnUse" + id="linearGradient4462" + xlink:href="#XMLID_11_" + inkscape:collect="always" /><linearGradient + gradientTransform="translate(-20,-16)" + y2="96.0002" + x2="88.0002" + y1="104" + x1="96" + gradientUnits="userSpaceOnUse" + id="linearGradient4460" + xlink:href="#XMLID_12_" + inkscape:collect="always" /><radialGradient + gradientTransform="translate(-20,-16)" + r="139.5585" + cy="112.3047" + cx="102" + gradientUnits="userSpaceOnUse" + id="radialGradient4458" + xlink:href="#XMLID_7_" + inkscape:collect="always" /><radialGradient + gradientTransform="translate(-20,-16)" + r="139.55859" + cy="112.3047" + cx="102" + gradientUnits="userSpaceOnUse" + id="radialGradient4456" + xlink:href="#XMLID_8_" + inkscape:collect="always" /><linearGradient + gradientTransform="translate(69.54139,-45.18897)" + y2="51.1875" + x2="-39.53125" + y1="78" + x1="-39.53125" + gradientUnits="userSpaceOnUse" + id="linearGradient4454" + xlink:href="#linearGradient18668" + inkscape:collect="always" /><linearGradient + y2="51.1875" + x2="-39.53125" + y1="78" + x1="-39.53125" + gradientUnits="userSpaceOnUse" + id="linearGradient4452" + xlink:href="#linearGradient18668" + inkscape:collect="always" /><linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient4450" + xlink:href="#XMLID_2_" + inkscape:collect="always" /><linearGradient + y2="51.1875" + x2="-39.53125" + y1="78" + x1="-39.53125" + gradientUnits="userSpaceOnUse" + id="linearGradient4448" + xlink:href="#linearGradient18668" + inkscape:collect="always" /> + + <linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient4442"> + <stop + id="stop4444" + style="stop-color:#FFEA00" + offset="0" /> + <stop + id="stop4446" + style="stop-color:#FFCC00" + offset="1" /> + </linearGradient> + <linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient4440" + xlink:href="#XMLID_2_" + inkscape:collect="always" /><radialGradient + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.754978,-2.959381e-2,0,0.905772,7.650275,10.87807)" + r="8.968153" + fy="31.045055" + fx="26.954102" + cy="31.045055" + cx="26.954102" + id="radialGradient4438" + xlink:href="#linearGradient15967" + inkscape:collect="always" /><linearGradient + y2="100.82378" + x2="-18.121965" + y1="100.82378" + x1="-74.820707" + gradientUnits="userSpaceOnUse" + id="linearGradient4436" + xlink:href="#linearGradient2309" + inkscape:collect="always" /><linearGradient + gradientTransform="translate(1.470416e-5,0)" + y2="30.441185" + x2="27.719746" + y1="7.881104" + x1="27.719746" + gradientUnits="userSpaceOnUse" + id="linearGradient4434" + xlink:href="#linearGradient15967" + inkscape:collect="always" /><linearGradient + y2="100.82378" + x2="-18.121965" + y1="100.82378" + x1="-74.820707" + gradientUnits="userSpaceOnUse" + id="linearGradient4432" + xlink:href="#linearGradient2309" + inkscape:collect="always" /><linearGradient + y2="100.82378" + x2="-18.121965" + y1="100.82378" + x1="-74.820707" + gradientUnits="userSpaceOnUse" + id="linearGradient4430" + xlink:href="#linearGradient2309" + inkscape:collect="always" /><linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient4428" + xlink:href="#XMLID_2_" + inkscape:collect="always" /> + +<foreignObject + id="foreignObject4426" + height="1" + width="1" + y="0" + x="0" + requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/"> + <i:pgfRef + xlink:href="#adobe_illustrator_pgf"> + </i:pgfRef> + </foreignObject> + <radialGradient + r="139.55859" + cy="112.3047" + cx="102" + gradientUnits="userSpaceOnUse" + id="radialGradient4424" + xlink:href="#XMLID_8_" + inkscape:collect="always" /><radialGradient + r="139.5585" + cy="112.3047" + cx="102" + gradientUnits="userSpaceOnUse" + id="radialGradient4422" + xlink:href="#XMLID_7_" + inkscape:collect="always" /><linearGradient + y2="96.0002" + x2="88.0002" + y1="104" + x1="96" + gradientUnits="userSpaceOnUse" + id="linearGradient4420" + xlink:href="#XMLID_12_" + inkscape:collect="always" /><linearGradient + y2="95.293" + x2="87.293" + y1="103" + x1="95" + gradientUnits="userSpaceOnUse" + id="linearGradient4418" + xlink:href="#XMLID_11_" + inkscape:collect="always" /><linearGradient + y2="94.5865" + x2="86.5865" + y1="103" + x1="95" + gradientUnits="userSpaceOnUse" + id="linearGradient4416" + xlink:href="#XMLID_10_" + inkscape:collect="always" /><linearGradient + y2="94.5366" + x2="86.5356" + y1="102.3447" + x1="94.3438" + gradientUnits="userSpaceOnUse" + id="linearGradient4414" + xlink:href="#XMLID_9_" + inkscape:collect="always" /><linearGradient + y2="0" + x2="28" + y1="57.5" + x1="28" + gradientUnits="userSpaceOnUse" + id="linearGradient4408"> + <stop + id="stop4410" + style="stop-color:#FFEA00" + offset="0" /> + <stop + id="stop4412" + style="stop-color:#FFCC00" + offset="1" /> + </linearGradient><linearGradient + id="linearGradient4402" + gradientUnits="userSpaceOnUse" + x1="28" + y1="57.5" + x2="28" + y2="0"> + <stop + offset="0" + style="stop-color:white;stop-opacity:1;" + id="stop4404" /> + <stop + offset="1" + style="stop-color:white;stop-opacity:0;" + id="stop4406" /> + </linearGradient><linearGradient + id="linearGradient4396" + gradientUnits="userSpaceOnUse" + x1="28" + y1="57.5" + x2="28" + y2="0"> + <stop + offset="0" + style="stop-color:#fff8a8;stop-opacity:1;" + id="stop4398" /> + <stop + offset="1" + style="stop-color:white;stop-opacity:0;" + id="stop4400" /> + </linearGradient><linearGradient + id="linearGradient4390"><stop + id="stop4392" + offset="0" + style="stop-color:black;stop-opacity:1" /><stop + id="stop4394" + offset="1" + style="stop-color:black;stop-opacity:0" /></linearGradient><linearGradient + id="linearGradient4384" + gradientUnits="userSpaceOnUse" + x1="28" + y1="57.5" + x2="28" + y2="0"> + <stop + offset="0" + style="stop-color:#FFEA00" + id="stop4386" /> + <stop + offset="1" + style="stop-color:#ffa000;stop-opacity:1;" + id="stop4388" /> + </linearGradient><linearGradient + id="linearGradient3464" + inkscape:collect="always"><stop + id="stop3466" + offset="0" + style="stop-color:#ffffff;stop-opacity:1;" /><stop + id="stop3468" + offset="1" + style="stop-color:#ffffff;stop-opacity:0;" /></linearGradient><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4077" + id="linearGradient4590" + gradientUnits="userSpaceOnUse" + x1="56.827953" + y1="-34.582161" + x2="76.486145" + y2="38.820595" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4005" + id="linearGradient4648" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-8,5.6)" + x1="63.085938" + y1="19.992191" + x2="63.085938" + y2="13.937426" /><radialGradient + inkscape:collect="always" + xlink:href="#XMLID_7_" + id="radialGradient4659" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-7.9999972,-4.0000003)" + cx="102" + cy="112.3047" + r="139.5585" /><radialGradient + inkscape:collect="always" + xlink:href="#XMLID_8_" + id="radialGradient4661" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-7.9999972,-4.0000003)" + cx="102" + cy="112.3047" + r="139.55859" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_9_" + id="linearGradient4663" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-7.9999972,-4.0000003)" + x1="94.3438" + y1="102.3447" + x2="86.5356" + y2="94.5366" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_10_" + id="linearGradient4665" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-7.9999972,-4.0000003)" + x1="95" + y1="103" + x2="86.5865" + y2="94.5865" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_11_" + id="linearGradient4667" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-7.9999972,-4.0000003)" + x1="95" + y1="103" + x2="87.293" + y2="95.293" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_12_" + id="linearGradient4669" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-7.9999972,-4.0000003)" + x1="96" + y1="104" + x2="88.0002" + y2="96.0002" /><filter + inkscape:collect="always" + id="filter4787"><feGaussianBlur + inkscape:collect="always" + stdDeviation="2.2677902" + id="feGaussianBlur4789" /></filter><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4811" + id="linearGradient4817" + x1="50.759903" + y1="-2.1362097" + x2="50.759903" + y2="1.3951097" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_12_" + id="linearGradient4840" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(8.0000028,3.9999997)" + x1="96" + y1="104" + x2="88.0002" + y2="96.0002" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_11_" + id="linearGradient4843" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(8.0000028,3.9999997)" + x1="95" + y1="103" + x2="87.293" + y2="95.293" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_10_" + id="linearGradient4846" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(8.0000028,3.9999997)" + x1="95" + y1="103" + x2="86.5865" + y2="94.5865" /><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_9_" + id="linearGradient4849" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(8.0000028,3.9999997)" + x1="94.3438" + y1="102.3447" + x2="86.5356" + y2="94.5366" /><radialGradient + inkscape:collect="always" + xlink:href="#XMLID_8_" + id="radialGradient4852" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(8.0000028,3.9999997)" + cx="102" + cy="112.3047" + r="139.55859" /><radialGradient + inkscape:collect="always" + xlink:href="#XMLID_7_" + id="radialGradient4855" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(8.0000028,3.9999997)" + cx="102" + cy="112.3047" + r="139.5585" /><filter + inkscape:collect="always" + x="-0.040822664" + width="1.0816453" + y="-0.11777063" + height="1.2355413" + id="filter3346"><feGaussianBlur + inkscape:collect="always" + stdDeviation="0.90509031" + id="feGaussianBlur3348" /></filter><filter + inkscape:collect="always" + id="filter3396"><feGaussianBlur + inkscape:collect="always" + stdDeviation="0.19500234" + id="feGaussianBlur3398" /></filter><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3400" + id="linearGradient3406" + x1="88.966972" + y1="5.7464399" + x2="-36.418835" + y2="5.7464399" + gradientUnits="userSpaceOnUse" /></defs><sodipodi:namedview + inkscape:window-height="670" + inkscape:window-width="1049" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + guidetolerance="10.0" + gridtolerance="10.0" + objecttolerance="10.0" + borderopacity="1.0" + bordercolor="#666666" + pagecolor="#ffffff" + id="base" + inkscape:zoom="5.0270873" + inkscape:cx="70.830936" + inkscape:cy="88.752043" + inkscape:window-x="750" + inkscape:window-y="145" + inkscape:current-layer="Layer_1" + showgrid="true" + gridspacingy="4px" + gridspacingx="4px" + gridempspacing="2" + showguides="true" + inkscape:guide-bbox="true"><inkscape:grid + type="xygrid" + id="grid3408" /></sodipodi:namedview> +<metadata + id="metadata3"> + <ns:sfw> + <ns:slices> + <ns:slice + y="0" + x="0" + height="128" + width="128" + sliceID="1316743234" /> + </ns:slices> + <ns:sliceSourceBounds + y="0" + x="0" + height="128" + width="128" + bottomLeftOrigin="true" /> + <ns:optimizationSettings> + <ns:targetSettings + targetSettingsID="0" + fileFormat="PNG24Format"> + <ns:PNG24Format + transparency="true" + filtered="false" + matteColor="#FFFFFF" + noMatteColor="false" + interlaced="false"> + </ns:PNG24Format> + </ns:targetSettings> + <ns:targetSettings + targetSettingsID="1696735251" + fileFormat="PNG24Format"> + <ns:PNG24Format + transparency="true" + filtered="false" + matteColor="#FFFFFF" + noMatteColor="false" + interlaced="false"> + </ns:PNG24Format> + </ns:targetSettings> + </ns:optimizationSettings> + </ns:sfw> +<rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata> + +<radialGradient + id="XMLID_7_" + cx="102" + cy="112.3047" + r="139.5585" + gradientUnits="userSpaceOnUse"> + <stop + offset="0" + style="stop-color:#3e3e3e;stop-opacity:1;" + id="stop16" /> + + + + + <stop + offset="0.1737" + style="stop-color:#dfdfdf;stop-opacity:1;" + id="stop26" /> + <stop + offset="0.2099" + style="stop-color:#ECF2F5" + id="stop28" /> + <stop + offset="0.2435" + style="stop-color:#FAFCFD" + id="stop30" /> + <stop + offset="0.2722" + style="stop-color:#FFFFFF" + id="stop32" /> +</radialGradient> + +<radialGradient + id="XMLID_8_" + cx="102" + cy="112.3047" + r="139.55859" + gradientUnits="userSpaceOnUse"> + <stop + offset="0" + style="stop-color:#535557" + id="stop37" /> + + <stop + offset="0.11366145" + style="stop-color:#898A8C" + id="stop41" /> + + + <stop + offset="0.20296688" + style="stop-color:#ECECEC" + id="stop47" /> + <stop + offset="0.2363" + style="stop-color:#FAFAFA" + id="stop49" /> + <stop + offset="0.2722" + style="stop-color:#FFFFFF" + id="stop51" /> + <stop + offset="0.5313" + style="stop-color:#FAFAFA" + id="stop53" /> + <stop + offset="0.8449" + style="stop-color:#EBECEC" + id="stop55" /> + <stop + offset="1" + style="stop-color:#E1E2E3" + id="stop57" /> +</radialGradient> + +<linearGradient + id="XMLID_9_" + gradientUnits="userSpaceOnUse" + x1="94.3438" + y1="102.3447" + x2="86.5356" + y2="94.5366"> + <stop + offset="0" + style="stop-color:#FFFFFF" + id="stop62" /> + <stop + offset="1" + style="stop-color:#555753" + id="stop64" /> +</linearGradient> + +<linearGradient + id="XMLID_10_" + gradientUnits="userSpaceOnUse" + x1="95" + y1="103" + x2="86.5865" + y2="94.5865"> + <stop + offset="0" + style="stop-color:#FFFFFF" + id="stop69" /> + <stop + offset="1" + style="stop-color:#555753" + id="stop71" /> +</linearGradient> + +<linearGradient + id="XMLID_11_" + gradientUnits="userSpaceOnUse" + x1="95" + y1="103" + x2="87.293" + y2="95.293"> + <stop + offset="0" + style="stop-color:#FFFFFF" + id="stop76" /> + <stop + offset="1" + style="stop-color:#393B38" + id="stop78" /> +</linearGradient> + +<linearGradient + id="XMLID_12_" + gradientUnits="userSpaceOnUse" + x1="96" + y1="104" + x2="88.0002" + y2="96.0002"> + <stop + offset="0" + style="stop-color:#888A85" + id="stop83" /> + <stop + offset="0.0072" + style="stop-color:#8C8E89" + id="stop85" /> + <stop + offset="0.0673" + style="stop-color:#ABACA9" + id="stop87" /> + <stop + offset="0.1347" + style="stop-color:#C5C6C4" + id="stop89" /> + <stop + offset="0.2115" + style="stop-color:#DBDBDA" + id="stop91" /> + <stop + offset="0.3012" + style="stop-color:#EBEBEB" + id="stop93" /> + <stop + offset="0.4122" + style="stop-color:#F7F7F6" + id="stop95" /> + <stop + offset="0.5679" + style="stop-color:#FDFDFD" + id="stop97" /> + <stop + offset="1" + style="stop-color:#FFFFFF" + id="stop99" /> +</linearGradient> + + +<path + style="opacity:0.7715356;fill:none;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4787)" + d="M 41.000003,32 L 41.000003,122 C 41.000003,123.104 41.896003,124 43.000003,124 L 85.187503,124 C 85.717503,124 86.218753,123.78125 86.593753,123.40625 C 86.593753,123.40625 98.500003,113.5 104,108 C 109.5,102.5 119.40625,90.59375 119.40625,90.59375 C 119.78125,90.218751 120,89.7175 120,89.1875 L 120,32 L 41.000003,32 z " + id="path4749" + sodipodi:nodetypes="cccccscccc" /><path + id="path4213" + d="M 8,114.15625 L 8,115.15625 C 8,117.28318 9.71681,119 11.84375,119 L 100.15625,119 C 102.28318,119 104,117.28318 104,115.15625 L 104,114.15625 C 104,116.28318 102.28318,118 100.15625,118 L 11.84375,118 C 9.71681,118 8,116.28318 8,114.15625 z " + style="opacity:1;fill:url(#linearGradient4215);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1;filter:url(#filter4253)" /><rect + style="opacity:0.57786889;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.63199997;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4;stroke-opacity:1" + id="rect1327" + width="1" + height="0" + x="60.000023" + y="-83" /><path + style="opacity:1;fill:url(#linearGradient3816);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998000000000;stroke-opacity:1" + d="M 16.53125,12 C 11.80293,12 8,15.802937 8,20.53125 L 8,116.15625 C 8,118.28318 9.71681,120 11.84375,120 L 100.15625,120 C 102.28318,120 104,118.28318 104,116.15625 L 104,20.53125 C 104,15.802937 100.19706,12 95.46875,12 L 16.53125,12 z " + id="rect2834" + sodipodi:nodetypes="ccccccccc" /><path + style="fill:url(#linearGradient3891);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4;stroke-opacity:0.19512191" + d="M 40,0 L 43.760192,16 L 49.822542,16 L 62.177458,16 L 68.239808,16 L 72,0 L 58.417266,0 L 53.582734,0 L 40,0 z " + id="rect3276" /><path + style="opacity:1;fill:url(#linearGradient4190);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1" + d="M 94.47112,12 C 99.19943,12 103.00238,15.802937 103.00237,20.53125 L 103.00237,116.15625 C 103.00237,118.28318 101.28556,120 99.15862,120 L 100.15862,120 C 102.28556,120 104.00237,118.28318 104.00237,116.15625 L 104.00237,20.53125 C 104.00238,15.802937 100.19943,12 95.47112,12 L 94.47112,12 z " + id="path4181" /><rect + style="opacity:0.47191013;fill:url(#linearGradient4648);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1;filter:url(#filter4033)" + id="rect4003" + width="42.382812" + height="6.0546875" + x="34.96875" + y="19.537506" + rx="1.5625" + ry="1.5625" /><path + transform="matrix(1,0,0.3713907,0.9284767,-8,0)" + style="opacity:0.54681648000000005;fill:url(#linearGradient4590);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.08779998000000000;stroke-opacity:1;filter:url(#filter3346)" + mask="url(#mask4131)" + d="M 36.111931,14.503877 L 83.012997,13.908895 C 83.727578,15.756474 84.556527,18.968682 79.20125,30.865909 L 36.111931,32.353364 L 36.111931,14.503877 z " + id="rect4075" + sodipodi:nodetypes="ccccc" /><path + sodipodi:nodetypes="ccccccccc" + style="opacity:0.59550559999999997;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998000000000;stroke-opacity:1;filter:url(#filter3396)" + d="M 16.656253,12.1 C 11.927923,12.1 8.093753,15.902937 8.093753,20.63125 L 8.093753,21.63125 C 8.093753,16.902937 11.927923,13.1 16.656253,13.1 L 95.3625,13.1 C 100.09081,13.1 103.89375,16.902937 103.89375,21.63125 L 103.89375,20.63125 C 103.89375,15.902937 100.09081,12.1 95.3625,12.1 L 16.656253,12.1 z" + id="path3374" /><path + id="path4192" + d="M 17.527763,12 C 12.799453,12 8.996503,15.802937 8.996513,20.53125 L 8.996513,116.15625 C 8.996513,118.28318 10.713323,120 12.840263,120 L 11.840263,120 C 9.713323,120 7.996513,118.28318 7.996513,116.15625 L 7.996513,20.53125 C 7.996503,15.802937 11.799453,12 16.527763,12 L 17.527763,12 z " + style="opacity:1;fill:url(#linearGradient4194);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1" /><path + id="path4819" + d="M 17.256253,13.1 C 12.527923,13.1 8.693753,16.902937 8.693753,21.63125 L 8.693753,22.63125 C 8.693753,17.902937 12.527923,14.1 17.256253,14.1 L 94.7625,14.1 C 99.49081,14.1 103.29375,17.902937 103.29375,22.63125 L 103.29375,21.63125 C 103.29375,16.902937 99.49081,13.1 94.7625,13.1 L 17.256253,13.1 z" + style="opacity:0.78277154000000004;fill:url(#linearGradient3406);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998000000000;stroke-opacity:1;" + sodipodi:nodetypes="ccccccccc" /><rect + style="fill:url(#linearGradient3884);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4;stroke-opacity:0.19512191" + id="rect3259" + width="40" + height="16" + x="36" + y="8" /><rect + style="opacity:1;fill:url(#linearGradient3931);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1;filter:url(#filter3999)" + id="rect3922" + width="40" + height="2.2046118" + x="36" + y="9.2953863" + rx="0" + ry="0" /><path + style="opacity:0.77902623;fill:url(#linearGradient4147);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.08779998;stroke-opacity:1;filter:url(#filter4177)" + d="M 40.661165,1.6893259 L 67.330096,1.6893259 L 67.330096,3.6228209 L 41.198274,3.6228209 L 40.661165,1.6893259 z " + id="rect4138" + sodipodi:nodetypes="ccccc" /><path + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998000000000;stroke-opacity:1" + d="M 8,115.15625 L 8,116.15625 C 8,118.28318 9.71681,120 11.84375,120 L 100.15625,120 C 102.28318,120 104,118.28318 104,116.15625 L 104,115.15625 C 104,117.28318 102.28318,119 100.15625,119 L 11.84375,119 C 9.71681,119 8,117.28318 8,115.15625 z " + id="path4196" /><path + sodipodi:nodetypes="cccccscccc" + id="path2260" + d="M 40.200003,32.3 L 40.200003,122 C 40.200003,123.104 41.096003,124 42.200003,124 L 85.187503,124 C 85.717503,124 86.218753,123.78125 86.593753,123.40625 C 86.593753,123.40625 98.500003,113.5 104,108 C 109.5,102.5 119.40625,90.59375 119.40625,90.59375 C 119.78125,90.218751 120,89.7175 120,89.1875 L 120,32.3 L 40.200003,32.3 z " + style="opacity:0.55805209;fill:none;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /><path + sodipodi:nodetypes="ccccccccc" + id="path2262" + d="M 40.000003,32 L 40.000003,122 C 40.000003,123.104 40.896003,124 42.000003,124 L 85.172003,124 C 85.702003,124 86.211003,123.789 86.586003,123.414 L 119.414,90.586 C 119.789,90.211 120,89.702 120,89.172 L 120,32 L 40.000003,32 z " + style="fill:url(#radialGradient4855)" /><path + sodipodi:nodetypes="ccccccccccc" + id="path2264" + d="M 42.000003,33 C 41.449003,33 41.000003,33.449 41.000003,34 L 41.000003,122 C 41.000003,122.552 41.449003,123 42.000003,123 L 86.172003,123 C 86.435003,123 86.693003,122.894 86.879003,122.707 L 118.707,90.879 C 118.894,90.692 119,90.435 119,90.172 L 119,34 C 119,33.449 118.552,33 118,33 L 42.000003,33 z " + style="fill:url(#radialGradient4852);fill-opacity:1" /><path + style="opacity:0.15;fill:url(#linearGradient4849)" + id="path2266" + d="M 119.414,90.586 C 119.664,90.336 101.035,97 96.000003,97 C 94.346003,97 93.000003,98.346 93.000003,100 C 93.000003,105.035 86.336003,123.664 86.586003,123.414 L 119.414,90.586 z " /><path + style="opacity:0.2;fill:url(#linearGradient4846)" + id="path2268" + d="M 119.414,90.586 C 119.789,90.211 105.444,98 96.000003,98 C 94.897003,98 94.000003,98.897 94.000003,100 C 94.000003,109.444 86.211003,123.789 86.586003,123.414 L 119.414,90.586 z " /><path + style="opacity:0.25;fill:url(#linearGradient4843)" + id="path2270" + d="M 119.414,90.586 C 119.653,90.347 105.807,99 96.000003,99 C 95.447003,99 95.000003,99.447 95.000003,100 C 95.000003,109.807 86.347003,123.653 86.586003,123.414 L 119.414,90.586 z " /><path + sodipodi:nodetypes="csccc" + style="fill:url(#linearGradient4840)" + id="path2272" + d="M 86.586003,123.414 C 86.586003,123.414 98.500003,113.5 104,108 C 109.5,102.5 119.414,90.586 119.414,90.586 C 119.414,90.586 106.25,99.95312 96.000003,99.95312 C 96.000003,110.20313 86.586003,123.414 86.586003,123.414 z " /><path + id="path4809" + d="M 40,0 L 43.760192,16 L 49.822542,16 L 62.177458,16 L 68.239808,16 L 72,0 L 58.417266,0 L 53.582734,0 L 40,0 z " + style="fill:url(#linearGradient4817);fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4;stroke-opacity:0.19512191" /></svg> \ No newline at end of file diff --git a/imgsrc/swap.svg b/imgsrc/swap.svg deleted file mode 100644 index aa62316b34..0000000000 --- a/imgsrc/swap.svg +++ /dev/null @@ -1,722 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://web.resource.org/cc/" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="128" - height="128" - id="svg2606" - sodipodi:version="0.32" - inkscape:version="0.45.1" - version="1.0" - sodipodi:docname="edit-undo.svgz" - inkscape:output_extension="org.inkscape.output.svgz.inkscape" - sodipodi:docbase="/home/david/oxygen/trunk/scalable/actions" - inkscape:export-filename="edit-undo.png" - inkscape:export-xdpi="11.25" - inkscape:export-ydpi="11.25"> - <defs - id="defs2608"> - <linearGradient - inkscape:collect="always" - id="linearGradient3342"> - <stop - style="stop-color:#000000;stop-opacity:1;" - offset="0" - id="stop3344" /> - <stop - style="stop-color:#000000;stop-opacity:0;" - offset="1" - id="stop3347" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient3326"> - <stop - style="stop-color:#000000;stop-opacity:1;" - offset="0" - id="stop3328" /> - <stop - style="stop-color:#000000;stop-opacity:0;" - offset="1" - id="stop3330" /> - </linearGradient> - <linearGradient - id="linearGradient3825"> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="0" - id="stop3827" /> - <stop - id="stop3833" - offset="0.5" - style="stop-color:#ffffff;stop-opacity:0.18705036;" /> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="1" - id="stop3829" /> - </linearGradient> - <linearGradient - id="linearGradient3751"> - <stop - style="stop-color:#beba2c;stop-opacity:1;" - offset="0" - id="stop3753" /> - <stop - style="stop-color:#b6be2c;stop-opacity:0;" - offset="1" - id="stop3755" /> - </linearGradient> - <linearGradient - id="linearGradient3528"> - <stop - style="stop-color:#eaf209;stop-opacity:1;" - offset="0" - id="stop3530" /> - <stop - style="stop-color:#c7c634;stop-opacity:0;" - offset="1" - id="stop3532" /> - </linearGradient> - <linearGradient - id="linearGradient3295"> - <stop - style="stop-color:#fffe63;stop-opacity:1;" - offset="0" - id="stop3297" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop3299" /> - </linearGradient> - <linearGradient - id="linearGradient3202"> - <stop - style="stop-color:#fcff9c;stop-opacity:1;" - offset="0" - id="stop3204" /> - <stop - style="stop-color:#c1a965;stop-opacity:0;" - offset="1" - id="stop3206" /> - </linearGradient> - <radialGradient - id="XMLID_4_" - cx="48" - cy="-0.2148" - r="55.148" - gradientTransform="matrix(0.9792,0,0,0.9725,133.0002,20.8762)" - gradientUnits="userSpaceOnUse"> - <stop - offset="0" - style="stop-color:#cfd13d;stop-opacity:1;" - id="stop3082" /> - <stop - offset="1" - style="stop-color:#db8900;stop-opacity:1;" - id="stop3090" /> - </radialGradient> - <linearGradient - id="linearGradient3260" - inkscape:collect="always"> - <stop - id="stop3262" - offset="0" - style="stop-color:#ffffff;stop-opacity:1;" /> - <stop - id="stop3264" - offset="1" - style="stop-color:#ffffff;stop-opacity:0;" /> - </linearGradient> - <linearGradient - id="linearGradient3344"> - <stop - id="stop3346" - offset="0" - style="stop-color:#fdff63;stop-opacity:1;" /> - <stop - id="stop3348" - offset="1" - style="stop-color:#ffffff;stop-opacity:0;" /> - </linearGradient> - <linearGradient - id="linearGradient3449"> - <stop - id="stop3451" - offset="0" - style="stop-color:#000000;stop-opacity:1;" /> - <stop - id="stop3453" - offset="1" - style="stop-color:#000000;stop-opacity:0;" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#XMLID_4_" - id="linearGradient3516" - x1="147.09375" - y1="33.40625" - x2="8.083992" - y2="123.90625" - gradientUnits="userSpaceOnUse" /> - <radialGradient - inkscape:collect="always" - xlink:href="#XMLID_4_" - id="radialGradient3524" - cx="67.09375" - cy="116.90625" - fx="67.09375" - fy="116.90625" - r="56" - gradientUnits="userSpaceOnUse" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient3528" - id="radialGradient3535" - cx="99.726295" - cy="27.418272" - fx="64.689766" - fy="68.231934" - r="56" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.693735,5.8671246e-2,-3.6242796e-2,0.4285387,33.939389,26.8809)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3295" - id="linearGradient3548" - x1="75.09375" - y1="4.5317035" - x2="75.09375" - y2="80.172485" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3260" - id="linearGradient3581" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(4.2161108e-3,1.9705695e-3)" - x1="75.09375" - y1="4.5317035" - x2="75.09375" - y2="80.172485" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3295" - id="linearGradient3613" - x1="208.59375" - y1="130.40625" - x2="208.59375" - y2="63.426777" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(-137,0)" /> - <filter - inkscape:collect="always" - id="filter3639"> - <feGaussianBlur - inkscape:collect="always" - stdDeviation="1.0580524" - id="feGaussianBlur3641" /> - </filter> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient3449" - id="radialGradient3654" - cx="-10.165252" - cy="66.906013" - fx="-10.165252" - fy="66.906013" - r="59.995121" - gradientTransform="matrix(0.4582893,-2.1035589e-8,4.5903973e-8,1.0000813,20.447953,-5.1974351e-3)" - gradientUnits="userSpaceOnUse" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient3449" - id="radialGradient3658" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.2676699,0.521376,-0.7037472,0.3612977,108.99386,-36.062981)" - cx="167.67001" - cy="80.404922" - fx="167.67001" - fy="80.404922" - r="59.995121" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3260" - id="linearGradient3676" - x1="120.0625" - y1="12.569496" - x2="125.30366" - y2="14.444496" - gradientUnits="userSpaceOnUse" - spreadMethod="reflect" /> - <filter - inkscape:collect="always" - x="-0.15096202" - width="1.301924" - y="-0.13732364" - height="1.2746473" - id="filter3738"> - <feGaussianBlur - inkscape:collect="always" - stdDeviation="0.39257441" - id="feGaussianBlur3740" /> - </filter> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient3449" - id="radialGradient3744" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.982366,1.671718e-2,-3.5801148e-3,0.2103843,-18.56344,30.477792)" - cx="72.684891" - cy="48.228905" - fx="74.871155" - fy="26.862719" - r="59.995121" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient3751" - id="radialGradient3757" - cx="66.01458" - cy="126.69183" - fx="66.01458" - fy="126.69183" - r="59.99512" - gradientTransform="matrix(0.675025,0,0,0.3583625,19.527377,41.004647)" - gradientUnits="userSpaceOnUse" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient3260" - id="radialGradient3767" - cx="64.088867" - cy="7.4108429" - fx="64.088867" - fy="7.4108429" - r="59.995121" - gradientTransform="matrix(0.3093869,0,0,0.4779247,44.260611,3.8644223)" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3344" - id="linearGradient3771" - gradientUnits="userSpaceOnUse" - spreadMethod="reflect" - x1="120.0625" - y1="12.569496" - x2="125.30366" - y2="14.444496" /> - <filter - inkscape:collect="always" - id="filter3438"> - <feGaussianBlur - inkscape:collect="always" - stdDeviation="1.3342697" - id="feGaussianBlur3440" /> - </filter> - <filter - inkscape:collect="always" - id="filter3630"> - <feGaussianBlur - inkscape:collect="always" - stdDeviation="0.89883985" - id="feGaussianBlur3632" /> - </filter> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient3825" - id="radialGradient2361" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.6484284,0.1017206,-3.1257154e-2,0.1992521,-4.56257,53.15916)" - cx="-112.17241" - cy="118.60459" - fx="-113.14772" - fy="59.708473" - r="59.99512" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3326" - id="linearGradient2363" - gradientUnits="userSpaceOnUse" - x1="-151.43935" - y1="37.68198" - x2="-152.26776" - y2="57.25" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3326" - id="linearGradient2365" - gradientUnits="userSpaceOnUse" - x1="-132.51041" - y1="39.803303" - x2="-158.92462" - y2="72.881729" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3326" - id="linearGradient2367" - gradientUnits="userSpaceOnUse" - x1="-83.012932" - y1="44.753052" - x2="-158.92462" - y2="72.881729" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3342" - id="linearGradient3349" - x1="-73" - y1="105.625" - x2="-163" - y2="86.125" - gradientUnits="userSpaceOnUse" /> - <filter - inkscape:collect="always" - x="-0.087741371" - width="1.1754827" - y="-0.10211017" - height="1.2042203" - id="filter3363"> - <feGaussianBlur - inkscape:collect="always" - stdDeviation="3.0526685" - id="feGaussianBlur3365" /> - </filter> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3342" - id="linearGradient3372" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(-40.5,-1.5)" - x1="-83.593941" - y1="137.13324" - x2="-138.0043" - y2="92.603989" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3342" - id="linearGradient3376" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(-40.5,-1.5)" - x1="-61.802711" - y1="99.979607" - x2="-136.51074" - y2="112.70422" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient3825" - id="radialGradient3388" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.6484284,0.1017206,-3.1257154e-2,0.1992521,-4.56257,53.15916)" - cx="-112.17241" - cy="118.60459" - fx="-113.14772" - fy="59.708473" - r="59.99512" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3326" - id="linearGradient3390" - gradientUnits="userSpaceOnUse" - x1="-151.43935" - y1="37.68198" - x2="-152.26776" - y2="57.25" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3326" - id="linearGradient3392" - gradientUnits="userSpaceOnUse" - x1="-132.51041" - y1="39.803303" - x2="-158.92462" - y2="72.881729" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3326" - id="linearGradient3394" - gradientUnits="userSpaceOnUse" - x1="-83.012932" - y1="44.753052" - x2="-158.92462" - y2="72.881729" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3342" - id="linearGradient3396" - gradientUnits="userSpaceOnUse" - x1="-73" - y1="105.625" - x2="-163" - y2="86.125" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3342" - id="linearGradient3398" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(-40.5,-1.5)" - x1="-83.593941" - y1="137.13324" - x2="-138.0043" - y2="92.603989" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3342" - id="linearGradient3400" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(-40.5,-1.5)" - x1="-61.802711" - y1="99.979607" - x2="-136.51074" - y2="112.70422" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient3825" - id="radialGradient3422" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.6484284,0.1017206,-3.1257154e-2,0.1992521,-4.56257,53.15916)" - cx="-112.17241" - cy="118.60459" - fx="-113.14772" - fy="59.708473" - r="59.99512" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3326" - id="linearGradient3424" - gradientUnits="userSpaceOnUse" - x1="-151.43935" - y1="37.68198" - x2="-152.26776" - y2="57.25" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3326" - id="linearGradient3426" - gradientUnits="userSpaceOnUse" - x1="-132.51041" - y1="39.803303" - x2="-158.92462" - y2="72.881729" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3326" - id="linearGradient3428" - gradientUnits="userSpaceOnUse" - x1="-83.012932" - y1="44.753052" - x2="-158.92462" - y2="72.881729" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3342" - id="linearGradient3430" - gradientUnits="userSpaceOnUse" - x1="-73" - y1="105.625" - x2="-163" - y2="86.125" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3342" - id="linearGradient3432" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(-40.5,-1.5)" - x1="-83.593941" - y1="137.13324" - x2="-138.0043" - y2="92.603989" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3342" - id="linearGradient3434" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(-40.5,-1.5)" - x1="-61.802711" - y1="99.979607" - x2="-136.51074" - y2="112.70422" /> - <mask - maskUnits="userSpaceOnUse" - id="mask3402"> - <g - id="g3404" - transform="translate(167.50257,-3.755156e-3)"> - <g - id="g3406" - transform="translate(80.51637,30.885255)"> - <path - style="opacity:1;fill:url(#radialGradient3422);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.08779998;stroke-opacity:1" - d="M -184.42232,-32.47243 C -217.54751,-32.47243 -248.42232,-0.097625 -248.42232,33.02757 C -248.42232,66.15276 -217.04751,97.02757 -183.92232,97.02757 C -153.6332,97.02757 -128.58571,70.81131 -124.51607,41.68382 L -159.54732,36.65257 C -161.172,48.6137 -171.47739,57.62132 -183.92232,57.62132 C -197.49395,57.62132 -206.01607,46.0992 -206.01607,32.52757 C -206.01607,18.955936 -199.99395,12.43382 -186.42232,12.43382 C -179.6365,12.433819 -176.50103,10.198864 -172.04732,14.65257 L -176.8745,25.979749 C -178.93037,28.035619 -179.11822,29.285529 -178.55411,30.595278 C -178.04554,31.776057 -177.03338,33.12132 -174.34438,33.12132 L -130.39107,33.12132 C -126.54518,33.12132 -123.93208,30.466941 -123.93208,26.871189 L -124.00095,-17.206829 C -124.00095,-19.687584 -124.90346,-21.050058 -126.18242,-21.556444 C -127.49674,-22.076829 -129.21563,-21.679122 -131.28951,-19.605244 L -141.48482,-19.40993 C -152.34417,-30.269281 -167.85972,-32.47243 -184.42232,-32.47243 z " - id="path3408" - sodipodi:nodetypes="cssccsssccsccccsccc" /> - <path - sodipodi:nodetypes="ccccc" - style="fill:url(#linearGradient3424);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3438)" - d="M -161.5,34.5 C -162,37 -180,54 -180,54 L -132.5,80 L -112,38.5 L -161.5,34.5 z " - id="path3410" /> - <path - sodipodi:nodetypes="ccccc" - id="path3412" - d="M -161.5,34.5 C -162,37 -181.27817,54.389087 -181.27817,54.389087 L -151.62742,97.591883 L -112,38.5 L -161.5,34.5 z " - style="fill:url(#linearGradient3426);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3438)" /> - <path - style="fill:url(#linearGradient3428);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3438)" - d="M -161.5,34.5 C -162,37 -181.27817,54.389087 -181.27817,54.389087 L -151.62742,97.591883 L -112,38.5 L -161.5,34.5 z " - id="path3414" - sodipodi:nodetypes="ccccc" /> - </g> - <rect - y="69.75" - x="-119" - height="71.75" - width="83.5" - id="rect3416" - style="opacity:1;fill:url(#linearGradient3430);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1;filter:url(#filter3363)" /> - <path - sodipodi:nodetypes="ccccc" - id="path3418" - d="M -159.5,68.25 L -39.138259,55.983708 L -93.453327,162.55286 L -197.79465,128.96507 L -159.5,68.25 z " - style="fill:url(#linearGradient3432);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.08779998;stroke-opacity:1;filter:url(#filter3363)" - transform="matrix(0.6393762,0.7688941,-0.7688941,0.6393762,37.597642,128.08723)" /> - <path - transform="matrix(0.6393762,0.7688941,-0.7688941,0.6393762,37.597642,128.08723)" - style="fill:url(#linearGradient3434);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.08779998;stroke-opacity:1;filter:url(#filter3363)" - d="M -159.5,68.25 L -39.138259,55.983708 L -93.453327,162.55286 L -197.79465,128.96507 L -159.5,68.25 z " - id="path3420" - sodipodi:nodetypes="ccccc" /> - </g> - </mask> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3751" - id="linearGradient3565" - x1="-267.47665" - y1="18.103027" - x2="-33.476654" - y2="18.103027" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3295" - id="linearGradient3567" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(-137,0)" - x1="208.59375" - y1="130.40625" - x2="208.59375" - y2="63.426777" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="4.6484375" - inkscape:cx="64" - inkscape:cy="64" - inkscape:document-units="px" - inkscape:current-layer="layer1" - width="128px" - height="128px" - gridspacingx="4px" - gridspacingy="4px" - gridempspacing="2" - showgrid="false" - inkscape:grid-points="true" - showguides="true" - inkscape:guide-bbox="true" - inkscape:window-width="748" - inkscape:window-height="681" - inkscape:window-x="526" - inkscape:window-y="51" /> - <metadata - id="metadata2611"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Livello 1" - inkscape:groupmode="layer" - id="layer1"> - <g - id="g3835" - mask="url(#mask3402)" - transform="matrix(-1,0,0,1,128.17774,0)"> - <path - sodipodi:nodetypes="cssccsssccsccccsccc" - id="rect3204" - d="M 64.09375,3.90625 C 30.968558,3.9062499 4.0937499,30.781055 4.09375,63.90625 C 4.0937501,97.031442 30.96856,123.90625 64.09375,123.90625 C 94.382866,123.90625 119.43036,101.68999 123.5,72.5625 L 88.46875,67.53125 C 86.844066,79.492379 76.538676,88.5 64.09375,88.5 C 50.522122,88.499999 39.5,77.477881 39.5,63.90625 C 39.500001,50.334616 50.522119,39.3125 64.09375,39.3125 C 70.879568,39.312499 77.015044,42.077544 81.46875,46.53125 L 71.141571,56.858429 C 69.085701,58.914299 68.897846,60.164209 69.461963,61.473958 C 69.970531,62.654737 70.982695,64 73.671688,64 L 117.625,64 C 121.47089,64 124.08399,61.345621 124.08399,57.749869 L 124.01512,13.671851 C 124.01512,11.191096 123.11261,9.8286218 121.83365,9.3222363 C 120.51933,8.8018514 118.80044,9.1995576 116.72656,11.273436 L 106.53125,21.46875 C 95.671902,10.609399 80.656349,3.90625 64.09375,3.90625 z " - style="opacity:1;fill:url(#linearGradient3516);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.08779998;stroke-opacity:1" /> - <path - style="opacity:0.79775277;fill:url(#radialGradient3757);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.08779998;stroke-opacity:1" - d="M 64.09375,3.90625 C 30.968558,3.9062499 4.0937499,30.781055 4.09375,63.90625 C 4.0937501,97.031442 30.96856,123.90625 64.09375,123.90625 C 94.382866,123.90625 119.43036,101.68999 123.5,72.5625 L 88.46875,67.53125 C 86.844066,79.492379 76.538676,88.5 64.09375,88.5 C 50.522122,88.499999 39.5,77.477881 39.5,63.90625 C 39.500001,50.334616 50.522119,39.3125 64.09375,39.3125 C 70.879568,39.312499 77.015044,42.077544 81.46875,46.53125 L 71.141571,56.858429 C 69.085701,58.914299 68.897846,60.164209 69.461963,61.473958 C 69.970531,62.654737 70.982695,64 73.671688,64 L 117.625,64 C 121.47089,64 124.08399,61.345621 124.08399,57.749869 L 124.01512,13.671851 C 124.01512,11.191096 123.11261,9.8286218 121.83365,9.3222363 C 120.51933,8.8018514 118.80044,9.1995576 116.72656,11.273436 L 106.53125,21.46875 C 95.671902,10.609399 80.656349,3.90625 64.09375,3.90625 z " - id="path3749" - sodipodi:nodetypes="cssccsssccsccccsccc" /> - <path - sodipodi:nodetypes="cssccsssccsccccsccc" - id="path3656" - d="M 64.09375,3.90625 C 30.968558,3.9062499 4.0937499,30.781055 4.09375,63.90625 C 4.0937501,97.031442 30.96856,123.90625 64.09375,123.90625 C 94.382866,123.90625 119.43036,101.68999 123.5,72.5625 L 88.46875,67.53125 C 86.844066,79.492379 76.538676,88.5 64.09375,88.5 C 50.522122,88.499999 39.5,77.477881 39.5,63.90625 C 39.500001,50.334616 50.522119,39.3125 64.09375,39.3125 C 70.879568,39.312499 77.015044,42.077544 81.46875,46.53125 L 71.141571,56.858429 C 69.085701,58.914299 68.897846,60.164209 69.461963,61.473958 C 69.970531,62.654737 70.982695,64 73.671688,64 L 117.625,64 C 121.47089,64 124.08399,61.345621 124.08399,57.749869 L 124.01512,13.671851 C 124.01512,11.191096 123.11261,9.8286218 121.83365,9.3222363 C 120.51933,8.8018514 118.80044,9.1995576 116.72656,11.273436 L 106.53125,21.46875 C 95.671902,10.609399 80.656349,3.90625 64.09375,3.90625 z " - style="opacity:0.68913861;fill:url(#radialGradient3658);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.08779998;stroke-opacity:1" /> - <path - style="opacity:1;fill:url(#radialGradient3654);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.08779998;stroke-opacity:1" - d="M 64.09375,3.90625 C 30.968558,3.9062499 4.0937499,30.781055 4.09375,63.90625 C 4.0937501,97.031442 30.96856,123.90625 64.09375,123.90625 C 94.382866,123.90625 119.43036,101.68999 123.5,72.5625 L 88.46875,67.53125 C 86.844066,79.492379 76.538676,88.5 64.09375,88.5 C 50.522122,88.499999 39.5,77.477881 39.5,63.90625 C 39.500001,50.334616 50.522119,39.3125 64.09375,39.3125 C 70.879568,39.312499 77.015044,42.077544 81.46875,46.53125 L 71.141571,56.858429 C 69.085701,58.914299 68.897846,60.164209 69.461963,61.473958 C 69.970531,62.654737 70.982695,64 73.671688,64 L 117.625,64 C 121.47089,64 124.08399,61.345621 124.08399,57.749869 L 124.01512,13.671851 C 124.01512,11.191096 123.11261,9.8286218 121.83365,9.3222363 C 120.51933,8.8018514 118.80044,9.1995576 116.72656,11.273436 L 106.53125,21.46875 C 95.671902,10.609399 80.656349,3.90625 64.09375,3.90625 z " - id="path3643" - sodipodi:nodetypes="cssccsssccsccccsccc" /> - <path - sodipodi:nodetypes="cssccsssccsccccsccc" - id="path3742" - d="M 64.09375,3.90625 C 30.968558,3.9062499 4.0937499,30.781055 4.09375,63.90625 C 4.0937501,97.031442 30.96856,123.90625 64.09375,123.90625 C 94.382866,123.90625 119.43036,101.68999 123.5,72.5625 L 88.46875,67.53125 C 86.844066,79.492379 76.538676,88.5 64.09375,88.5 C 50.522122,88.499999 39.5,77.477881 39.5,63.90625 C 39.500001,50.334616 50.522119,39.3125 64.09375,39.3125 C 70.879568,39.312499 77.015044,42.077544 81.46875,46.53125 L 71.141571,56.858429 C 69.085701,58.914299 68.897846,60.164209 69.461963,61.473958 C 69.970531,62.654737 70.982695,64 73.671688,64 L 117.625,64 C 121.47089,64 124.08399,61.345621 124.08399,57.749869 L 124.01512,13.671851 C 124.01512,11.191096 123.11261,9.8286218 121.83365,9.3222363 C 120.51933,8.8018514 118.80044,9.1995576 116.72656,11.273436 L 106.53125,21.46875 C 95.671902,10.609399 80.656349,3.90625 64.09375,3.90625 z " - style="opacity:0.79775277;fill:url(#radialGradient3744);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.08779998;stroke-opacity:1" /> - <path - style="opacity:0.74531836;fill:url(#radialGradient3767);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.08779998;stroke-opacity:1;filter:url(#filter3630)" - d="M 64.09375,4.20625 C 30.968558,4.2062499 4.0937499,30.781055 4.09375,63.90625 C 4.0937501,97.031442 30.96856,123.90625 64.09375,123.90625 C 94.382866,123.90625 119.43036,101.68999 123.5,72.5625 L 88.46875,67.53125 C 86.844066,79.492379 76.538676,88.5 64.09375,88.5 C 50.522122,88.499999 39.5,77.477881 39.5,63.90625 C 39.500001,50.334616 50.522119,39.3125 64.09375,39.3125 C 70.879568,39.312499 77.015044,42.077544 81.46875,46.53125 L 71.141571,56.858429 C 69.085701,58.914299 68.897846,60.164209 69.461963,61.473958 C 69.970531,62.654737 70.982695,64 73.671688,64 L 117.625,64 C 121.47089,64 124.08399,61.345621 124.08399,57.749869 L 124.01512,13.671851 C 124.01512,11.191096 123.11261,9.8286218 121.83365,9.3222363 C 120.51933,8.8018514 118.80044,9.1995576 116.72656,11.273436 L 106.53125,21.46875 C 95.671902,10.609399 80.656349,4.20625 64.09375,4.20625 z " - id="path3759" - sodipodi:nodetypes="cssccsssccsccccsccc" /> - <path - sodipodi:nodetypes="cccczc" - id="path3660" - d="M 117.6875,10.75 L 118.625,15.125 L 119.875,16 L 123.875,13.375 C 124.12188,11.651249 123.52383,10.027571 121.9375,9.3749999 C 120.35116,8.7224285 118.77622,9.5017032 117.6875,10.75 z " - style="opacity:0.82022472;fill:url(#linearGradient3676);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3738)" /> - <path - transform="matrix(0,1,1,0,60.363582,-60.363586)" - style="opacity:0.82022472;fill:url(#linearGradient3771);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3738)" - d="M 117.6875,10.75 L 119.875,13.875 L 120.375,13.75 L 123.875,13.375 C 124.12188,11.651249 123.52383,10.027571 121.9375,9.3749999 C 120.35116,8.7224285 118.77622,9.5017032 117.6875,10.75 z " - id="path3769" - sodipodi:nodetypes="cccczc" /> - <path - id="path3494" - d="M 64.09375,7.90625 C 33.132052,7.9062499 8.0937499,32.944549 8.09375,63.90625 C 8.0937501,94.867948 33.132054,119.90625 64.09375,119.90625 C 91.026646,119.90625 113.21548,101.0995 118.625,75.90625 L 91.5,72.03125 C 88.061436,83.928551 77.059621,92.5 64.09375,92.5 C 48.356404,92.499999 35.5,79.643599 35.5,63.90625 C 35.500001,48.168899 48.356402,35.3125 64.09375,35.3125 C 71.966166,35.312499 79.145304,38.520304 84.3125,43.6875 C 85.071964,44.438909 85.499997,45.462886 85.5,46.53125 C 85.5,47.599614 85.071964,48.623591 84.3125,49.375 L 73.6875,60 L 117.625,60 C 119.63039,60 120.09375,59.407836 120.09375,57.75 L 120,13.65625 L 109.375,24.3125 C 108.62359,25.071964 107.59961,25.5 106.53125,25.5 C 105.46289,25.5 104.43891,25.071964 103.6875,24.3125 C 93.549835,14.174833 79.577106,7.90625 64.09375,7.90625 z " - style="opacity:1;fill:url(#radialGradient3524);fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1" /> - <path - style="opacity:1;fill:url(#radialGradient3535);fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1" - d="M 64.09375,7.90625 C 33.132052,7.9062499 8.0937499,32.944549 8.09375,63.90625 C 8.0937501,94.867948 33.132054,119.90625 64.09375,119.90625 C 91.026646,119.90625 113.21548,101.0995 118.625,75.90625 L 91.5,72.03125 C 88.061436,83.928551 77.059621,92.5 64.09375,92.5 C 48.356404,92.499999 35.5,79.643599 35.5,63.90625 C 35.500001,48.168899 48.356402,35.3125 64.09375,35.3125 C 71.966166,35.312499 79.145304,38.520304 84.3125,43.6875 C 85.071964,44.438909 85.499997,45.462886 85.5,46.53125 C 85.5,47.599614 85.071964,48.623591 84.3125,49.375 L 73.6875,60 L 117.625,60 C 119.63039,60 120.09375,59.407836 120.09375,57.75 L 120,13.65625 L 109.375,24.3125 C 108.62359,25.071964 107.59961,25.5 106.53125,25.5 C 105.46289,25.5 104.43891,25.071964 103.6875,24.3125 C 93.549835,14.174833 79.577106,7.90625 64.09375,7.90625 z " - id="path3526" /> - <path - sodipodi:nodetypes="csccssccccccscc" - id="path3537" - d="M 64.09375,7.90625 C 33.132052,7.9062499 8.0937499,32.944549 8.09375,63.90625 C 8.09375,64.474122 8.1082724,65.029981 8.125,65.59375 C 14.11447,66.271402 20.266218,66.74388 26.53125,67 C 26.260548,56.540958 30.202859,46.025084 38.34375,38.21875 C 53.683067,23.509813 78.072313,24.004431 92.78125,39.34375 C 95.545099,42.226046 97.537852,45.032117 99.34375,48.59375 L 78.84375,59 L 98,59 C 105.9282,56.973373 113.18621,55.563033 120.09375,52.8125 L 120,13.65625 L 109.375,24.3125 C 108.62359,25.071964 107.59961,25.5 106.53125,25.5 C 105.46289,25.5 104.43891,25.071964 103.6875,24.3125 C 93.549835,14.174833 79.577106,7.90625 64.09375,7.90625 z " - style="opacity:1;fill:url(#linearGradient3548);fill-opacity:1;stroke:none;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1" /> - <path - sodipodi:nodetypes="cscscscccccccccccssssssccscscc" - id="path3553" - d="M 64.099866,7.9087646 C 33.138176,7.9087644 8.0998661,32.947063 8.0998661,63.908764 C 8.0998761,64.087476 8.0973761,64.263059 8.0998661,64.440014 C 8.3531061,33.696509 33.295846,8.9087645 64.099866,8.9087646 C 79.583236,8.9087645 93.555946,15.177347 103.69361,25.315014 C 104.44503,26.074479 105.469,26.502514 106.53736,26.502514 C 107.60573,26.502515 108.6297,26.074478 109.38111,25.315014 L 119.50611,15.158764 L 119.99986,52.708764 C 113.09232,55.459294 105.43431,56.569624 97.506116,58.596264 L 78.849866,59.002514 L 98.006116,59.002514 C 105.93431,56.975884 113.19232,55.565544 120.09986,52.815014 L 120.00611,14.658764 L 120.00611,13.658764 L 119.50611,14.158764 L 109.38111,24.315014 C 108.62971,25.074479 107.60572,25.502514 106.53736,25.502514 C 105.46901,25.502515 104.44502,25.074478 103.69361,24.315014 C 103.68314,24.304548 103.67283,24.294222 103.66236,24.283764 C 103.60999,24.231473 103.55869,24.179598 103.50611,24.127514 C 102.93231,23.559643 102.35524,23.012364 101.75611,22.471264 C 101.67459,22.397145 101.58807,22.326157 101.50611,22.252514 C 91.590066,13.342335 78.496526,7.9087646 64.099866,7.9087646 z M 63.443616,27.127514 C 54.205446,27.378034 45.040176,30.920194 37.849866,37.815014 C 30.217786,45.133448 26.722316,55.187931 26.537366,65.033764 C 26.777246,55.231884 30.717786,45.539698 38.349866,38.221264 C 51.665996,25.452364 71.803196,24.123207 86.506116,34.033764 C 79.627056,29.22869 71.518656,26.908534 63.443616,27.127514 z " - style="opacity:1;fill:url(#linearGradient3581);fill-opacity:1;stroke:none;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1" /> - <path - id="path3603" - d="M 63.59375,7.90625 C 32.63205,7.9062499 7.59375,32.944549 7.59375,63.90625 C 7.59375,94.867948 32.63205,119.90625 63.59375,119.90625 C 90.52665,119.90625 112.71548,101.0995 118.125,75.90625 L 91,72.03125 C 87.56144,83.928551 76.55962,92.5 63.59375,92.5 C 47.8564,92.499999 35,79.643599 35,63.90625 C 35,48.168899 47.8564,35.3125 63.59375,35.3125 C 71.46617,35.312499 78.6453,38.520304 83.8125,43.6875 C 84.57196,44.438909 85,45.462886 85,46.53125 C 85,47.599614 84.57196,48.623591 83.8125,49.375 L 73.1875,60 L 117.125,60 C 119.13039,60 119.59375,59.407836 119.59375,57.75 L 119.5,13.65625 L 108.875,24.3125 C 108.12359,25.071964 107.09961,25.5 106.03125,25.5 C 104.96289,25.5 103.93891,25.071964 103.1875,24.3125 C 93.04984,14.174833 79.07711,7.90625 63.59375,7.90625 z " - style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3567);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1;filter:url(#filter3639)" /> - </g> - </g> -</svg> diff --git a/resources/images/edit_copy.png b/resources/images/edit-copy.png similarity index 100% rename from resources/images/edit_copy.png rename to resources/images/edit-copy.png diff --git a/resources/images/edit-cut.png b/resources/images/edit-cut.png new file mode 100644 index 0000000000000000000000000000000000000000..b995283754579ac4e4ddbf15ca791fa58bd45c90 GIT binary patch literal 11657 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 literal 0 HcmV?d00001 diff --git a/resources/images/edit-paste.png b/resources/images/edit-paste.png new file mode 100644 index 0000000000000000000000000000000000000000..b790efec251c872ec2687e4729c8292dc928b463 GIT binary patch literal 4949 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à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 Tif2eE00000NkvXXu0mjfREkF+ literal 0 HcmV?d00001 diff --git a/resources/images/edit-redo.png b/resources/images/edit-redo.png new file mode 100644 index 0000000000000000000000000000000000000000..8de333fe8cefce891058e89c3c549173e87e284f GIT binary patch literal 3383 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 N002ovPDHLkV1fjvU2OmW literal 0 HcmV?d00001 diff --git a/resources/images/edit-undo.png b/resources/images/edit-undo.png new file mode 100644 index 0000000000000000000000000000000000000000..f6d7e8ba56eeb0e4ea9083e4979a7f7b79448b39 GIT binary patch literal 1986 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 U0)c$%*Z=?k07*qoM6N<$f?U?MnE(I) literal 0 HcmV?d00001 diff --git a/resources/images/format-text-subscript.png b/resources/images/format-text-subscript.png new file mode 100644 index 0000000000000000000000000000000000000000..7da8882aea3387120a29b26765b940e80654bb4f GIT binary patch literal 7332 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 IglXvi0pE}E>;M1& literal 0 HcmV?d00001 diff --git a/resources/images/format-text-superscript.png b/resources/images/format-text-superscript.png new file mode 100644 index 0000000000000000000000000000000000000000..9dc31ab7838535ae4c837f2f384dfedbeeca4206 GIT binary patch literal 7279 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 ZP}x7vs+-mlvcUWj2&t^0RIXqa@<0C}zl;C? literal 0 HcmV?d00001 diff --git a/resources/images/swap.png b/resources/images/swap.png index e5aeb60e223db413010b0539566c2cfaff0c89bd..7f8d40ca1d4dfd5da26db107bede17d1f817f140 100644 GIT binary patch literal 10850 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 literal 13638 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 Y3q}XEX`#NUVgLXD07*qoM6N<$f(?yEvH$=8 diff --git a/src/calibre/gui2/comments_editor.py b/src/calibre/gui2/comments_editor.py index 8438fa3cfc..a73181164f 100644 --- a/src/calibre/gui2/comments_editor.py +++ b/src/calibre/gui2/comments_editor.py @@ -9,26 +9,65 @@ __docformat__ = 'restructuredtext en' from lxml import html from lxml.html import soupparser -from PyQt4.Qt import QApplication, QFontInfo, QPalette, QSize, QWidget, \ - QToolBar, QVBoxLayout, QAction, QIcon +from PyQt4.Qt import QApplication, QFontInfo, QSize, QWidget, \ + QToolBar, QVBoxLayout, QAction, QIcon, QWebPage, Qt from PyQt4.QtWebKit import QWebView from calibre.ebooks.chardet import xml_to_unicode from calibre import xml_replace_entities + +class PageAction(QAction): + + def __init__(self, wac, icon, text, checkable, view): + QAction.__init__(self, QIcon(I(icon+'.png')), text, view) + self._page_action = getattr(QWebPage, wac) + self.setCheckable(checkable) + self.triggered.connect(self.trigger_page_action) + view.selectionChanged.connect(self.update_state, + type=Qt.QueuedConnection) + self.page_action.changed.connect(self.update_state, + type=Qt.QueuedConnection) + + @property + def page_action(self): + return self.parent().pageAction(self._page_action) + + def trigger_page_action(self, *args): + self.page_action.trigger() + + def update_state(self, *args): + if self.isCheckable(): + self.setChecked(self.page_action.isChecked()) + self.setEnabled(self.page_action.isEnabled()) + + class EditorWidget(QWebView): def __init__(self, parent=None): QWebView.__init__(self, parent) - for name, icon, text, checkable in [ - ('bold', 'format-text-bold', _('Bold'), True), - ('italic', 'format-text-italic', _('Italic'), True), - ('underline', 'format-text-underline', _('Underline'), True), - ('strikethrough', 'format-text-underline', _('Underline'), True), + for wac, name, icon, text, checkable in [ + ('ToggleBold', 'bold', 'format-text-bold', _('Bold'), True), + ('ToggleItalic', 'italic', 'format-text-italic', _('Italic'), + True), + ('ToggleUnderline', 'underline', 'format-text-underline', + _('Underline'), True), + ('ToggleStrikethrough', 'strikethrough', 'format-text-strikethrough', + _('Strikethrough'), True), + ('ToggleSuperscript', 'superscript', 'format-text-superscript', + _('Superscript'), True), + ('ToggleSubscript', 'subscript', 'format-text-subscript', + _('Subscript'), True), + + ('Undo', 'undo', 'edit-undo', _('Undo'), False), + ('Redo', 'redo', 'edit-redo', _('Redo'), False), + ('Copy', 'copy', 'edit-copy', _('Copy'), False), + ('Paste', 'paste', 'edit-paste', _('Paste'), False), + ('Cut', 'cut', 'edit-cut', _('Cut'), False), + ]: - ac = QAction(QIcon(I(icon+'.png')), text, self) - ac.setCheckable(checkable) + ac = PageAction(wac, icon, text, checkable, self) setattr(self, 'action_'+name, ac) def sizeHint(self): @@ -67,12 +106,7 @@ class EditorWidget(QWebView): def fset(self, val): self.setHtml(val) f = QFontInfo(QApplication.font(self)).pixelSize() - b = unicode(QApplication.palette().color(QPalette.Normal, - QPalette.Base).name()) - c = unicode(QApplication.palette().color(QPalette.Normal, - QPalette.Text).name()) - style = 'font-size: %dpx; background-color: %s; color: %s' % (f, b, - c) + style = 'font-size: %dpx;' % (f,) for body in self.page().mainFrame().documentElement().findAll('body'): body.setAttribute('style', style) diff --git a/src/calibre/gui2/viewer/main.ui b/src/calibre/gui2/viewer/main.ui index 4cfa1590da..d470a386c6 100644 --- a/src/calibre/gui2/viewer/main.ui +++ b/src/calibre/gui2/viewer/main.ui @@ -243,7 +243,7 @@ <action name="action_copy"> <property name="icon"> <iconset resource="../../../../resources/images.qrc"> - <normaloff>:/images/edit_copy.png</normaloff>:/images/edit_copy.png</iconset> + <normaloff>:/images/edit-copy.png</normaloff>:/images/edit-copy.png</iconset> </property> <property name="text"> <string>Copy to clipboard</string> From dd05c065e2df0194e34c88d11014f6e75f6ee939 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sun, 19 Dec 2010 22:07:49 -0700 Subject: [PATCH 40/62] ... --- resources/images/format-indent-less.png | Bin 0 -> 1303 bytes resources/images/format-indent-more.png | Bin 0 -> 3668 bytes resources/images/format-justify-center.png | Bin 0 -> 1072 bytes resources/images/format-justify-fill.png | Bin 0 -> 1021 bytes resources/images/format-justify-left.png | Bin 0 -> 1099 bytes resources/images/format-justify-right.png | Bin 0 -> 1105 bytes resources/images/format-list-ordered.png | Bin 0 -> 4237 bytes resources/images/format-list-unordered.png | Bin 0 -> 3863 bytes src/calibre/gui2/comments_editor.py | 50 +++++++++++++++++++-- 9 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 resources/images/format-indent-less.png create mode 100644 resources/images/format-indent-more.png create mode 100644 resources/images/format-justify-center.png create mode 100644 resources/images/format-justify-fill.png create mode 100644 resources/images/format-justify-left.png create mode 100644 resources/images/format-justify-right.png create mode 100644 resources/images/format-list-ordered.png create mode 100644 resources/images/format-list-unordered.png diff --git a/resources/images/format-indent-less.png b/resources/images/format-indent-less.png new file mode 100644 index 0000000000000000000000000000000000000000..8662c348717820a1b9176d51a6e1623a4612b55b GIT binary patch literal 1303 zcmV+y1?c*TP)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm00004b3#c}2nYxW zd<bNS00009a7bBm000Fs000Fs0k`caQUCw|8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H11e8fcK~#9!?OIJt8%Gp=Yp)m9*yh9~fsoRw5)y<|$pr<8J4w|; z)uM`@GnZV#rJ+sQOD>5NQI!Kq+A9cgDs96lRgC0FoLT`Ehy$0pgs8<p>|L)}&rau! z;%wyZ?kskUw-O(EdSmZ;_kHu;d^59)Oeux`Gh}9G1Oi3i;r9<eimNSCiA3VMMTuG{ z7$Apb2+LvS!w@dF-}d<Z>tnKPw?m;2NRk9trj}&^Ath!6N+t59%|BziWP3bTB80a? z;Sjr4sGw{56J5*SyLt20@2&(MOh35Xb)ob5#fx3dt*xyrfG`vaI=f*B1K|O2lUQIO z$!?>^&vu)gkH;hcG$g=`Qi~B`-eUegZHu*OxsAr}-=ru&ETSG{v!DL;Vt0sj@U>e= z!ij()N4{)t?`Xc%+sA_r$^ggC>w52fh;47FfB*CHHUNC?NI-3F`ZykovtBPi&|sP- zMAaz7qVXH9CB*7Iim4B(v{LqG6b;ptfR@h(viI%yG{|PN?ka?eV4BB)%|NkO1d9+4 z0$dTmkw7l@3Ub;js2Acb35drNq7uRw-3eHD(53fvLxbHH8K@UJ+B?MrP>uxzkfmb= zI?i{(2VEc5wLH)SDG(4Ki~tqfpus9+5zh=zbitKT%42jVKq=v81r-u6Zz34PE@L2{ z&!GxctuV1z{2gV$63VC}3Pm0EUhYCQkk8A03DhW~#61J;=Pp#OLWW_Wy_*aWk&IG7 z5DkQcF^VU$Agd5X6%r2OK+7l<&cr@4u)e+yYinyz3r0ppsv5=?^->{X@sTdV=H@2M z&CQ)U0qj>IoQZv8V0?TWCMG7J7VPiugBvtWgW1_xn4Fxfq~JY>DfO2D-1MN;0~;F~ zFf%jbNRU#o3N>skWR^@=TwH|Z<z;?<rAcv!gZh%uQ%5F~fya*@aj!%o;05X_qlDNp zDo8UbQ8no8?S-D6o;R6(`rA`jTKWke<6y5>>b}D~AlOp+sh+K^EtsF5hiVXsM9Kts zou|_q`~jJwDBuUg&yEbe7skfMs#YOX7&Js%TN`}+)g4H#Bw=BpvO{=0C*M*6^&dp7 zAcVlt(Gd(>8-UAweK7sqG#ngc!2|yH#HWc|E(fwK!#8)og<pRC8CF)3E@MDMfba}7 z1UQHf4-et`&<(hH<tqH}<0Iz`5L){@kWQz$64ip?;bCwBl1L<4Ve0lBUS5@;9%~`r zrL(=g%?8~<9SGP@K#q@(PySqp_#6YHqoXyih4%LLL~H+(%P6XXALR3SZViCHL5%E! z3X24BG3WnHjduocN=H2oC@?l$ig*!_G=>&r89?A31m9Tdt^`c8wDc_b?2GR1ZY-m~ zl~3w<3JjyT<VwIWjQg2CGoLVxkM{TXgQ}`HLt@>PU$a(vyY1r9D5Yf$ck_<l;cu~Q zbX|wl)m31z>8wKTyAnvHQhy8%4h|4PrgnCAhS)`-IH}-86h%S98boiK{e7j!-<1jQ zjxbFVC#XvQwpAX->mZo|lkF$jZ1!F<nRI{Ajd*>+XJ`K_aYn!&{soWHf>$Snx~u>I N002ovPDHLkV1m^9Pd@+v literal 0 HcmV?d00001 diff --git a/resources/images/format-indent-more.png b/resources/images/format-indent-more.png new file mode 100644 index 0000000000000000000000000000000000000000..e1244ef47cbba4056b6a73340b84e45d2111e029 GIT binary patch literal 3668 zcmZu!c{tSH_kWL>rm;_`217HJk}W$$j7ed##aL5_u_U`9Y7EA{f9zY0EK!LTBkQ0- zcAqe^jt~)j?6QpS^!xjFp6A^2+;h%zo_p>+&wZT}XJ(?$%^}1A006h4fu1=_lKwIb z%342aJ9V=JBmirOhq34p%q5n!XZJO*4Pg1x|1t<Gl^@Jf3I<-a3AFHW4GePfCjdb~ zLGm8no&nBIz65z6f4BTqEg_coprM{FKDc0|Fzl7U@W~F^&Q$K<8nGp`nT^kYB*dTR zE<;s4e4Ytxm7+g?I+f3ee35BYE$6tz`>)O~9ZL(9N;PgZ4?AJ9-cgGf0_=YHv4m<B zuWD(8lZMz4SDJT5Ykh*;7W$eForAV}<$o&%J#d@qd%Lrtl>248&dqh9;9|gP-9jJV zc}bN?POlwy_pt;ulDxh!CcBuM(me<rn0E&+`X{E&!TYJJ*4I)(n{GCb7z?)iCLWE8 zj#JeUJvPRIhisC8f<+R?;24~N0RSPx&9J)V4aOMQF*Jm1rSsC8zFqj^-59mO%r0|Y zULeE7tKsOm>NoBc5T$-atn}5BP(tY46RB9N3eyw^Q>>9A+&_a}8cVpl?@?P?u&sRl z^U#{!yt4H)<kRJjf8gIOW@5wqV`zlD_U7ZON4n^8dBXv{fvT{LiCB-k{^#ajT3wWq z$Q}`jP%MC!_~2E1FT1r4%zlv*%CKZ+Ji@WVTor(n6Tz~MLi47AB=XDuprxUSC}}VN zbV(U~CAD&ybpZw%$-sgd&Ps6J-=l}R;>GLrXYGjr7vrbHLBZD67A*%?dhJJFZUU1@ z%yDHa2^k~{_#%(<EL8te!j<yf8{d{{bq1_0f^(n)|Iy00DJI`$5G}*pce(%+$W=ii z-7u%jRu$mDdGtnpQ`0B<v+>ulXT17;ou8k7N1M55Dsr+(T8Awpbe}npZj#cIuYLv$ z1}pUHZLz^Lcw*pe8RiN&T|`s{$rlM5TumkI{{BAR{CGOtJia6sqm)K=LO3Q`zJAwG z#<hrETv^e*lzHuJx?siBS7FOJnTI5Y%SXSW11~l0>>Z;!Pc<Ghcy11$b9BN$d;5EX z<Ky7=w)k_Z(!PB+q>RL}yJy-ya{{Ed1ax{Y<KRz#lt6;`IPtx6)l;Mccy~UazvMi@ zO-ETJaI!5bVPJYXg~`;Gy|r#zVqW3foKz;sx)75>ra%-H^e2w}U}xee^@}}nzTm>t zo0W5)U)F3jd5P#x6ynONmRDB5&Rpg=*;{Y9D)1ax1j{G;$>7T`G#cR876i-0QeMxN z{iuKDh%?%WQdP@aH?e!4>J@gpCBZs<HXrsZ<F$zdzhe(+7A9-sdzmjzV*QVnY&YA2 zy$p@p;C$=F7=mr*!iIqa-``x3Xvdth|HKI(RIT>Etf>OnPL4=L1AIL)V4>$~kr@fz zR#oAe1;<j%q#R9-3YNIfJ0iHqj8imfGZa<&0Yq+@;nAo~Gmv<{?i>qeEAwchcEcw? zXoz{2@WI%hcEDUrj!f#UlTj&99w8@Z@KL=YHIZ00^RD*}!VX|KwvGBwvf@fC&+eVX zSq;@&etl?x&ADk#1~SVs!U<9H>gm}hcrA=z7NH0)9Uibc-aZZ1;OWY;G}NW$;lJu7 z6KthUB}ko2fG3Bkjp{&2df((D1=z`W+y&3EP8W2_oi{e@(9*E#*De4SmeEbnzzSm~ zzAS8HF3`j?MCsB^08pN2;wJ*Mi;TaP_#rKx&)k<mkY3&N{BB(OnsB%C8}AWX%eG?m zhSE9X{R%6!BD?F1m}kdRRS!K);XXo~b_ZrKwq<(dI&+N{Em5KT=im4$JtEgn+XJ(8 z;L|KfWvy&=mG}8+v&!{M%<{ZtUU}MZzUl-j^#hbLiTSk#4d>W1-vIoj`P@}u2YWAk z-VZf@6%-Lk!V?Ej12j=!2^3X!7#z7h5Yb|%Bn459-Q!t&fHj2-3j%{g)anP_&{$nm zSv`OK1w`1AQh3or02r8e6w&QHd`a-iyasOK!3gU%`iW4Vfz5J-7o&+zWD@HT++oCW zZm8j6pl=Mr7#zb78Tq&6?#F~YHGU%8=9aaa;W7d>6?`2Oc-8DQAMrA#6Y6{LkrpF% zPTJ}bvwKB5Dl3+P(%S)Dii3rKwmgj+*%9Cur=m<MtF~+?vor^R3P#2K<&(O8RmVRB z{xokeEs|{XV8A0WK}gES-^ub6qQ+?05r!}$0Rb;=YRaw#zate{Lh3vp9|b{m14|JQ zD~s#(C<*4!=1JGfm>OxD;Y#<hm|7vJ_k);1o>ion;jvKezp2H!cvIBjL!X4dRqqy^ zf-F7qU4R?kC|4IOiBq1EFzZw#)tedb$D&|*s+@@ab1h>vp5u=>!h;XD=;E0U8wXBF z(2-XaYFBLd-5M{F{)@-n7yA$i8{swE0sJ<P@?^@-aC6B)bC%d41p4b+qxJV?LPA5q zwU#rZZ=BOQlj1iP`t_xCB0@;*c#MMSe|?(28K2_#N1GpOdN=?1f$^%kDz;N{BZFLb zYS`#9KoBT)E)M?gX6iUue;-lj28li~bs@1(Ge};=md?h9rh|ug<)G?-)uEg&4#p#* z726>iD)8L&DUYmvu|dm>V^l<{Bca_INqSp9-;?`pv@YNrkEm8TxEmJxUbZpU2<2=& zmXpD@zrFJL_!(qJmfTH66%_%4GFR7#tSFfScYO8G_mjuVnSCpP-RGV@iYU}P)6wvo zDOqjbyGcIEs<z@Ly?H4w+1<8!`gY6eWWx<92y-jI7<{6aTf$fvDCY1xOWK**7dClv zpswb_)Xuu#AiArO$FT)v&}g&=5!!em-j?!pCE`P5zg7chRpa{Ge|bec%Fvr3fYBi- zL|IX@RMt1Y*rz!z#k8R1$8k01!Dm;Eku{<0m;Cu3T2?QKQ_?mT`erJgKlxM`G!-}e zl1_pjKD&EzNfhK)&QbO?5NvtEoH4A^6rZBagypLdPe(>ZTK{_IJy~Bi-w&;7+8%o) zdZFz$CLQXV=}lSkU!OD7+S*JHJ{sK*Pnq^I;)X=w`9|*ADmb?~lXB-4J4kGx?ug7Y zAhOEBG52&uQufS@)5JR`NP2p@NVZJQVPI`-v~tF6%*HH$+0aD+C0{+X);o)Bnhye$ znJ$kfmO*__E^EH*NSM2tR+$m4E)02X<0nJ)ehB*+D3nD&=l8bV*p-|3pg1my`scLX zkSN$V844YLdZ#<`rr)?%EeL4u=ul+QEYq#8fc=pPT}gMEmm&&Lvp%7=;?6LVwS6m~ zN!3ZL3s`8Qdbzx_9i@sKP$m=A9eHbH8>0p>Cz}r|w?51!J1Mj)C@O|`XJ1$j2|pX_ z=<l9z46Qxc(%P!~Yjj)Tl)OEx!_Rl^`&FB)lYd_=4I1wBJc718JpP7wIH_RF&w{Ap z;$r1%`$DQ>`9dRej*RzBBp0Q)N?s;heJWU-4DWPN5~0&lWOTPmwJ$dsayoK1k@CIk z+4I$=5&|zJnO6+GnQR#4+w=7`&_$IBi0|C{R9Q<rfhi5m?w)7s{%T)nARS>R!(MFD z7_8VFH0{d8#nr+}N=b0CDIvBq6r`KP$oHhrY>!(<C`Q}M$E>aSu`H=eQkV~fnMz3b zORGxg0`j!HJ%$B_@+~n9tMxL0xi{X19WmW`;Y9eThA2Go%NN7Rru?h+7esDLk3PQc zo-U6{{{rzY_6U~>0ZqO2Jv{JEDzAD9fA%`Qn^zKCE)e-?L(YlyTe;5-Ram5TRap}e zs^OxFYZkP!G|C>w=08$mv)1XSw?u|L@Jk@d1Yu_fzy`B%tbp&NEbkTLj&&&V3<R@3 zzK!vWL-qdR!#kvz^3r?cXZpGBz7aD}Zh#D1Q-02@ErZ>K(3sKOmUtVi6xYY0l<*vj z!4oLGSeC|7d}wFi;~6^Fhz&q?u%CmX$U_-b+$g3(yCWicy~N%ji4TVnjB*m9BrfS= zdYqt<Xl}#=aDHFkizy0_S`mm+1#I3@WgL&Sb)tDGWs(ktp%VbZ2A@61nBu%`F&nyM z`<fM23NYXFELQSab|Dz#kQB=jE;@59G;UjE-o4dgNK<2hJ9#%|R>N}n*&dzd+*5iz z`);d4&1v6>s-!BAM)C&LYuq=9(Gm_u7rZ#j!6R}Bf;*4w2=^Li6wp@a?R3ECYj9M6 z=1qC)v-d9XbPN{jU(vW_oYS~9lF#Z9u^QE~oYY%==D6G2p89yU`b-&X@5P@#ziIkR zX|bvSm5D<anm7jsBd%PzLcs^|x(Q=ptip4Br}1c4LAD!PXWu?LicresivRq*lNEet zuj_{8M4qZAbCgc6^>BBG1^nm<_sFa1FUh$7IrjgMKLaNTLoeO_(~ijBw)Fja7*_T; zvda%_qn_+XUyTZ^3f~u*sL40x#}3J5Y8p!&g_ZT==it~>T&ZK;Ss40$!v3w23`T+Y z(|+;%Ua_bBzc2dFb)IGQsL!|C+uK*&64UOfH4OS8H@COj6cWdxHl?SjUcs}`8sE3? z**#?caSuf%5o}Y<M-s<X0XoKO{92J2Mn3z>8=HyrUf16inN|0Ij%1Ml;GU4EsJ0k6 zxY<UQr_B7k1Yg|P<h-5OLgRzeHFp3fDM|T-0o=`<kb3ok(8|gDN*mc{c<H2X)TWgr z^{G*QJtAX{IrA~b!Hz~eWMYe|i|pmAl(=S3VLO#RDwwabhfZ2(u1V{Zqk}U?yni#a zPfZ|=w$|``*n^k=X3?xhn27{mC@)e2zAMSurAT^;?0=y3_-D<Pa{8rLGnXqjzljfd kPVR-;tBNH3Ka&!Z*J7ZAUzuk8cLD?qubSw+#yUp)4-l@qga7~l literal 0 HcmV?d00001 diff --git a/resources/images/format-justify-center.png b/resources/images/format-justify-center.png new file mode 100644 index 0000000000000000000000000000000000000000..505160a1bb4e7578b3ec2c7ef2c776d37787acd7 GIT binary patch literal 1072 zcmV-01kd}4P)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm00004b3#c}2nYxW zd<bNS00009a7bBm000Fs000Fs0k`caQUCw|8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H11FcC!K~#9!?OMH08!;5O?=FE01U4qxQo53)jHm;9Kh&)Z2*k+3 z!ql>}fP^abKR|qlm4StY4r#<x@g+qa3$#=%sf2PL`S7{VZY{`_J9CFlF%mC&dQUc- zf4_V7?|gAEr4-#|)4=Zuw9^cK!_tSP;jGy;*VEJU!lT4=92Xh7fpkNMs3TqES0iix z*Jl`)xu$6dV~p4|^*j#|(gY`{*(4(8-eh@GMBWEE;kl-3a4pTTEqlwhs`E25v!Acx zZCL}0?-!pAK73Rf7#QsA?d=5sI&vHv25d4Q91wR5z%+cB^LE^lW6b(6Ld+Qfa7sNO z0?~u`U+zIpMb4a$-;quu;t}+_QbDKRzd2t|kDtv768;LLjnv!z{s*1;T!DjDWP$UW zH~9Do>i$wTfByRM4w~LvOTg^xc$MwW!d-WeYSw5pP{z!l?o9S&;2MDWo?)d|Raz;0 z+?s0!s*qK!DtGr=@mZ)+sRXMKAp}ZQSGEGRS`B%Ggb?70fI<l@FE1wwa&mGqbP55+ zU;-ZN6yQ}Pz~op)09b}rV0U*nQ34ki7h$VdLVy4PDjlG$D&&#S3UKu5$|w~W17ws^ z!v9KD!+d%Z$s$HHQU&(+_tD<oUMxU`LILIT`G^(pq%s=Gj*gDd%F0T-t*~K82t<`p z61@UbQ&VVqdO8*X*L9gks{oP7D2)pudBY5&{6VI&3Q?v)(nYK=0dVP)SW<!2)zw5n zj*pLrE@O{|sSx?Ql?b!7wY9bo5EUTOC$XdgrBW$T0_W%FA-$5#9HsIKzyNJr19BBo zY%e6QfOd_HDs41WMhS^5qlbrw=-}WW7MNTvhlYlRB0dKsuar?|Pq|!1>+9>W2&7V} z2m}O1`5PIJH?@h0iP(D~%d(h9tblwg5g$bICMQ7E-bzSRh^VhZ9-+5;4s2{}BnohB zY)n#xfGOkyt|9^XA|^Lj1I1!7Q37XYXYpl}5E6F)MO28W{6;1)-r>z0#yDI?HBIAR zb*O59jcq@IE1+rE0_$QdRW!$O*ombbSb;{Pxw-Rkhm}gn=~MhvM6O%g45|Qhx(g@A zC$B;4Gb1A-$TUrUS_u^q$E^M+@}MZriG_v-MSq(ZlTRDlw)xlkfX#*(vJiAm%x!dZ zbhxjtZw}6hpTk8maIC{Gl1`_&!yFX3aMA9M{Qm?2xDouMv0ktHV~hLy;W~_rQ>|9F q;CyU;dwaX(p!@#E9`^)pX@3Ce*7TttJS^4#0000<MNUMnLSTYQQ`_hO literal 0 HcmV?d00001 diff --git a/resources/images/format-justify-fill.png b/resources/images/format-justify-fill.png new file mode 100644 index 0000000000000000000000000000000000000000..ee34b8272f0e9edbcd0f8a8e6d5210762eb95478 GIT binary patch literal 1021 zcmV<Z0|NYsP)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm00004b3#c}2nYxW zd<bNS00009a7bBm000Fs000Fs0k`caQUCw|8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H11A0kBK~#9!?OHoe8$l4>d)ROWLq|mtLh3vy5e0o7N*9C>`~w=Q zgq{W@6e<6Jr)Vi?Xh>ljs<ctc00|+%LCC)IYj!ic=ydqP?MSgs-bf5u&9H0Ve&5aR zw|5Md5Q6>BW@Eb}&`opW9jhN!$MRm^;=sVb3ogJ5f*NxjmpQJ3-eFD{-}I{gddzjB z*tTtESr(JalylAiTG)WKS`fz9zstB4c^tzSRBSsoUds;rs=wz~D@*h93!iS{ZQBDY z?^m9U-hWUU85!*z92`Ud4hsSwCu~U|3Xp0R0<*0sR{d66Y+2~>J4`l7KnQdkiJ<4` z|B5-rB8+8I^Y>)43^=gg<uW_{{w?@=dOWcZl89#@>t@~#58vy3^7yF&ZO8^!H*fUe zBi8@rv-k7Yk9XMh=2ik;Z_lfIe;)68z)Z7dv&nK^j`ipAFBA6wuJ@cwy{XbF@TXR< zd5J1ityGM>`w_k>E0@d3Dg*$Ss)n%{sMqU^184{+MPOP2Yinz%f}ES1(=H*zm`s4n z!4SNO1f(2O1dydR14l<ksS>!ly3*}pf&g#?PfpNP72=@HfI@GsjEWFrf{Y3Q>Qkng zrIt4ko0!-G>+9>Of}EY5B{INC8P(dx#zxl&&@u{i1`ZDoQzdYDd8y9;P%<j$3A$yL z#7G}xCaaK;DnxE#qh(Z(Coz$M&CShJLC(y~Xpb^3bSeZ~?R1@OZEdAZK$`&|Phuhi zrBW$X0v8t-no;6mP6#>!I6)Wp0IfoXJqytpuy2u3qfKaK6o8b`?d|PU0Zva(6XyW& zN*Q7|jX;Evej`&p$%@5dsszr@&pUgiWP+Zci$)U=W<N?0Dg@@M5C_rOIk2;{lPbWe zsVO20x|28pZXyAC69cFBK%r1bmB88A*}uyu0CX^c2`U8UzL7;3O@5f8D>YgfRW&cy zb(x{2uw^ot<P6xhRYmKQEKRf^2xP_5Ps~8G+1fq$cpy_{<nk#L3#?YF?<Qpc2W!hG z$0x5*>vQAd<IM9sRjtH~gk{#a591^s)`>$6PxA4;a89*seBW1p)<<kUu8`%VI<d0J z$;q*yp`k^r6F<j`<gl!xE|Se=Rl_x?e7s?Q+^g?}1n@?vN@JtZi2Jq{AIIxRGC`$M r*~9wS(*FK_TcP{zpFQpfbZCD7Mdsd?mh?N%00000NkvXXu0mjfieSla literal 0 HcmV?d00001 diff --git a/resources/images/format-justify-left.png b/resources/images/format-justify-left.png new file mode 100644 index 0000000000000000000000000000000000000000..f5af823a82e274b9d7a6cc5e4c4cf958c6bce16c GIT binary patch literal 1099 zcmV-R1ho5!P)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm00004b3#c}2nYxW zd<bNS00009a7bBm000Fs000Fs0k`caQUCw|8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H11IS54K~#9!?OHoe8$l4>v(JVz82$iB2&oX*PD+$W^dwP=D3Kxo zf{uoUDxs$V2}R03KnO%jL5&L|Q6;>D<$@+8QIyDOeCP9HZZmUmI^=l0*2O0;5@U^K zeRsZ{Z)fJ)T^5~l&Tg~lsCNLA0<ivR{Yld3TOJq~c<yj8%4M7BQJqEgDB38CdhMH* zu3z8Nb-x{nM3|;&jMCI`90pKF1y-+v*S`8r?YeLA9=5@4N1_pYSEOv2)}CdSRu&hR zJ_`Y?eO!Aya{s}>@bF0Q;NT!S5M|}Eg&o$(5pw8CHFPYZ`E9cF-EZUbbWdZ9lmMV| z?jR7f4%&a(4z{`1CUyJoiN_f@VEic-Uw`}YeF_Ko=@Noy3Lvh>-VY7k>rJOJuG6X% zI1S#&!$+*YkT-t){`mnfy=@A>=<Ru#>`&sTmzio(tJPS-NU;7y@`W&kFy9jtdR3{F z<HxSph7f>RDk(YozJDew7K>sQ0sstERoMtsDi!7cv;g2T0&5E3=;+ARuq2bokjhes zd=vw4=%!%wPft(T#>Pfy0OsfC<p79|WdJyRIB(j)!ootR=|L(9fdl{`050jE%PizT z%Ls5X>e488eG~)W9Nec=70pd=kQA|?29A%9iG>0)Ogf$JPy`$)jW(6Dvop52xfyK9 ztLp&(1ffw7M__JlE-(w(woTfZ2!M=6xx|Ssibg)lCo+{;h!YD*i&$X*sM48O5P_4E z6PJm?5-RdkDkUvrhqq!OxLQgylk@X)wzaht8h}_VMgXJ{0O?FDh`{XZY^ZA?%d*<o zi%1r8oC_mBFDLDG4aix@t9CVow?(5$3vWrI074q24Gl3-5TW86A0O|~JRsRpin1r4 z&$I3A?Z6B}06HPi&W?<1qs+|A1ZE-AG)X%X0eKBboan9u+!OnvIE{k(EaU(WHV@E- zhL|WUp&}m}8*3v9f(XbautK50c6N3`0}zkLWdP(w3@vJ4dU`t4wNR;4BK<!a1prwG zin9=?yCd^`yv2(-P19OOfX=+=Pauj4`9{l<Rsb{;rH@c5D6}7;6H7}7pjNBz?q~Pk zjgF2|8Y!1Pxq}?D?aHnYfNk5WmtQYmA>St^CMK9+7<5`mdFLIoHd?POvfeqd$KgWT zc+KmR(uTI1hlhs@eX}q_R)qj^x!jk@$;oE`uzYcGF@-NlR4NsE2~9Mll!Ih_^{+Qt z`ke=W2EsjQtX8Xy_NF%8r}q$;GE(>+o{z0$vsv*$H_7z_Z|?qA;toK2@)v4a98?34 RPpAL@002ovPDHLkV1lGZ;e-GH literal 0 HcmV?d00001 diff --git a/resources/images/format-justify-right.png b/resources/images/format-justify-right.png new file mode 100644 index 0000000000000000000000000000000000000000..9a3d8d6ee16fefae0af2a7b45c2d5126a80f5e10 GIT binary patch literal 1105 zcmV-X1g`suP)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm00004b3#c}2nYxW zd<bNS00009a7bBm000Fs000Fs0k`caQUCw|8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H11I|fAK~#9!?OM-E8$lGFO*YYu#{2`ewe}>Mq&-Rt-fc?{rG<iu z-n@A6)Oz=#Acg)1B8pcJp3NbGr`BH>a_~~yQd-hWcC(vgcKY7n5@9o$HS6LCzVdkE z&bsrydGCEQ(@|%Pk-IE9=sf_X0IYpkdzLo(mIej}Ub>7LwVF-zxK84F9BiD#z4ld$ z&oBFQz15DzVnow4f@$iyE}^suN=dUxy*Ae-wws>iebA=79gD}{Td|sDTDz86U0zsN z{3-;n`g!%~@WV&@Lqo&8nM?*8h?82)f&rW82zQ9929CwFRvRt;+-k%7*rySKiU2?v za{&lg7p$-CLYsMQR6c%BGD)aQjenKO+aJGvPQnB~Ujz_s0VMUr$HBn|y}4|jJFQBA z<KzuLenR@oCF9TE-=E;o`?dg#-k#U#{xr;bji@G#MuVh`6zNZ;UkOtP@;!y2SCv{B z{Iea~5CSl(RV8P?<)29^m5P{!D5Vgpy0Q^)9EZ4+b^yQ`fk*)y9v*UyO7i(UYP%Fd zAH@J%><lpbCnqOleSJML0CRJ5?ExSiO8_8Bd{H{U{QP{Rse;-j1QGxg0I<LV+zJc1 zv||Jq8g*%uaUaD17^D0xRYl|JO(jL_)j&u&Iyyq8>Y9aextt&Zu9QY^L{3jn$;QS; zcUxp#M*v;WD80D|%+Ahs%~ZB+qqd8Htcb-d6yAyOqM?uSg-m4@V#q?$B32jxsB|R` z5P{?4W6m;B2^MfRn<akXC$>(zQI}V`OwP{E$mZr|WB?M01OjLq0V-XI14LkEW+u|T zkY!ndbBSa#$5@~U;KxyKqXy(G<W;+x!UEB#(!x5@D5W82)PLwfw(3T(fXBwh1nYq0 zNO@D)Q!16n*49?nEaV5^`6xe;aT`{qr>DDSD$_Jk1rdm_2INkJm*8h&xhP1ZRDBk5 zDGR?2;9&(>CMv-K9vvMOL_r*Zz^PL%m&x|_c4PpO$s_`}ei74vH83?b73p56TCJj9 zpGGOAp$3Rvf)z1FK;a_3!<#ux(>g~0@4WE8G!zx|4YwJc0B9yiAEH!H@C<@CmX;7e zqtV>iE9`w385zMeQZ9Xp`$b~g&W;EGblNKy-!I+($EU`}$BAJWcw32i=Uub<tk)J; z@1EG>aG~`-<6~ml@FV8I!2to^EXa@*A%J4B_-$fh;svF2>HPeB5<Zf090xywiwi2| zAX=ZobDzcE^8nyP;7wz_UiaB6>g$K^Aeb7^_AcCyEf)#}@kKYv<qPlb|5oB2Krs0a XgG(G#kq5E900000NkvXXu0mjfp-%EP literal 0 HcmV?d00001 diff --git a/resources/images/format-list-ordered.png b/resources/images/format-list-ordered.png new file mode 100644 index 0000000000000000000000000000000000000000..c7da85da3ff2c2114845f69a392c3a743d353f4a GIT binary patch literal 4237 zcmZ8lcT^MG*PW0ANNABJO^OBtMEcWElz<?hlu$&10zp8^Lux2e6F`t6O({wc1VQP& zKWd~af=F*sM37#j3w-16&u`W`b7yAVb=JM7?7i<q;S97{kbFo009bT&G>yTL^w${a z!8`T3O&>VGyfk!88Nn-%(e5euj&Rq(dx7&u{~AO?Jlzlc$V=2RCz`lDB>LKT+5^76 zzS2&v|9aWlxZ6v+c{-%8sqz5;3aP89Zt6!_%?NSfA5Q6N+3RPUJkUx{QZ&TgbL>#l zLZMNn!jRiW=vz;4Uq$t|Ei7=EW`%nL&)c^?+&G4sLxxLIDx@A<BHa5TJ#oj$>5ZhW z<DsDu+?e~yMuMZYMHVq#>?BdBWOei7RAb1PLd{UsHg)cU$Q}n?p?pCwet}Z&wWhSt zkLp)~F`ZQ&RS{0R7Y>nf|Nr)b^dlkLTdt%?b!1ce$oxp2<U4!1$7eaJVy_#VcI!9m zt;J8_NwQd=zpV{|LTO+T@HZpM5E0IB6zbKfREw*d3e{n^VJBNrrqAC9XJKAD^R8ya zX%!;e;@YP4c|E|jY2yJcHcUSx-b>cZd_lE^#a46`-+UaqO!>UeyHK<dB(?W4*NyJM zs%?avPu$Cu5SAfKiTGB?^~zOWiP8qN6;%E7(5<n7Q|qyU0PAJeC+Bfo@FX-DMUrE^ zF`77BDa*_u5XjA(WqtrZc)^ak-vLC&W_8m qj7^x?QCjN<MOnbph-{Ooue<Q^X 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 MSIa=NM1v6ee_JoySO5S3 literal 0 HcmV?d00001 diff --git a/resources/images/format-list-unordered.png b/resources/images/format-list-unordered.png new file mode 100644 index 0000000000000000000000000000000000000000..c9599899585c890cb61424d51614e84a4ce4adb1 GIT binary patch literal 3863 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 Z{{xbBkNaSbPb~ld002ovPDHLkV1f@!JCXnZ literal 0 HcmV?d00001 diff --git a/src/calibre/gui2/comments_editor.py b/src/calibre/gui2/comments_editor.py index a73181164f..bf8fb4a930 100644 --- a/src/calibre/gui2/comments_editor.py +++ b/src/calibre/gui2/comments_editor.py @@ -59,13 +59,28 @@ class EditorWidget(QWebView): _('Superscript'), True), ('ToggleSubscript', 'subscript', 'format-text-subscript', _('Subscript'), True), + ('InsertOrderedList', 'ordered_list', 'format-list-ordered', + _('Ordered list'), True), + ('InsertUnorderedList', 'unordered_list', 'format-list-unordered', + _('Unordered list'), True), + ('AlignLeft', 'align_left', 'format-justify-left', + _('Align left'), False), + ('AlignCenter', 'align_center', 'format-justify-center', + _('Align center'), False), + ('AlignRight', 'align_right', 'format-justify-right', + _('Align right'), False), + ('AlignJustified', 'align_justified', 'format-justify-fill', + _('Align justified'), False), ('Undo', 'undo', 'edit-undo', _('Undo'), False), ('Redo', 'redo', 'edit-redo', _('Redo'), False), ('Copy', 'copy', 'edit-copy', _('Copy'), False), ('Paste', 'paste', 'edit-paste', _('Paste'), False), ('Cut', 'cut', 'edit-cut', _('Cut'), False), - + ('Indent', 'indent', 'format-indent-more', + _('Increase Indentation'), False), + ('Outdent', 'outdent', 'format-indent-less', + _('Decrease Indentation'), False), ]: ac = PageAction(wac, icon, text, checkable, self) setattr(self, 'action_'+name, ac) @@ -119,14 +134,43 @@ class Editor(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) - self.toolbar = QToolBar(self) + self.toolbar1 = QToolBar(self) + self.toolbar2 = QToolBar(self) self.editor = EditorWidget(self) self._layout = QVBoxLayout(self) self.setLayout(self._layout) self._layout.setContentsMargins(0, 0, 0, 0) - self._layout.addWidget(self.toolbar) + self._layout.addWidget(self.toolbar1) + self._layout.addWidget(self.toolbar2) self._layout.addWidget(self.editor) + for x in ('bold', 'italic', 'underline', 'strikethrough', + 'superscript', 'subscript', 'indent', 'outdent'): + ac = getattr(self.editor, 'action_'+x) + if x in ('superscript', 'indent'): + self.toolbar2.addSeparator() + self.toolbar2.addAction(ac) + self.toolbar2.addSeparator() + + for x in ('left', 'center', 'right', 'justified'): + ac = getattr(self.editor, 'action_align_'+x) + self.toolbar2.addAction(ac) + self.toolbar2.addSeparator() + + self.toolbar1.addAction(self.editor.action_undo) + self.toolbar1.addAction(self.editor.action_redo) + self.toolbar1.addSeparator() + + for x in ('copy', 'cut', 'paste'): + ac = getattr(self.editor, 'action_'+x) + self.toolbar1.addAction(ac) + self.toolbar1.addSeparator() + + for x in ('', 'un'): + ac = getattr(self.editor, 'action_%sordered_list'%x) + self.toolbar1.addAction(ac) + self.toolbar1.addSeparator() + @dynamic_property def html(self): def fset(self, v): From 506f08be468e55d8c9bd3b9e86efcf1d716aeab4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sun, 19 Dec 2010 22:15:05 -0700 Subject: [PATCH 41/62] ... --- resources/images/edit-select-all.png | Bin 0 -> 2197 bytes src/calibre/gui2/comments_editor.py | 5 +++++ 2 files changed, 5 insertions(+) create mode 100644 resources/images/edit-select-all.png diff --git a/resources/images/edit-select-all.png b/resources/images/edit-select-all.png new file mode 100644 index 0000000000000000000000000000000000000000..4393bc9dc7fe05ce4d2db5d8630cc4b88e25a4bc GIT binary patch literal 2197 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 Xd$*Y6|7Q;K00000NkvXXu0mjfY8MXk literal 0 HcmV?d00001 diff --git a/src/calibre/gui2/comments_editor.py b/src/calibre/gui2/comments_editor.py index bf8fb4a930..32e93d0a77 100644 --- a/src/calibre/gui2/comments_editor.py +++ b/src/calibre/gui2/comments_editor.py @@ -74,6 +74,7 @@ class EditorWidget(QWebView): _('Align justified'), False), ('Undo', 'undo', 'edit-undo', _('Undo'), False), ('Redo', 'redo', 'edit-redo', _('Redo'), False), + ('RemoveFormat', 'remove_format', 'trash', _('Remove formatting'), False), ('Copy', 'copy', 'edit-copy', _('Copy'), False), ('Paste', 'paste', 'edit-paste', _('Paste'), False), ('Cut', 'cut', 'edit-cut', _('Cut'), False), @@ -81,6 +82,8 @@ class EditorWidget(QWebView): _('Increase Indentation'), False), ('Outdent', 'outdent', 'format-indent-less', _('Decrease Indentation'), False), + ('SelectAll', 'select_all', 'edit-select-all', + _('Select all'), False), ]: ac = PageAction(wac, icon, text, checkable, self) setattr(self, 'action_'+name, ac) @@ -159,6 +162,8 @@ class Editor(QWidget): self.toolbar1.addAction(self.editor.action_undo) self.toolbar1.addAction(self.editor.action_redo) + self.toolbar1.addAction(self.editor.action_select_all) + self.toolbar1.addAction(self.editor.action_remove_format) self.toolbar1.addSeparator() for x in ('copy', 'cut', 'paste'): From b358edb5e0b3a919fda021cc8efafa5fe38b1d22 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sun, 19 Dec 2010 22:33:26 -0700 Subject: [PATCH 42/62] E-book viewer: Add a right click menu item 'Inspect' that allows you to inspect the underlying HTML/CSS source of the currently displayed content --- src/calibre/gui2/viewer/documentview.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/calibre/gui2/viewer/documentview.py b/src/calibre/gui2/viewer/documentview.py index f131dd522d..d5f881d4b4 100644 --- a/src/calibre/gui2/viewer/documentview.py +++ b/src/calibre/gui2/viewer/documentview.py @@ -188,6 +188,7 @@ class Document(QWebPage): # Miscellaneous settings.setAttribute(QWebSettings.LinksIncludedInFocusChain, True) + settings.setAttribute(QWebSettings.DeveloperExtrasEnabled, True) self.set_user_stylesheet() self.misc_config() From 4c564132ca5a59951cc6e213aec280076337922a Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 20 Dec 2010 00:08:40 -0700 Subject: [PATCH 43/62] Add a source code editor to the comments editor --- src/calibre/gui2/comments_editor.py | 263 +++++++++++++++++++++++++++- 1 file changed, 255 insertions(+), 8 deletions(-) diff --git a/src/calibre/gui2/comments_editor.py b/src/calibre/gui2/comments_editor.py index 32e93d0a77..547dd51848 100644 --- a/src/calibre/gui2/comments_editor.py +++ b/src/calibre/gui2/comments_editor.py @@ -9,15 +9,16 @@ __docformat__ = 'restructuredtext en' from lxml import html from lxml.html import soupparser -from PyQt4.Qt import QApplication, QFontInfo, QSize, QWidget, \ - QToolBar, QVBoxLayout, QAction, QIcon, QWebPage, Qt +from PyQt4.Qt import QApplication, QFontInfo, QSize, QWidget, QPlainTextEdit, \ + QToolBar, QVBoxLayout, QAction, QIcon, QWebPage, Qt, QTabWidget, \ + QSyntaxHighlighter, QColor, QChar from PyQt4.QtWebKit import QWebView from calibre.ebooks.chardet import xml_to_unicode from calibre import xml_replace_entities -class PageAction(QAction): +class PageAction(QAction): # {{{ def __init__(self, wac, icon, text, checkable, view): QAction.__init__(self, QIcon(I(icon+'.png')), text, view) @@ -41,8 +42,9 @@ class PageAction(QAction): self.setChecked(self.page_action.isChecked()) self.setEnabled(self.page_action.isEnabled()) +# }}} -class EditorWidget(QWebView): +class EditorWidget(QWebView): # {{{ def __init__(self, parent=None): QWebView.__init__(self, parent) @@ -132,6 +134,219 @@ class EditorWidget(QWebView): return property(fget=fget, fset=fset) +# }}} + +# Highlighter {{{ +State_Text = -1 +State_DocType = 0 +State_Comment = 1 +State_TagStart = 2 +State_TagName = 3 +State_InsideTag = 4 +State_AttributeName = 5 +State_SingleQuote = 6 +State_DoubleQuote = 7 +State_AttributeValue = 8 + +class Highlighter(QSyntaxHighlighter): + + def __init__(self, doc): + QSyntaxHighlighter.__init__(self, doc) + self.colors = {} + self.colors['doctype'] = QColor(192, 192, 192) + self.colors['entity'] = QColor(128, 128, 128) + self.colors['tag'] = QColor(136, 18, 128) + self.colors['comment'] = QColor( 35, 110, 37) + self.colors['attrname'] = QColor(153, 69, 0) + self.colors['attrval'] = QColor( 36, 36, 170) + + def highlightBlock(self, text): + state = self.previousBlockState() + len_ = text.length() + start = 0 + pos = 0 + + while pos < len_: + + if state == State_Comment: + start = pos + while pos < len_: + if text.mid(pos, 3) == "-->": + pos += 3; + state = State_Text; + break + else: + pos += 1 + self.setFormat(start, pos - start, self.colors['comment']) + + elif state == State_DocType: + start = pos + while pos < len_: + ch = text.at(pos) + pos += 1 + if ch == QChar('>'): + state = State_Text + break + self.setFormat(start, pos - start, self.colors['doctype']) + + # at '<' in e.g. "<span>foo</span>" + elif state == State_TagStart: + start = pos + 1 + while pos < len_: + ch = text.at(pos) + pos += 1 + if ch == QChar('>'): + state = State_Text + break + if not ch.isSpace(): + pos -= 1 + state = State_TagName + break + + # at 'b' in e.g "<blockquote>foo</blockquote>" + elif state == State_TagName: + start = pos + while pos < len_: + ch = text.at(pos) + pos += 1 + if ch.isSpace(): + pos -= 1 + state = State_InsideTag + break + if ch == QChar('>'): + state = State_Text + break + self.setFormat(start, pos - start, self.colors['tag']); + + # anywhere after tag name and before tag closing ('>') + elif state == State_InsideTag: + start = pos + + while pos < len_: + ch = text.at(pos) + pos += 1 + + if ch == QChar('/'): + continue + + if ch == QChar('>'): + state = State_Text + break + + if not ch.isSpace(): + pos -= 1 + state = State_AttributeName + break + + # at 's' in e.g. <img src=bla.png/> + elif state == State_AttributeName: + start = pos + + while pos < len_: + ch = text.at(pos) + pos += 1 + + if ch == QChar('='): + state = State_AttributeValue + break + + if ch in (QChar('>'), QChar('/')): + state = State_InsideTag + break + + self.setFormat(start, pos - start, self.colors['attrname']) + + # after '=' in e.g. <img src=bla.png/> + elif state == State_AttributeValue: + start = pos + + # find first non-space character + while pos < len_: + ch = text.at(pos) + pos += 1 + + # handle opening single quote + if ch == QChar("'"): + state = State_SingleQuote + break + + # handle opening double quote + if ch == QChar('"'): + state = State_DoubleQuote + break + + if not ch.isSpace(): + break + + if state == State_AttributeValue: + # attribute value without quote + # just stop at non-space or tag delimiter + start = pos + while pos < len_: + ch = text.at(pos); + if ch.isSpace(): + break + if ch in (QChar('>'), QChar('/')): + break + pos += 1 + state = State_InsideTag + self.setFormat(start, pos - start, self.colors['attrval']) + + # after the opening single quote in an attribute value + elif state == State_SingleQuote: + start = pos + + while pos < len_: + ch = text.at(pos) + pos += 1 + if ch == QChar("'"): + break + + state = State_InsideTag + + self.setFormat(start, pos - start, self.colors['attrval']) + + # after the opening double quote in an attribute value + elif state == State_DoubleQuote: + start = pos + + while pos < len_: + ch = text.at(pos) + pos += 1 + if ch == QChar('"'): + break + + state = State_InsideTag + + self.setFormat(start, pos - start, self.colors['attrval']) + + else: + # State_Text and default + while pos < len_: + ch = text.at(pos) + if ch == QChar('<'): + if text.mid(pos, 4) == "<!--": + state = State_Comment + else: + if text.mid(pos, 9).toUpper() == "<!DOCTYPE": + state = State_DocType + else: + state = State_TagStart + break; + elif ch == QChar('&'): + start = pos + while pos < len_ and text.at(pos) != QChar(';'): + self.setFormat(start, pos - start, + self.colors['entity']) + pos += 1 + + else: + pos += 1 + + + self.setCurrentBlockState(state) + +# }}} class Editor(QWidget): @@ -140,12 +355,25 @@ class Editor(QWidget): self.toolbar1 = QToolBar(self) self.toolbar2 = QToolBar(self) self.editor = EditorWidget(self) + self.tabs = QTabWidget(self) + self.tabs.setTabPosition(self.tabs.South) + self.wyswyg = QWidget(self.tabs) + self.code_edit = QPlainTextEdit(self.tabs) + self.source_dirty = False + self.wyswyg_dirty = True + self._layout = QVBoxLayout(self) + self.wyswyg.layout = l = QVBoxLayout(self.wyswyg) self.setLayout(self._layout) - self._layout.setContentsMargins(0, 0, 0, 0) - self._layout.addWidget(self.toolbar1) - self._layout.addWidget(self.toolbar2) - self._layout.addWidget(self.editor) + l.setContentsMargins(0, 0, 0, 0) + l.addWidget(self.toolbar1) + l.addWidget(self.toolbar2) + l.addWidget(self.editor) + self._layout.addWidget(self.tabs) + self.tabs.addTab(self.wyswyg, _('Normal view')) + self.tabs.addTab(self.code_edit, _('HTML Source')) + self.tabs.currentChanged[int].connect(self.change_tab) + self.highlighter = Highlighter(self.code_edit.document()) for x in ('bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript', 'indent', 'outdent'): @@ -176,13 +404,32 @@ class Editor(QWidget): self.toolbar1.addAction(ac) self.toolbar1.addSeparator() + self.code_edit.textChanged.connect(self.code_dirtied) + self.editor.page().contentsChanged.connect(self.wyswyg_dirtied) + @dynamic_property def html(self): def fset(self, v): self.editor.html = v return property(fget=lambda self:self.editor.html, fset=fset) + def change_tab(self, index): + #print 'reloading:', (index and self.wyswyg_dirty) or (not index and + # self.source_dirty) + if index == 1: # changing to code view + if self.wyswyg_dirty: + self.code_edit.setPlainText(self.html) + self.wyswyg_dirty = False + elif index == 0: #changing to wyswyg + if self.source_dirty: + self.html = unicode(self.code_edit.toPlainText()) + self.source_dirty = False + def wyswyg_dirtied(self, *args): + self.wyswyg_dirty = True + + def code_dirtied(self, *args): + self.source_dirty = True if __name__ == '__main__': app = QApplication([]) From a8065fd7150a2bbe85a051b1e226b94a6f8aa93b Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Mon, 20 Dec 2010 09:01:43 +0000 Subject: [PATCH 44/62] Make the title_sort order tweak respected in more places (hope, everywhere) --- src/calibre/ebooks/metadata/__init__.py | 2 ++ src/calibre/library/database2.py | 4 ++++ src/calibre/library/sqlite.py | 5 +---- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/calibre/ebooks/metadata/__init__.py b/src/calibre/ebooks/metadata/__init__.py index 01e5190640..25127ee591 100644 --- a/src/calibre/ebooks/metadata/__init__.py +++ b/src/calibre/ebooks/metadata/__init__.py @@ -57,6 +57,8 @@ _ignore_starts = u'\'"'+u''.join(unichr(x) for x in range(0x2018, 0x201e)+[0x203 def title_sort(title): title = title.strip() + if tweaks['title_series_sorting'] == 'strictly_alphabetic': + return title if title and title[0] in _ignore_starts: title = title[1:] match = _title_pat.search(title) diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 2848e8ebb3..cba49ae6ae 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -1128,6 +1128,10 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): for l in list: (id, val, sort_val) = (l[0], l[1], l[2]) tids[category][val] = (id, sort_val) + elif cat['datatype'] == 'series': + for l in list: + (id, val) = (l[0], l[1]) + tids[category][val] = (id, title_sort(val)) elif cat['datatype'] == 'rating': for l in list: (id, val) = (l[0], l[1]) diff --git a/src/calibre/library/sqlite.py b/src/calibre/library/sqlite.py index ca6b0fc178..521c275efe 100644 --- a/src/calibre/library/sqlite.py +++ b/src/calibre/library/sqlite.py @@ -161,10 +161,7 @@ class DBThread(Thread): self.conn.create_aggregate('sort_concat', 2, SafeSortedConcatenate) self.conn.create_collation('PYNOCASE', partial(pynocase, encoding=encoding)) - if tweaks['title_series_sorting'] == 'strictly_alphabetic': - self.conn.create_function('title_sort', 1, lambda x:x) - else: - self.conn.create_function('title_sort', 1, title_sort) + self.conn.create_function('title_sort', 1, title_sort) self.conn.create_function('author_to_author_sort', 1, _author_to_author_sort) self.conn.create_function('uuid4', 0, lambda : str(uuid.uuid4())) From 81864723c683661abbb977162ad6cc8a9241aaf0 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 20 Dec 2010 09:22:40 -0700 Subject: [PATCH 45/62] Fix #7981 (New recipe for Mish's Global Economic Trend Analysis) --- resources/recipes/ecotrend.recipe | 42 +++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 resources/recipes/ecotrend.recipe diff --git a/resources/recipes/ecotrend.recipe b/resources/recipes/ecotrend.recipe new file mode 100644 index 0000000000..679f190e96 --- /dev/null +++ b/resources/recipes/ecotrend.recipe @@ -0,0 +1,42 @@ +__license__ = 'GPL v3' +__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>' +''' +globaleconomicanalysis.blogspot.com +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class GlobalEconomicAnalysis(BasicNewsRecipe): + title = "Mish's Global Economic Trend Analysis" + __author__ = 'Darko Miletic' + description = 'Thoughts on the global economy, housing, gold, silver, interest rates, oil, energy, China, commodities, the dollar, Euro, Renminbi, Yen, inflation, deflation, stagflation, precious metals, emerging markets, and policy decisions that affect the global markets.' + publisher = 'Mike Shedlock' + category = 'news, politics, economy, banking' + oldest_article = 7 + max_articles_per_feed = 200 + no_stylesheets = True + encoding = 'utf8' + use_embedded_content = True + language = 'en' + remove_empty_feeds = True + publication_type = 'blog' + masthead_url = 'http://www.pagina12.com.ar/commons/imgs/logo-home.gif' + extra_css = """ + body{font-family: Arial,Helvetica,sans-serif } + img{margin-bottom: 0.4em; display:block} + """ + + conversion_options = { + 'comment' : description + , 'tags' : category + , 'publisher' : publisher + , 'language' : language + } + + remove_tags = [ + dict(name=['meta','link','iframe','object','embed']) + ,dict(attrs={'class':'blogger-post-footer'}) + ] + remove_attributes=['border'] + + feeds = [(u'Articles', u'http://feeds2.feedburner.com/MishsGlobalEconomicTrendAnalysis')] From eac89c5439c99337dd94618f17cb5ab3827527bd Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 20 Dec 2010 09:55:44 -0700 Subject: [PATCH 46/62] Linux binary build: If setting system default locale fails, try setting locale to en_US.UTF-8 instead --- setup/installer/linux/freeze2.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/setup/installer/linux/freeze2.py b/setup/installer/linux/freeze2.py index df2c1d6480..7a2980039e 100644 --- a/setup/installer/linux/freeze2.py +++ b/setup/installer/linux/freeze2.py @@ -318,7 +318,11 @@ class LinuxFreeze(Command): import codecs def set_default_encoding(): - locale.setlocale(locale.LC_ALL, '') + try: + locale.setlocale(locale.LC_ALL, '') + except: + print 'WARNING: Failed to set default libc locale, using en_US' + locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') enc = locale.getdefaultlocale()[1] if not enc: enc = locale.nl_langinfo(locale.CODESET) From 2719075963b5d502eba3378dde7d46d8a05ecaf0 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 20 Dec 2010 10:07:37 -0700 Subject: [PATCH 47/62] Update Gazet van Antwerpen --- resources/recipes/gva_be.recipe | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/resources/recipes/gva_be.recipe b/resources/recipes/gva_be.recipe index 34c4122394..f42bd23417 100644 --- a/resources/recipes/gva_be.recipe +++ b/resources/recipes/gva_be.recipe @@ -40,13 +40,12 @@ class GazetvanAntwerpen(BasicNewsRecipe): remove_tags_after = dict(name='span', attrs={'class':'author'}) feeds = [ - (u'Overzicht & Blikvanger', u'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/overview/overzicht' ) + (u'Binnenland' , u'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/binnenland' ) + ,(u'Buitenland' , u'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/buitenland' ) ,(u'Stad & Regio' , u'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/stadenregio' ) ,(u'Economie' , u'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/economie' ) - ,(u'Binnenland' , u'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/binnenland' ) - ,(u'Buitenland' , u'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/buitenland' ) ,(u'Media & Cultur' , u'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/mediaencultuur') - ,(u'Wetenschap' , u'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/mediaencultuur') + ,(u'Wetenschap' , u'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/wetenschap' ) ,(u'Sport' , u'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/sport' ) ] From 8ea848312c666cce6e6a71190aa4f834971a1ce1 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 20 Dec 2010 10:52:44 -0700 Subject: [PATCH 48/62] Fix #7967 (Specific format actions show non-existent formats) --- setup/installer/linux/freeze2.py | 2 +- src/calibre/gui2/actions/delete.py | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/setup/installer/linux/freeze2.py b/setup/installer/linux/freeze2.py index 7a2980039e..bd8463b1a7 100644 --- a/setup/installer/linux/freeze2.py +++ b/setup/installer/linux/freeze2.py @@ -321,7 +321,7 @@ class LinuxFreeze(Command): try: locale.setlocale(locale.LC_ALL, '') except: - print 'WARNING: Failed to set default libc locale, using en_US' + print 'WARNING: Failed to set default libc locale, using en_US.UTF-8' locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') enc = locale.getdefaultlocale()[1] if not enc: diff --git a/src/calibre/gui2/actions/delete.py b/src/calibre/gui2/actions/delete.py index 24dd1d3e5c..27973b5f5b 100644 --- a/src/calibre/gui2/actions/delete.py +++ b/src/calibre/gui2/actions/delete.py @@ -97,10 +97,15 @@ class DeleteAction(InterfaceAction): for action in list(self.delete_menu.actions())[1:]: action.setEnabled(enabled) - def _get_selected_formats(self, msg): + def _get_selected_formats(self, msg, ids): from calibre.gui2.dialogs.select_formats import SelectFormats - fmts = self.gui.library_view.model().db.all_formats() - d = SelectFormats([x.lower() for x in fmts], msg, parent=self.gui) + fmts = set([]) + db = self.gui.library_view.model().db + for x in ids: + fmts_ = db.formats(x, index_is_id=True, verify_formats=False) + if fmts_: + fmts.update(frozenset([x.lower() for x in fmts_.split(',')])) + d = SelectFormats(list(sorted(fmts)), msg, parent=self.gui) if d.exec_() != d.Accepted: return None return d.selected_formats @@ -118,7 +123,7 @@ class DeleteAction(InterfaceAction): if not ids: return fmts = self._get_selected_formats( - _('Choose formats to be deleted')) + _('Choose formats to be deleted'), ids) if not fmts: return for id in ids: @@ -136,7 +141,7 @@ class DeleteAction(InterfaceAction): if not ids: return fmts = self._get_selected_formats( - '<p>'+_('Choose formats <b>not</b> to be deleted')) + '<p>'+_('Choose formats <b>not</b> to be deleted'), ids) if fmts is None: return for id in ids: From f4b7d64708312a8966cede28ccb24430a8456a19 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 20 Dec 2010 11:15:10 -0700 Subject: [PATCH 49/62] E-book viewer: SHow format of current book in the title bar. Fixes #7974 (Viewer - more info in title bar) --- src/calibre/gui2/viewer/main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/viewer/main.py b/src/calibre/gui2/viewer/main.py index f7b8a8d401..25f69b1558 100644 --- a/src/calibre/gui2/viewer/main.py +++ b/src/calibre/gui2/viewer/main.py @@ -650,7 +650,8 @@ class EbookViewer(MainWindow, Ui_EbookViewer): self.action_table_of_contents.setDisabled(not self.iterator.toc) self.current_book_has_toc = bool(self.iterator.toc) self.current_title = title - self.setWindowTitle(self.base_window_title+' - '+title) + self.setWindowTitle(self.base_window_title+' - '+title + + ' [%s]'%os.path.splitext(pathtoebook)[1][1:].upper()) self.pos.setMaximum(sum(self.iterator.pages)) self.pos.setSuffix(' / %d'%sum(self.iterator.pages)) self.vertical_scrollbar.setMinimum(100) From b4d7c5f7a6e8cba8166be30a5ec217e5b8c73084 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 20 Dec 2010 11:21:37 -0700 Subject: [PATCH 50/62] ... --- src/calibre/devices/usbms/device.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/calibre/devices/usbms/device.py b/src/calibre/devices/usbms/device.py index af2948cf82..2c095d6f7b 100644 --- a/src/calibre/devices/usbms/device.py +++ b/src/calibre/devices/usbms/device.py @@ -605,8 +605,9 @@ class Device(DeviceConfig, DevicePlugin): main, carda, cardb = self.find_device_nodes() if main is None: - raise DeviceError(_('Unable to detect the %s disk drive. Your ' - ' kernel is probably exporting a deprecated version of SYSFS.') + raise DeviceError(_('Unable to detect the %s disk drive. Either ' + 'the device has already been ejected, or your ' + 'kernel is exporting a deprecated version of SYSFS.') %self.__class__.__name__) self._linux_mount_map = {} From a16708ca72c07bcf5d015440b0172e933f15638c Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 20 Dec 2010 11:58:07 -0700 Subject: [PATCH 51/62] Implement #7947 (Bulk grab cover from format) --- src/calibre/gui2/dialogs/metadata_bulk.py | 47 ++++++++++++++++++++++- src/calibre/gui2/dialogs/metadata_bulk.ui | 11 +++++- 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index e0f1f83c73..b875de14e3 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -3,7 +3,7 @@ __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>' '''Dialog to edit metadata in bulk''' -import re +import re, os from PyQt4.Qt import Qt, QDialog, QGridLayout, QVBoxLayout, QFont, QLabel, \ pyqtSignal, QDialogButtonBox @@ -12,12 +12,41 @@ from PyQt4 import QtGui from calibre.gui2.dialogs.metadata_bulk_ui import Ui_MetadataBulkDialog from calibre.gui2.dialogs.tag_editor import TagEditor from calibre.ebooks.metadata import string_to_authors, authors_to_string +from calibre.ebooks.metadata.meta import get_metadata from calibre.gui2.custom_column_widgets import populate_metadata_page from calibre.gui2 import error_dialog from calibre.gui2.progress_indicator import ProgressIndicator from calibre.utils.config import dynamic from calibre.utils.titlecase import titlecase from calibre.utils.icu import sort_key, capitalize +from calibre.utils.config import prefs +from calibre.utils.magick.draw import identify_data + +def get_cover_data(path): + old = prefs['read_file_metadata'] + if not old: + prefs['read_file_metadata'] = True + cdata = area = None + + try: + mi = get_metadata(open(path, 'rb'), + os.path.splitext(path)[1][1:].lower()) + if mi.cover and os.access(mi.cover, os.R_OK): + cdata = open(mi.cover).read() + elif mi.cover_data[1] is not None: + cdata = mi.cover_data[1] + if cdata: + width, height, fmt = identify_data(cdata) + area = width*height + except: + cdata = area = None + + if old != prefs['read_file_metadata']: + prefs['read_file_metadata'] = old + + return cdata, area + + class MyBlockingBusy(QDialog): @@ -146,6 +175,20 @@ class MyBlockingBusy(QDialog): cdata = calibre_cover(mi.title, mi.format_field('authors')[-1], series_string=series_string) self.db.set_cover(id, cdata) + elif cover_action == 'fromfmt': + fmts = self.db.formats(id, index_is_id=True, verify_formats=False) + if fmts: + covers = [] + for fmt in fmts.split(','): + fmt = self.db.format_abspath(id, fmt, index_is_id=True) + if not fmt: continue + cdata, area = get_cover_data(fmt) + if cdata: + covers.append((cdata, area)) + covers.sort(key=lambda x: x[1]) + if covers: + self.db.set_cover(id, covers[-1][0]) + covers = [] elif self.current_phase == 2: # All of these just affect the DB, so we can tolerate a total rollback if do_auto_author: @@ -700,6 +743,8 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): cover_action = 'remove' elif self.cover_generate.isChecked(): cover_action = 'generate' + elif self.cover_from_fmt.isChecked(): + cover_action = 'fromfmt' args = (remove_all, remove, add, au, aus, do_aus, rating, pub, do_series, do_autonumber, do_remove_format, remove_format, do_swap_ta, diff --git a/src/calibre/gui2/dialogs/metadata_bulk.ui b/src/calibre/gui2/dialogs/metadata_bulk.ui index ecb34d8e5b..3f20958d47 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.ui +++ b/src/calibre/gui2/dialogs/metadata_bulk.ui @@ -414,6 +414,13 @@ Future conversion of these books will use the default settings.</string> </property> </widget> </item> + <item> + <widget class="QRadioButton" name="cover_from_fmt"> + <property name="text"> + <string>Set from &ebook file(s)</string> + </property> + </widget> + </item> </layout> </widget> </item> @@ -686,8 +693,8 @@ nothing should be put between the original text and the inserted text</string> <rect> <x>0</x> <y>0</y> - <width>122</width> - <height>38</height> + <width>726</width> + <height>334</height> </rect> </property> <layout class="QGridLayout" name="testgrid"> From f595ff2dfc6b4b9177aa4c2248448336da0254e1 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 20 Dec 2010 12:01:49 -0700 Subject: [PATCH 52/62] ... --- src/calibre/gui2/dialogs/metadata_bulk.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index b875de14e3..e5292ee755 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -185,10 +185,10 @@ class MyBlockingBusy(QDialog): cdata, area = get_cover_data(fmt) if cdata: covers.append((cdata, area)) - covers.sort(key=lambda x: x[1]) - if covers: - self.db.set_cover(id, covers[-1][0]) - covers = [] + covers.sort(key=lambda x: x[1]) + if covers: + self.db.set_cover(id, covers[-1][0]) + covers = [] elif self.current_phase == 2: # All of these just affect the DB, so we can tolerate a total rollback if do_auto_author: From 6e3d2db96c7958ccaaae78b82b665230931c3940 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 20 Dec 2010 13:20:21 -0700 Subject: [PATCH 53/62] On X11 initialize fontconfig in the GUI thread as Qt also uses fontconfig internally and fontconfig is not thread safe --- src/calibre/gui2/convert/mobi_output.py | 2 +- src/calibre/gui2/widgets.py | 2 +- src/calibre/utils/fonts/__init__.py | 19 +++++++++++++++---- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/calibre/gui2/convert/mobi_output.py b/src/calibre/gui2/convert/mobi_output.py index 14aca24db5..be9c5b4658 100644 --- a/src/calibre/gui2/convert/mobi_output.py +++ b/src/calibre/gui2/convert/mobi_output.py @@ -11,7 +11,6 @@ from PyQt4.Qt import Qt from calibre.gui2.convert.mobi_output_ui import Ui_Form from calibre.gui2.convert import Widget from calibre.gui2.widgets import FontFamilyModel -from calibre.utils.fonts import fontconfig font_family_model = None @@ -28,6 +27,7 @@ class PluginWidget(Widget, Ui_Form): 'mobi_ignore_margins', 'dont_compress', 'no_inline_toc', 'masthead_font','personal_doc'] ) + from calibre.utils.fonts import fontconfig self.db, self.book_id = db, book_id global font_family_model diff --git a/src/calibre/gui2/widgets.py b/src/calibre/gui2/widgets.py index 12d64bbbcd..c5ae7fff85 100644 --- a/src/calibre/gui2/widgets.py +++ b/src/calibre/gui2/widgets.py @@ -19,7 +19,6 @@ from calibre.gui2 import NONE, error_dialog, pixmap_to_data, gprefs from calibre.constants import isosx from calibre.gui2.filename_pattern_ui import Ui_Form from calibre import fit_image -from calibre.utils.fonts import fontconfig from calibre.ebooks import BOOK_EXTENSIONS from calibre.ebooks.metadata.meta import metadata_from_filename from calibre.utils.config import prefs, XMLConfig @@ -283,6 +282,7 @@ class FontFamilyModel(QAbstractListModel): def __init__(self, *args): QAbstractListModel.__init__(self, *args) + from calibre.utils.fonts import fontconfig try: self.families = fontconfig.find_font_families() except: diff --git a/src/calibre/utils/fonts/__init__.py b/src/calibre/utils/fonts/__init__.py index 5cab0c4920..3db3a1b285 100644 --- a/src/calibre/utils/fonts/__init__.py +++ b/src/calibre/utils/fonts/__init__.py @@ -7,15 +7,19 @@ __copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>' __docformat__ = 'restructuredtext en' import os, sys -from threading import Thread -from calibre.constants import plugins, iswindows +from calibre.constants import plugins, iswindows, islinux, isfreebsd _fc, _fc_err = plugins['fontconfig'] if _fc is None: raise RuntimeError('Failed to load fontconfig with error:'+_fc_err) +if islinux or isfreebsd: + Thread = object +else: + from threading import Thread + class FontConfig(Thread): def __init__(self): @@ -45,7 +49,8 @@ class FontConfig(Thread): self.failed = True def wait(self): - self.join() + if not (islinux or isfreebsd): + self.join() if self.failed: raise RuntimeError('Failed to initialize fontconfig') @@ -144,7 +149,13 @@ class FontConfig(Thread): return fonts if all else (fonts[0] if fonts else None) fontconfig = FontConfig() -fontconfig.start() +if islinux or isfreebsd: + # On X11 Qt also uses fontconfig, so initialization must happen in the + # main thread. In any case on X11 initializing fontconfig should be very + # fast + fontconfig.run() +else: + fontconfig.start() def test(): from pprint import pprint; From cddf20727770508ffe1116c399a67403b67022a4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 20 Dec 2010 14:48:25 -0700 Subject: [PATCH 54/62] Fix #7980 (Security vulnerability in Calibre 0.7.34) --- src/calibre/library/server/content.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/calibre/library/server/content.py b/src/calibre/library/server/content.py index 5492c86fa9..8af70d5675 100644 --- a/src/calibre/library/server/content.py +++ b/src/calibre/library/server/content.py @@ -5,7 +5,7 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>' __docformat__ = 'restructuredtext en' -import re, os +import re, os, posixpath import cherrypy @@ -88,17 +88,24 @@ class ContentServer(object): def static(self, name): 'Serves static content' name = name.lower() - cherrypy.response.headers['Content-Type'] = { + fname = posixpath.basename(name) + try: + cherrypy.response.headers['Content-Type'] = { 'js' : 'text/javascript', 'css' : 'text/css', 'png' : 'image/png', 'gif' : 'image/gif', 'html' : 'text/html', - '' : 'application/octet-stream', - }[name.rpartition('.')[-1].lower()] + }[fname.rpartition('.')[-1].lower()] + except KeyError: + raise cherrypy.HTTPError(404, '%r not a valid resource type'%name) cherrypy.response.headers['Last-Modified'] = self.last_modified(self.build_time) - path = P('content_server/'+name) - if not os.path.exists(path): + basedir = os.path.abspath(P('content_server')) + path = os.path.join(basedir, name.replace('/', os.sep)) + path = os.path.abspath(path) + if not path.startswith(basedir): + raise cherrypy.HTTPError(403, 'Access to %s is forbidden'%name) + if not os.path.exists(path) or not os.path.isfile(path): raise cherrypy.HTTPError(404, '%s not found'%name) if self.opts.develop: lm = fromtimestamp(os.stat(path).st_mtime) From c235e3745c7316c18441ed2186215bbb5758e27b Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 20 Dec 2010 18:42:49 -0700 Subject: [PATCH 55/62] Comments editor: Add colors --- resources/images/format-fill-color.png | Bin 0 -> 16588 bytes resources/images/format-text-color.png | Bin 0 -> 5106 bytes src/calibre/gui2/comments_editor.py | 34 ++++++++++++++++++++++++- 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 resources/images/format-fill-color.png create mode 100644 resources/images/format-text-color.png diff --git a/resources/images/format-fill-color.png b/resources/images/format-fill-color.png new file mode 100644 index 0000000000000000000000000000000000000000..946bead5dae2abe62866d7bb9ae901cfbda262f7 GIT binary patch literal 16588 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 literal 0 HcmV?d00001 diff --git a/resources/images/format-text-color.png b/resources/images/format-text-color.png new file mode 100644 index 0000000000000000000000000000000000000000..2ec27d559de328c0e62ab3f0240bfd675a0b4630 GIT binary patch literal 5106 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 Uh^k$J<p2Nx07*qoM6N<$g5fs5ga7~l literal 0 HcmV?d00001 diff --git a/src/calibre/gui2/comments_editor.py b/src/calibre/gui2/comments_editor.py index 547dd51848..c644d696de 100644 --- a/src/calibre/gui2/comments_editor.py +++ b/src/calibre/gui2/comments_editor.py @@ -11,7 +11,7 @@ from lxml.html import soupparser from PyQt4.Qt import QApplication, QFontInfo, QSize, QWidget, QPlainTextEdit, \ QToolBar, QVBoxLayout, QAction, QIcon, QWebPage, Qt, QTabWidget, \ - QSyntaxHighlighter, QColor, QChar + QSyntaxHighlighter, QColor, QChar, QColorDialog from PyQt4.QtWebKit import QWebView from calibre.ebooks.chardet import xml_to_unicode @@ -90,9 +90,37 @@ class EditorWidget(QWebView): # {{{ ac = PageAction(wac, icon, text, checkable, self) setattr(self, 'action_'+name, ac) + self.action_color = QAction(QIcon(I('format-text-color')), _('Foreground color'), + self) + self.action_color.triggered.connect(self.foreground_color) + + self.action_background = QAction(QIcon(I('format-fill-color')), + _('Background color'), self) + self.action_background.triggered.connect(self.background_color) + + def foreground_color(self): + col = QColorDialog.getColor(Qt.black, self, + _('Choose foreground color'), QColorDialog.ShowAlphaChannel) + if col.isValid(): + self.exec_command('foreColor', unicode(col.name())) + + def background_color(self): + col = QColorDialog.getColor(Qt.white, self, + _('Choose background color'), QColorDialog.ShowAlphaChannel) + if col.isValid(): + self.exec_command('hiliteColor', unicode(col.name())) + def sizeHint(self): return QSize(150, 150) + def exec_command(self, cmd, arg=None): + frame = self.page().mainFrame() + if arg is not None: + js = 'document.execCommand("%s", false, "%s");' % (cmd, arg) + else: + js = 'document.execCommand("%s", false, null);' % cmd + frame.evaluateJavaScript(js) + @dynamic_property def html(self): @@ -404,6 +432,10 @@ class Editor(QWidget): self.toolbar1.addAction(ac) self.toolbar1.addSeparator() + self.toolbar1.addAction(self.editor.action_color) + self.toolbar1.addAction(self.editor.action_background) + self.toolbar1.addSeparator() + self.code_edit.textChanged.connect(self.code_dirtied) self.editor.page().contentsChanged.connect(self.wyswyg_dirtied) From 72d6fbf2130dc005cb66f4f314080c504e06cef9 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 20 Dec 2010 19:51:20 -0700 Subject: [PATCH 56/62] Comments editor completed --- resources/images/format-text-heading.png | Bin 0 -> 965 bytes resources/images/insert-link.png | Bin 0 -> 3696 bytes src/calibre/gui2/comments_editor.py | 87 ++++++++++++++++++++++- 3 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 resources/images/format-text-heading.png create mode 100644 resources/images/insert-link.png diff --git a/resources/images/format-text-heading.png b/resources/images/format-text-heading.png new file mode 100644 index 0000000000000000000000000000000000000000..970acb7d604b8ce0ea7c852c8a5c7d31f4c27ca3 GIT binary patch literal 965 zcmV;$13LVPP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#XGugsRCwC#SIchGKoq?*b`m>*G|i&j z6}sZ_D{PREy6p!*c5Q)D350}DNy;x&ZGi=_V8b_5`~ek}K&Xh84QlhS<0LlsUV9wd zsT+ditQcu(*JozVnfscF004bwXXk?u;+E^W;CUWo*^mdMl*IFKd3pIZeY?E7yX#H6 z5hro$_{X4~Q~UbuJ1Wf706+#_yt)7Zr$GXQGP{(5O(Zf>K|G2pcnUr4AIT!J^uO!I zV=OK}X1Dtx2c!#-B6|S|{)7b*0tBW@RE{_Foj*2-1;HE)@Ns<doRsuVwScB+kk92n z$1Z|J`n?`F*r}yqDx-8==T5DM-v@(%AB2Bn0qQxNyt1|iCnvvnp?<#)^Ye4isMmSy z%IfL}R^Qx&9=?-!7s=K)HsJ8fA-sS07Hr!N#ihC=6hOwqXYF1MDwPUUt5ukpsX*;+ zEli~m4F6~0XccOWMgy8>Ets9HvdHM>(k-9`<k(!#g@r2%U>F8>O3~{#uR*KT0veLU zZXnj_SaAIF7+$@81E;5FD69;YW%=19hihNpf_TuGrUChU9tzm~{PnnwQ!5rtC=?0- z<}yyZ+u#4h!B{L7Rn1QXxVSh7qwXL=!$cz5CHgg|=Wxd^FG4Y5A_)off_X%?v~-94 z{i43b?(hQ2p?k*!Vf<aN022k!Vh`3gz;PTu3y`=}D*2Hf5kLW1E|-1Fp@kR|=_P)| z1@W@1fsH<-Z8%OBHlIJkC?7DM(>1vN@DUOfaK{#p9nKf*dlE#}P}q4jF4YC}uAvW` z%_i@P7UZ1nb^`%L475{>6O%C-tL7)?h1hrth(t;PG%@O_h$sQkLK4ON^@S>e=VD?K z0V>+9cAL&?OtDT_AyrwO1dC?G*g_=HUld$NM?d_UKotzXAACLtOYFa3ejJDk1ZY9Q zz^BwCJbv<&gQ$(Wu`L_wTQB*$!~mQa(-G7BwUcdbdwZMjX&u}4I+n$~>p17$<?z7a zJ}E})@!H5ijW~%r76TfcY~lIp@+k&EA@L&DDs{q5g3)?%>{*Zi!~0vx{cbW$#4_ct z1Y~tD{4XHA6iW%yZZfQ3Q*Me=S)jGIw|9wZ_Y}!nDpf1k7qQQdTvsyuiHQ9-{TwAi nx<!`gjxl8~(9Nd(M}PqUkbjK|=HJ=G00000NkvXXu0mjf`q{pl literal 0 HcmV?d00001 diff --git a/resources/images/insert-link.png b/resources/images/insert-link.png new file mode 100644 index 0000000000000000000000000000000000000000..b9e335d320408f26bec0e37da2fd9f7c28c3cb0e GIT binary patch literal 3696 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 O0000<MNUMnLSTYh&Ie=w literal 0 HcmV?d00001 diff --git a/src/calibre/gui2/comments_editor.py b/src/calibre/gui2/comments_editor.py index c644d696de..a21390bcd0 100644 --- a/src/calibre/gui2/comments_editor.py +++ b/src/calibre/gui2/comments_editor.py @@ -5,18 +5,19 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>' __docformat__ = 'restructuredtext en' +import re, os from lxml import html from lxml.html import soupparser from PyQt4.Qt import QApplication, QFontInfo, QSize, QWidget, QPlainTextEdit, \ - QToolBar, QVBoxLayout, QAction, QIcon, QWebPage, Qt, QTabWidget, \ - QSyntaxHighlighter, QColor, QChar, QColorDialog + QToolBar, QVBoxLayout, QAction, QIcon, QWebPage, Qt, QTabWidget, QUrl, \ + QSyntaxHighlighter, QColor, QChar, QColorDialog, QMenu, QInputDialog from PyQt4.QtWebKit import QWebView from calibre.ebooks.chardet import xml_to_unicode from calibre import xml_replace_entities - +from calibre.gui2 import open_url class PageAction(QAction): # {{{ @@ -44,6 +45,18 @@ class PageAction(QAction): # {{{ # }}} +class BlockStyleAction(QAction): # {{{ + + def __init__(self, text, name, view): + QAction.__init__(self, text, view) + self._name = name + self.triggered.connect(self.apply_style) + + def apply_style(self, *args): + self.parent().exec_command('formatBlock', self._name) + +# }}} + class EditorWidget(QWebView): # {{{ def __init__(self, parent=None): @@ -98,6 +111,38 @@ class EditorWidget(QWebView): # {{{ _('Background color'), self) self.action_background.triggered.connect(self.background_color) + self.action_block_style = QAction(QIcon(I('format-text-heading')), + _('Style text block'), self) + self.action_block_style.setToolTip( + _('Style the selected text block')) + self.block_style_menu = QMenu(self) + self.action_block_style.setMenu(self.block_style_menu) + self.block_style_actions = [] + for text, name in [ + (_('Normal'), 'p'), + (_('Heading') +' 1', 'h1'), + (_('Heading') +' 2', 'h2'), + (_('Heading') +' 3', 'h3'), + (_('Heading') +' 4', 'h4'), + (_('Heading') +' 5', 'h5'), + (_('Heading') +' 6', 'h6'), + (_('Pre-formatted'), 'pre'), + (_('Address'), 'address'), + ]: + ac = BlockStyleAction(text, name, self) + self.block_style_menu.addAction(ac) + self.block_style_actions.append(ac) + + self.action_insert_link = QAction(QIcon(I('insert-link.png')), + _('Insert link'), self) + self.action_insert_link.triggered.connect(self.insert_link) + + self.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks) + self.page().linkClicked.connect(self.link_clicked) + + def link_clicked(self, url): + open_url(url) + def foreground_color(self): col = QColorDialog.getColor(Qt.black, self, _('Choose foreground color'), QColorDialog.ShowAlphaChannel) @@ -110,6 +155,37 @@ class EditorWidget(QWebView): # {{{ if col.isValid(): self.exec_command('hiliteColor', unicode(col.name())) + def insert_link(self, *args): + link, ok = QInputDialog.getText(self, _('Create link'), + _('Enter URL')) + if not ok: + return + url = self.parse_link(unicode(link)) + if url.isValid(): + url = unicode(url.toString()) + self.exec_command('createLink', url) + + def parse_link(self, link): + link = link.strip() + has_schema = re.match(r'^[a-zA-Z]+:', link) + if has_schema is not None: + url = QUrl(link, QUrl.TolerantMode) + if url.isValid(): + return url + if os.path.exists(link): + return QUrl.fromLocalFile(link) + + if has_schema is None: + first, _, rest = link.partition('.') + prefix = 'http' + if first == 'ftp': + prefix = 'ftp' + url = QUrl(prefix +'://'+link, QUrl.TolerantMode) + if url.isValid(): + return url + + return QUrl(link, QUrl.TolerantMode) + def sizeHint(self): return QSize(150, 150) @@ -436,6 +512,11 @@ class Editor(QWidget): self.toolbar1.addAction(self.editor.action_background) self.toolbar1.addSeparator() + self.toolbar1.addAction(self.editor.action_block_style) + w = self.toolbar1.widgetForAction(self.editor.action_block_style) + w.setPopupMode(w.InstantPopup) + self.toolbar1.addAction(self.editor.action_insert_link) + self.code_edit.textChanged.connect(self.code_dirtied) self.editor.page().contentsChanged.connect(self.wyswyg_dirtied) From 5194927aca6c5b8e3cad1879386037ac7590f18d Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 20 Dec 2010 19:52:01 -0700 Subject: [PATCH 57/62] ... --- src/calibre/gui2/comments_editor.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/comments_editor.py b/src/calibre/gui2/comments_editor.py index a21390bcd0..fb09de984e 100644 --- a/src/calibre/gui2/comments_editor.py +++ b/src/calibre/gui2/comments_editor.py @@ -452,7 +452,7 @@ class Highlighter(QSyntaxHighlighter): # }}} -class Editor(QWidget): +class Editor(QWidget): # {{{ def __init__(self, parent=None): QWidget.__init__(self, parent) @@ -544,6 +544,8 @@ class Editor(QWidget): def code_dirtied(self, *args): self.source_dirty = True +# }}} + if __name__ == '__main__': app = QApplication([]) w = Editor() From 1b36225c7c96f72a43d7948f3079faa09c89ed2a Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 20 Dec 2010 20:13:22 -0700 Subject: [PATCH 58/62] ... --- src/calibre/gui2/comments_editor.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/comments_editor.py b/src/calibre/gui2/comments_editor.py index fb09de984e..5c4e3f4cb0 100644 --- a/src/calibre/gui2/comments_editor.py +++ b/src/calibre/gui2/comments_editor.py @@ -524,7 +524,10 @@ class Editor(QWidget): # {{{ def html(self): def fset(self, v): self.editor.html = v - return property(fget=lambda self:self.editor.html, fset=fset) + def fget(self): + self.tabs.setCurrentIndex(0) + return self.editor.html + return property(fget=fget, fset=fset) def change_tab(self, index): #print 'reloading:', (index and self.wyswyg_dirty) or (not index and From 3bd7e3457a95dd5693ffcd10c882ad9fc17ac69d Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 20 Dec 2010 20:28:59 -0700 Subject: [PATCH 59/62] ... --- src/calibre/gui2/comments_editor.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/comments_editor.py b/src/calibre/gui2/comments_editor.py index 5c4e3f4cb0..e7647a8da3 100644 --- a/src/calibre/gui2/comments_editor.py +++ b/src/calibre/gui2/comments_editor.py @@ -202,6 +202,9 @@ class EditorWidget(QWebView): # {{{ def fget(self): ans = u'' + check = unicode(self.page().mainFrame().toPlainText()).strip() + if not check: + return ans try: raw = unicode(self.page().mainFrame().toHtml()) raw = xml_to_unicode(raw, strip_encoding_pats=True, @@ -534,11 +537,11 @@ class Editor(QWidget): # {{{ # self.source_dirty) if index == 1: # changing to code view if self.wyswyg_dirty: - self.code_edit.setPlainText(self.html) + self.code_edit.setPlainText(self.editor.html) self.wyswyg_dirty = False elif index == 0: #changing to wyswyg if self.source_dirty: - self.html = unicode(self.code_edit.toPlainText()) + self.editor.html = unicode(self.code_edit.toPlainText()) self.source_dirty = False def wyswyg_dirtied(self, *args): From 0968eef89469f15c19ab50f22b8659552cb78714 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 20 Dec 2010 20:34:30 -0700 Subject: [PATCH 60/62] Redesign edit metadata single dialog, using the new WYSWYG comments editor widget --- src/calibre/gui2/dialogs/metadata_single.py | 23 +- src/calibre/gui2/dialogs/metadata_single.ui | 278 ++++++++++---------- 2 files changed, 155 insertions(+), 146 deletions(-) diff --git a/src/calibre/gui2/dialogs/metadata_single.py b/src/calibre/gui2/dialogs/metadata_single.py index 7c5a9f95d4..9cb9f7bbbc 100644 --- a/src/calibre/gui2/dialogs/metadata_single.py +++ b/src/calibre/gui2/dialogs/metadata_single.py @@ -34,6 +34,7 @@ from calibre.customize.ui import run_plugins_on_import, get_isbndb_key from calibre.gui2.preferences.social import SocialMetadata from calibre.gui2.custom_column_widgets import populate_metadata_page from calibre import strftime +from calibre.library.comments import comments_to_html class CoverFetcher(Thread): # {{{ @@ -195,7 +196,6 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): _file + _(" is not a valid picture")) d.exec_() else: - self.cover_path.setText(_file) self.cover.setPixmap(pix) self.update_cover_tooltip() self.cover_changed = True @@ -409,7 +409,8 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): if mi.series_index is not None: self.series_index.setValue(float(mi.series_index)) if mi.comments and mi.comments.strip(): - self.comments.setPlainText(mi.comments) + comments = comments_to_html(mi.comments) + self.comments.html = comments def sync_formats(self): @@ -556,7 +557,9 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): if rating > 0: self.rating.setValue(int(rating/2.)) comments = self.db.comments(row) - self.comments.setPlainText(comments if comments else '') + if comments and comments.strip(): + comments = comments_to_html(comments) + self.comments.html = comments cover = self.db.cover(row) pubdate = db.pubdate(self.id, index_is_id=True) self.pubdate.setDate(QDate(pubdate.year, pubdate.month, @@ -806,10 +809,10 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): self.pubdate.setDate(QDate(dt.year, dt.month, dt.day)) summ = book.comments if summ: - prefix = unicode(self.comments.toPlainText()) + prefix = self.comment.html if prefix: prefix += '\n' - self.comments.setPlainText(prefix + summ) + self.comments.html = prefix + comments_to_html(summ) if book.rating is not None: self.rating.setValue(int(book.rating)) if book.tags: @@ -899,7 +902,7 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): self.db.set_series_index(self.id, self.series_index.value(), notify=False, commit=False) self.db.set_comment(self.id, - unicode(self.comments.toPlainText()).strip(), + self.comments.html, notify=False, commit=False) d = self.pubdate.date() d = qt_to_dt(d) @@ -936,16 +939,16 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): QDialog.reject(self, *args) def read_state(self): - wg = dynamic.get('metasingle_window_geometry', None) - ss = dynamic.get('metasingle_splitter_state', None) + wg = dynamic.get('metasingle_window_geometry2', None) + ss = dynamic.get('metasingle_splitter_state2', None) if wg is not None: self.restoreGeometry(wg) if ss is not None: self.splitter.restoreState(ss) def save_state(self): - dynamic.set('metasingle_window_geometry', bytes(self.saveGeometry())) - dynamic.set('metasingle_splitter_state', + dynamic.set('metasingle_window_geometry2', bytes(self.saveGeometry())) + dynamic.set('metasingle_splitter_state2', bytes(self.splitter.saveState())) def break_cycles(self): diff --git a/src/calibre/gui2/dialogs/metadata_single.ui b/src/calibre/gui2/dialogs/metadata_single.ui index 0355dc0fe6..dfa8c45797 100644 --- a/src/calibre/gui2/dialogs/metadata_single.ui +++ b/src/calibre/gui2/dialogs/metadata_single.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>887</width> - <height>750</height> + <width>994</width> + <height>726</height> </rect> </property> <property name="sizePolicy"> @@ -43,8 +43,8 @@ <rect> <x>0</x> <y>0</y> - <width>879</width> - <height>711</height> + <width>986</width> + <height>687</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout_5"> @@ -66,8 +66,8 @@ <attribute name="title"> <string>&Basic metadata</string> </attribute> - <layout class="QVBoxLayout" name="verticalLayout_3"> - <item> + <layout class="QGridLayout" name="gridLayout_5"> + <item row="0" column="0"> <widget class="QSplitter" name="splitter"> <property name="orientation"> <enum>Qt::Horizontal</enum> @@ -495,29 +495,132 @@ Using this button to create author sort will change author sort from red to gree </property> </widget> </item> + </layout> + </widget> + <widget class="QWidget" name="layoutWidget_2"> + <layout class="QVBoxLayout" name="verticalLayout_2"> <item> - <widget class="QGroupBox" name="groupBox_2"> - <property name="title"> - <string>&Comments</string> + <widget class="QGroupBox" name="bc_box"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>10</verstretch> + </sizepolicy> </property> - <layout class="QGridLayout" name="gridLayout_4"> - <item row="0" column="0"> - <widget class="QTextEdit" name="comments"> - <property name="tabChangesFocus"> - <bool>true</bool> - </property> - <property name="acceptRichText"> - <bool>false</bool> + <property name="title"> + <string>Book Cover</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_4"> + <item> + <widget class="ImageView" name="cover" native="true"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>100</verstretch> + </sizepolicy> </property> </widget> </item> + <item> + <layout class="QVBoxLayout" name="_4"> + <property name="spacing"> + <number>6</number> + </property> + <property name="sizeConstraint"> + <enum>QLayout::SetMaximumSize</enum> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <widget class="QLabel" name="label_5"> + <property name="text"> + <string>Change &cover image:</string> + </property> + <property name="buddy"> + <cstring>cover_button</cstring> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="_5"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <widget class="QPushButton" name="cover_button"> + <property name="text"> + <string>&Browse</string> + </property> + <property name="icon"> + <iconset resource="../../../../resources/images.qrc"> + <normaloff>:/images/document_open.png</normaloff>:/images/document_open.png</iconset> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="trim_cover_button"> + <property name="toolTip"> + <string>Remove border (if any) from cover</string> + </property> + <property name="text"> + <string>T&rim</string> + </property> + <property name="icon"> + <iconset resource="../../../../resources/images.qrc"> + <normaloff>:/images/trim.png</normaloff>:/images/trim.png</iconset> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="reset_cover"> + <property name="toolTip"> + <string>Reset cover to default</string> + </property> + <property name="text"> + <string>&Remove</string> + </property> + <property name="icon"> + <iconset resource="../../../../resources/images.qrc"> + <normaloff>:/images/trash.png</normaloff>:/images/trash.png</iconset> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="_6"> + <item> + <widget class="QPushButton" name="fetch_cover_button"> + <property name="text"> + <string>Download co&ver</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="generate_cover_button"> + <property name="toolTip"> + <string>Generate a default cover based on the title and author</string> + </property> + <property name="text"> + <string>&Generate cover</string> + </property> + </widget> + </item> + </layout> + </item> </layout> </widget> </item> </layout> </widget> - <widget class="QWidget" name="layoutWidget_2"> - <layout class="QVBoxLayout" name="verticalLayout_2"> + <widget class="QWidget" name="layoutWidget"> + <layout class="QVBoxLayout" name="verticalLayout_3"> <item> <widget class="QGroupBox" name="af_group_box"> <property name="sizePolicy"> @@ -546,6 +649,12 @@ Using this button to create author sort will change author sort from red to gree <height>140</height> </size> </property> + <property name="baseSize"> + <size> + <width>100</width> + <height>0</height> + </size> + </property> <property name="dragDropMode"> <enum>QAbstractItemView::DropOnly</enum> </property> @@ -644,129 +753,22 @@ Using this button to create author sort will change author sort from red to gree </widget> </item> <item> - <widget class="QGroupBox" name="bc_box"> + <widget class="QGroupBox" name="groupBox"> <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Expanding"> + <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>10</verstretch> </sizepolicy> </property> <property name="title"> - <string>Book Cover</string> + <string>&Comments</string> </property> - <layout class="QVBoxLayout" name="verticalLayout_4"> + <layout class="QVBoxLayout" name="verticalLayout_8"> + <property name="margin"> + <number>0</number> + </property> <item> - <widget class="ImageView" name="cover" native="true"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> - <horstretch>0</horstretch> - <verstretch>100</verstretch> - </sizepolicy> - </property> - </widget> - </item> - <item> - <layout class="QVBoxLayout" name="_4"> - <property name="spacing"> - <number>6</number> - </property> - <property name="sizeConstraint"> - <enum>QLayout::SetMaximumSize</enum> - </property> - <property name="margin"> - <number>0</number> - </property> - <item> - <widget class="QLabel" name="label_5"> - <property name="text"> - <string>Change &cover image:</string> - </property> - <property name="buddy"> - <cstring>cover_path</cstring> - </property> - </widget> - </item> - <item> - <layout class="QHBoxLayout" name="_5"> - <property name="spacing"> - <number>6</number> - </property> - <property name="margin"> - <number>0</number> - </property> - <item> - <widget class="QLineEdit" name="cover_path"> - <property name="readOnly"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="cover_button"> - <property name="text"> - <string>&Browse</string> - </property> - <property name="icon"> - <iconset resource="../../../../resources/images.qrc"> - <normaloff>:/images/document_open.png</normaloff>:/images/document_open.png</iconset> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="trim_cover_button"> - <property name="toolTip"> - <string>Remove border (if any) from cover</string> - </property> - <property name="text"> - <string>T&rim</string> - </property> - <property name="icon"> - <iconset resource="../../../../resources/images.qrc"> - <normaloff>:/images/trim.png</normaloff>:/images/trim.png</iconset> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="reset_cover"> - <property name="toolTip"> - <string>Reset cover to default</string> - </property> - <property name="text"> - <string>...</string> - </property> - <property name="icon"> - <iconset resource="../../../../resources/images.qrc"> - <normaloff>:/images/trash.png</normaloff>:/images/trash.png</iconset> - </property> - </widget> - </item> - </layout> - </item> - </layout> - </item> - <item> - <layout class="QHBoxLayout" name="_6"> - <item> - <widget class="QPushButton" name="fetch_cover_button"> - <property name="text"> - <string>Download co&ver</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="generate_cover_button"> - <property name="toolTip"> - <string>Generate a default cover based on the title and author</string> - </property> - <property name="text"> - <string>&Generate cover</string> - </property> - </widget> - </item> - </layout> + <widget class="Editor" name="comments" native="true"/> </item> </layout> </widget> @@ -828,6 +830,12 @@ Using this button to create author sort will change author sort from red to gree <header>calibre/gui2/widgets.h</header> <container>1</container> </customwidget> + <customwidget> + <class>Editor</class> + <extends>QWidget</extends> + <header location="global">calibre/gui2/comments_editor.h</header> + <container>1</container> + </customwidget> </customwidgets> <tabstops> <tabstop>title</tabstop> @@ -848,13 +856,11 @@ Using this button to create author sort will change author sort from red to gree <tabstop>date</tabstop> <tabstop>pubdate</tabstop> <tabstop>fetch_metadata_button</tabstop> - <tabstop>comments</tabstop> <tabstop>button_set_cover</tabstop> <tabstop>button_set_metadata</tabstop> <tabstop>formats</tabstop> <tabstop>add_format_button</tabstop> <tabstop>remove_format_button</tabstop> - <tabstop>cover_path</tabstop> <tabstop>cover_button</tabstop> <tabstop>trim_cover_button</tabstop> <tabstop>reset_cover</tabstop> From f5eaa0034d384325b2ee39978ff78e33f2b5d41d Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 20 Dec 2010 21:24:34 -0700 Subject: [PATCH 61/62] ... --- src/calibre/gui2/comments_editor.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/calibre/gui2/comments_editor.py b/src/calibre/gui2/comments_editor.py index e7647a8da3..d19c97e87b 100644 --- a/src/calibre/gui2/comments_editor.py +++ b/src/calibre/gui2/comments_editor.py @@ -127,6 +127,7 @@ class EditorWidget(QWebView): # {{{ (_('Heading') +' 5', 'h5'), (_('Heading') +' 6', 'h6'), (_('Pre-formatted'), 'pre'), + (_('Blockquote'), 'blockquote'), (_('Address'), 'address'), ]: ac = BlockStyleAction(text, name, self) From 4489730bd16942baa7fe59c5ccc35f68b5a9dd08 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 20 Dec 2010 21:54:37 -0700 Subject: [PATCH 62/62] CND and wenxuecity - znjy by Derek Liang --- resources/recipes/cnd.recipe | 67 ++++++++++++++++++++++++ resources/recipes/wenxuecity-znjy.recipe | 62 ++++++++++++++++++++++ 2 files changed, 129 insertions(+) create mode 100644 resources/recipes/cnd.recipe create mode 100644 resources/recipes/wenxuecity-znjy.recipe diff --git a/resources/recipes/cnd.recipe b/resources/recipes/cnd.recipe new file mode 100644 index 0000000000..0e8206d07a --- /dev/null +++ b/resources/recipes/cnd.recipe @@ -0,0 +1,67 @@ +#!/usr/bin/env python + +__license__ = 'GPL v3' +__copyright__ = '2010, Derek Liang <Derek.liang.ca @@@at@@@ gmail.com>' +''' +cnd.org +''' +import re + +from calibre.web.feeds.news import BasicNewsRecipe + +class TheCND(BasicNewsRecipe): + + title = 'CND' + __author__ = 'Derek Liang' + description = '' + INDEX = 'http://cnd.org' + language = 'zh' + conversion_options = {'linearize_tables':True} + + remove_tags_before = dict(name='div', id='articleHead') + remove_tags_after = dict(id='copyright') + remove_tags = [dict(name='table', attrs={'align':'right'}), dict(name='img', attrs={'src':'http://my.cnd.org/images/logo.gif'}), dict(name='hr', attrs={}), dict(name='small', attrs={})] + no_stylesheets = True + + preprocess_regexps = [(re.compile(r'<!--.*?-->', re.DOTALL), lambda m: '')] + + def print_version(self, url): + if url.find('news/article.php') >= 0: + return re.sub("^[^=]*", "http://my.cnd.org/modules/news/print.php?storyid", url) + else: + return re.sub("^[^=]*", "http://my.cnd.org/modules/wfsection/print.php?articleid", url) + + def parse_index(self): + soup = self.index_to_soup(self.INDEX) + + feeds = [] + articles = {} + + for a in soup.findAll('a', attrs={'target':'_cnd'}): + url = a['href'] + if url.find('article.php') < 0 : + continue + if url.startswith('/'): + url = 'http://cnd.org'+url + title = self.tag_to_string(a) + self.log('\tFound article: ', title, 'at', url) + date = a.nextSibling + if (date is not None) and len(date)>2: + if not articles.has_key(date): + articles[date] = [] + articles[date].append({'title':title, 'url':url, 'description': '', 'date':''}) + self.log('\t\tAppend to : ', date) + + self.log('log articles', articles) + mostCurrent = sorted(articles).pop() + self.title = 'CND ' + mostCurrent + + feeds.append((self.title, articles[mostCurrent])) + + return feeds + + def populate_article_metadata(self, article, soup, first): + header = soup.find('h3') + self.log('header: ' + self.tag_to_string(header)) + pass + diff --git a/resources/recipes/wenxuecity-znjy.recipe b/resources/recipes/wenxuecity-znjy.recipe new file mode 100644 index 0000000000..ecce80222e --- /dev/null +++ b/resources/recipes/wenxuecity-znjy.recipe @@ -0,0 +1,62 @@ +#!/usr/bin/env python + +__license__ = 'GPL v3' +__copyright__ = '2010, Derek Liang <Derek.liang.ca @@@at@@@ gmail.com>' +''' +wenxuecity.com +''' +import re + +from calibre.web.feeds.news import BasicNewsRecipe + +class TheCND(BasicNewsRecipe): + + title = 'wenxuecity - znjy' + __author__ = 'Derek Liang' + description = '' + INDEX = 'http://bbs.wenxuecity.com/znjy/?elite=1' + language = 'zh' + conversion_options = {'linearize_tables':True} + + remove_tags_before = dict(name='div', id='message') + remove_tags_after = dict(name='div', id='message') + remove_tags = [dict(name='div', id='postmeta'), dict(name='div', id='footer')] + no_stylesheets = True + + preprocess_regexps = [(re.compile(r'<!--.*?-->', re.DOTALL), lambda m: '')] + + def print_version(self, url): + return url + '?print' + + def parse_index(self): + soup = self.index_to_soup(self.INDEX) + + feeds = [] + articles = {} + + for a in soup.findAll('a', attrs={'class':'post'}): + url = a['href'] + if url.startswith('/'): + url = 'http://bbs.wenxuecity.com'+url + title = self.tag_to_string(a) + self.log('\tFound article: ', title, ' at:', url) + dateReg = re.search( '(\d\d?)/(\d\d?)/(\d\d)', self.tag_to_string(a.parent) ) + date = '%(y)s/%(m)02d/%(d)02d' % {'y' : dateReg.group(3), 'm' : int(dateReg.group(1)), 'd' : int(dateReg.group(2)) } + if not articles.has_key(date): + articles[date] = [] + articles[date].append({'title':title, 'url':url, 'description': '', 'date':''}) + self.log('\t\tAppend to : ', date) + + self.log('log articles', articles) + mostCurrent = sorted(articles).pop() + self.title = '文学城 - 子女教育 - ' + mostCurrent + + feeds.append((self.title, articles[mostCurrent])) + + return feeds + + def populate_article_metadata(self, article, soup, first): + header = soup.find('h3') + self.log('header: ' + self.tag_to_string(header)) + pass +