Merge from trunk

This commit is contained in:
Charles Haley 2011-02-12 08:21:17 +00:00
commit e66c42d05f
74 changed files with 81489 additions and 64505 deletions

View File

@ -19,6 +19,106 @@
# new recipes:
# - title:
- version: 0.7.45
date: 2011-02-11
new features:
- title: "Add plugin to download series information from the Kent District Library"
- title: "Kindle driver: When uploading MOBI files to the device, upload page number information as well (used by the not yet released Kindle 3.1 firmware)"
- title: "When automatically sending news to device, send to main memory preferentially, if it has enough space."
tickets: [8877]
- title: "Allow customization of which metadata fields are searched by default (click the preferences icon next to the search box)"
- title: "New format TXTZ: which is a zip file containing the TXT file and associated images + metadata. calibre can convert to and from this format and read/write metadata to it."
- title: "New option to control how automerge handles duplicate formats when adding books to your calibre library. See Preferences->Adding books"
- title: "Driver for Nokia X6, Nexus S, WiBook, MyTouch 4G and Huawei Ideos S7"
- title: "Nicer interface for editing tweaks"
- title: "Add tweak to remove yellow lines from edges of book list"
- title: "Completion: Restore adding of comma at end after completion for tags type fields. Add a tweak to control if an & is added after completion for author type fields"
- title: "Turn search as you type off by default for searching the book list. You can turn it on by clicking the preferences button next to the search bar."
- title: "TXT Input: Add option to remove indents and fix bug where spaces were not retained properly."
bug fixes:
- title: "Fix a regression in 0.7.44 that could cause setting authors to fail in windows when the author name is very long"
tickets: [8797]
- title: "E-book viewer: Fix bug that could cause the bottom of chapters to get cut-off if the topmost element had a large top margin."
tickets: [8791]
- title: "Fix regression that caused a spurious error message after moving a library. Also ensure that the entries in the Copy to Library menu are updated after a library is moved/renamed/deleted."
tickets: [8905]
- title: "PML Input: New handling of t and T tags. T's that do not start the line are ignored. t's that start and end the line use a margin for the text block"
- title: "News download: Remove all invalid ASCII control characters from article descriptions as they cause XML parsing to fail"
- title: "MOBI Output: Fix bug that was discarding non breaking spaces at the start of a paragraph when they were followed immediately by a tag."
tickets: [4887]
- title: "LIT Input: Fix a regression in handling LIT files that contain txt rather than html data"
tickets: [8904]
- title: "Fix bug in search box in the plugins dialog"
tickets: [8882]
- title: "Fix renaming of categories via the Tag Browser"
tickets: [8807]
- title: "Content server: Do not send mobile version to iPad"
tickets: [8820]
- title: "Fix undefined publication date appearing in book jacket as 101"
tickets: [8799]
- title: "Heuristics: Fix issue with invalid markup from italicize patterns."
- title: "TXT Input: De-hyphenate textile and markdown inpu as well. Fix inline toc not showing all items."
- title: "RTF Input: More encoding token splitting fixes."
- title: "Fix regression that broke the convenience Email to xxx entry in the connect share menu."
tickets: [8775]
- title: "Fix editing of series type custom columns in the book list."
tickets: [8765]
improved recipes:
- El periodico de Aragon
- B92
- French Belgian news sources
new recipes:
- title: "ABC.es"
author: "Ricardo Jurado"
- title: "Korespondent and Kopalnia Wiedzy"
author: "Attis"
- title: "Radio Prague"
author: "Francois Pellicaan"
- title: "Europa Press"
author: "Luis Hernandez"
- title: "Interoperability Happens and njuz.net"
author: "Darko Miletic"
- title: "Weblogs SL"
author: "desUBIKado"
- title: "Kompas and Jakarta Post"
author: "Adrian Gunawan"
- version: 0.7.44
date: 2011-02-04

View File

@ -0,0 +1,68 @@
__license__ = 'GPL v3'
__author__ = 'Ricardo Jurado'
__copyright__ = 'Ricardo Jurado'
__version__ = 'v0.4'
__date__ = '11 February 2011'
'''
http://www.abc.es/
'''
from calibre.web.feeds.news import BasicNewsRecipe
class AdvancedUserRecipe1296604369(BasicNewsRecipe):
title = u'ABC.es'
masthead_url = 'http://www.abc.es/img/logo-abc.gif'
cover_url = 'http://www.abc.es/img/logo-abc.gif'
publisher = u'Grupo VOCENTO'
__author__ = 'Ricardo Jurado'
description = 'Noticias de Spain y el mundo'
category = 'News,Spain,National,International,Economy'
oldest_article = 2
max_articles_per_feed = 10
no_stylesheets = True
use_embedded_content = False
encoding = 'ISO-8859-1'
remove_javascript = True
language = 'es'
extra_css = """
p{text-align: justify; font-size: 100%}
body{ text-align: left; font-size:100% }
h3{font-family: sans-serif; font-size:120%; font-weight:bold; text-align: justify; }
h2{font-family: sans-serif; font-size:100%; font-weight:bold; text-align: justify; }
h1{font-family: sans-serif; font-size:150%; font-weight:bold; text-align: justify; }
"""
keep_only_tags = [
# dict(name='h2', attrs={'class':['logos']}),
dict(name='h3', attrs={'class':['overhead']}),
dict(name='h1', attrs={'class':'headline'}),
dict(name='h3', attrs={'class':['subhead']}),
dict(name='div', attrs={'class':'datosi'}),
dict(name='div', attrs={'class':'photo-alt1'}),
dict(name='div', attrs={'class':'text'})
]
# remove_tags_before = dict(name='div' , attrs={'id':['cabecera2']})
feeds = [
(u'PORTADA', u'http://www.abc.es/rss/feeds/abcPortada.xml')
,(u'ULTIMAS', u'http://www.abc.es/rss/feeds/abc_ultima.xml')
,(u'NACIONAL', u'http://www.abc.es/rss/feeds/abc_EspanaEspana.xml')
,(u'INTERNACIONAL', u'http://www.abc.es/rss/feeds/abc_Internacional.xml')
,(u'OPINION', u'http://www.abc.es/rss/feeds/abc_opinioncompleto.xml')
,(u'BLOGS ABC', u'http://www.abc.es/rss/feeds/blogs-abc.xml')
,(u'ECONOMIA', u'http://www.abc.es/rss/feeds/abc_Economia.xml')
,(u'CIENCIA Y TECNOLOGIA', u'http://www.abc.es/rss/feeds/abc_Ciencia_Tecnologia.xml')
,(u'CULTURA', u'http://www.abc.es/rss/feeds/abc_Cultura.xml')
,(u'LIBROS', u'http://www.abc.es/rss/feeds/abc_Libros.xml')
,(u'MEDIOS Y REDES', u'http://www.abc.es/rss/feeds/ABC_Medios_Redes.xml')
,(u'EVASION', u'http://www.abc.es/rss/feeds/abc_evasion.xml')
,(u'ESPECTACULOS', u'http://www.abc.es/rss/feeds/abc_Espectaculos.xml')
,(u'GENTE', u'http://www.abc.es/rss/feeds/abc_Gente.xml')
,(u'DEPORTES', u'http://www.abc.es/rss/feeds/abc_Deportes.xml')
]

View File

@ -182,6 +182,10 @@ class NYTimes(BasicNewsRecipe):
'mediaOverlay slideshow',
'headlinesOnly multiline flush',
'wideThumb',
'video', #added 02-11-2011
'videoHeader',#added 02-11-2011
'articleInlineVideoHolder', #added 02-11-2011
'assetCompanionAd',
re.compile('^subNavigation'),
re.compile('^leaderboard'),
re.compile('^module'),
@ -664,7 +668,7 @@ class NYTimes(BasicNewsRecipe):
try:
#remove "Related content" bar
runAroundsFound = soup.findAll('div',{'class':['articleInline runaroundLeft','articleInline doubleRule runaroundLeft','articleInline runaroundLeft firstArticleInline']})
runAroundsFound = soup.findAll('div',{'class':['articleInline runaroundLeft','articleInline doubleRule runaroundLeft','articleInline runaroundLeft firstArticleInline','articleInline runaroundLeft ']})
if runAroundsFound:
for runAround in runAroundsFound:
#find all section headers
@ -672,6 +676,12 @@ class NYTimes(BasicNewsRecipe):
if hlines:
for hline in hlines:
hline.extract()
#find all section headers
hlines = runAround.findAll('h6')
if hlines:
for hline in hlines:
hline.extract()
except:
self.log("Error removing related content bar")

View File

@ -2,7 +2,7 @@ __license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
__docformat__ = 'restructuredtext en'
__appname__ = 'calibre'
__version__ = '0.7.44'
__version__ = '0.7.45'
__author__ = "Kovid Goyal <kovid@kovidgoyal.net>"
import re

View File

@ -507,7 +507,7 @@ from calibre.devices.kobo.driver import KOBO
from calibre.devices.bambook.driver import BAMBOOK
from calibre.ebooks.metadata.fetch import GoogleBooks, ISBNDB, Amazon, \
LibraryThing
KentDistrictLibrary
from calibre.ebooks.metadata.douban import DoubanBooks
from calibre.ebooks.metadata.nicebooks import NiceBooks, NiceBooksCovers
from calibre.ebooks.metadata.covers import OpenLibraryCovers, \
@ -517,7 +517,7 @@ from calibre.ebooks.epub.fix.unmanifested import Unmanifested
from calibre.ebooks.epub.fix.epubcheck import Epubcheck
plugins = [HTML2ZIP, PML2PMLZ, ArchiveExtract, GoogleBooks, ISBNDB, Amazon,
LibraryThing, DoubanBooks, NiceBooks, CSV_XML, EPUB_MOBI, BIBTEX, Unmanifested,
KentDistrictLibrary, DoubanBooks, NiceBooks, CSV_XML, EPUB_MOBI, BIBTEX, Unmanifested,
Epubcheck, OpenLibraryCovers, LibraryThingCovers, DoubanCovers,
NiceBooksCovers]
plugins += [

View File

@ -76,11 +76,11 @@ class E52(USBMS):
supported_platforms = ['windows', 'linux', 'osx']
VENDOR_ID = [0x421]
PRODUCT_ID = [0x1CD]
PRODUCT_ID = [0x1CD, 0x273]
BCD = [0x100]
FORMATS = ['mobi', 'prc']
FORMATS = ['epub', 'fb2', 'mobi', 'prc', 'txt']
EBOOK_DIR_MAIN = 'eBooks'
SUPPORTS_SUB_DIRS = True

View File

@ -247,30 +247,24 @@ class Amazon(MetadataSource): # {{{
# }}}
class LibraryThing(MetadataSource): # {{{
class KentDistrictLibrary(MetadataSource): # {{{
name = 'LibraryThing'
name = 'Kent District Library'
metadata_type = 'social'
description = _('Downloads series/covers/rating information from librarything.com')
description = _('Downloads series information from ww2.kdl.org')
def fetch(self):
if not self.isbn or not self.site_customization:
if not self.title or not self.book_author:
return
from calibre.ebooks.metadata.library_thing import get_social_metadata
un, _, pw = self.site_customization.partition(':')
from calibre.ebooks.metadata.kdl import get_series
try:
self.results = get_social_metadata(self.title, self.book_author,
self.publisher, self.isbn, username=un, password=pw)
self.results = get_series(self.title, self.book_author)
except Exception, e:
import traceback
traceback.print_exc()
self.exception = e
self.tb = traceback.format_exc()
@property
def string_customization_help(self):
ans = _('To use librarything.com you must sign up for a %sfree account%s '
'and enter your username and password separated by a : below.')
return '<p>'+ans%('<a href="http://www.librarything.com">', '</a>')
# }}}

View File

@ -0,0 +1,79 @@
#!/usr/bin/env python
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
__license__ = 'GPL v3'
__copyright__ = '2011, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en'
import re, urllib, urlparse
from calibre.ebooks.metadata.book.base import Metadata
from calibre import browser
from calibre.ebooks.BeautifulSoup import BeautifulSoup
from calibre.ebooks.chardet import xml_to_unicode
URL = \
"http://ww2.kdl.org/libcat/WhatsNext.asp?AuthorLastName={0}&AuthorFirstName=&SeriesName=&BookTitle={1}&CategoryID=0&cmdSearch=Search&Search=1&grouping="
_ignore_starts = u'\'"'+u''.join(unichr(x) for x in range(0x2018, 0x201e)+[0x2032, 0x2033])
def get_series(title, authors):
mi = Metadata(title, authors)
if title and title[0] in _ignore_starts:
title = title[1:]
title = re.sub(r'^(A|The|An)\s+', '', title).strip()
if not title:
return mi
if isinstance(title, unicode):
title = title.encode('utf-8')
title = urllib.quote_plus(title)
author = authors[0].strip()
if not author:
return mi
if ',' in author:
author = author.split(',')[0]
else:
author = author.split()[-1]
url = URL.format(author, title)
br = browser()
raw = br.open(url).read()
if 'see the full results' not in raw:
return mi
raw = xml_to_unicode(raw)[0]
soup = BeautifulSoup(raw)
searcharea = soup.find('div', attrs={'class':'searcharea'})
if searcharea is None:
return mi
ss = searcharea.find('div', attrs={'class':'seriessearch'})
if ss is None:
return mi
a = ss.find('a', href=True)
if a is None:
return mi
href = a['href'].partition('?')[-1]
data = urlparse.parse_qs(href)
series = data.get('SeriesName', [])
if not series:
return mi
series = series[0]
series = re.sub(r' series$', '', series).strip()
if series:
mi.series = series
ns = ss.nextSibling
if ns.contents:
raw = unicode(ns.contents[0])
raw = raw.partition('.')[0].strip()
try:
mi.series_index = int(raw)
except:
pass
return mi
if __name__ == '__main__':
import sys
print get_series(sys.argv[-2], [sys.argv[-1]])

View File

@ -60,10 +60,8 @@ class Tweak(object): # {{{
return ans
def __cmp__(self, other):
if self.is_customized != getattr(other, 'is_customized', False):
return -1 * cmp(self.is_customized,
return -1 * cmp(self.is_customized,
getattr(other, 'is_customized', False))
return cmp(icu_lower(self.name), icu_lower(getattr(other, 'name', '')))
@property
def is_customized(self):

View File

@ -7,7 +7,6 @@ __copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en'
import os, traceback, cStringIO, re, shutil
from functools import partial
from calibre.constants import DEBUG
from calibre.utils.config import Config, StringConfig, tweaks

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -4,9 +4,9 @@
#
msgid ""
msgstr ""
"Project-Id-Version: calibre 0.7.44\n"
"POT-Creation-Date: 2011-02-10 13:08+MST\n"
"PO-Revision-Date: 2011-02-10 13:08+MST\n"
"Project-Id-Version: calibre 0.7.45\n"
"POT-Creation-Date: 2011-02-11 11:38+MST\n"
"PO-Revision-Date: 2011-02-11 11:38+MST\n"
"Last-Translator: Automatically generated\n"
"Language-Team: LANGUAGE\n"
"MIME-Version: 1.0\n"
@ -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:54
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:365
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:359
#: /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
@ -2351,7 +2351,6 @@ msgid "LibraryThing.com server error. Try again later."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:177
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:270
msgid "To use librarything.com you must sign up for a %sfree account%s and enter your username and password separated by a : below."
msgstr ""
@ -2408,7 +2407,7 @@ msgid "Downloads social metadata from amazon.com"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:254
msgid "Downloads series/covers/rating information from librarything.com"
msgid "Downloads series information from ww2.kdl.org"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:25
@ -3567,8 +3566,8 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:905
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/restore_library.py:101
#: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:186
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:268
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:308
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:273
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:313
msgid "Failed"
msgstr ""
@ -10568,28 +10567,28 @@ msgstr ""
msgid "Remove selected actions from toolbar"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:112
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:113
msgid "This tweak has it default value"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:114
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:115
msgid "This tweak has been customized"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:231
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:236
msgid "Add/edit tweaks for any custom plugins you have installed. Documentation for these tweaks should be available on the website from where you downloaded the plugins."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:269
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:309
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:274
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:314
msgid "There was a syntax error in your tweak. Click the show details button for details."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:322
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:327
msgid "Invalid tweaks"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:323
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:328
msgid "The tweaks you entered are invalid, try resetting the tweaks to default and changing them one by one until you find the invalid setting."
msgstr ""
@ -11773,7 +11772,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/caches.py:548
#: /home/kovid/work/calibre/src/calibre/library/caches.py:558
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:185
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192
msgid "no"
msgstr ""
@ -11784,7 +11783,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/caches.py:551
#: /home/kovid/work/calibre/src/calibre/library/caches.py:561
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:185
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:192
msgid "yes"
msgstr ""
@ -12576,101 +12575,101 @@ msgstr ""
msgid "creating custom column "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:33
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:32
msgid "The title"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:34
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:33
msgid "The authors"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:35
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:34
msgid "The author sort string. To use only the first letter of the name use {author_sort[0]}"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:37
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:36
msgid "The tags"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:38
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:37
msgid "The series"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:39
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:38
msgid "The series number. To get leading zeros use {series_index:0>3s} or {series_index:>3s} for leading spaces"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:42
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:41
msgid "The rating"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:43
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:42
msgid "The ISBN"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:44
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:43
msgid "The publisher"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:45
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:44
msgid "The date"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:46
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:45
msgid "The published date"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:47
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:46
msgid "The calibre internal id"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:57
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:56
msgid "Options to control saving to disk"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:63
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:62
msgid "Normally, calibre will update the metadata in the saved files from what is in the calibre library. Makes saving to disk slower."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:66
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:65
msgid "Normally, calibre will write the metadata into a separate OPF file along with the actual e-book files."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:69
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:68
msgid "Normally, calibre will save the cover in a separate file along with the actual e-book file(s)."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:72
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:71
msgid "Comma separated list of formats to save for each book. By default all available formats are saved."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:75
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:74
msgid "The template to control the filename and directory structure of the saved files. Default is \"%s\" which will save books into a per-author subdirectory with filenames containing title and author. Available controls are: {%s}"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:80
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:79
msgid "The template to control the filename and directory structure of files sent to the device. Default is \"%s\" which will save books into a per-author directory with filenames containing title and author. Available controls are: {%s}"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:87
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:86
msgid "Normally, calibre will convert all non English characters into English equivalents for the file names. WARNING: If you turn this off, you may experience errors when saving, depending on how well the filesystem you are saving to supports unicode."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:93
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:96
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:92
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:95
msgid "The format in which to display dates. %d - day, %b - month, %Y - year. Default is: %b, %Y"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:99
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:98
msgid "Convert paths to lowercase."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:101
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:100
msgid "Replace whitespace with underscores."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:354
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:378
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:361
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:385
msgid "Requested formats not available"
msgstr ""
@ -13366,16 +13365,16 @@ msgstr ""
msgid "Control email delivery"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:118
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:119
msgid "Unknown section"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:140
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:141
msgid "Unknown feed"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:158
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:185
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:159
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:186
msgid "Untitled article"
msgstr ""

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -12,6 +12,8 @@ def clean_ascii_chars(txt, charlist=None):
Remove ASCII control chars: 0 to 8 and 11, 12, 14-31 by default
This is all control chars except \\t,\\n and \\r
'''
if not txt:
return ''
global _ascii_pat
if _ascii_pat is None:
chars = list(range(8)) + [0x0B, 0x0C] + list(range(0x0E, 0x1F))