diff --git a/recipes/independent.recipe b/recipes/independent.recipe index 53208915d3..60241be98b 100644 --- a/recipes/independent.recipe +++ b/recipes/independent.recipe @@ -1,26 +1,27 @@ # adapted from old recipe by Darko Miletic -import re +import string, re +from calibre import strftime from calibre.web.feeds.recipes import BasicNewsRecipe -from calibre.ebooks.BeautifulSoup import Tag, NavigableString +from calibre.ebooks.BeautifulSoup import BeautifulSoup, Tag, NavigableString class TheIndependentNew(BasicNewsRecipe): - + # flag to enable/disable article graphics on business pages/some others # eg http://www.independent.co.uk/news/world/europe/berlusconi-departure-fails-to-calm-the-markets-6259682.html # -max dimensions can be altered using the .pictureContainer img selector in the css _FETCH_ARTICLE_GRAPHICS = True - + #Flag to enable/disable image fetching (not business) _FETCH_IMAGES = True - - + + #used for converting rating to stars _STAR_URL = 'http://www.independent.co.uk/skins/ind/images/rating_star.png' _NO_STAR_URL = 'http://www.independent.co.uk/skins/ind/images/rating_star_grey.png' - - + + title = u'The Independent' __author__ = 'Will' description = 'The latest in UK News and World News from The \ @@ -41,26 +42,26 @@ class TheIndependentNew(BasicNewsRecipe): dict(attrs={'id' : ['RelatedArtTag','renderBiography']}), dict(attrs={'class' : ['autoplay','openBiogPopup']}) ] - + keep_only_tags =[dict(attrs={'id':'main'})] recursions = 0 - + # fixes non compliant html nesting and 'marks' article graphics links preprocess_regexps = [ (re.compile('(?P.*?)', re.DOTALL), lambda match: '
' + match.group('nested') + '
'), - (re.compile('.*?Click.*?to view graphic.*?', re.DOTALL), + (re.compile('(.*?[Cc]lick.*?)', re.DOTALL), lambda match: '
' + match.group(0) + '
'), - ] - - + ] + + conversion_options = { 'comment' : description , 'tags' : category , 'publisher' : publisher , 'language' : language - } - + } + extra_css = """ h1{font-family: Georgia,serif } body{font-family: Verdana,Arial,Helvetica,sans-serif} @@ -80,22 +81,22 @@ class TheIndependentNew(BasicNewsRecipe): .articleContent {display: block; clear:left;} .storyTop{} .pictureContainer img { max-width: 400px; max-height: 400px;} - """ - + """ + oldest_article = 1 max_articles_per_feed = 100 - + _processed_urls = [] - - + + def get_article_url(self, article): url = super(self.__class__,self).get_article_url(article) - + title = article.get('title', None) if title and re.search("^Video:",title): return None - - #remove duplicates + + #remove duplicates if not (url in self._processed_urls): self._processed_urls.append(url) else: @@ -103,132 +104,147 @@ class TheIndependentNew(BasicNewsRecipe): return url def preprocess_html(self, soup): - + + #remove 'advertorial articles' + strapline = soup.find('div',attrs={'class' : re.compile('.*strapLine.*')}) + if strapline: + for para in strapline.findAll('p'): + if len(para.contents) and isinstance(para.contents[0],NavigableString) \ + and para.contents[0] == 'ADVERTORIAL FEATURE': + return None + items_to_extract = [] - + for item in soup.findAll(attrs={'class' : re.compile("widget.*")}): remove = True pattern = re.compile('((articleContent)|(title))$') if (pattern.search(item['class'])) is not None: remove = False - + # corrections # story content always good - pattern = re.compile('storyContent') + pattern = re.compile('storyContent') if (pattern.search(item['class'])) is not None: remove = False - + #images - pattern = re.compile('slideshow') + pattern = re.compile('slideshow') if (pattern.search(item['class'])) is not None: if self._FETCH_IMAGES: remove = False else: remove = True - + #social widgets always bad - pattern = re.compile('socialwidget') + pattern = re.compile('socialwidget') if (pattern.search(item['class'])) is not None: remove = True - + if remove: items_to_extract.append(item) - + for item in items_to_extract: - item.extract() - - items_to_extract = [] - - if self._FETCH_IMAGES: + item.extract() + + items_to_extract = [] + + if self._FETCH_IMAGES: for item in soup.findAll('a',attrs={'href' : re.compile('.*')}): if item.img is not None: #use full size image img = item.findNext('img') - + img['src'] = item['href'] - + #insert caption if available if img['title'] is not None and (len(img['title']) > 1): tag = Tag(soup,'h3') text = NavigableString(img['title']) tag.insert(0,text) - + #picture before text img.extract() item.insert(0,img) item.insert(1,tag) - + # remove link item.name = "div" item["class"]='image' del item["href"] - - + + #remove empty subtitles """ currently the subtitle is located in first paragraph after sibling

tag. This may be 'fixed' at - some point. - """ + some point. + """ subtitle = soup.find('h3',attrs={'class' : 'subtitle'}) if subtitle is not None: subtitleText = subtitle.findNext('p') if subtitleText is not None: - if len(subtitleText.contents[0]) <= 1 : + if len(subtitleText.contents[0]) <= 1 : subtitleText.extract() subtitle.extract() - - + + #replace rating numbers with stars for item in soup.findAll('div',attrs={ 'class' : 'starRating'}): if item is not None: soup2 = self._insertRatingStars(soup,item) if soup2 is not None: soup = soup2 - - + + #remove empty paragraph tags in storyTop which can leave a space #between first paragraph and rest of story + nested_content = False storyTop = soup.find('div',attrs={ 'class' : ['storyTop']}) for item in storyTop.findAll('p'): - if item.contents is not None and len(item.contents[0]) <= 1 : + for nested in item: + if isinstance(nested, Tag): + nested_content = True + break + if not nested_content and item.contents is not None and len(item.contents[0]) <= 1 : items_to_extract.append(item) - + for item in items_to_extract: - item.extract() - - items_to_extract = [] - - + item.extract() + + items_to_extract = [] + + #remove line breaks immediately next to tags with default margins #to prevent double line spacing and narrow columns of text storyTop = soup.find('div',attrs={ 'class' : ['storyTop']}) - self._remove_undesired_line_breaks_from_tag(storyTop,soup) - - + self._remove_undesired_line_breaks_from_tag(storyTop,soup) + + #replace article graphics link with the graphics themselves if self._FETCH_ARTICLE_GRAPHICS: items_to_insert = [] for item in soup.findAll('div', attrs={'class' : ['article-graphic']}): strong = item.find('strong') + if not strong: + continue for child in strong: if isinstance(child,Tag): if str(child.name) == 'a': items_to_insert.extend(self._get_article_graphic(strong,child['href'],soup)) - + for item in items_to_insert: - item[0].replaceWith(item[1]) - + item[0].replaceWith(item[1]) + for item in items_to_extract: - item.extract() - + item.extract() + return soup - - + + def _get_article_graphic(self,old_item,url,soup): - + items_to_insert = [] - + if re.search('\.jpg$',str(url)): div = Tag(soup,'div') div['class'] = 'pictureContainer' @@ -238,20 +254,20 @@ class TheIndependentNew(BasicNewsRecipe): div.insert(0,img) items_to_insert.append((old_item,div,)) return items_to_insert - + soup2 = self.index_to_soup(url) for item in soup2.findAll('div',attrs={'class' : re.compile("widget picture article.*")}): items_to_insert.append((old_item,item),) return items_to_insert - - + + def _insertRatingStars(self,soup,item): if item.contents is None: return rating = item.contents[0] if not rating.isdigit(): return None - rating = int(item.contents[0]) + rating = int(item.contents[0]) for i in range(1,6): star = Tag(soup,'img') if i <= rating: @@ -261,26 +277,26 @@ class TheIndependentNew(BasicNewsRecipe): star['alt'] = 'star number ' + str(i) item.insert(i,star) #item.contents[0] = NavigableString('(' + str(rating) + ')') - item.contents[0] = '' - + item.contents[0] = '' + def postprocess_html(self,soup, first_fetch): #find broken images and remove captions items_to_extract = [] for item in soup.findAll('div', attrs={'class' : 'image'}): img = item.findNext('img') if img is not None and img['src'] is not None: - # broken images still point to remote url - pattern = re.compile('http://www.independent.co.uk.*') + # broken images still point to remote url + pattern = re.compile('http://www.independent.co.uk.*') if pattern.match(img["src"]) is not None: caption = img.findNextSibling('h3') if caption is not None: items_to_extract.append(caption) items_to_extract.append(img) - + for item in items_to_extract: - item.extract() + item.extract() return soup - + def _recurisvely_linearise_tag_tree( self, item, @@ -295,25 +311,25 @@ class TheIndependentNew(BasicNewsRecipe): if not (isinstance(item,Tag)): return linearised for nested in item: - linearised.append(nested) + linearised.append(nested) linearised = self._recurisvely_linearise_tag_tree(nested,linearised, count) return linearised - - + + def _get_previous_tag(self,current_index, tag_tree): if current_index == 0: return None else: return tag_tree[current_index - 1] - - + + def _get_next_tag(self,current_index, tag_tree): if current_index < len(tag_tree) - 1: return tag_tree[current_index + 1] else: return None - - + + def _list_match(self,test_str, list_regex): for regex in list_regex: match = re.match(regex, test_str) @@ -322,24 +338,24 @@ class TheIndependentNew(BasicNewsRecipe): return False def _remove_undesired_line_breaks_from_tag(self,parent,soup): - + if parent is None: return - - + + tag_tree = self._recurisvely_linearise_tag_tree(parent) items_to_remove = [] - - + + for item in tag_tree: if item == u'\n': items_to_remove.append(item) continue; - + for item in items_to_remove: tag_tree.remove(item) - - + + spaced_tags = [r'p', r'h\d', r'blockquote'] tags_to_extract = [] tags_to_replace = [] @@ -347,41 +363,41 @@ class TheIndependentNew(BasicNewsRecipe): if isinstance(tag, Tag): if str(tag) == '
': previous_tag = self._get_previous_tag(i, tag_tree) - + if isinstance(previous_tag, Tag): previous_tag_is_spaced = previous_tag is not None\ and self._list_match(str(previous_tag.name), spaced_tags) else: previous_tag_is_spaced = False - + next_tag = self._get_next_tag(i, tag_tree) - + if isinstance(next_tag, Tag): next_tag_is_spaced = next_tag is not None\ and self._list_match(str(next_tag.name), spaced_tags) else: next_tag_is_spaced = False - + if previous_tag_is_spaced or next_tag_is_spaced or i == 0\ or i == len(tag_tree) - 1: tags_to_extract.append(tag) else: tags_to_replace.append((tag,NavigableString(' '),)) - - + + for pair in tags_to_replace: - pair[0].replaceWith(pair[1]) + pair[0].replaceWith(pair[1]) for tag in tags_to_extract: tag.extract() - + feeds = [ (u'News - UK', u'http://www.independent.co.uk/news/uk/?service=rss'), (u'News - World', u'http://www.independent.co.uk/news/world/?service=rss'), (u'News - Business', - u'http://www.independent.co.uk/news/business/?service=rss'), + u'http://www.independent.co.uk/news/business/?service=rss'), (u'News - People', u'http://www.independent.co.uk/news/people/?service=rss'), (u'News - Science', @@ -481,4 +497,4 @@ class TheIndependentNew(BasicNewsRecipe): (u'IndyBest', u'http://www.independent.co.uk/extras/indybest/?service=rss'), ] - + diff --git a/recipes/sueddeutsche.recipe b/recipes/sueddeutsche.recipe index e0dc6742a1..ae5ddedf02 100644 --- a/recipes/sueddeutsche.recipe +++ b/recipes/sueddeutsche.recipe @@ -3,7 +3,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' ''' -Fetch sueddeutsche. +Fetch sueddeutsche.de ''' from calibre.web.feeds.news import BasicNewsRecipe @@ -62,7 +62,7 @@ class Sueddeutsche(BasicNewsRecipe): (u'Sport', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5ESport%24?output=rss'), (u'Leben', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5ELeben%24?output=rss'), (u'Karriere', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5EKarriere%24?output=rss'), - (u'München & Region', u'http://www.sueddeutsche.de/app/service/rss/ressort/muenchen/rss.xml'), + (u'München & Region', u'http://www.sueddeutsche.de/app/service/rss/ressort/muenchen/rss.xml'), # AGe 2011-11-13 (u'Bayern', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5EBayern%24?output=rss'), (u'Medien', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5EMedien%24?output=rss'), (u'Digital', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5EDigital%24?output=rss'), diff --git a/src/calibre/ebooks/conversion/cli.py b/src/calibre/ebooks/conversion/cli.py index ed332acac2..7a6997249f 100644 --- a/src/calibre/ebooks/conversion/cli.py +++ b/src/calibre/ebooks/conversion/cli.py @@ -134,7 +134,7 @@ def add_pipeline_options(parser, plumber): 'font_size_mapping', 'line_height', 'minimum_line_height', 'linearize_tables', - 'extra_css', + 'extra_css', 'filter_css', 'smarten_punctuation', 'unsmarten_punctuation', 'margin_top', 'margin_left', 'margin_right', 'margin_bottom', 'change_justification', diff --git a/src/calibre/ebooks/conversion/plumber.py b/src/calibre/ebooks/conversion/plumber.py index defb2b837d..1d43d3cb7e 100644 --- a/src/calibre/ebooks/conversion/plumber.py +++ b/src/calibre/ebooks/conversion/plumber.py @@ -308,6 +308,16 @@ OptionRecommendation(name='extra_css', 'rules.') ), +OptionRecommendation(name='filter_css', + recommended_value=None, level=OptionRecommendation.LOW, + help=_('A comma separated list of CSS properties that ' + 'will be removed from all CSS style rules. This is useful ' + 'if the presence of some style information prevents it ' + 'from being overridden on your device. ' + 'For example: ' + 'font-family,color,margin-left,margin-right') + ), + OptionRecommendation(name='page_breaks_before', recommended_value="//*[name()='h1' or name()='h2']", level=OptionRecommendation.LOW, diff --git a/src/calibre/ebooks/oeb/transforms/flatcss.py b/src/calibre/ebooks/oeb/transforms/flatcss.py index 6f338cb6d1..664b07baa5 100644 --- a/src/calibre/ebooks/oeb/transforms/flatcss.py +++ b/src/calibre/ebooks/oeb/transforms/flatcss.py @@ -118,8 +118,20 @@ class CSSFlattener(object): def __call__(self, oeb, context): oeb.logger.info('Flattening CSS and remapping font sizes...') + self.context = self.opts =context self.oeb = oeb - self.context = context + + self.filter_css = frozenset() + if self.opts.filter_css: + try: + self.filter_css = frozenset([x.strip().lower() for x in + self.opts.filter_css.split(',')]) + except: + self.oeb.log.warning('Failed to parse filter_css, ignoring') + else: + self.oeb.log.debug('Filtering CSS properties: %s'% + ', '.join(self.filter_css)) + self.stylize_spine() self.sbase = self.baseline_spine() if self.fbase else None self.fmap = FontMapper(self.sbase, self.fbase, self.fkey) @@ -279,6 +291,10 @@ class CSSFlattener(object): except: self.oeb.logger.exception('Failed to set minimum line-height') + if cssdict: + for x in self.filter_css: + cssdict.pop(x, None) + if cssdict: if self.lineh and self.fbase and tag != 'body': self.clean_edges(cssdict, style, psize) @@ -311,7 +327,6 @@ class CSSFlattener(object): lineh = self.lineh / psize cssdict['line-height'] = "%0.5fem" % lineh - if (self.context.remove_paragraph_spacing or self.context.insert_blank_line) and tag in ('p', 'div'): if item_id != 'calibre_jacket' or self.context.output_profile.name == 'Kindle': diff --git a/src/calibre/gui2/convert/look_and_feel.py b/src/calibre/gui2/convert/look_and_feel.py index 4785e222fc..ad604ec4e3 100644 --- a/src/calibre/gui2/convert/look_and_feel.py +++ b/src/calibre/gui2/convert/look_and_feel.py @@ -18,6 +18,16 @@ class LookAndFeelWidget(Widget, Ui_Form): HELP = _('Control the look and feel of the output') COMMIT_NAME = 'look_and_feel' + FILTER_CSS = { + 'fonts': {'font-family'}, + 'margins': {'margin', 'margin-left', 'margin-right', 'margin-top', + 'margin-bottom'}, + 'padding': {'padding', 'padding-left', 'padding-right', 'padding-top', + 'padding-bottom'}, + 'floats': {'float'}, + 'colors': {'color', 'background', 'background-color'}, + } + def __init__(self, parent, get_option, get_help, db=None, book_id=None): Widget.__init__(self, parent, ['change_justification', 'extra_css', 'base_font_size', @@ -27,7 +37,7 @@ class LookAndFeelWidget(Widget, Ui_Form): 'remove_paragraph_spacing', 'remove_paragraph_spacing_indent_size', 'insert_blank_line_size', - 'input_encoding', + 'input_encoding', 'filter_css', 'asciiize', 'keep_ligatures', 'linearize_tables'] ) @@ -56,6 +66,15 @@ class LookAndFeelWidget(Widget, Ui_Form): if g is self.opt_change_justification: ans = unicode(g.itemData(g.currentIndex()).toString()) return ans + if g is self.opt_filter_css: + ans = set() + for key, item in self.FILTER_CSS.iteritems(): + w = getattr(self, 'filter_css_%s'%key) + if w.isChecked(): + ans = ans.union(item) + ans = ans.union(set([x.strip().lower() for x in + unicode(self.filter_css_others.text()).split(',')])) + return ','.join(ans) if ans else None return Widget.get_value_handler(self, g) def set_value_handler(self, g, val): @@ -66,6 +85,27 @@ class LookAndFeelWidget(Widget, Ui_Form): g.setCurrentIndex(i) break return True + if g is self.opt_filter_css: + if not val: val = '' + items = frozenset([x.strip().lower() for x in val.split(',')]) + for key, vals in self.FILTER_CSS.iteritems(): + w = getattr(self, 'filter_css_%s'%key) + if not vals - items: + items = items - vals + w.setChecked(True) + else: + w.setChecked(False) + self.filter_css_others.setText(', '.join(items)) + return True + + def connect_gui_obj_handler(self, gui_obj, slot): + if gui_obj is self.opt_filter_css: + for key in self.FILTER_CSS: + w = getattr(self, 'filter_css_%s'%key) + w.stateChanged.connect(slot) + self.filter_css_others.textChanged.connect(slot) + return + raise NotImplementedError() def font_key_wizard(self): from calibre.gui2.convert.font_key import FontKeyChooser diff --git a/src/calibre/gui2/convert/look_and_feel.ui b/src/calibre/gui2/convert/look_and_feel.ui index 2c63ce4846..fae1cf2331 100644 --- a/src/calibre/gui2/convert/look_and_feel.ui +++ b/src/calibre/gui2/convert/look_and_feel.ui @@ -6,7 +6,7 @@ 0 0 - 642 + 655 522 @@ -164,6 +164,41 @@ + + + + &Indent size: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + opt_remove_paragraph_spacing_indent_size + + + + + + + <p>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. + + + No change + + + em + + + 1 + + + -0.100000000000000 + + + 0.100000000000000 + + + @@ -171,6 +206,19 @@ + + + + &Line size: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + opt_insert_blank_line_size + + + @@ -194,80 +242,6 @@ - - - - &Transliterate unicode characters to ASCII - - - - - - - Keep &ligatures - - - - - - - Extra &CSS - - - - - - - - - - - - <p>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. - - - No change - - - em - - - 1 - - - -0.100000000000000 - - - 0.100000000000000 - - - - - - - &Indent size: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - opt_remove_paragraph_spacing_indent_size - - - - - - - &Line size: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - opt_insert_blank_line_size - - - @@ -275,6 +249,13 @@ + + + + &Transliterate unicode characters to ASCII + + + @@ -282,6 +263,13 @@ + + + + Keep &ligatures + + + @@ -289,6 +277,111 @@ + + + + 0 + + + + &Extra CSS + + + + + + + + + + &Filter Style Information + + + + + + Select what style information you want completely removed: + + + true + + + + + + + Removes the font-family CSS property + + + &Fonts + + + + + + + Removes the margin CSS properties. Note that page margins are not affected by this setting. + + + &Margins + + + + + + + Removes the padding CSS properties + + + &Padding + + + + + + + Convert floating images/text into static images/text + + + F&loats + + + + + + + Removes foreground and background colors + + + &Colors + + + + + + + + + &Other CSS Properties: + + + filter_css_others + + + + + + + Comma separated list of CSS properties to remove. For example: display, color, font-family + + + + + + + + + diff --git a/src/calibre/gui2/metadata/bulk_download.py b/src/calibre/gui2/metadata/bulk_download.py index 182881f02d..976dfad2bb 100644 --- a/src/calibre/gui2/metadata/bulk_download.py +++ b/src/calibre/gui2/metadata/bulk_download.py @@ -131,8 +131,9 @@ def get_job_details(job): def merge_result(oldmi, newmi, ensure_fields=None): dummy = Metadata(_('Unknown')) for f in msprefs['ignore_fields']: - if ':' not in f and (ensure_fields and f not in ensure_fields): - setattr(newmi, f, getattr(dummy, f)) + if ':' in f or (ensure_fields and f in ensure_fields): + continue + setattr(newmi, f, getattr(dummy, f)) fields = set() for plugin in metadata_plugins(['identify']): fields |= plugin.touched_fields diff --git a/src/calibre/gui2/store/config/search/search_widget.ui b/src/calibre/gui2/store/config/search/search_widget.ui index a73aae3ea5..857a152e2d 100644 --- a/src/calibre/gui2/store/config/search/search_widget.ui +++ b/src/calibre/gui2/store/config/search/search_widget.ui @@ -127,7 +127,7 @@ - Number of conver download threads to use + Number of cover download threads to use diff --git a/src/calibre/translations/calibre.pot b/src/calibre/translations/calibre.pot index d850a3bbed..4cd1956c37 100644 --- a/src/calibre/translations/calibre.pot +++ b/src/calibre/translations/calibre.pot @@ -5,8 +5,8 @@ msgid "" msgstr "" "Project-Id-Version: calibre 0.8.26\n" -"POT-Creation-Date: 2011-11-12 09:09+IST\n" -"PO-Revision-Date: 2011-11-12 09:09+IST\n" +"POT-Creation-Date: 2011-11-13 17:08+IST\n" +"PO-Revision-Date: 2011-11-13 17:08+IST\n" "Last-Translator: Automatically generated\n" "Language-Team: LANGUAGE\n" "MIME-Version: 1.0\n" @@ -988,8 +988,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:102 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:447 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:470 -#: /home/kovid/work/calibre/src/calibre/devices/prst1/driver.py:529 -#: /home/kovid/work/calibre/src/calibre/devices/prst1/driver.py:548 +#: /home/kovid/work/calibre/src/calibre/devices/prst1/driver.py:532 +#: /home/kovid/work/calibre/src/calibre/devices/prst1/driver.py:551 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:1048 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:1054 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:1089 @@ -2029,250 +2029,254 @@ msgstr "" 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:314 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:313 +msgid "A comma separated list of CSS properties that will be removed from all CSS style rules. This is useful if the presence of some style information prevents it from being overridden on your device. For example: font-family,color,margin-left,margin-right" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:324 msgid "An XPath expression. Page breaks are inserted before the specified elements." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:320 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:330 msgid "Some documents specify page margins by specifying a left and right margin on each individual paragraph. calibre will try to detect and remove these margins. Sometimes, this can cause the removal of margins that should not have been removed. In this case you can disable the removal." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:331 -#, python-format -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:336 -#, python-format -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:341 #, python-format -msgid "Set the left margin in pts. Default is %default. Note: 72 pts equals 1 inch" +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:346 #, python-format +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:351 +#, python-format +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:356 +#, python-format 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:352 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:362 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:362 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:372 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:369 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:379 msgid "When calibre removes blank lines between paragraphs, it automatically sets a paragraph indent, to ensure that paragraphs can be easily distinguished. This option controls the width of that indent (in em). If you set this value negative, then the indent specified in the input document is used, that is, calibre does not change the indentation." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:378 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:388 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:384 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:394 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:391 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:401 msgid "Set the height of the inserted blank lines (in em). The height of the lines between paragraphs will be twice the value set here." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:398 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:408 msgid "Remove the first image from the input ebook. Useful if the input document has a cover image that is not identified as a cover. In this case, if you set a cover in calibre, the output document will end up with two cover images if you do not specify this option." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:407 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:417 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:415 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:425 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:423 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:433 msgid "Convert fancy quotes, dashes and ellipsis to their plain equivalents." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:431 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:441 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:438 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:448 #, python-format 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 based on the current calibre interface language will be used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:453 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:463 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:465 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:475 #: /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:469 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:479 msgid "Set the authors. Multiple authors should be separated by ampersands." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:474 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:484 msgid "The version of the title to be used for sorting. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:478 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:488 msgid "String to be used when sorting by author. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:482 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:492 msgid "Set the cover to the specified file or URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:486 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:496 #: /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:490 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:500 #: /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:494 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:504 #: /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:498 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:508 #: /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:502 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:512 #: /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:506 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:516 #: /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:510 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:520 #: /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:514 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:524 #: /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:518 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:528 #: /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:522 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:532 msgid "Set the publication date." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:526 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:536 msgid "Set the book timestamp (used by the date column in calibre)." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:530 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:540 msgid "Enable heuristic processing. This option must be set for any heuristic processing to take place." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:535 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:545 msgid "Detect unformatted chapter headings and sub headings. Change them to h2 and h3 tags. This setting will not create a TOC, but can be used in conjunction with structure detection to create one." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:542 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:552 msgid "Look for common words and patterns that denote italics and italicize them." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:547 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:557 msgid "Turn indentation created from multiple non-breaking space entities into CSS indents." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:552 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:562 msgid "Scale used to determine the length at which a line should be unwrapped. Valid values are a decimal between 0 and 1. The default is 0.4, just below the median line length. If only a few lines in the document require unwrapping this value should be reduced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:560 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:570 msgid "Unwrap lines using punctuation and other formatting clues." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:564 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:574 msgid "Remove empty paragraphs from the document when they exist between every other paragraph" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:569 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:579 msgid "Left aligned scene break markers are center aligned. Replace soft scene breaks that use multiple blank lines with horizontal rules." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:575 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:585 msgid "Replace scene breaks with the specified text. By default, the text from the input document is used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:580 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:590 msgid "Analyze hyphenated words throughout the document. The document itself is used as a dictionary to determine whether hyphens should be retained or removed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:586 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:596 msgid "Looks for occurrences of sequential

or

tags. The tags are renumbered to prevent splitting in the middle of chapter headings." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:592 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:602 msgid "Search pattern (regular expression) to be replaced with sr1-replace." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:597 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:607 msgid "Replacement to replace the text found with sr1-search." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:601 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:611 msgid "Search pattern (regular expression) to be replaced with sr2-replace." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:606 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:616 msgid "Replacement to replace the text found with sr2-search." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:610 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:620 msgid "Search pattern (regular expression) to be replaced with sr3-replace." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:615 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:625 msgid "Replacement to replace the text found with sr3-search." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:719 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:729 msgid "Could not find an ebook inside the archive" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:777 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:787 msgid "Values of series index and rating must be numbers. Ignoring" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:784 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:794 msgid "Failed to parse date/time" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:943 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:953 msgid "Converting input to HTML..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:970 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:980 msgid "Running transforms on ebook..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:1074 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:1084 msgid "Creating" msgstr "" @@ -5312,7 +5316,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:21 #: /home/kovid/work/calibre/src/calibre/gui2/store/basic_config_widget_ui.py:37 #: /home/kovid/work/calibre/src/calibre/gui2/store/config/chooser/chooser_widget_ui.py:77 -#: /home/kovid/work/calibre/src/calibre/gui2/store/config/search/search_widget_ui.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/store/config/search/search_widget_ui.py:21 #: /home/kovid/work/calibre/src/calibre/gui2/store/config/search_widget_ui.py:98 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:123 msgid "Form" @@ -6017,15 +6021,15 @@ msgstr "" msgid "Control the look and feel of the output" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel.py:45 msgid "Original" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel.py:36 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel.py:46 msgid "Left align" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel.py:47 msgid "Justify text" msgstr "" @@ -6062,59 +6066,115 @@ msgid "Remove &spacing between paragraphs" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:97 -msgid "Insert &blank line between paragraphs" +msgid "&Indent size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:132 -msgid " em" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:106 -msgid "Text &justification:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:113 -msgid "&Transliterate unicode characters to ASCII" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:117 -msgid "Keep &ligatures" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:121 -msgid "Extra &CSS" -msgstr "" - -#: /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:102 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:131 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:103 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:87 msgid "No change" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:139 -msgid "&Indent size:" +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:120 +msgid " em" 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:111 +msgid "Insert &blank line between paragraphs" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:115 msgid "&Line size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:125 +msgid "Text &justification:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:132 msgid "Smarten &punctuation" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:153 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:136 +msgid "&Transliterate unicode characters to ASCII" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:140 msgid "&UnSmarten punctuation" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:144 +msgid "Keep &ligatures" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:148 msgid "&Linearize tables" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:166 +msgid "Select what style information you want completely removed:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:171 +msgid "Removes the font-family CSS property" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:172 +msgid "&Fonts" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:176 +msgid "Removes the margin CSS properties. Note that page margins are not affected by this setting." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:177 +msgid "&Margins" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:181 +msgid "Removes the padding CSS properties" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:182 +msgid "&Padding" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:186 +msgid "Convert floating images/text into static images/text" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:187 +msgid "F&loats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:191 +msgid "Removes foreground and background colors" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:192 +msgid "&Colors" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:198 +msgid "&Other CSS Properties:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:202 +msgid "Comma separated list of CSS properties to remove. For example: display, color, font-family" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:227 +msgid "&Extra CSS" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:228 +msgid "&Filter Style Information" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output.py:19 msgid "LRF Output" msgstr "" @@ -10652,7 +10712,7 @@ msgstr "" msgid "(Failed cover)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:212 #, python-format msgid "Downloaded %(num)d of %(tot)d" msgstr "" @@ -13082,53 +13142,53 @@ msgstr "" msgid "Configure..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/store/config/search/search_widget_ui.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/store/config/search/search_widget_ui.py:25 #: /home/kovid/work/calibre/src/calibre/gui2/store/config/search_widget_ui.py:99 msgid "Time" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/store/config/search/search_widget_ui.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/store/config/search/search_widget_ui.py:30 #: /home/kovid/work/calibre/src/calibre/gui2/store/config/search_widget_ui.py:100 msgid "Number of seconds to wait for a store to respond" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/store/config/search/search_widget_ui.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/store/config/search/search_widget_ui.py:38 #: /home/kovid/work/calibre/src/calibre/gui2/store/config/search_widget_ui.py:101 msgid "Number of seconds to let a store process results" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/store/config/search/search_widget_ui.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/store/config/search/search_widget_ui.py:50 #: /home/kovid/work/calibre/src/calibre/gui2/store/config/search_widget_ui.py:102 msgid "Display" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/store/config/search/search_widget_ui.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/store/config/search/search_widget_ui.py:55 #: /home/kovid/work/calibre/src/calibre/gui2/store/config/search_widget_ui.py:103 msgid "Maximum number of results to show per store" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/store/config/search/search_widget_ui.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/store/config/search/search_widget_ui.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/store/config/search_widget_ui.py:104 msgid "Open search result in system browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/store/config/search/search_widget_ui.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/store/config/search/search_widget_ui.py:68 msgid "Threads" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/store/config/search/search_widget_ui.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/store/config/search/search_widget_ui.py:73 msgid "Number of search threads to use" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/store/config/search/search_widget_ui.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/store/config/search/search_widget_ui.py:81 msgid "Number of cache update threads to use" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/store/config/search/search_widget_ui.py:108 -msgid "Number of conver download threads to use" +#: /home/kovid/work/calibre/src/calibre/gui2/store/config/search/search_widget_ui.py:89 +msgid "Number of cover download threads to use" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/store/config/search/search_widget_ui.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/store/config/search/search_widget_ui.py:97 msgid "Number of details threads to use" msgstr ""