1
0
mirror of https://github.com/gryf/ebook-converter.git synced 2026-04-18 12:03:33 +02:00

Removed gettext related functions

This commit is contained in:
2020-05-03 19:00:20 +02:00
parent 35445cb736
commit 212cb56d42
92 changed files with 1505 additions and 1605 deletions

View File

@@ -14,7 +14,7 @@ from ebook_converter import patheq
from ebook_converter.utils.localization import localize_user_manual_link
USAGE = '%prog ' + _('''\
USAGE = '%prog ' + '''\
input_file output_file [options]
Convert an e-book from one format to another.
@@ -38,7 +38,8 @@ To get help on them specify the input and output file and then use the -h \
option.
For full documentation of the conversion system see
''') + localize_user_manual_link('https://manual.calibre-ebook.com/conversion.html')
https://manual.calibre-ebook.com/conversion.html
'''
HEURISTIC_OPTIONS = ['markup_chapter_headings',
'italicize_common_cases', 'fix_indents',
@@ -98,21 +99,20 @@ def option_recommendation_to_cli_option(add_option, rec):
if opt.name == 'read_metadata_from_opf':
switches.append('--from-opf')
if opt.name == 'transform_css_rules':
attrs['help'] = _(
'Path to a file containing rules to transform the CSS styles'
' in this book. The easiest way to create such a file is to'
' use the wizard for creating rules in the calibre GUI. Access'
' it in the "Look & feel->Transform styles" section of the conversion'
' dialog. Once you create the rules, you can use the "Export" button'
' to save them to a file.'
)
attrs['help'] = ('Path to a file containing rules to transform the '
'CSS styles in this book. The easiest way to create '
'such a file is to use the wizard for creating rules '
'in the calibre GUI. Access it in the "Look & '
'feel->Transform styles" section of the conversion '
'dialog. Once you create the rules, you can use the '
'"Export" button to save them to a file.')
if opt.name in DEFAULT_TRUE_OPTIONS and rec.recommended_value is True:
switches = ['--disable-'+opt.long_switch]
add_option(optparse.Option(*switches, **attrs))
def group_titles():
return _('INPUT OPTIONS'), _('OUTPUT OPTIONS')
return 'INPUT OPTIONS', 'OUTPUT OPTIONS'
def recipe_test(option, opt_str, value, parser):
@@ -160,15 +160,17 @@ def add_input_output_options(parser, plumber):
if input_options:
title = group_titles()[0]
io = optparse.OptionGroup(parser, title, _('Options to control the processing'
' of the input %s file')%plumber.input_fmt)
io = optparse.OptionGroup(parser, title, 'Options to control the '
'processing of the input %s file' %
plumber.input_fmt)
add_options(io.add_option, input_options)
parser.add_option_group(io)
if output_options:
title = group_titles()[1]
oo = optparse.OptionGroup(parser, title, _('Options to control the processing'
' of the output %s')%plumber.output_fmt)
oo = optparse.OptionGroup(parser, title, 'Options to control the '
'processing of the output %s' %
plumber.output_fmt)
add_options(oo.add_option, output_options)
parser.add_option_group(oo)
@@ -181,8 +183,8 @@ def add_pipeline_options(parser, plumber):
'output_profile',
]
)),
(_('LOOK AND FEEL') , (
_('Options to control the look and feel of the output'),
('LOOK AND FEEL' , (
'Options to control the look and feel of the output',
[
'base_font_size', 'disable_font_rescaling',
'font_size_mapping', 'embed_font_family',
@@ -200,26 +202,23 @@ def add_pipeline_options(parser, plumber):
]
)),
(_('HEURISTIC PROCESSING') , (
_('Modify the document text and structure using common'
' patterns. Disabled by default. Use %(en)s to enable. '
' Individual actions can be disabled with the %(dis)s options.')
% dict(en='--enable-heuristics', dis='--disable-*'),
('HEURISTIC PROCESSING' ,
('Modify the document text and structure using common '
'patterns. Disabled by default. Use %(en)s to enable. '
'Individual actions can be disabled with the %(dis)s '
'options.' % dict(en='--enable-heuristics', dis='--disable-*'),
['enable_heuristics'] + HEURISTIC_OPTIONS
)),
(_('SEARCH AND REPLACE') , (
_('Modify the document text and structure using user defined patterns.'),
[
'sr1_search', 'sr1_replace',
'sr2_search', 'sr2_replace',
'sr3_search', 'sr3_replace',
'search_replace',
]
('SEARCH AND REPLACE' ,
('Modify the document text and structure using user defined '
'patterns.',
['sr1_search', 'sr1_replace', 'sr2_search', 'sr2_replace',
'sr3_search', 'sr3_replace', 'search_replace']
)),
(_('STRUCTURE DETECTION') , (
_('Control auto-detection of document structure.'),
('STRUCTURE DETECTION' , (
'Control auto-detection of document structure.',
[
'chapter', 'chapter_mark',
'prefer_metadata_cover', 'remove_first_image',
@@ -228,21 +227,20 @@ def add_pipeline_options(parser, plumber):
]
)),
(_('TABLE OF CONTENTS') , (
_('Control the automatic generation of a Table of Contents. By '
'default, if the source file has a Table of Contents, it will '
'be used in preference to the automatically generated one.'),
[
'level1_toc', 'level2_toc', 'level3_toc',
'toc_threshold', 'max_toc_links', 'no_chapters_in_toc',
'use_auto_toc', 'toc_filter', 'duplicate_links_in_toc',
]
)),
('TABLE OF CONTENTS' ,
('Control the automatic generation of a Table of Contents. By '
'default, if the source file has a Table of Contents, it will '
'be used in preference to the automatically generated one.',
['level1_toc', 'level2_toc', 'level3_toc', 'toc_threshold',
'max_toc_links', 'no_chapters_in_toc', 'use_auto_toc',
'toc_filter', 'duplicate_links_in_toc']
)
),
(_('METADATA') , (_('Options to set metadata in the output'),
('METADATA' , ('Options to set metadata in the output',
plumber.metadata_option_names + ['read_metadata_from_opf'],
)),
(_('DEBUG'), (_('Options to help with debugging the conversion'),
('DEBUG', ('Options to help with debugging the conversion',
[
'verbose',
'debug_pipeline',
@@ -265,9 +263,9 @@ def add_pipeline_options(parser, plumber):
def option_parser():
parser = OptionParser(usage=USAGE)
parser.add_option('--list-recipes', default=False, action='store_true',
help=_('List builtin recipe names. You can create an e-book from '
'a builtin recipe like this: ebook-convert "Recipe Name.recipe" '
'output.epub'))
help='List builtin recipe names. You can create an e-book from '
'a builtin recipe like this: ebook-convert "Recipe '
'Name.recipe" output.epub')
return parser
@@ -393,20 +391,20 @@ def main(args=sys.argv):
plumber.run()
log(_('Output saved to'), ' ', plumber.output)
log('Output saved to', ' ', plumber.output)
return 0
def manual_index_strings():
return _('''\
return '''\
The options and default values for the options change depending on both the
input and output formats, so you should always check with::
%s
Below are the options that are common to all conversion, followed by the
options specific to every input and output format.''')
options specific to every input and output format.'''
if __name__ == '__main__':

View File

@@ -191,7 +191,7 @@ class CHMInput(InputFormatPlugin):
title = param.attrib['value']
elif match_string(param.attrib['name'], 'local'):
href = param.attrib['value']
child = toc.add(title or _('Unknown'), href)
child = toc.add(title or 'Unknown', href)
ancestor_map[node] = child
def _process_nodes(self, root):

View File

@@ -25,51 +25,54 @@ class ComicInput(InputFormatPlugin):
options = {
OptionRecommendation(name='colors', recommended_value=0,
help=_('Reduce the number of colors used in the image. This works only'
' if you choose the PNG output format. It is useful to reduce file sizes.'
' Set to zero to turn off. Maximum value is 256. It is off by default.')),
help='Reduce the number of colors used in the image. This works '
'only if you choose the PNG output format. It is useful to '
'reduce file sizes. Set to zero to turn off. Maximum value '
'is 256. It is off by default.'),
OptionRecommendation(name='dont_normalize', recommended_value=False,
help=_('Disable normalize (improve contrast) color range '
'for pictures. Default: False')),
help='Disable normalize (improve contrast) color range '
'for pictures. Default: False'),
OptionRecommendation(name='keep_aspect_ratio', recommended_value=False,
help=_('Maintain picture aspect ratio. Default is to fill the screen.')),
help='Maintain picture aspect ratio. Default is to fill the '
'screen.'),
OptionRecommendation(name='dont_sharpen', recommended_value=False,
help=_('Disable sharpening.')),
help='Disable sharpening.'),
OptionRecommendation(name='disable_trim', recommended_value=False,
help=_('Disable trimming of comic pages. For some comics, '
'trimming might remove content as well as borders.')),
help='Disable trimming of comic pages. For some comics, trimming '
'might remove content as well as borders.'),
OptionRecommendation(name='landscape', recommended_value=False,
help=_("Don't split landscape images into two portrait images")),
help="Don't split landscape images into two portrait images"),
OptionRecommendation(name='wide', recommended_value=False,
help=_("Keep aspect ratio and scale image using screen height as "
"image width for viewing in landscape mode.")),
help="Keep aspect ratio and scale image using screen height as "
"image width for viewing in landscape mode."),
OptionRecommendation(name='right2left', recommended_value=False,
help=_('Used for right-to-left publications like manga. '
'Causes landscape pages to be split into portrait pages '
'from right to left.')),
help='Used for right-to-left publications like manga. '
'Causes landscape pages to be split into portrait pages '
'from right to left.'),
OptionRecommendation(name='despeckle', recommended_value=False,
help=_('Enable Despeckle. Reduces speckle noise. '
'May greatly increase processing time.')),
help='Enable Despeckle. Reduces speckle noise. May greatly '
'increase processing time.'),
OptionRecommendation(name='no_sort', recommended_value=False,
help=_("Don't sort the files found in the comic "
"alphabetically by name. Instead use the order they were "
"added to the comic.")),
help="Don't sort the files found in the comic "
"alphabetically by name. Instead use the order they were "
"added to the comic."),
OptionRecommendation(name='output_format', choices=['png', 'jpg'],
recommended_value='png', help=_('The format that images in the created e-book '
'are converted to. You can experiment to see which format gives '
'you optimal size and look on your device.')),
recommended_value='png',
help='The format that images in the created e-book are '
'converted to. You can experiment to see which format '
'gives you optimal size and look on your device.'),
OptionRecommendation(name='no_process', recommended_value=False,
help=_("Apply no processing to the image")),
help="Apply no processing to the image"),
OptionRecommendation(name='dont_grayscale', recommended_value=False,
help=_('Do not convert the image to grayscale (black and white)')),
help='Do not convert the image to grayscale (black and white)'),
OptionRecommendation(name='comic_image_size', recommended_value=None,
help=_('Specify the image size as widthxheight pixels. Normally,'
' an image size is automatically calculated from the output '
'profile, this option overrides it.')),
help='Specify the image size as widthxheight pixels. Normally,'
' an image size is automatically calculated from the output '
'profile, this option overrides it.'),
OptionRecommendation(name='dont_add_comic_pages_to_toc', recommended_value=False,
help=_('When converting a CBC do not add links to each page to'
' the TOC. Note this only applies if the TOC has more than one'
' section')),
help='When converting a CBC do not add links to each page to'
' the TOC. Note this only applies if the TOC has more than '
'one section'),
}
recommendations = {
@@ -192,7 +195,7 @@ class ComicInput(InputFormatPlugin):
raise ValueError('No comic pages found in %s'%stream.name)
mi = MetaInformation(os.path.basename(stream.name).rpartition('.')[0],
[_('Unknown')])
['Unknown'])
opf = OPFCreator(os.getcwd(), mi)
entries = []
@@ -222,7 +225,7 @@ class ComicInput(InputFormatPlugin):
if len(comics) == 1:
wrappers = comics[0][2]
for i, x in enumerate(wrappers):
toc.add_item(href(x), None, _('Page')+' %d'%(i+1),
toc.add_item(href(x), None, 'Page %d' % (i+1),
play_order=i)
else:
po = 0
@@ -234,7 +237,7 @@ class ComicInput(InputFormatPlugin):
if not opts.dont_add_comic_pages_to_toc:
for i, x in enumerate(wrappers):
stoc.add_item(href(x), None,
_('Page')+' %d'%(i+1), play_order=po)
'Page %d' % (i+1), play_order=po)
po += 1
opf.set_toc(toc)
with open('metadata.opf', 'wb') as m, open('toc.ncx', 'wb') as n:

View File

@@ -8,19 +8,21 @@ __copyright__ = '2013, Kovid Goyal <kovid at kovidgoyal.net>'
class DOCXInput(InputFormatPlugin):
name = 'DOCX Input'
author = 'Kovid Goyal'
description = _('Convert DOCX files (.docx and .docm) to HTML')
description = 'Convert DOCX files (.docx and .docm) to HTML'
file_types = {'docx', 'docm'}
commit_name = 'docx_input'
options = {
OptionRecommendation(name='docx_no_cover', recommended_value=False,
help=_('Normally, if a large image is present at the start of the document that looks like a cover, '
'it will be removed from the document and used as the cover for created e-book. This option '
'turns off that behavior.')),
help='Normally, if a large image is present at the start of the '
'document that looks like a cover, it will be removed from '
'the document and used as the cover for created e-book. This '
'option turns off that behavior.'),
OptionRecommendation(name='docx_no_pagebreaks_between_notes', recommended_value=False,
help=_('Do not insert a page break after every endnote.')),
help='Do not insert a page break after every endnote.'),
OptionRecommendation(name='docx_inline_subsup', recommended_value=False,
help=_('Render superscripts and subscripts so that they do not affect the line height.')),
help='Render superscripts and subscripts so that they do not '
'affect the line height.'),
}
recommendations = {('page_breaks_before', '/', OptionRecommendation.MED)}

View File

@@ -19,52 +19,52 @@ class DOCXOutput(OutputFormatPlugin):
options = {
OptionRecommendation(name='docx_page_size', recommended_value='letter',
level=OptionRecommendation.LOW, choices=PAGE_SIZES,
help=_('The size of the page. Default is letter. Choices '
'are %s') % PAGE_SIZES),
help='The size of the page. Default is letter. Choices '
'are %s' % PAGE_SIZES),
OptionRecommendation(name='docx_custom_page_size', recommended_value=None,
help=_('Custom size of the document. Use the form widthxheight '
help='Custom size of the document. Use the form widthxheight '
'EG. `123x321` to specify the width and height (in pts). '
'This overrides any specified page-size.')),
'This overrides any specified page-size.'),
OptionRecommendation(name='docx_no_cover', recommended_value=False,
help=_('Do not insert the book cover as an image at the start of the document.'
' If you use this option, the book cover will be discarded.')),
help='Do not insert the book cover as an image at the start of the document.'
' If you use this option, the book cover will be discarded.'),
OptionRecommendation(name='preserve_cover_aspect_ratio', recommended_value=False,
help=_('Preserve the aspect ratio of the cover image instead of stretching'
' it out to cover the entire page.')),
help='Preserve the aspect ratio of the cover image instead of stretching'
' it out to cover the entire page.'),
OptionRecommendation(name='docx_no_toc', recommended_value=False,
help=_('Do not insert the table of contents as a page at the start of the document.')),
help='Do not insert the table of contents as a page at the start of the document.'),
OptionRecommendation(name='extract_to',
help=_('Extract the contents of the generated %s file to the '
help='Extract the contents of the generated %s file to the '
'specified directory. The contents of the directory are first '
'deleted, so be careful.') % 'DOCX'),
'deleted, so be careful.' % 'DOCX'),
OptionRecommendation(name='docx_page_margin_left', recommended_value=72.0,
level=OptionRecommendation.LOW,
help=_('The size of the left page margin, in pts. Default is 72pt.'
' Overrides the common left page margin setting.')
help='The size of the left page margin, in pts. Default is 72pt.'
' Overrides the common left page margin setting.'
),
OptionRecommendation(name='docx_page_margin_top', recommended_value=72.0,
level=OptionRecommendation.LOW,
help=_('The size of the top page margin, in pts. Default is 72pt.'
' Overrides the common top page margin setting, unless set to zero.')
help='The size of the top page margin, in pts. Default is 72pt.'
' Overrides the common top page margin setting, unless set to zero.'
),
OptionRecommendation(name='docx_page_margin_right', recommended_value=72.0,
level=OptionRecommendation.LOW,
help=_('The size of the right page margin, in pts. Default is 72pt.'
' Overrides the common right page margin setting, unless set to zero.')
help='The size of the right page margin, in pts. Default is 72pt.'
' Overrides the common right page margin setting, unless set to zero.'
),
OptionRecommendation(name='docx_page_margin_bottom', recommended_value=72.0,
level=OptionRecommendation.LOW,
help=_('The size of the bottom page margin, in pts. Default is 72pt.'
' Overrides the common bottom page margin setting, unless set to zero.')
help='The size of the bottom page margin, in pts. Default is 72pt.'
' Overrides the common bottom page margin setting, unless set to zero.'
),
}

View File

@@ -3,8 +3,9 @@ import re
import shutil
import urllib.parse
from ebook_converter.customize.conversion import (OutputFormatPlugin,
OptionRecommendation)
from ebook_converter.customize.conversion import OutputFormatPlugin
from ebook_converter.customize.conversion import OptionRecommendation
from ebook_converter.ptempfile import TemporaryDirectory
from ebook_converter import CurrentDir
from ebook_converter.polyglot.builtins import as_bytes
@@ -53,78 +54,79 @@ class EPUBOutput(OutputFormatPlugin):
options = {
OptionRecommendation(name='extract_to',
help=_('Extract the contents of the generated %s file to the '
'specified directory. The contents of the directory are first '
'deleted, so be careful.') % 'EPUB'),
help='Extract the contents of the generated %s file to the '
'specified directory. The contents of the directory are '
'first deleted, so be careful.' % 'EPUB'),
OptionRecommendation(name='dont_split_on_page_breaks',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Turn off splitting at page breaks. Normally, input '
'files are automatically split at every page break into '
'two files. This gives an output e-book that can be '
'parsed faster and with less resources. However, '
'splitting is slow and if your source file contains a '
'very large number of page breaks, you should turn off '
'splitting on page breaks.'
)
help='Turn off splitting at page breaks. Normally, input '
'files are automatically split at every page break into '
'two files. This gives an output e-book that can be '
'parsed faster and with less resources. However, '
'splitting is slow and if your source file contains a '
'very large number of page breaks, you should turn off '
'splitting on page breaks.'
),
OptionRecommendation(name='flow_size', recommended_value=260,
help=_('Split all HTML files larger than this size (in KB). '
'This is necessary as most EPUB readers cannot handle large '
'file sizes. The default of %defaultKB is the size required '
'for Adobe Digital Editions. Set to 0 to disable size based splitting.')
help='Split all HTML files larger than this size (in KB). '
'This is necessary as most EPUB readers cannot handle large '
'file sizes. The default of %defaultKB is the size required '
'for Adobe Digital Editions. Set to 0 to disable size based '
'splitting.'
),
OptionRecommendation(name='no_default_epub_cover', recommended_value=False,
help=_('Normally, if the input file has no cover and you don\'t'
help='Normally, if the input file has no cover and you don\'t'
' specify one, a default cover is generated with the title, '
'authors, etc. This option disables the generation of this cover.')
'authors, etc. This option disables the generation of this cover.'
),
OptionRecommendation(name='no_svg_cover', recommended_value=False,
help=_('Do not use SVG for the book cover. Use this option if '
help='Do not use SVG for the book cover. Use this option if '
'your EPUB is going to be used on a device that does not '
'support SVG, like the iPhone or the JetBook Lite. '
'Without this option, such devices will display the cover '
'as a blank page.')
'as a blank page.'
),
OptionRecommendation(name='preserve_cover_aspect_ratio',
recommended_value=False, help=_(
'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.'
)
recommended_value=False,
help='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.'
),
OptionRecommendation(name='epub_flatten', recommended_value=False,
help=_('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.')
help='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.'
),
OptionRecommendation(name='epub_inline_toc', recommended_value=False,
help=_('Insert an inline Table of Contents that will appear as part of the main book content.')
help='Insert an inline Table of Contents that will appear as part '
'of the main book content.'
),
OptionRecommendation(name='epub_toc_at_end', recommended_value=False,
help=_('Put the inserted inline Table of Contents at the end of the book instead of the start.')
help='Put the inserted inline Table of Contents at the end of '
'the book instead of the start.'
),
OptionRecommendation(name='toc_title', recommended_value=None,
help=_('Title for any generated in-line table of contents.')
help='Title for any generated in-line table of contents.'
),
OptionRecommendation(name='epub_version', recommended_value='2', choices=ui_data['versions'],
help=_('The version of the EPUB file to generate. EPUB 2 is the'
' most widely compatible, only use EPUB 3 if you know you'
' actually need it.')
),
help='The version of the EPUB file to generate. EPUB 2 is the '
'most widely compatible, only use EPUB 3 if you know you '
'actually need it.'
)
}
recommendations = {('pretty_print', True, OptionRecommendation.HIGH)}
@@ -219,7 +221,7 @@ class EPUBOutput(OutputFormatPlugin):
self.log.warn('This EPUB file has no Table of Contents. '
'Creating a default TOC')
first = next(iter(self.oeb.spine))
self.oeb.toc.add(_('Start'), first.href)
self.oeb.toc.add('Start', first.href)
from ebook_converter.ebooks.oeb.base import OPF
identifiers = oeb.metadata['identifier']

View File

@@ -32,8 +32,7 @@ class FB2Input(InputFormatPlugin):
options = {
OptionRecommendation(name='no_inline_fb2_toc',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Do not insert a Table of Contents at the beginning of the book.'
)
help='Do not insert a Table of Contents at the beginning of the book.'
)}
def convert(self, stream, options, file_ext, log,
@@ -129,9 +128,9 @@ class FB2Input(InputFormatPlugin):
stream.seek(0)
mi = get_metadata(stream, 'fb2')
if not mi.title:
mi.title = _('Unknown')
mi.title = 'Unknown'
if not mi.authors:
mi.authors = [_('Unknown')]
mi.authors = ['Unknown']
cpath = None
if mi.cover_data and mi.cover_data[1]:
with open('fb2_cover_calibre_mi.jpg', 'wb') as f:

View File

@@ -141,31 +141,31 @@ class FB2Output(OutputFormatPlugin):
'home_sex', # Erotica & sex
'home', # Other
]
ui_data = {
'sectionize': {
'toc': _('Section per entry in the ToC'),
'files': _('Section per file'),
'nothing': _('A single section')
},
'genres': FB2_GENRES,
}
ui_data = {'sectionize': {'toc': 'Section per entry in the ToC',
'files': 'Section per file',
'nothing': 'A single section'},
'genres': FB2_GENRES}
options = {
OptionRecommendation(name='sectionize',
recommended_value='files', level=OptionRecommendation.LOW,
choices=list(ui_data['sectionize']),
help=_('Specify how sections are created:\n'
' * nothing: {nothing}\n'
' * files: {files}\n'
' * toc: {toc}\n'
'If ToC based generation fails, adjust the "Structure detection" and/or "Table of Contents" settings '
'(turn on "Force use of auto-generated Table of Contents").').format(**ui_data['sectionize'])
help='Specify how sections are created:\n'
' * nothing: {nothing}\n'
' * files: {files}\n'
' * toc: {toc}\n'
'If ToC based generation fails, adjust the "Structure '
'detection" and/or "Table of Contents" settings (turn on '
'"Force use of auto-generated Table of Contents")'
'.'.format(**ui_data['sectionize'])
),
OptionRecommendation(name='fb2_genre',
recommended_value='antique', level=OptionRecommendation.LOW,
choices=FB2_GENRES,
help=(_('Genre for the book. Choices: %s\n\n See: ') % ', '.join(FB2_GENRES)
) + 'http://www.fictionbook.org/index.php/Eng:FictionBook_2.1_genres ' + _('for a complete list with descriptions.')),
help='Genre for the book. Choices: %s\n\n See: http://www.'
'fictionbook.org/index.php/Eng:FictionBook_2.1_genres for a '
'complete list with descriptions.' % ', '.join(FB2_GENRES)),
}
def convert(self, oeb_book, output_path, input_plugin, opts, log):

View File

@@ -35,27 +35,24 @@ class HTMLInput(InputFormatPlugin):
options = {
OptionRecommendation(name='breadth_first',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Traverse links in HTML files breadth first. Normally, '
help='Traverse links in HTML files breadth first. Normally, '
'they are traversed depth first.'
)
),
OptionRecommendation(name='max_levels',
recommended_value=5, level=OptionRecommendation.LOW,
help=_('Maximum levels of recursion when following links in '
help='Maximum levels of recursion when following links in '
'HTML files. Must be non-negative. 0 implies that no '
'links in the root HTML file are followed. Default is '
'%default.'
)
),
OptionRecommendation(name='dont_package',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Normally this input plugin re-arranges all the input '
help='Normally this input plugin re-arranges all the input '
'files into a standard folder hierarchy. Only use this option '
'if you know what you are doing as it can result in various '
'nasty side effects in the rest of the conversion pipeline.'
)
),
}
@@ -129,12 +126,12 @@ class HTMLInput(InputFormatPlugin):
a = string_to_authors(a)
if not a:
oeb.logger.warn('Creator not specified')
a = [self.oeb.translate(__('Unknown'))]
a = [self.oeb.translate('Unknown')]
for aut in a:
metadata.add('creator', aut)
if not metadata.title:
oeb.logger.warn('Title not specified')
metadata.add('title', self.oeb.translate(__('Unknown')))
metadata.add('title', self.oeb.translate('Unknown'))
bookid = str(uuid.uuid4())
metadata.add('identifier', bookid, id='uuid_id', scheme='uuid')
for ident in metadata.identifier:

View File

@@ -30,18 +30,18 @@ class HTMLOutput(OutputFormatPlugin):
options = {
OptionRecommendation(name='template_css',
help=_('CSS file used for the output instead of the default file')),
help='CSS file used for the output instead of the default file'),
OptionRecommendation(name='template_html_index',
help=_('Template used for generation of the HTML index file instead of the default file')),
help='Template used for generation of the HTML index file instead of the default file'),
OptionRecommendation(name='template_html',
help=_('Template used for the generation of the HTML contents of the book instead of the default file')),
help='Template used for the generation of the HTML contents of the book instead of the default file'),
OptionRecommendation(name='extract_to',
help=_('Extract the contents of the generated ZIP file to the '
help='Extract the contents of the generated ZIP file to the '
'specified directory. WARNING: The contents of the directory '
'will be deleted.')
'will be deleted.'
),
}

View File

@@ -59,16 +59,17 @@ class HTMLZInput(InputFormatPlugin):
# HTMLZ archive probably won't turn out as the user expects. With
# Multiple HTML files ZIP input should be used in place of HTMLZ.
if multiple_html:
log.warn(_('Multiple HTML files found in the archive. Only %s will be used.') % index)
log.warn('Multiple HTML files found in the archive. Only %s will '
'be used.' % index)
if index:
with open(index, 'rb') as tf:
html = tf.read()
else:
raise Exception(_('No top level HTML file found.'))
raise Exception('No top level HTML file found.')
if not html:
raise Exception(_('Top level HTML file %s is empty') % index)
raise Exception('Top level HTML file %s is empty' % index)
# Encoding
if options.input_encoding:

View File

@@ -17,40 +17,33 @@ class HTMLZOutput(OutputFormatPlugin):
author = 'John Schember'
file_type = 'htmlz'
commit_name = 'htmlz_output'
ui_data = {
'css_choices': {
'class': _('Use CSS classes'),
'inline': _('Use the style attribute'),
'tag': _('Use HTML tags wherever possible')
},
'sheet_choices': {
'external': _('Use an external CSS file'),
'inline': _('Use a <style> tag in the HTML file')
}
}
ui_data = {'css_choices': {'class': 'Use CSS classes',
'inline': 'Use the style attribute',
'tag': 'Use HTML tags wherever possible'},
'sheet_choices': {'external': 'Use an external CSS file',
'inline': 'Use a <style> tag in the HTML '
'file'}}
options = {
OptionRecommendation(name='htmlz_css_type', recommended_value='class',
level=OptionRecommendation.LOW,
choices=list(ui_data['css_choices']),
help=_('Specify the handling of CSS. Default is class.\n'
'class: {class}\n'
'inline: {inline}\n'
'tag: {tag}'
).format(**ui_data['css_choices'])),
help='Specify the handling of CSS. Default is class.\n'
'class: {class}\n'
'inline: {inline}\n'
'tag: {tag}'.format(**ui_data['css_choices'])),
OptionRecommendation(name='htmlz_class_style', recommended_value='external',
level=OptionRecommendation.LOW,
choices=list(ui_data['sheet_choices']),
help=_('How to handle the CSS when using css-type = \'class\'.\n'
'Default is external.\n'
'external: {external}\n'
'inline: {inline}'
).format(**ui_data['sheet_choices'])),
help='How to handle the CSS when using css-type = \'class\'.\n'
'Default is external.\n'
'external: {external}\n'
'inline: {inline}'.format(**ui_data['sheet_choices'])),
OptionRecommendation(name='htmlz_title_filename',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('If set this option causes the file name of the HTML file'
' inside the HTMLZ archive to be based on the book title.')
),
help='If set this option causes the file name of the HTML file '
'inside the HTMLZ archive to be based on the book title.'
)
}
def convert(self, oeb_book, output_path, input_plugin, opts, log):

View File

@@ -24,7 +24,7 @@ class LRFOptions(object):
if val < 0:
setattr(opts, attr, 0)
self.title = None
self.author = self.publisher = _('Unknown')
self.author = self.publisher = 'Unknown'
self.title_sort = self.author_sort = ''
for x in m.creator:
if x.role == 'aut':
@@ -91,43 +91,44 @@ class LRFOutput(OutputFormatPlugin):
options = {
OptionRecommendation(name='enable_autorotation', recommended_value=False,
help=_('Enable auto-rotation of images that are wider than the screen width.')
help='Enable auto-rotation of images that are wider than the '
'screen width.'
),
OptionRecommendation(name='wordspace',
recommended_value=2.5, level=OptionRecommendation.LOW,
help=_('Set the space between words in pts. Default is %default')
help='Set the space between words in pts. Default is %default'
),
OptionRecommendation(name='header', recommended_value=False,
help=_('Add a header to all the pages with title and author.')
help='Add a header to all the pages with title and author.'
),
OptionRecommendation(name='header_format', recommended_value="%t by %a",
help=_('Set the format of the header. %a is replaced by the author '
'and %t by the title. Default is %default')
help='Set the format of the header. %a is replaced by the author '
'and %t by the title. Default is %default'
),
OptionRecommendation(name='header_separation', recommended_value=0,
help=_('Add extra spacing below the header. Default is %default pt.')
help='Add extra spacing below the header. Default is %default pt.'
),
OptionRecommendation(name='minimum_indent', recommended_value=0,
help=_('Minimum paragraph indent (the indent of the first line '
'of a paragraph) in pts. Default: %default')
help='Minimum paragraph indent (the indent of the first line '
'of a paragraph) in pts. Default: %default'
),
OptionRecommendation(name='render_tables_as_images',
recommended_value=False,
help=_('This option has no effect')
help='This option has no effect'
),
OptionRecommendation(name='text_size_multiplier_for_rendered_tables',
recommended_value=1.0,
help=_('Multiply the size of text in rendered tables by this '
'factor. Default is %default')
help='Multiply the size of text in rendered tables by this '
'factor. Default is %default'
),
OptionRecommendation(name='serif_family', recommended_value=None,
help=_('The serif family of fonts to embed')
help='The serif family of fonts to embed'
),
OptionRecommendation(name='sans_family', recommended_value=None,
help=_('The sans-serif family of fonts to embed')
help='The sans-serif family of fonts to embed'
),
OptionRecommendation(name='mono_family', recommended_value=None,
help=_('The monospace family of fonts to embed')
help='The monospace family of fonts to embed'
),
}
@@ -151,7 +152,7 @@ class LRFOutput(OutputFormatPlugin):
book = Book(title=opts.title, author=opts.author,
bookid=uuid4().hex,
publisher='%s %s'%(__appname__, __version__),
category=_('Comic'), pagestyledefault=ps,
category='Comic', pagestyledefault=ps,
booksetting=BookSetting(screenwidth=width, screenheight=height))
for page in pages:
imageStream = ImageStream(page)

View File

@@ -44,64 +44,64 @@ class MOBIOutput(OutputFormatPlugin):
options = {
OptionRecommendation(name='prefer_author_sort',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('When present, use author sort field as author.')
help='When present, use author sort field as author.'
),
OptionRecommendation(name='no_inline_toc',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Don\'t add Table of Contents to the book. Useful if '
'the book has its own table of contents.')),
help='Don\'t add Table of Contents to the book. Useful if '
'the book has its own table of contents.'),
OptionRecommendation(name='toc_title', recommended_value=None,
help=_('Title for any generated in-line table of contents.')
help='Title for any generated in-line table of contents.'
),
OptionRecommendation(name='dont_compress',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Disable compression of the file contents.')
help='Disable compression of the file contents.'
),
OptionRecommendation(name='personal_doc', recommended_value='[PDOC]',
help=_('Tag for MOBI files to be marked as personal documents.'
help='Tag for MOBI files to be marked as personal documents.'
' This option has no effect on the conversion. It is used'
' only when sending MOBI files to a device. If the file'
' being sent has the specified tag, it will be marked as'
' a personal document when sent to the Kindle.')
' a personal document when sent to the Kindle.'
),
OptionRecommendation(name='mobi_ignore_margins',
recommended_value=False,
help=_('Ignore margins in the input document. If False, then '
help='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.')
' in the input document, otherwise it will ignore them.'
),
OptionRecommendation(name='mobi_toc_at_start',
recommended_value=False,
help=_('When adding the Table of Contents to the book, add it at the start of the '
'book instead of the end. Not recommended.')
help='When adding the Table of Contents to the book, add it at the start of the '
'book instead of the end. Not recommended.'
),
OptionRecommendation(name='extract_to',
help=_('Extract the contents of the generated %s file to the '
help='Extract the contents of the generated %s file to the '
'specified directory. The contents of the directory are first '
'deleted, so be careful.') % 'MOBI'
'deleted, so be careful.' % 'MOBI'
),
OptionRecommendation(name='share_not_sync', recommended_value=False,
help=_('Enable sharing of book content via Facebook etc. '
help='Enable sharing of book content via Facebook etc. '
' on the Kindle. WARNING: Using this feature means that '
' the book will not auto sync its last read position '
' on multiple devices. Complain to Amazon.')
' on multiple devices. Complain to Amazon.'
),
OptionRecommendation(name='mobi_keep_original_images',
recommended_value=False,
help=_('By default calibre converts all images to JPEG format '
help='By default calibre converts all images to JPEG format '
'in the output MOBI file. This is for maximum compatibility '
'as some older MOBI viewers have problems with other image '
'formats. This option tells calibre not to do this. '
'Useful if your document contains lots of GIF/PNG images that '
'become very large when converted to JPEG.')),
'become very large when converted to JPEG.'),
OptionRecommendation(name='mobi_file_type', choices=ui_data['file_types'], recommended_value='old',
help=_('By default calibre generates MOBI files that contain the '
help='By default calibre generates MOBI files that contain the '
'old MOBI 6 format. This format is compatible with all '
'devices. However, by changing this setting, you can tell '
'calibre to generate MOBI files that contain both MOBI 6 and '
'the new KF8 format, or only the new KF8 format. KF8 has '
'more features than MOBI 6, but only works with newer Kindles. '
'Allowed values: {}').format('old, both, new')),
'Allowed values: {}'.format('old, both, new'))
}
@@ -139,7 +139,7 @@ class MOBIOutput(OutputFormatPlugin):
# single section periodical
self.oeb.manifest.remove(one)
self.oeb.manifest.remove(two)
sections = [TOC(klass='section', title=_('All articles'),
sections = [TOC(klass='section', title='All articles',
href=self.oeb.spine[0].href)]
for x in toc:
sections[0].nodes.append(x)
@@ -274,34 +274,34 @@ class AZW3Output(OutputFormatPlugin):
options = {
OptionRecommendation(name='prefer_author_sort',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('When present, use author sort field as author.')
help='When present, use author sort field as author.'
),
OptionRecommendation(name='no_inline_toc',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Don\'t add Table of Contents to the book. Useful if '
'the book has its own table of contents.')),
help='Don\'t add Table of Contents to the book. Useful if '
'the book has its own table of contents.'),
OptionRecommendation(name='toc_title', recommended_value=None,
help=_('Title for any generated in-line table of contents.')
help='Title for any generated in-line table of contents.'
),
OptionRecommendation(name='dont_compress',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Disable compression of the file contents.')
help='Disable compression of the file contents.'
),
OptionRecommendation(name='mobi_toc_at_start',
recommended_value=False,
help=_('When adding the Table of Contents to the book, add it at the start of the '
'book instead of the end. Not recommended.')
help='When adding the Table of Contents to the book, add it at the start of the '
'book instead of the end. Not recommended.'
),
OptionRecommendation(name='extract_to',
help=_('Extract the contents of the generated %s file to the '
help='Extract the contents of the generated %s file to the '
'specified directory. The contents of the directory are first '
'deleted, so be careful.') % 'AZW3'),
'deleted, so be careful.' % 'AZW3'),
OptionRecommendation(name='share_not_sync', recommended_value=False,
help=_('Enable sharing of book content via Facebook etc. '
help='Enable sharing of book content via Facebook etc. '
' on the Kindle. WARNING: Using this feature means that '
' the book will not auto sync its last read position '
' on multiple devices. Complain to Amazon.')
),
' on multiple devices. Complain to Amazon.'
)
}
def convert(self, oeb, output_path, input_plugin, opts, log):

View File

@@ -25,8 +25,10 @@ class PDBInput(InputFormatPlugin):
Reader = get_reader(header.ident)
if Reader is None:
raise PDBError('No reader available for format within container.\n Identity is %s. Book type is %s' %
(header.ident, IDENTITY_TO_NAME.get(header.ident, _('Unknown'))))
raise PDBError('No reader available for format within container.'
'\n Identity is %s. Book type is %s' %
(header.ident,
IDENTITY_TO_NAME.get(header.ident, 'Unknown')))
log.debug('Detected ebook format as: %s with identity: %s' % (IDENTITY_TO_NAME[header.ident], header.ident))

View File

@@ -22,15 +22,16 @@ class PDBOutput(OutputFormatPlugin):
OptionRecommendation(name='format', recommended_value='doc',
level=OptionRecommendation.LOW,
short_switch='f', choices=list(ALL_FORMAT_WRITERS),
help=(_('Format to use inside the pdb container. Choices are:') + ' %s' % sorted(ALL_FORMAT_WRITERS))),
help='Format to use inside the pdb container. Choices are: %s' %
sorted(ALL_FORMAT_WRITERS)),
OptionRecommendation(name='pdb_output_encoding', recommended_value='cp1252',
level=OptionRecommendation.LOW,
help=_('Specify the character encoding of the output document. '
'The default is cp1252. Note: This option is not honored by all '
'formats.')),
help='Specify the character encoding of the output document. '
'The default is cp1252. Note: This option is not honored by '
'all formats.'),
OptionRecommendation(name='inline_toc',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Add Table of Contents to beginning of the book.')),
help='Add Table of Contents to beginning of the book.'),
}
def convert(self, oeb_book, output_path, input_plugin, opts, log):

View File

@@ -19,13 +19,13 @@ class PDFInput(InputFormatPlugin):
options = {
OptionRecommendation(name='no_images', recommended_value=False,
help=_('Do not extract images from the document')),
help='Do not extract images from the document'),
OptionRecommendation(name='unwrap_factor', recommended_value=0.45,
help=_('Scale used to determine the length at which a line should '
help='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.45, just below the median line length.')),
'default is 0.45, just below the median line length.'),
OptionRecommendation(name='new_pdf_engine', recommended_value=False,
help=_('Use the new PDF conversion engine. Currently not operational.'))
help='Use the new PDF conversion engine. Currently not operational.')
}
def convert_new(self, stream, accelerators):

View File

@@ -29,114 +29,111 @@ class PDFOutput(OutputFormatPlugin):
options = {
OptionRecommendation(name='use_profile_size', recommended_value=False,
help=_('Instead of using the paper size specified in the PDF Output options,'
help='Instead of using the paper size specified in the PDF Output options,'
' use a paper size corresponding to the current output profile.'
' Useful if you want to generate a PDF for viewing on a specific device.')),
' Useful if you want to generate a PDF for viewing on a specific device.'),
OptionRecommendation(name='unit', recommended_value='inch',
level=OptionRecommendation.LOW, short_switch='u', choices=UNITS,
help=_('The unit of measure for page sizes. Default is inch. Choices '
help='The unit of measure for page sizes. Default is inch. Choices '
'are {} '
'Note: This does not override the unit for margins!').format(', '.join(UNITS))),
'Note: This does not override the unit for margins!'.format(', '.join(UNITS))),
OptionRecommendation(name='paper_size', recommended_value='letter',
level=OptionRecommendation.LOW, choices=PAPER_SIZES,
help=_('The size of the paper. This size will be overridden when a '
help='The size of the paper. This size will be overridden when a '
'non default output profile is used. Default is letter. Choices '
'are {}').format(', '.join(PAPER_SIZES))),
'are {}'.format(', '.join(PAPER_SIZES))),
OptionRecommendation(name='custom_size', recommended_value=None,
help=_('Custom size of the document. Use the form widthxheight '
help='Custom size of the document. Use the form widthxheight '
'e.g. `123x321` to specify the width and height. '
'This overrides any specified paper-size.')),
'This overrides any specified paper-size.'),
OptionRecommendation(name='preserve_cover_aspect_ratio',
recommended_value=False,
help=_('Preserve the aspect ratio of the cover, instead'
help='Preserve the aspect ratio of the cover, instead'
' of stretching it to fill the full first page of the'
' generated pdf.')),
' generated pdf.'),
OptionRecommendation(name='pdf_serif_family',
recommended_value='Times', help=_(
'The font family used to render serif fonts. Will work only if the font is available system-wide.')),
recommended_value='Times', help=
'The font family used to render serif fonts. Will work only if the font is available system-wide.'),
OptionRecommendation(name='pdf_sans_family',
recommended_value='Helvetica', help=_(
'The font family used to render sans-serif fonts. Will work only if the font is available system-wide.')),
recommended_value='Helvetica', help=
'The font family used to render sans-serif fonts. Will work only if the font is available system-wide.'),
OptionRecommendation(name='pdf_mono_family',
recommended_value='Courier', help=_(
'The font family used to render monospace fonts. Will work only if the font is available system-wide.')),
recommended_value='Courier', help=
'The font family used to render monospace fonts. Will work only if the font is available system-wide.'),
OptionRecommendation(name='pdf_standard_font', choices=ui_data['font_types'],
recommended_value='serif', help=_(
'The font family used to render monospace fonts')),
recommended_value='serif', help=
'The font family used to render monospace fonts'),
OptionRecommendation(name='pdf_default_font_size',
recommended_value=20, help=_(
'The default font size')),
OptionRecommendation(name='pdf_mono_font_size',
recommended_value=16, help=_(
'The default font size for monospaced text')),
recommended_value=20, help='The default font size'),
OptionRecommendation(name='pdf_mono_font_size', recommended_value=16,
help='The default font size for monospaced text'),
OptionRecommendation(name='pdf_hyphenate', recommended_value=False,
help=_('Break long words at the end of lines. This can give the text at the right margin a more even appearance.')),
help='Break long words at the end of lines. This can give the text at the right margin a more even appearance.'),
OptionRecommendation(name='pdf_mark_links', recommended_value=False,
help=_('Surround all links with a red box, useful for debugging.')),
help='Surround all links with a red box, useful for debugging.'),
OptionRecommendation(name='pdf_page_numbers', recommended_value=False,
help=_('Add page numbers to the bottom of every page in the generated PDF file. If you '
help='Add page numbers to the bottom of every page in the generated PDF file. If you '
'specify a footer template, it will take precedence '
'over this option.')),
'over this option.'),
OptionRecommendation(name='pdf_footer_template', recommended_value=None,
help=_('An HTML template used to generate %s on every page.'
' The strings _PAGENUM_, _TITLE_, _AUTHOR_ and _SECTION_ will be replaced by their current values.')%_('footers')),
help='An HTML template used to generate %s on every page.'
' The strings _PAGENUM_, _TITLE_, _AUTHOR_ and _SECTION_ will be replaced by their current values.' % 'footers'),
OptionRecommendation(name='pdf_header_template', recommended_value=None,
help=_('An HTML template used to generate %s on every page.'
' The strings _PAGENUM_, _TITLE_, _AUTHOR_ and _SECTION_ will be replaced by their current values.')%_('headers')),
help='An HTML template used to generate %s on every page.'
' The strings _PAGENUM_, _TITLE_, _AUTHOR_ and _SECTION_ will be replaced by their current values.' % 'headers'),
OptionRecommendation(name='pdf_add_toc', recommended_value=False,
help=_('Add a Table of Contents at the end of the PDF that lists page numbers. '
'Useful if you want to print out the PDF. If this PDF is intended for electronic use, use the PDF Outline instead.')),
help='Add a Table of Contents at the end of the PDF that lists page numbers. '
'Useful if you want to print out the PDF. If this PDF is intended for electronic use, use the PDF Outline instead.'),
OptionRecommendation(name='toc_title', recommended_value=None,
help=_('Title for generated table of contents.')
help='Title for generated table of contents.'
),
OptionRecommendation(name='pdf_page_margin_left', recommended_value=72.0,
level=OptionRecommendation.LOW,
help=_('The size of the left page margin, in pts. Default is 72pt.'
' Overrides the common left page margin setting.')
help='The size of the left page margin, in pts. Default is 72pt.'
' Overrides the common left page margin setting.'
),
OptionRecommendation(name='pdf_page_margin_top', recommended_value=72.0,
level=OptionRecommendation.LOW,
help=_('The size of the top page margin, in pts. Default is 72pt.'
' Overrides the common top page margin setting, unless set to zero.')
help='The size of the top page margin, in pts. Default is 72pt.'
' Overrides the common top page margin setting, unless set to zero.'
),
OptionRecommendation(name='pdf_page_margin_right', recommended_value=72.0,
level=OptionRecommendation.LOW,
help=_('The size of the right page margin, in pts. Default is 72pt.'
' Overrides the common right page margin setting, unless set to zero.')
help='The size of the right page margin, in pts. Default is 72pt.'
' Overrides the common right page margin setting, unless set to zero.'
),
OptionRecommendation(name='pdf_page_margin_bottom', recommended_value=72.0,
level=OptionRecommendation.LOW,
help=_('The size of the bottom page margin, in pts. Default is 72pt.'
' Overrides the common bottom page margin setting, unless set to zero.')
help='The size of the bottom page margin, in pts. Default is 72pt.'
' Overrides the common bottom page margin setting, unless set to zero.'
),
OptionRecommendation(name='pdf_use_document_margins', recommended_value=False,
help=_('Use the page margins specified in the input document via @page CSS rules.'
help='Use the page margins specified in the input document via @page CSS rules.'
' This will cause the margins specified in the conversion settings to be ignored.'
' If the document does not specify page margins, the conversion settings will be used as a fallback.')
' If the document does not specify page margins, the conversion settings will be used as a fallback.'
),
OptionRecommendation(name='pdf_page_number_map', recommended_value=None,
help=_('Adjust page numbers, as needed. Syntax is a JavaScript expression for the page number.'
' For example, "if (n < 3) 0; else n - 3;", where n is current page number.')
help='Adjust page numbers, as needed. Syntax is a JavaScript expression for the page number.'
' For example, "if (n < 3) 0; else n - 3;", where n is current page number.'
),
OptionRecommendation(name='uncompressed_pdf',
recommended_value=False, help=_(
'Generate an uncompressed PDF, useful for debugging.')
recommended_value=False, help=
'Generate an uncompressed PDF, useful for debugging.'
),
OptionRecommendation(name='pdf_odd_even_offset', recommended_value=0.0,
level=OptionRecommendation.LOW,
help=_(
help=
'Shift the text horizontally by the specified offset (in pts).'
' On odd numbered pages, it is shifted to the right and on even'
' numbered pages to the left. Use negative numbers for the opposite'
' effect. Note that this setting is ignored on pages where the margins'
' are smaller than the specified offset. Shifting is done by setting'
' the PDF CropBox, not all software respects the CropBox.'
)
),
)
}

View File

@@ -20,17 +20,17 @@ class PMLOutput(OutputFormatPlugin):
options = {
OptionRecommendation(name='pml_output_encoding', recommended_value='cp1252',
level=OptionRecommendation.LOW,
help=_('Specify the character encoding of the output document. '
'The default is cp1252.')),
help='Specify the character encoding of the output document. '
'The default is cp1252.'),
OptionRecommendation(name='inline_toc',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Add Table of Contents to beginning of the book.')),
help='Add Table of Contents to beginning of the book.'),
OptionRecommendation(name='full_image_depth',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Do not reduce the size or bit depth of images. Images '
help='Do not reduce the size or bit depth of images. Images '
'have their size and depth reduced by default to accommodate '
'applications that can not convert images on their '
'own such as Dropbook.')),
'own such as Dropbook.'),
}
def convert(self, oeb_book, output_path, input_plugin, opts, log):

View File

@@ -18,7 +18,7 @@ class RBOutput(OutputFormatPlugin):
options = {
OptionRecommendation(name='inline_toc',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Add Table of Contents to beginning of the book.'))}
help='Add Table of Contents to beginning of the book.')}
def convert(self, oeb_book, output_path, input_plugin, opts, log):
from ebook_converter.ebooks.rb.writer import RBWriter

View File

@@ -18,7 +18,7 @@ class RecipeInput(InputFormatPlugin):
name = 'Recipe Input'
author = 'Kovid Goyal'
description = _('Download periodical content from the internet')
description = 'Download periodical content from the internet'
file_types = {'recipe', 'downloaded_recipe'}
commit_name = 'recipe_input'
@@ -34,20 +34,19 @@ class RecipeInput(InputFormatPlugin):
options = {
OptionRecommendation(name='test', recommended_value=False,
help=_(
'Useful for recipe development. Forces'
' max_articles_per_feed to 2 and downloads at most 2 feeds.'
' You can change the number of feeds and articles by supplying optional arguments.'
' For example: --test 3 1 will download at most 3 feeds and only 1 article per feed.')),
help='Useful for recipe development. Forces max_articles_per_feed '
'to 2 and downloads at most 2 feeds. You can change the '
'number of feeds and articles by supplying optional '
'arguments. For example: --test 3 1 will download at most 3 '
'feeds and only 1 article per feed.'),
OptionRecommendation(name='username', recommended_value=None,
help=_('Username for sites that require a login to access '
'content.')),
help='Username for sites that require a login to access content.'),
OptionRecommendation(name='password', recommended_value=None,
help=_('Password for sites that require a login to access '
'content.')),
help='Password for sites that require a login to access content.'),
OptionRecommendation(name='dont_download_recipe',
recommended_value=False,
help=_('Do not download latest version of builtin recipes from the calibre server')),
help='Do not download latest version of builtin recipes from the '
'calibre server'),
OptionRecommendation(name='lrf', recommended_value=False,
help='Optimize fetching for subsequent conversion to LRF.'),
}

View File

@@ -49,7 +49,8 @@ class RTFInput(InputFormatPlugin):
options = {
OptionRecommendation(name='ignore_wmf', recommended_value=False,
help=_('Ignore WMF images instead of replacing them with a placeholder image.')),
help='Ignore WMF images instead of replacing them with a '
'placeholder image.'),
}
def generate_xml(self, stream):
@@ -259,8 +260,9 @@ class RTFInput(InputFormatPlugin):
xml = self.generate_xml(stream.name)
except RtfInvalidCodeException as e:
self.log.exception('Unable to parse RTF')
raise ValueError(_('This RTF file has a feature calibre does not '
'support. Convert it to HTML first and then try it.\n%s')%e)
raise ValueError('This RTF file has a feature calibre does not '
'support. Convert it to HTML first and then try '
'it.\n%s' % e)
d = glob.glob(os.path.join('*_rtf_pict_dir', 'picts.rtf'))
if d:
@@ -303,9 +305,9 @@ class RTFInput(InputFormatPlugin):
stream.seek(0)
mi = get_metadata(stream, 'rtf')
if not mi.title:
mi.title = _('Unknown')
mi.title = 'Unknown'
if not mi.authors:
mi.authors = [_('Unknown')]
mi.authors = ['Unknown']
opf = OPFCreator(os.getcwd(), mi)
opf.create_manifest([(u'index.xhtml', None)])
opf.create_spine([u'index.xhtml'])

View File

@@ -20,30 +20,30 @@ class SNBOutput(OutputFormatPlugin):
options = {
OptionRecommendation(name='snb_output_encoding', recommended_value='utf-8',
level=OptionRecommendation.LOW,
help=_('Specify the character encoding of the output document. '
'The default is utf-8.')),
help='Specify the character encoding of the output document. '
'The default is utf-8.'),
OptionRecommendation(name='snb_max_line_length',
recommended_value=0, level=OptionRecommendation.LOW,
help=_('The maximum number of characters per line. This splits on '
'the first space before the specified value. If no space is found '
'the line will be broken at the space after and will exceed the '
'specified value. Also, there is a minimum of 25 characters. '
'Use 0 to disable line splitting.')),
help='The maximum number of characters per line. This splits on '
'the first space before the specified value. If no space is '
'found the line will be broken at the space after and will '
'exceed the specified value. Also, there is a minimum of 25 '
'characters. Use 0 to disable line splitting.'),
OptionRecommendation(name='snb_insert_empty_line',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Specify whether or not to insert an empty line between '
'two paragraphs.')),
help='Specify whether or not to insert an empty line between two '
'paragraphs.'),
OptionRecommendation(name='snb_dont_indent_first_line',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Specify whether or not to insert two space characters '
'to indent the first line of each paragraph.')),
help='Specify whether or not to insert two space characters to '
'indent the first line of each paragraph.'),
OptionRecommendation(name='snb_hide_chapter_name',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Specify whether or not to hide the chapter title for each '
'chapter. Useful for image-only output (eg. comics).')),
help='Specify whether or not to hide the chapter title for each '
'chapter. Useful for image-only output (eg. comics).'),
OptionRecommendation(name='snb_full_screen',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Resize all the images for full screen view. ')),
help='Resize all the images for full screen view. '),
}
def convert(self, oeb_book, output_path, input_plugin, opts, log):
@@ -123,7 +123,7 @@ class SNBOutput(OutputFormatPlugin):
log.warn('This SNB file has no Table of Contents. '
'Creating a default TOC')
first = next(iter(oeb_book.spine))
oeb_book.toc.add(_('Start page'), first.href)
oeb_book.toc.add('Start page', first.href)
else:
first = next(iter(oeb_book.spine))
if oeb_book.toc[0].href != first.href:
@@ -133,9 +133,9 @@ class SNBOutput(OutputFormatPlugin):
# the tocInfoTree directly instead of modifying the toc
ch = etree.SubElement(tocBody, "chapter")
ch.set("src", ProcessFileName(first.href) + ".snbc")
ch.text = _('Cover pages')
ch.text = 'Cover pages'
outputFiles[first.href] = []
outputFiles[first.href].append(("", _("Cover pages")))
outputFiles[first.href].append(("", "Cover pages"))
for tocitem in oeb_book.toc:
if tocitem.href.find('#') != -1:
@@ -148,10 +148,12 @@ class SNBOutput(OutputFormatPlugin):
else:
outputFiles[item[0]] = []
if "" not in outputFiles[item[0]]:
outputFiles[item[0]].append(("", tocitem.title + _(" (Preface)")))
outputFiles[item[0]].append(("",
tocitem.title +
" (Preface)"))
ch = etree.SubElement(tocBody, "chapter")
ch.set("src", ProcessFileName(item[0]) + ".snbc")
ch.text = tocitem.title + _(" (Preface)")
ch.text = tocitem.title + " (Preface)"
outputFiles[item[0]].append((item[1], tocitem.title))
else:
if tocitem.href in outputFiles:
@@ -200,7 +202,8 @@ class SNBOutput(OutputFormatPlugin):
f.write(etree.tostring(oldTree, pretty_print=True, encoding='utf-8'))
else:
log.debug('Merge %s with last TOC item...' % item.href)
snbwriter.merge_content(oldTree, oeb_book, item, [('', _("Start"))], opts)
snbwriter.merge_content(oldTree, oeb_book, item,
[('', "Start")], opts)
# Output the last one if needed
log.debug('Output the last modified chapter again: %s' % lastName)

View File

@@ -19,8 +19,8 @@ class TCROutput(OutputFormatPlugin):
options = {
OptionRecommendation(name='tcr_output_encoding', recommended_value='utf-8',
level=OptionRecommendation.LOW,
help=_('Specify the character encoding of the output document. '
'The default is utf-8.'))}
help='Specify the character encoding of the output document. '
'The default is utf-8.')}
def convert(self, oeb_book, output_path, input_plugin, opts, log):
from ebook_converter.ebooks.txt.txtml import TXTMLizer

View File

@@ -9,23 +9,23 @@ __copyright__ = '2009, John Schember <john@nachtimwald.com>'
__docformat__ = 'restructuredtext en'
MD_EXTENSIONS = {
'abbr': _('Abbreviations'),
'admonition': _('Support admonitions'),
'attr_list': _('Add attribute to HTML tags'),
'codehilite': _('Add code highlighting via Pygments'),
'def_list': _('Definition lists'),
'extra': _('Enables various common extensions'),
'fenced_code': _('Alternative code block syntax'),
'footnotes': _('Footnotes'),
'legacy_attrs': _('Use legacy element attributes'),
'legacy_em': _('Use legacy underscore handling for connected words'),
'meta': _('Metadata in the document'),
'nl2br': _('Treat newlines as hard breaks'),
'sane_lists': _('Do not allow mixing list types'),
'smarty': _('Use markdown\'s internal smartypants parser'),
'tables': _('Support tables'),
'toc': _('Generate a table of contents'),
'wikilinks': _('Wiki style links'),
'abbr': 'Abbreviations',
'admonition': 'Support admonitions',
'attr_list': 'Add attribute to HTML tags',
'codehilite': 'Add code highlighting via Pygments',
'def_list': 'Definition lists',
'extra': 'Enables various common extensions',
'fenced_code': 'Alternative code block syntax',
'footnotes': 'Footnotes',
'legacy_attrs': 'Use legacy element attributes',
'legacy_em': 'Use legacy underscore handling for connected words',
'meta': 'Metadata in the document',
'nl2br': 'Treat newlines as hard breaks',
'sane_lists': 'Do not allow mixing list types',
'smarty': 'Use markdown\'s internal smartypants parser',
'tables': 'Support tables',
'toc': 'Generate a table of contents',
'wikilinks': 'Wiki style links',
}
@@ -39,57 +39,67 @@ class TXTInput(InputFormatPlugin):
ui_data = {
'md_extensions': MD_EXTENSIONS,
'paragraph_types': {
'auto': _('Try to auto detect paragraph type'),
'block': _('Treat a blank line as a paragraph break'),
'single': _('Assume every line is a paragraph'),
'print': _('Assume every line starting with 2+ spaces or a tab starts a paragraph'),
'unformatted': _('Most lines have hard line breaks, few/no blank lines or indents'),
'off': _('Don\'t modify the paragraph structure'),
'auto': 'Try to auto detect paragraph type',
'block': 'Treat a blank line as a paragraph break',
'single': 'Assume every line is a paragraph',
'print': 'Assume every line starting with 2+ spaces or a tab '
'starts a paragraph',
'unformatted': 'Most lines have hard line breaks, few/no blank '
'lines or indents',
'off': 'Don\'t modify the paragraph structure',
},
'formatting_types': {
'auto': _('Automatically decide which formatting processor to use'),
'plain': _('No formatting'),
'heuristic': _('Use heuristics to determine chapter headings, italics, etc.'),
'textile': _('Use the TexTile markup language'),
'markdown': _('Use the Markdown markup language')
'auto': 'Automatically decide which formatting processor to use',
'plain': 'No formatting',
'heuristic': 'Use heuristics to determine chapter headings, '
'italics, etc.',
'textile': 'Use the TexTile markup language',
'markdown': 'Use the Markdown markup language'
},
}
options = {
OptionRecommendation(name='formatting_type', recommended_value='auto',
choices=list(ui_data['formatting_types']),
help=_('Formatting used within the document.\n'
'* auto: {auto}\n'
'* plain: {plain}\n'
'* heuristic: {heuristic}\n'
'* textile: {textile}\n'
'* markdown: {markdown}\n'
'To learn more about markdown see {url}').format(
url='https://daringfireball.net/projects/markdown/', **ui_data['formatting_types'])
help='Formatting used within the document.\n'
'* auto: {auto}\n'
'* plain: {plain}\n'
'* heuristic: {heuristic}\n'
'* textile: {textile}\n'
'* markdown: {markdown}\n'
'To learn more about markdown see '
'{url}'.format(url='https://daringfireball.net/projects/'
'markdown/',
**ui_data['formatting_types'])
),
OptionRecommendation(name='paragraph_type', recommended_value='auto',
choices=list(ui_data['paragraph_types']),
help=_('Paragraph structure to assume. The value of "off" is useful for formatted documents such as Markdown or Textile. '
'Choices are:\n'
'* auto: {auto}\n'
'* block: {block}\n'
'* single: {single}\n'
'* print: {print}\n'
'* unformatted: {unformatted}\n'
'* off: {off}').format(**ui_data['paragraph_types'])
help='Paragraph structure to assume. The value of "off" is useful '
'for formatted documents such as Markdown or Textile. '
'Choices are:\n'
'* auto: {auto}\n'
'* block: {block}\n'
'* single: {single}\n'
'* print: {print}\n'
'* unformatted: {unformatted}\n'
'* off: {off}'.format(**ui_data['paragraph_types'])
),
OptionRecommendation(name='preserve_spaces', recommended_value=False,
help=_('Normally extra spaces are condensed into a single space. '
'With this option all spaces will be displayed.')),
help='Normally extra spaces are condensed into a single space. '
'With this option all spaces will be displayed.'),
OptionRecommendation(name='txt_in_remove_indents', recommended_value=False,
help=_('Normally extra space at the beginning of lines is retained. '
'With this option they will be removed.')),
OptionRecommendation(name="markdown_extensions", recommended_value='footnotes, tables, toc',
help=_('Enable extensions to markdown syntax. Extensions are formatting that is not part '
'of the standard markdown format. The extensions enabled by default: %default.\n'
'To learn more about markdown extensions, see {}\n'
'This should be a comma separated list of extensions to enable:\n'
).format('https://python-markdown.github.io/extensions/') + '\n'.join('* %s: %s' % (k, MD_EXTENSIONS[k]) for k in sorted(MD_EXTENSIONS))),
help='Normally extra space at the beginning of lines is retained. '
'With this option they will be removed.'),
OptionRecommendation(name="markdown_extensions",
recommended_value='footnotes, tables, toc',
help='Enable extensions to markdown syntax. Extensions are '
'formatting that is not part of the standard markdown '
'format. The extensions enabled by default: %default.\nTo '
'learn more about markdown extensions, see {}\nThis should '
'be a comma separated list of extensions to enable:'
'\n'.format('https://python-markdown.github.io/extensions/') +
'\n'.join('* %s: %s' % (k, MD_EXTENSIONS[k])
for k in sorted(MD_EXTENSIONS))),
}
def shift_file(self, fname, data):
@@ -301,5 +311,5 @@ class TXTInput(InputFormatPlugin):
for item in oeb.spine:
if hasattr(item.data, 'xpath'):
for title in item.data.xpath('//*[local-name()="title"]'):
if title.text == _('Unknown'):
if title.text == 'Unknown':
title.text = self.html_postprocess_title

View File

@@ -22,9 +22,9 @@ class TXTOutput(OutputFormatPlugin):
ui_data = {
'newline_types': NEWLINE_TYPES,
'formatting_types': {
'plain': _('Plain text'),
'markdown': _('Markdown formatted text'),
'textile': _('TexTile formatted text')
'plain': 'Plain text',
'markdown': 'Markdown formatted text',
'textile': 'TexTile formatted text'
},
}
@@ -32,52 +32,57 @@ class TXTOutput(OutputFormatPlugin):
OptionRecommendation(name='newline', recommended_value='system',
level=OptionRecommendation.LOW,
short_switch='n', choices=NEWLINE_TYPES,
help=_('Type of newline to use. Options are %s. Default is \'system\'. '
help='Type of newline to use. Options are %s. Default is \'system\'. '
'Use \'old_mac\' for compatibility with Mac OS 9 and earlier. '
'For macOS use \'unix\'. \'system\' will default to the newline '
'type used by this OS.') % sorted(NEWLINE_TYPES)),
'type used by this OS.' % sorted(NEWLINE_TYPES)),
OptionRecommendation(name='txt_output_encoding', recommended_value='utf-8',
level=OptionRecommendation.LOW,
help=_('Specify the character encoding of the output document. '
'The default is utf-8.')),
help='Specify the character encoding of the output document. '
'The default is utf-8.'),
OptionRecommendation(name='inline_toc',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Add Table of Contents to beginning of the book.')),
help='Add Table of Contents to beginning of the book.'),
OptionRecommendation(name='max_line_length',
recommended_value=0, level=OptionRecommendation.LOW,
help=_('The maximum number of characters per line. This splits on '
'the first space before the specified value. If no space is found '
'the line will be broken at the space after and will exceed the '
'specified value. Also, there is a minimum of 25 characters. '
'Use 0 to disable line splitting.')),
help='The maximum number of characters per line. This splits on '
'the first space before the specified value. If no space is '
'found the line will be broken at the space after and will '
'exceed the specified value. Also, there is a minimum of 25 '
'characters. Use 0 to disable line splitting.'),
OptionRecommendation(name='force_max_line_length',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Force splitting on the max-line-length value when no space '
'is present. Also allows max-line-length to be below the minimum')),
help='Force splitting on the max-line-length value when no space '
'is present. Also allows max-line-length to be below the '
'minimum'),
OptionRecommendation(name='txt_output_formatting',
recommended_value='plain',
choices=list(ui_data['formatting_types']),
help=_('Formatting used within the document.\n'
'* plain: {plain}\n'
'* markdown: {markdown}\n'
'* textile: {textile}').format(**ui_data['formatting_types'])),
help='Formatting used within the document.\n'
'* plain: {plain}\n'
'* markdown: {markdown}\n'
'* textile: {textile}'
''.format(**ui_data['formatting_types'])),
OptionRecommendation(name='keep_links',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Do not remove links within the document. This is only '
'useful when paired with a txt-output-formatting option that '
'is not none because links are always removed with plain text output.')),
help='Do not remove links within the document. This is only '
'useful when paired with a txt-output-formatting option that '
'is not none because links are always removed with plain '
'text output.'),
OptionRecommendation(name='keep_image_references',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Do not remove image references within the document. This is only '
'useful when paired with a txt-output-formatting option that '
'is not none because links are always removed with plain text output.')),
help='Do not remove image references within the document. This is '
'only useful when paired with a txt-output-formatting option '
'that is not none because links are always removed with '
'plain text output.'),
OptionRecommendation(name='keep_color',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Do not remove font color from output. This is only useful when '
'txt-output-formatting is set to textile. Textile is the only '
'formatting that supports setting font color. If this option is '
'not specified font color will not be set and default to the '
'color displayed by the reader (generally this is black).')),
help='Do not remove font color from output. This is only useful '
'when txt-output-formatting is set to textile. Textile is '
'the only formatting that supports setting font color. If '
'this option is not specified font color will not be set and '
'default to the color displayed by the reader (generally '
'this is black).')
}
def convert(self, oeb_book, output_path, input_plugin, opts, log):

View File

@@ -110,74 +110,70 @@ class Plumber(object):
OptionRecommendation(name='verbose',
recommended_value=0, level=OptionRecommendation.LOW,
short_switch='v',
help=_('Level of verbosity. Specify multiple times for greater '
'verbosity. Specifying it twice will result in full '
'verbosity, once medium verbosity and zero times least verbosity.')
help='Level of verbosity. Specify multiple times for greater '
'verbosity. Specifying it twice will result in full '
'verbosity, once medium verbosity and zero times least verbosity.'
),
OptionRecommendation(name='debug_pipeline',
recommended_value=None, level=OptionRecommendation.LOW,
short_switch='d',
help=_('Save the output from different stages of the conversion '
'pipeline to the specified '
'directory. Useful if you are unsure at which stage '
'of the conversion process a bug is occurring.')
help='Save the output from different stages of the conversion '
'pipeline to the specified '
'directory. Useful if you are unsure at which stage '
'of the conversion process a bug is occurring.'
),
OptionRecommendation(name='input_profile',
recommended_value='default', level=OptionRecommendation.LOW,
choices=[x.short_name for x in input_profiles()],
help=_('Specify the input profile. The input profile gives the '
'conversion system information on how to interpret '
'various information in the input document. For '
'example resolution dependent lengths (i.e. lengths in '
'pixels). Choices are:')+ ', '.join([
help='Specify the input profile. The input profile gives the '
'conversion system information on how to interpret '
'various information in the input document. For '
'example resolution dependent lengths (i.e. lengths in '
'pixels). Choices are:'+ ', '.join([
x.short_name for x in input_profiles()])
),
OptionRecommendation(name='output_profile',
recommended_value='default', level=OptionRecommendation.LOW,
choices=[x.short_name for x in output_profiles()],
help=_('Specify the output profile. The output profile '
'tells the conversion system how to optimize the '
'created document for the specified device (such as by resizing images for the device screen size). In some cases, '
'an output profile can be used to optimize the output for a particular device, but this is rarely necessary. '
'Choices are:') + ', '.join([
help='Specify the output profile. The output profile '
'tells the conversion system how to optimize the '
'created document for the specified device (such as by resizing images for the device screen size). In some cases, '
'an output profile can be used to optimize the output for a particular device, but this is rarely necessary. '
'Choices are:' + ', '.join([
x.short_name for x in output_profiles()])
),
OptionRecommendation(name='base_font_size',
recommended_value=0, level=OptionRecommendation.LOW,
help=_('The base font size in pts. All font sizes in the produced book '
help='The base font size in pts. All font sizes in the produced book '
'will be rescaled based on this size. By choosing a larger '
'size you can make the fonts in the output bigger and vice '
'versa. By default, when the value is zero, the base font size is chosen based on '
'the output profile you chose.'
)
),
OptionRecommendation(name='font_size_mapping',
recommended_value=None, level=OptionRecommendation.LOW,
help=_('Mapping from CSS font names to font sizes in pts. '
help='Mapping from CSS font names to font sizes in pts. '
'An example setting is 12,12,14,16,18,20,22,24. '
'These are the mappings for the sizes xx-small to xx-large, '
'with the final size being for huge fonts. The font '
'rescaling algorithm uses these sizes to intelligently '
'rescale fonts. The default is to use a mapping based on '
'the output profile you chose.'
)
),
OptionRecommendation(name='disable_font_rescaling',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Disable all rescaling of font sizes.'
)
help='Disable all rescaling of font sizes.'
),
OptionRecommendation(name='minimum_line_height',
recommended_value=120.0, level=OptionRecommendation.LOW,
help=_(
'The minimum line height, as a percentage of the element\'s '
help='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. '
@@ -185,134 +181,119 @@ OptionRecommendation(name='minimum_line_height',
'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.'
)
),
OptionRecommendation(name='line_height',
recommended_value=0, level=OptionRecommendation.LOW,
help=_(
'The line height in pts. Controls spacing between consecutive '
help='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.'
)
),
OptionRecommendation(name='embed_font_family',
recommended_value=None, level=OptionRecommendation.LOW,
help=_(
'Embed the specified font family into the book. This specifies '
help='Embed the specified font family into the book. This specifies '
'the "base" font used for the book. If the input document '
'specifies its own fonts, they may override this base font. '
'You can use the filter style information option to remove fonts from the '
'input document. Note that font embedding only works '
'with some output formats, principally EPUB, AZW3 and DOCX.')
'with some output formats, principally EPUB, AZW3 and DOCX.'
),
OptionRecommendation(name='embed_all_fonts',
recommended_value=False, level=OptionRecommendation.LOW,
help=_(
'Embed every font that is referenced in the input document '
help='Embed every font that is referenced in the input document '
'but not already embedded. This will search your system for the '
'fonts, and if found, they will be embedded. Embedding will only work '
'if the format you are converting to supports embedded fonts, such as '
'EPUB, AZW3, DOCX or PDF. Please ensure that you have the proper license for embedding '
'the fonts used in this document.'
)),
),
OptionRecommendation(name='subset_embedded_fonts',
recommended_value=False, level=OptionRecommendation.LOW,
help=_(
'Subset all embedded fonts. Every embedded font is reduced '
help='Subset all embedded fonts. Every embedded font is reduced '
'to contain only the glyphs used in this document. This decreases '
'the size of the font files. Useful if you are embedding a '
'particularly large font with lots of unused glyphs.')
'particularly large font with lots of unused glyphs.'
),
OptionRecommendation(name='linearize_tables',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Some badly designed documents use tables to control the '
help='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.'
)
),
OptionRecommendation(name='level1_toc',
recommended_value=None, level=OptionRecommendation.LOW,
help=_('XPath expression that specifies all tags that '
help='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.'
' See the XPath Tutorial in the calibre User Manual for examples.'
)
),
OptionRecommendation(name='level2_toc',
recommended_value=None, level=OptionRecommendation.LOW,
help=_('XPath expression that specifies all tags that should be '
help='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.'
' See the XPath Tutorial in the calibre User Manual for examples.'
)
),
OptionRecommendation(name='level3_toc',
recommended_value=None, level=OptionRecommendation.LOW,
help=_('XPath expression that specifies all tags that should be '
help='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.'
' See the XPath Tutorial in the calibre User Manual for examples.'
)
),
OptionRecommendation(name='use_auto_toc',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Normally, if the source file already has a Table of '
help='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.'
)
),
OptionRecommendation(name='no_chapters_in_toc',
recommended_value=False, level=OptionRecommendation.LOW,
help=_("Don't add auto-detected chapters to the Table of "
help="Don't add auto-detected chapters to the Table of "
'Contents.'
)
),
OptionRecommendation(name='toc_threshold',
recommended_value=6, level=OptionRecommendation.LOW,
help=_(
'If fewer than this number of chapters is detected, then links '
'are added to the Table of Contents. Default: %default')
help='If fewer than this number of chapters is detected, then links '
'are added to the Table of Contents. Default: %default'
),
OptionRecommendation(name='max_toc_links',
recommended_value=50, level=OptionRecommendation.LOW,
help=_('Maximum number of links to insert into the TOC. Set to 0 '
help='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.'
)
),
OptionRecommendation(name='toc_filter',
recommended_value=None, level=OptionRecommendation.LOW,
help=_('Remove entries from the Table of Contents whose titles '
help='Remove entries from the Table of Contents whose titles '
'match the specified regular expression. Matching entries and all '
'their children are removed.'
)
),
OptionRecommendation(name='duplicate_links_in_toc',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('When creating a TOC from links in the input document, '
help='When creating a TOC from links in the input document, '
'allow duplicate entries, i.e. allow more than one entry '
'with the same text, provided that they point to a '
'different location.')
'different location.'
),
@@ -320,7 +301,7 @@ OptionRecommendation(name='chapter',
recommended_value="//*[((name()='h1' or name()='h2') and "
r"re:test(., '\s*((chapter|book|section|part)\s+)|((prolog|prologue|epilogue)(\s+|$))', 'i')) or @class "
"= 'chapter']", level=OptionRecommendation.LOW,
help=_('An XPath expression to detect chapter titles. The default '
help='An XPath expression to detect chapter titles. The default '
'is to consider <h1> or <h2> tags that contain the words '
'"chapter", "book", "section", "prologue", "epilogue" or "part" as chapter titles as '
'well as any tags that have class="chapter". The expression '
@@ -328,390 +309,380 @@ OptionRecommendation(name='chapter',
'detection, use the expression "/". See the XPath Tutorial '
'in the calibre User Manual for further help on using this '
'feature.'
)
),
OptionRecommendation(name='chapter_mark',
recommended_value='pagebreak', level=OptionRecommendation.LOW,
choices=['pagebreak', 'rule', 'both', 'none'],
help=_('Specify how to mark detected chapters. A value of '
help='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.')
'to mark chapters.'
),
OptionRecommendation(name='start_reading_at',
recommended_value=None, level=OptionRecommendation.LOW,
help=_('An XPath expression to detect the location in the document'
help='An XPath expression to detect the location in the document'
' at which to start reading. Some e-book reading programs'
' (most prominently the Kindle) use this location as the'
' position at which to open the book. See the XPath tutorial'
' in the calibre User Manual for further help using this'
' feature.')
' feature.'
),
OptionRecommendation(name='extra_css',
recommended_value=None, level=OptionRecommendation.LOW,
help=_('Either the path to a CSS stylesheet or raw CSS. '
help='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.')
'rules.'
),
OptionRecommendation(name='transform_css_rules',
recommended_value=None, level=OptionRecommendation.LOW,
help=_('Rules for transforming the styles in this book. These'
' rules are applied after all other CSS processing is done.')
help='Rules for transforming the styles in this book. These'
' rules are applied after all other CSS processing is done.'
),
OptionRecommendation(name='filter_css',
recommended_value=None, level=OptionRecommendation.LOW,
help=_('A comma separated list of CSS properties that '
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')
'font-family,color,margin-left,margin-right'
),
OptionRecommendation(name='expand_css',
recommended_value=False, level=OptionRecommendation.LOW,
help=_(
'By default, calibre will use the shorthand form for various'
help='By default, calibre will use the shorthand form for various'
' CSS properties such as margin, padding, border, etc. This'
' option will cause it to use the full expanded form instead.'
' Note that CSS is always expanded when generating EPUB files'
' with the output profile set to one of the Nook profiles'
' as the Nook cannot handle shorthand CSS.')
' as the Nook cannot handle shorthand CSS.'
),
OptionRecommendation(name='page_breaks_before',
recommended_value="//*[name()='h1' or name()='h2']",
level=OptionRecommendation.LOW,
help=_('An XPath expression. Page breaks are inserted '
'before the specified elements. To disable use the expression: /')
help='An XPath expression. Page breaks are inserted '
'before the specified elements. To disable use the expression: /'
),
OptionRecommendation(name='remove_fake_margins',
recommended_value=True, level=OptionRecommendation.LOW,
help=_('Some documents specify page margins by '
help='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.')
'case you can disable the removal.'
),
OptionRecommendation(name='margin_top',
recommended_value=5.0, level=OptionRecommendation.LOW,
help=_('Set the top margin in pts. Default is %default. '
help='Set the top margin in pts. Default is %default. '
'Setting this to less than zero will cause no margin to be set '
'(the margin setting in the original document will be preserved). '
'Note: Page oriented formats such as PDF and DOCX have their own'
' margin settings that take precedence.')),
' margin settings that take precedence.'),
OptionRecommendation(name='margin_bottom',
recommended_value=5.0, level=OptionRecommendation.LOW,
help=_('Set the bottom margin in pts. Default is %default. '
help='Set the bottom margin in pts. Default is %default. '
'Setting this to less than zero will cause no margin to be set '
'(the margin setting in the original document will be preserved). '
'Note: Page oriented formats such as PDF and DOCX have their own'
' margin settings that take precedence.')),
' margin settings that take precedence.'),
OptionRecommendation(name='margin_left',
recommended_value=5.0, level=OptionRecommendation.LOW,
help=_('Set the left margin in pts. Default is %default. '
help='Set the left margin in pts. Default is %default. '
'Setting this to less than zero will cause no margin to be set '
'(the margin setting in the original document will be preserved). '
'Note: Page oriented formats such as PDF and DOCX have their own'
' margin settings that take precedence.')),
' margin settings that take precedence.'),
OptionRecommendation(name='margin_right',
recommended_value=5.0, level=OptionRecommendation.LOW,
help=_('Set the right margin in pts. Default is %default. '
help='Set the right margin in pts. Default is %default. '
'Setting this to less than zero will cause no margin to be set '
'(the margin setting in the original document will be preserved). '
'Note: Page oriented formats such as PDF and DOCX have their own'
' margin settings that take precedence.')),
' margin settings that take precedence.'),
OptionRecommendation(name='change_justification',
recommended_value='original', level=OptionRecommendation.LOW,
choices=['left','justify','original'],
help=_('Change text justification. A value of "left" converts all'
help='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.')),
'justification.'),
OptionRecommendation(name='remove_paragraph_spacing',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Remove spacing between paragraphs. Also sets an indent on '
help='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 (<p> or <div> tags).')
'if the source file does not use paragraphs (<p> or <div> tags).'
),
OptionRecommendation(name='remove_paragraph_spacing_indent_size',
recommended_value=1.5, level=OptionRecommendation.LOW,
help=_('When calibre removes blank lines between paragraphs, it automatically '
help='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.')
'document is used, that is, calibre does not change the indentation.'
),
OptionRecommendation(name='prefer_metadata_cover',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Use the cover detected from the source file in preference '
'to the specified cover.')
help='Use the cover detected from the source file in preference '
'to the specified cover.'
),
OptionRecommendation(name='insert_blank_line',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Insert a blank line between paragraphs. Will not work '
help='Insert a blank line between paragraphs. Will not work '
'if the source file does not use paragraphs (<p> or <div> tags).'
)
),
OptionRecommendation(name='insert_blank_line_size',
recommended_value=0.5, level=OptionRecommendation.LOW,
help=_('Set the height of the inserted blank lines (in em).'
help='Set the height of the inserted blank lines (in em).'
' The height of the lines between paragraphs will be twice the value'
' set here.')
' set here.'
),
OptionRecommendation(name='remove_first_image',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Remove the first image from the input e-book. Useful if the '
help='Remove the first image from the input e-book. 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.'
)
),
OptionRecommendation(name='insert_metadata',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Insert the book metadata at the start of '
help='Insert the book metadata at the start of '
'the book. This is useful if your e-book reader does not support '
'displaying/searching metadata directly.'
)
),
OptionRecommendation(name='smarten_punctuation',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Convert plain quotes, dashes and ellipsis to their '
help='Convert plain quotes, dashes and ellipsis to their '
'typographically correct equivalents. For details, see '
'https://daringfireball.net/projects/smartypants'
)
),
OptionRecommendation(name='unsmarten_punctuation',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Convert fancy quotes, dashes and ellipsis to their '
help='Convert fancy quotes, dashes and ellipsis to their '
'plain equivalents.'
)
),
OptionRecommendation(name='read_metadata_from_opf',
recommended_value=None, level=OptionRecommendation.LOW,
short_switch='m',
help=_('Read metadata from the specified OPF file. Metadata read '
help='Read metadata from the specified OPF file. Metadata read '
'from this file will override any metadata in the source '
'file.')
'file.'
),
OptionRecommendation(name='asciiize',
recommended_value=False, level=OptionRecommendation.LOW,
help=(_('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.')%
'\u041c\u0438\u0445\u0430\u0438\u043b '
'\u0413\u043e\u0440\u0431\u0430\u0447\u0451\u0432'
)
recommended_value=False, level=OptionRecommendation.LOW,
help='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.' %
'\u041c\u0438\u0445\u0430\u0438\u043b '
'\u0413\u043e\u0440\u0431\u0430\u0447\u0451\u0432'
),
OptionRecommendation(name='keep_ligatures',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Preserve ligatures present in the input document. '
help='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.')
'characters. This option will preserve them instead.'
),
OptionRecommendation(name='title',
recommended_value=None, level=OptionRecommendation.LOW,
help=_('Set the title.')),
help='Set the title.'),
OptionRecommendation(name='authors',
recommended_value=None, level=OptionRecommendation.LOW,
help=_('Set the authors. Multiple authors should be separated by '
'ampersands.')),
help='Set the authors. Multiple authors should be separated by '
'ampersands.'),
OptionRecommendation(name='title_sort',
recommended_value=None, level=OptionRecommendation.LOW,
help=_('The version of the title to be used for sorting. ')),
help='The version of the title to be used for sorting. '),
OptionRecommendation(name='author_sort',
recommended_value=None, level=OptionRecommendation.LOW,
help=_('String to be used when sorting by author. ')),
help='String to be used when sorting by author. '),
OptionRecommendation(name='cover',
recommended_value=None, level=OptionRecommendation.LOW,
help=_('Set the cover to the specified file or URL')),
help='Set the cover to the specified file or URL'),
OptionRecommendation(name='comments',
recommended_value=None, level=OptionRecommendation.LOW,
help=_('Set the e-book description.')),
help='Set the e-book description.'),
OptionRecommendation(name='publisher',
recommended_value=None, level=OptionRecommendation.LOW,
help=_('Set the e-book publisher.')),
help='Set the e-book publisher.'),
OptionRecommendation(name='series',
recommended_value=None, level=OptionRecommendation.LOW,
help=_('Set the series this e-book belongs to.')),
help='Set the series this e-book belongs to.'),
OptionRecommendation(name='series_index',
recommended_value=None, level=OptionRecommendation.LOW,
help=_('Set the index of the book in this series.')),
help='Set the index of the book in this series.'),
OptionRecommendation(name='rating',
recommended_value=None, level=OptionRecommendation.LOW,
help=_('Set the rating. Should be a number between 1 and 5.')),
help='Set the rating. Should be a number between 1 and 5.'),
OptionRecommendation(name='isbn',
recommended_value=None, level=OptionRecommendation.LOW,
help=_('Set the ISBN of the book.')),
help='Set the ISBN of the book.'),
OptionRecommendation(name='tags',
recommended_value=None, level=OptionRecommendation.LOW,
help=_('Set the tags for the book. Should be a comma separated list.')),
help='Set the tags for the book. Should be a comma separated list.'),
OptionRecommendation(name='book_producer',
recommended_value=None, level=OptionRecommendation.LOW,
help=_('Set the book producer.')),
help='Set the book producer.'),
OptionRecommendation(name='language',
recommended_value=None, level=OptionRecommendation.LOW,
help=_('Set the language.')),
help='Set the language.'),
OptionRecommendation(name='pubdate',
recommended_value=None, level=OptionRecommendation.LOW,
help=_('Set the publication date (assumed to be in the local timezone, unless the timezone is explicitly specified)')),
help='Set the publication date (assumed to be in the local timezone, unless the timezone is explicitly specified)'),
OptionRecommendation(name='timestamp',
recommended_value=None, level=OptionRecommendation.LOW,
help=_('Set the book timestamp (no longer used anywhere)')),
help='Set the book timestamp (no longer used anywhere)'),
OptionRecommendation(name='enable_heuristics',
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Enable heuristic processing. This option must be set for any '
'heuristic processing to take place.')),
help='Enable heuristic processing. This option must be set for any '
'heuristic processing to take place.'),
OptionRecommendation(name='markup_chapter_headings',
recommended_value=True, level=OptionRecommendation.LOW,
help=_('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.')),
help='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.'),
OptionRecommendation(name='italicize_common_cases',
recommended_value=True, level=OptionRecommendation.LOW,
help=_('Look for common words and patterns that denote '
'italics and italicize them.')),
help='Look for common words and patterns that denote '
'italics and italicize them.'),
OptionRecommendation(name='fix_indents',
recommended_value=True, level=OptionRecommendation.LOW,
help=_('Turn indentation created from multiple non-breaking space entities '
'into CSS indents.')),
help='Turn indentation created from multiple non-breaking space entities '
'into CSS indents.'),
OptionRecommendation(name='html_unwrap_factor',
recommended_value=0.40, level=OptionRecommendation.LOW,
help=_('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')),
help='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'),
OptionRecommendation(name='unwrap_lines',
recommended_value=True, level=OptionRecommendation.LOW,
help=_('Unwrap lines using punctuation and other formatting clues.')),
help='Unwrap lines using punctuation and other formatting clues.'),
OptionRecommendation(name='delete_blank_paragraphs',
recommended_value=True, level=OptionRecommendation.LOW,
help=_('Remove empty paragraphs from the document when they exist between '
'every other paragraph')),
help='Remove empty paragraphs from the document when they exist between '
'every other paragraph'),
OptionRecommendation(name='format_scene_breaks',
recommended_value=True, level=OptionRecommendation.LOW,
help=_('Left aligned scene break markers are center aligned. '
'Replace soft scene breaks that use multiple blank lines with '
'horizontal rules.')),
help='Left aligned scene break markers are center aligned. Replace soft '
'scene breaks that use multiple blank lines with horizontal rules.'),
OptionRecommendation(name='replace_scene_breaks',
recommended_value='', level=OptionRecommendation.LOW,
help=_('Replace scene breaks with the specified text. By default, the '
'text from the input document is used.')),
help='Replace scene breaks with the specified text. By default, the text '
'from the input document is used.'),
OptionRecommendation(name='dehyphenate',
recommended_value=True, level=OptionRecommendation.LOW,
help=_('Analyze hyphenated words throughout the document. The '
'document itself is used as a dictionary to determine whether hyphens '
'should be retained or removed.')),
help='Analyze hyphenated words throughout the document. The document '
'itself is used as a dictionary to determine whether hyphens should '
'be retained or removed.'),
OptionRecommendation(name='renumber_headings',
recommended_value=True, level=OptionRecommendation.LOW,
help=_('Looks for occurrences of sequential <h1> or <h2> tags. '
'The tags are renumbered to prevent splitting in the middle '
'of chapter headings.')),
help='Looks for occurrences of sequential <h1> or <h2> tags. The tags are '
'renumbered to prevent splitting in the middle of chapter headings.'),
OptionRecommendation(name='sr1_search',
recommended_value='', level=OptionRecommendation.LOW,
help=_('Search pattern (regular expression) to be replaced with '
'sr1-replace.')),
help='Search pattern (regular expression) to be replaced with '
'sr1-replace.'),
OptionRecommendation(name='sr1_replace',
recommended_value='', level=OptionRecommendation.LOW,
help=_('Replacement to replace the text found with sr1-search.')),
help='Replacement to replace the text found with sr1-search.'),
OptionRecommendation(name='sr2_search',
recommended_value='', level=OptionRecommendation.LOW,
help=_('Search pattern (regular expression) to be replaced with '
'sr2-replace.')),
help='Search pattern (regular expression) to be replaced with '
'sr2-replace.'),
OptionRecommendation(name='sr2_replace',
recommended_value='', level=OptionRecommendation.LOW,
help=_('Replacement to replace the text found with sr2-search.')),
help='Replacement to replace the text found with sr2-search.'),
OptionRecommendation(name='sr3_search',
recommended_value='', level=OptionRecommendation.LOW,
help=_('Search pattern (regular expression) to be replaced with '
'sr3-replace.')),
help='Search pattern (regular expression) to be replaced with '
'sr3-replace.'),
OptionRecommendation(name='sr3_replace',
recommended_value='', level=OptionRecommendation.LOW,
help=_('Replacement to replace the text found with sr3-search.')),
help='Replacement to replace the text found with sr3-search.'),
OptionRecommendation(name='search_replace',
recommended_value=None, level=OptionRecommendation.LOW, help=_(
'Path to a file containing search and replace regular expressions. '
'The file must contain alternating lines of regular expression '
'followed by replacement pattern (which can be an empty line). '
'The regular expression must be in the Python regex syntax and '
'the file must be UTF-8 encoded.')),
recommended_value=None, level=OptionRecommendation.LOW,
help='Path to a file containing search and replace regular expressions. '
'The file must contain alternating lines of regular expression '
'followed by replacement pattern (which can be an empty line). '
'The regular expression must be in the Python regex syntax and '
'the file must be UTF-8 encoded.'),
]
# }}}
@@ -818,7 +789,7 @@ OptionRecommendation(name='search_replace',
html_pat = re.compile(r'\.(x){0,1}htm(l){0,1}$', re.IGNORECASE)
html_files = [f for f in files if html_pat.search(f) is not None]
if not html_files:
raise ValueError(_('Could not find an e-book inside the archive'))
raise ValueError('Could not find an e-book inside the archive')
html_files = [(f, os.stat(f).st_size) for f in html_files]
html_files.sort(key=lambda x: x[1])
html_files = [f[0] for f in html_files]
@@ -908,14 +879,14 @@ OptionRecommendation(name='search_replace',
try:
val = float(val)
except ValueError:
self.log.warn(_('Values of series index and rating must'
' be numbers. Ignoring'), val)
self.log.warn('Values of series index and rating must'
' be numbers. Ignoring', val)
continue
elif x in ('timestamp', 'pubdate'):
try:
val = parse_date(val, assume_utc=x=='timestamp')
except:
self.log.exception(_('Failed to parse date/time') + ' ' + str(val))
self.log.exception('Failed to parse date/time %s', val)
continue
setattr(mi, x, val)
@@ -1095,7 +1066,7 @@ OptionRecommendation(name='search_replace',
self.flush()
return
self.ui_reporter(0.01, _('Converting input to HTML...'))
self.ui_reporter(0.01, 'Converting input to HTML...')
ir = CompositeProgressReporter(0.01, 0.34, self.ui_reporter)
self.input_plugin.report_progress = ir
if self.for_regex_wizard:
@@ -1129,7 +1100,7 @@ OptionRecommendation(name='search_replace',
self.input_plugin.specialize(self.oeb, self.opts, self.log,
self.output_fmt)
pr(0., _('Running transforms on e-book...'))
pr(0., 'Running transforms on e-book...')
self.oeb.plumber_output_format = self.output_fmt or ''
@@ -1266,7 +1237,7 @@ OptionRecommendation(name='search_replace',
self.log.info('Creating %s...'%self.output_plugin.name)
our = CompositeProgressReporter(0.67, 1., self.ui_reporter)
self.output_plugin.report_progress = our
our(0., _('Running %s plugin')%self.output_plugin.name)
our(0., 'Running %s plugin' % self.output_plugin.name)
with self.output_plugin:
self.output_plugin.convert(self.oeb, self.output, self.input_plugin,
self.opts, self.log)