mirror of
https://github.com/gryf/ebook-converter.git
synced 2025-12-29 04:52:26 +01:00
Here is the first batch of modules, which are needed for converting several formats to LRF. Some of the logic has been change, more cleanups will follow.
874 lines
26 KiB
Python
874 lines
26 KiB
Python
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
|
|
from __future__ import absolute_import, division, print_function, unicode_literals
|
|
__license__ = 'GPL 3'
|
|
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
|
|
__docformat__ = 'restructuredtext en'
|
|
|
|
from ebook_converter.customize import Plugin as _Plugin
|
|
from ebook_converter.polyglot.builtins import zip
|
|
|
|
FONT_SIZES = [('xx-small', 1),
|
|
('x-small', None),
|
|
('small', 2),
|
|
('medium', 3),
|
|
('large', 4),
|
|
('x-large', 5),
|
|
('xx-large', 6),
|
|
(None, 7)]
|
|
|
|
|
|
class Plugin(_Plugin):
|
|
|
|
fbase = 12
|
|
fsizes = [5, 7, 9, 12, 13.5, 17, 20, 22, 24]
|
|
screen_size = (1600, 1200)
|
|
dpi = 100
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
_Plugin.__init__(self, *args, **kwargs)
|
|
self.width, self.height = self.screen_size
|
|
fsizes = list(self.fsizes)
|
|
self.fkey = list(self.fsizes)
|
|
self.fsizes = []
|
|
for (name, num), size in zip(FONT_SIZES, fsizes):
|
|
self.fsizes.append((name, num, float(size)))
|
|
self.fnames = dict((name, sz) for name, _, sz in self.fsizes if name)
|
|
self.fnums = dict((num, sz) for _, num, sz in self.fsizes if num)
|
|
self.width_pts = self.width * 72./self.dpi
|
|
self.height_pts = self.height * 72./self.dpi
|
|
|
|
# Input profiles {{{
|
|
|
|
|
|
class InputProfile(Plugin):
|
|
|
|
author = 'Kovid Goyal'
|
|
supported_platforms = {'windows', 'osx', 'linux'}
|
|
can_be_disabled = False
|
|
type = _('Input profile')
|
|
|
|
name = 'Default Input Profile'
|
|
short_name = 'default' # Used in the CLI so dont use spaces etc. in it
|
|
description = _('This profile tries to provide sane defaults and is useful '
|
|
'if you know nothing about the input document.')
|
|
|
|
|
|
class SonyReaderInput(InputProfile):
|
|
|
|
name = 'Sony Reader'
|
|
short_name = 'sony'
|
|
description = _('This profile is intended for the SONY PRS line. '
|
|
'The 500/505/600/700 etc.')
|
|
|
|
screen_size = (584, 754)
|
|
dpi = 168.451
|
|
fbase = 12
|
|
fsizes = [7.5, 9, 10, 12, 15.5, 20, 22, 24]
|
|
|
|
|
|
class SonyReader300Input(SonyReaderInput):
|
|
|
|
name = 'Sony Reader 300'
|
|
short_name = 'sony300'
|
|
description = _('This profile is intended for the SONY PRS 300.')
|
|
|
|
dpi = 200
|
|
|
|
|
|
class SonyReader900Input(SonyReaderInput):
|
|
|
|
author = 'John Schember'
|
|
name = 'Sony Reader 900'
|
|
short_name = 'sony900'
|
|
description = _('This profile is intended for the SONY PRS-900.')
|
|
|
|
screen_size = (584, 978)
|
|
|
|
|
|
class MSReaderInput(InputProfile):
|
|
|
|
name = 'Microsoft Reader'
|
|
short_name = 'msreader'
|
|
description = _('This profile is intended for the Microsoft Reader.')
|
|
|
|
screen_size = (480, 652)
|
|
dpi = 96
|
|
fbase = 13
|
|
fsizes = [10, 11, 13, 16, 18, 20, 22, 26]
|
|
|
|
|
|
class MobipocketInput(InputProfile):
|
|
|
|
name = 'Mobipocket Books'
|
|
short_name = 'mobipocket'
|
|
description = _('This profile is intended for the Mobipocket books.')
|
|
|
|
# Unfortunately MOBI books are not narrowly targeted, so this information is
|
|
# quite likely to be spurious
|
|
screen_size = (600, 800)
|
|
dpi = 96
|
|
fbase = 18
|
|
fsizes = [14, 14, 16, 18, 20, 22, 24, 26]
|
|
|
|
|
|
class HanlinV3Input(InputProfile):
|
|
|
|
name = 'Hanlin V3'
|
|
short_name = 'hanlinv3'
|
|
description = _('This profile is intended for the Hanlin V3 and its clones.')
|
|
|
|
# Screen size is a best guess
|
|
screen_size = (584, 754)
|
|
dpi = 168.451
|
|
fbase = 16
|
|
fsizes = [12, 12, 14, 16, 18, 20, 22, 24]
|
|
|
|
|
|
class HanlinV5Input(HanlinV3Input):
|
|
|
|
name = 'Hanlin V5'
|
|
short_name = 'hanlinv5'
|
|
description = _('This profile is intended for the Hanlin V5 and its clones.')
|
|
|
|
# Screen size is a best guess
|
|
screen_size = (584, 754)
|
|
dpi = 200
|
|
|
|
|
|
class CybookG3Input(InputProfile):
|
|
|
|
name = 'Cybook G3'
|
|
short_name = 'cybookg3'
|
|
description = _('This profile is intended for the Cybook G3.')
|
|
|
|
# Screen size is a best guess
|
|
screen_size = (600, 800)
|
|
dpi = 168.451
|
|
fbase = 16
|
|
fsizes = [12, 12, 14, 16, 18, 20, 22, 24]
|
|
|
|
|
|
class CybookOpusInput(InputProfile):
|
|
|
|
author = 'John Schember'
|
|
name = 'Cybook Opus'
|
|
short_name = 'cybook_opus'
|
|
description = _('This profile is intended for the Cybook Opus.')
|
|
|
|
# Screen size is a best guess
|
|
screen_size = (600, 800)
|
|
dpi = 200
|
|
fbase = 16
|
|
fsizes = [12, 12, 14, 16, 18, 20, 22, 24]
|
|
|
|
|
|
class KindleInput(InputProfile):
|
|
|
|
name = 'Kindle'
|
|
short_name = 'kindle'
|
|
description = _('This profile is intended for the Amazon Kindle.')
|
|
|
|
# Screen size is a best guess
|
|
screen_size = (525, 640)
|
|
dpi = 168.451
|
|
fbase = 16
|
|
fsizes = [12, 12, 14, 16, 18, 20, 22, 24]
|
|
|
|
|
|
class IlliadInput(InputProfile):
|
|
|
|
name = 'Illiad'
|
|
short_name = 'illiad'
|
|
description = _('This profile is intended for the Irex Illiad.')
|
|
|
|
screen_size = (760, 925)
|
|
dpi = 160.0
|
|
fbase = 12
|
|
fsizes = [7.5, 9, 10, 12, 15.5, 20, 22, 24]
|
|
|
|
|
|
class IRexDR1000Input(InputProfile):
|
|
|
|
author = 'John Schember'
|
|
name = 'IRex Digital Reader 1000'
|
|
short_name = 'irexdr1000'
|
|
description = _('This profile is intended for the IRex Digital Reader 1000.')
|
|
|
|
# Screen size is a best guess
|
|
screen_size = (1024, 1280)
|
|
dpi = 160
|
|
fbase = 16
|
|
fsizes = [12, 14, 16, 18, 20, 22, 24]
|
|
|
|
|
|
class IRexDR800Input(InputProfile):
|
|
|
|
author = 'Eric Cronin'
|
|
name = 'IRex Digital Reader 800'
|
|
short_name = 'irexdr800'
|
|
description = _('This profile is intended for the IRex Digital Reader 800.')
|
|
|
|
screen_size = (768, 1024)
|
|
dpi = 160
|
|
fbase = 16
|
|
fsizes = [12, 14, 16, 18, 20, 22, 24]
|
|
|
|
|
|
class NookInput(InputProfile):
|
|
|
|
author = 'John Schember'
|
|
name = 'Nook'
|
|
short_name = 'nook'
|
|
description = _('This profile is intended for the B&N Nook.')
|
|
|
|
# Screen size is a best guess
|
|
screen_size = (600, 800)
|
|
dpi = 167
|
|
fbase = 16
|
|
fsizes = [12, 12, 14, 16, 18, 20, 22, 24]
|
|
|
|
|
|
input_profiles = [InputProfile, SonyReaderInput, SonyReader300Input,
|
|
SonyReader900Input, MSReaderInput, MobipocketInput, HanlinV3Input,
|
|
HanlinV5Input, CybookG3Input, CybookOpusInput, KindleInput, IlliadInput,
|
|
IRexDR1000Input, IRexDR800Input, NookInput]
|
|
|
|
input_profiles.sort(key=lambda x: x.name.lower())
|
|
|
|
# }}}
|
|
|
|
|
|
class OutputProfile(Plugin):
|
|
|
|
author = 'Kovid Goyal'
|
|
supported_platforms = {'windows', 'osx', 'linux'}
|
|
can_be_disabled = False
|
|
type = _('Output profile')
|
|
|
|
name = 'Default Output Profile'
|
|
short_name = 'default' # Used in the CLI so dont use spaces etc. in it
|
|
description = _('This profile tries to provide sane defaults and is useful '
|
|
'if you want to produce a document intended to be read at a '
|
|
'computer or on a range of devices.')
|
|
|
|
#: The image size for comics
|
|
comic_screen_size = (584, 754)
|
|
|
|
#: If True the MOBI renderer on the device supports MOBI indexing
|
|
supports_mobi_indexing = False
|
|
|
|
#: If True output should be optimized for a touchscreen interface
|
|
touchscreen = False
|
|
touchscreen_news_css = ''
|
|
#: A list of extra (beyond CSS 2.1) modules supported by the device
|
|
#: Format is a css_parser profile dictionary (see iPad for example)
|
|
extra_css_modules = []
|
|
#: If True, the date is appended to the title of downloaded news
|
|
periodical_date_in_title = True
|
|
|
|
#: Characters used in jackets and catalogs
|
|
ratings_char = '*'
|
|
empty_ratings_char = ' '
|
|
|
|
#: Unsupported unicode characters to be replaced during preprocessing
|
|
unsupported_unicode_chars = []
|
|
|
|
#: Number of ems that the left margin of a blockquote is rendered as
|
|
mobi_ems_per_blockquote = 1.0
|
|
|
|
#: Special periodical formatting needed in EPUB
|
|
epub_periodical_format = None
|
|
|
|
|
|
class iPadOutput(OutputProfile):
|
|
|
|
name = 'iPad'
|
|
short_name = 'ipad'
|
|
description = _('Intended for the iPad and similar devices with a '
|
|
'resolution of 768x1024')
|
|
screen_size = (768, 1024)
|
|
comic_screen_size = (768, 1024)
|
|
dpi = 132.0
|
|
extra_css_modules = [
|
|
{
|
|
'name':'webkit',
|
|
'props': {'-webkit-border-bottom-left-radius':'{length}',
|
|
'-webkit-border-bottom-right-radius':'{length}',
|
|
'-webkit-border-top-left-radius':'{length}',
|
|
'-webkit-border-top-right-radius':'{length}',
|
|
'-webkit-border-radius': r'{border-width}(\s+{border-width}){0,3}|inherit',
|
|
},
|
|
'macros': {'border-width': '{length}|medium|thick|thin'}
|
|
}
|
|
]
|
|
|
|
ratings_char = '\u2605' # filled star
|
|
empty_ratings_char = '\u2606' # hollow star
|
|
|
|
touchscreen = True
|
|
# touchscreen_news_css {{{
|
|
touchscreen_news_css = '''
|
|
/* hr used in articles */
|
|
.article_articles_list {
|
|
width:18%;
|
|
}
|
|
.article_link {
|
|
color: #593f29;
|
|
font-style: italic;
|
|
}
|
|
.article_next {
|
|
-webkit-border-top-right-radius:4px;
|
|
-webkit-border-bottom-right-radius:4px;
|
|
font-style: italic;
|
|
width:32%;
|
|
}
|
|
|
|
.article_prev {
|
|
-webkit-border-top-left-radius:4px;
|
|
-webkit-border-bottom-left-radius:4px;
|
|
font-style: italic;
|
|
width:32%;
|
|
}
|
|
.article_sections_list {
|
|
width:18%;
|
|
}
|
|
.articles_link {
|
|
font-weight: bold;
|
|
}
|
|
.sections_link {
|
|
font-weight: bold;
|
|
}
|
|
|
|
|
|
.caption_divider {
|
|
border:#ccc 1px solid;
|
|
}
|
|
|
|
.touchscreen_navbar {
|
|
background:#c3bab2;
|
|
border:#ccc 0px solid;
|
|
border-collapse:separate;
|
|
border-spacing:1px;
|
|
margin-left: 5%;
|
|
margin-right: 5%;
|
|
page-break-inside:avoid;
|
|
width: 90%;
|
|
-webkit-border-radius:4px;
|
|
}
|
|
.touchscreen_navbar td {
|
|
background:#fff;
|
|
font-family:Helvetica;
|
|
font-size:80%;
|
|
/* UI touchboxes use 8px padding */
|
|
padding: 6px;
|
|
text-align:center;
|
|
}
|
|
|
|
.touchscreen_navbar td a:link {
|
|
color: #593f29;
|
|
text-decoration: none;
|
|
}
|
|
|
|
/* Index formatting */
|
|
.publish_date {
|
|
text-align:center;
|
|
}
|
|
.divider {
|
|
border-bottom:1em solid white;
|
|
border-top:1px solid gray;
|
|
}
|
|
|
|
hr.caption_divider {
|
|
border-color:black;
|
|
border-style:solid;
|
|
border-width:1px;
|
|
}
|
|
|
|
/* Feed summary formatting */
|
|
.article_summary {
|
|
display:inline-block;
|
|
padding-bottom:0.5em;
|
|
}
|
|
.feed {
|
|
font-family:sans-serif;
|
|
font-weight:bold;
|
|
font-size:larger;
|
|
}
|
|
|
|
.feed_link {
|
|
font-style: italic;
|
|
}
|
|
|
|
.feed_next {
|
|
-webkit-border-top-right-radius:4px;
|
|
-webkit-border-bottom-right-radius:4px;
|
|
font-style: italic;
|
|
width:40%;
|
|
}
|
|
|
|
.feed_prev {
|
|
-webkit-border-top-left-radius:4px;
|
|
-webkit-border-bottom-left-radius:4px;
|
|
font-style: italic;
|
|
width:40%;
|
|
}
|
|
|
|
.feed_title {
|
|
text-align: center;
|
|
font-size: 160%;
|
|
}
|
|
|
|
.feed_up {
|
|
font-weight: bold;
|
|
width:20%;
|
|
}
|
|
|
|
.summary_headline {
|
|
font-weight:bold;
|
|
text-align:left;
|
|
}
|
|
|
|
.summary_byline {
|
|
text-align:left;
|
|
font-family:monospace;
|
|
}
|
|
|
|
.summary_text {
|
|
text-align:left;
|
|
}
|
|
|
|
'''
|
|
# }}}
|
|
|
|
|
|
class iPad3Output(iPadOutput):
|
|
|
|
screen_size = comic_screen_size = (2048, 1536)
|
|
dpi = 264.0
|
|
name = 'iPad 3'
|
|
short_name = 'ipad3'
|
|
description = _('Intended for the iPad 3 and similar devices with a '
|
|
'resolution of 1536x2048')
|
|
|
|
|
|
class TabletOutput(iPadOutput):
|
|
name = 'Tablet'
|
|
short_name = 'tablet'
|
|
description = _('Intended for generic tablet devices, does no resizing of images')
|
|
|
|
screen_size = (10000, 10000)
|
|
comic_screen_size = (10000, 10000)
|
|
|
|
|
|
class SamsungGalaxy(TabletOutput):
|
|
name = 'Samsung Galaxy'
|
|
short_name = 'galaxy'
|
|
description = _('Intended for the Samsung Galaxy and similar tablet devices with '
|
|
'a resolution of 600x1280')
|
|
screen_size = comic_screen_size = (600, 1280)
|
|
|
|
|
|
class NookHD(TabletOutput):
|
|
name = 'Nook HD+'
|
|
short_name = 'nook_hd_plus'
|
|
description = _('Intended for the Nook HD+ and similar tablet devices with '
|
|
'a resolution of 1280x1920')
|
|
screen_size = comic_screen_size = (1280, 1920)
|
|
|
|
|
|
class SonyReaderOutput(OutputProfile):
|
|
|
|
name = 'Sony Reader'
|
|
short_name = 'sony'
|
|
description = _('This profile is intended for the SONY PRS line. '
|
|
'The 500/505/600/700 etc.')
|
|
|
|
screen_size = (590, 775)
|
|
dpi = 168.451
|
|
fbase = 12
|
|
fsizes = [7.5, 9, 10, 12, 15.5, 20, 22, 24]
|
|
unsupported_unicode_chars = [u'\u201f', u'\u201b']
|
|
|
|
epub_periodical_format = 'sony'
|
|
# periodical_date_in_title = False
|
|
|
|
|
|
class KoboReaderOutput(OutputProfile):
|
|
|
|
name = 'Kobo Reader'
|
|
short_name = 'kobo'
|
|
|
|
description = _('This profile is intended for the Kobo Reader.')
|
|
|
|
screen_size = (536, 710)
|
|
comic_screen_size = (536, 710)
|
|
dpi = 168.451
|
|
fbase = 12
|
|
fsizes = [7.5, 9, 10, 12, 15.5, 20, 22, 24]
|
|
|
|
|
|
class SonyReader300Output(SonyReaderOutput):
|
|
|
|
author = 'John Schember'
|
|
name = 'Sony Reader 300'
|
|
short_name = 'sony300'
|
|
description = _('This profile is intended for the SONY PRS-300.')
|
|
|
|
dpi = 200
|
|
|
|
|
|
class SonyReader900Output(SonyReaderOutput):
|
|
|
|
author = 'John Schember'
|
|
name = 'Sony Reader 900'
|
|
short_name = 'sony900'
|
|
description = _('This profile is intended for the SONY PRS-900.')
|
|
|
|
screen_size = (600, 999)
|
|
comic_screen_size = screen_size
|
|
|
|
|
|
class SonyReaderT3Output(SonyReaderOutput):
|
|
|
|
author = 'Kovid Goyal'
|
|
name = 'Sony Reader T3'
|
|
short_name = 'sonyt3'
|
|
description = _('This profile is intended for the SONY PRS-T3.')
|
|
|
|
screen_size = (758, 934)
|
|
comic_screen_size = screen_size
|
|
|
|
|
|
class GenericEink(SonyReaderOutput):
|
|
|
|
name = 'Generic e-ink'
|
|
short_name = 'generic_eink'
|
|
description = _('Suitable for use with any e-ink device')
|
|
epub_periodical_format = None
|
|
|
|
|
|
class GenericEinkLarge(GenericEink):
|
|
|
|
name = 'Generic e-ink large'
|
|
short_name = 'generic_eink_large'
|
|
description = _('Suitable for use with any large screen e-ink device')
|
|
|
|
screen_size = (600, 999)
|
|
comic_screen_size = screen_size
|
|
|
|
|
|
class GenericEinkHD(GenericEink):
|
|
|
|
name = 'Generic e-ink HD'
|
|
short_name = 'generic_eink_hd'
|
|
description = _('Suitable for use with any modern high resolution e-ink device')
|
|
|
|
screen_size = (10000, 10000)
|
|
comic_screen_size = (10000, 10000)
|
|
|
|
|
|
class JetBook5Output(OutputProfile):
|
|
|
|
name = 'JetBook 5-inch'
|
|
short_name = 'jetbook5'
|
|
description = _('This profile is intended for the 5-inch JetBook.')
|
|
|
|
screen_size = (480, 640)
|
|
dpi = 168.451
|
|
|
|
|
|
class SonyReaderLandscapeOutput(SonyReaderOutput):
|
|
|
|
name = 'Sony Reader Landscape'
|
|
short_name = 'sony-landscape'
|
|
description = _('This profile is intended for the SONY PRS line. '
|
|
'The 500/505/700 etc, in landscape mode. Mainly useful '
|
|
'for comics.')
|
|
|
|
screen_size = (784, 1012)
|
|
comic_screen_size = (784, 1012)
|
|
|
|
|
|
class MSReaderOutput(OutputProfile):
|
|
|
|
name = 'Microsoft Reader'
|
|
short_name = 'msreader'
|
|
description = _('This profile is intended for the Microsoft Reader.')
|
|
|
|
screen_size = (480, 652)
|
|
dpi = 96
|
|
fbase = 13
|
|
fsizes = [10, 11, 13, 16, 18, 20, 22, 26]
|
|
|
|
|
|
class MobipocketOutput(OutputProfile):
|
|
|
|
name = 'Mobipocket Books'
|
|
short_name = 'mobipocket'
|
|
description = _('This profile is intended for the Mobipocket books.')
|
|
|
|
# Unfortunately MOBI books are not narrowly targeted, so this information is
|
|
# quite likely to be spurious
|
|
screen_size = (600, 800)
|
|
dpi = 96
|
|
fbase = 18
|
|
fsizes = [14, 14, 16, 18, 20, 22, 24, 26]
|
|
|
|
|
|
class HanlinV3Output(OutputProfile):
|
|
|
|
name = 'Hanlin V3'
|
|
short_name = 'hanlinv3'
|
|
description = _('This profile is intended for the Hanlin V3 and its clones.')
|
|
|
|
# Screen size is a best guess
|
|
screen_size = (584, 754)
|
|
dpi = 168.451
|
|
fbase = 16
|
|
fsizes = [12, 12, 14, 16, 18, 20, 22, 24]
|
|
|
|
|
|
class HanlinV5Output(HanlinV3Output):
|
|
|
|
name = 'Hanlin V5'
|
|
short_name = 'hanlinv5'
|
|
description = _('This profile is intended for the Hanlin V5 and its clones.')
|
|
|
|
dpi = 200
|
|
|
|
|
|
class CybookG3Output(OutputProfile):
|
|
|
|
name = 'Cybook G3'
|
|
short_name = 'cybookg3'
|
|
description = _('This profile is intended for the Cybook G3.')
|
|
|
|
# Screen size is a best guess
|
|
screen_size = (600, 800)
|
|
comic_screen_size = (600, 757)
|
|
dpi = 168.451
|
|
fbase = 16
|
|
fsizes = [12, 12, 14, 16, 18, 20, 22, 24]
|
|
|
|
|
|
class CybookOpusOutput(SonyReaderOutput):
|
|
|
|
author = 'John Schember'
|
|
name = 'Cybook Opus'
|
|
short_name = 'cybook_opus'
|
|
description = _('This profile is intended for the Cybook Opus.')
|
|
|
|
# Screen size is a best guess
|
|
dpi = 200
|
|
fbase = 16
|
|
fsizes = [12, 12, 14, 16, 18, 20, 22, 24]
|
|
|
|
epub_periodical_format = None
|
|
|
|
|
|
class KindleOutput(OutputProfile):
|
|
|
|
name = 'Kindle'
|
|
short_name = 'kindle'
|
|
description = _('This profile is intended for the Amazon Kindle.')
|
|
|
|
# Screen size is a best guess
|
|
screen_size = (525, 640)
|
|
dpi = 168.451
|
|
fbase = 16
|
|
fsizes = [12, 12, 14, 16, 18, 20, 22, 24]
|
|
supports_mobi_indexing = True
|
|
periodical_date_in_title = False
|
|
|
|
empty_ratings_char = '\u2606'
|
|
ratings_char = '\u2605'
|
|
|
|
mobi_ems_per_blockquote = 2.0
|
|
|
|
|
|
class KindleDXOutput(OutputProfile):
|
|
|
|
name = 'Kindle DX'
|
|
short_name = 'kindle_dx'
|
|
description = _('This profile is intended for the Amazon Kindle DX.')
|
|
|
|
# Screen size is a best guess
|
|
screen_size = (744, 1022)
|
|
dpi = 150.0
|
|
comic_screen_size = (771, 1116)
|
|
# comic_screen_size = (741, 1022)
|
|
supports_mobi_indexing = True
|
|
periodical_date_in_title = False
|
|
empty_ratings_char = '\u2606'
|
|
ratings_char = '\u2605'
|
|
mobi_ems_per_blockquote = 2.0
|
|
|
|
|
|
class KindlePaperWhiteOutput(KindleOutput):
|
|
|
|
name = 'Kindle PaperWhite'
|
|
short_name = 'kindle_pw'
|
|
description = _('This profile is intended for the Amazon Kindle PaperWhite 1 and 2')
|
|
|
|
# Screen size is a best guess
|
|
screen_size = (658, 940)
|
|
dpi = 212.0
|
|
comic_screen_size = screen_size
|
|
|
|
|
|
class KindleVoyageOutput(KindleOutput):
|
|
|
|
name = 'Kindle Voyage'
|
|
short_name = 'kindle_voyage'
|
|
description = _('This profile is intended for the Amazon Kindle Voyage')
|
|
|
|
# Screen size is currently just the spec size, actual renderable area will
|
|
# depend on someone with the device doing tests.
|
|
screen_size = (1080, 1430)
|
|
dpi = 300.0
|
|
comic_screen_size = screen_size
|
|
|
|
|
|
class KindlePaperWhite3Output(KindleVoyageOutput):
|
|
|
|
name = 'Kindle PaperWhite 3'
|
|
short_name = 'kindle_pw3'
|
|
description = _('This profile is intended for the Amazon Kindle PaperWhite 3 and above')
|
|
# Screen size is currently just the spec size, actual renderable area will
|
|
# depend on someone with the device doing tests.
|
|
screen_size = (1072, 1430)
|
|
dpi = 300.0
|
|
comic_screen_size = screen_size
|
|
|
|
|
|
class KindleOasisOutput(KindlePaperWhite3Output):
|
|
|
|
name = 'Kindle Oasis'
|
|
short_name = 'kindle_oasis'
|
|
description = _('This profile is intended for the Amazon Kindle Oasis 2017 and above')
|
|
# Screen size is currently just the spec size, actual renderable area will
|
|
# depend on someone with the device doing tests.
|
|
screen_size = (1264, 1680)
|
|
dpi = 300.0
|
|
comic_screen_size = screen_size
|
|
|
|
|
|
class KindleFireOutput(KindleDXOutput):
|
|
|
|
name = 'Kindle Fire'
|
|
short_name = 'kindle_fire'
|
|
description = _('This profile is intended for the Amazon Kindle Fire.')
|
|
|
|
screen_size = (570, 1016)
|
|
dpi = 169.0
|
|
comic_screen_size = (570, 1016)
|
|
|
|
|
|
class IlliadOutput(OutputProfile):
|
|
|
|
name = 'Illiad'
|
|
short_name = 'illiad'
|
|
description = _('This profile is intended for the Irex Illiad.')
|
|
|
|
screen_size = (760, 925)
|
|
comic_screen_size = (760, 925)
|
|
dpi = 160.0
|
|
fbase = 12
|
|
fsizes = [7.5, 9, 10, 12, 15.5, 20, 22, 24]
|
|
|
|
|
|
class IRexDR1000Output(OutputProfile):
|
|
|
|
author = 'John Schember'
|
|
name = 'IRex Digital Reader 1000'
|
|
short_name = 'irexdr1000'
|
|
description = _('This profile is intended for the IRex Digital Reader 1000.')
|
|
|
|
# Screen size is a best guess
|
|
screen_size = (1024, 1280)
|
|
comic_screen_size = (996, 1241)
|
|
dpi = 160
|
|
fbase = 16
|
|
fsizes = [12, 14, 16, 18, 20, 22, 24]
|
|
|
|
|
|
class IRexDR800Output(OutputProfile):
|
|
|
|
author = 'Eric Cronin'
|
|
name = 'IRex Digital Reader 800'
|
|
short_name = 'irexdr800'
|
|
description = _('This profile is intended for the IRex Digital Reader 800.')
|
|
|
|
# Screen size is a best guess
|
|
screen_size = (768, 1024)
|
|
comic_screen_size = (768, 1024)
|
|
dpi = 160
|
|
fbase = 16
|
|
fsizes = [12, 14, 16, 18, 20, 22, 24]
|
|
|
|
|
|
class NookOutput(OutputProfile):
|
|
|
|
author = 'John Schember'
|
|
name = 'Nook'
|
|
short_name = 'nook'
|
|
description = _('This profile is intended for the B&N Nook.')
|
|
|
|
# Screen size is a best guess
|
|
screen_size = (600, 730)
|
|
comic_screen_size = (584, 730)
|
|
dpi = 167
|
|
fbase = 16
|
|
fsizes = [12, 12, 14, 16, 18, 20, 22, 24]
|
|
|
|
|
|
class NookColorOutput(NookOutput):
|
|
name = 'Nook Color'
|
|
short_name = 'nook_color'
|
|
description = _('This profile is intended for the B&N Nook Color.')
|
|
|
|
screen_size = (600, 900)
|
|
comic_screen_size = (594, 900)
|
|
dpi = 169
|
|
|
|
|
|
class PocketBook900Output(OutputProfile):
|
|
|
|
author = 'Chris Lockfort'
|
|
name = 'PocketBook Pro 900'
|
|
short_name = 'pocketbook_900'
|
|
description = _('This profile is intended for the PocketBook Pro 900 series of devices.')
|
|
|
|
screen_size = (810, 1180)
|
|
dpi = 150.0
|
|
comic_screen_size = screen_size
|
|
|
|
|
|
class PocketBookPro912Output(OutputProfile):
|
|
|
|
author = 'Daniele Pizzolli'
|
|
name = 'PocketBook Pro 912'
|
|
short_name = 'pocketbook_pro_912'
|
|
description = _('This profile is intended for the PocketBook Pro 912 series of devices.')
|
|
|
|
# According to http://download.pocketbook-int.com/user-guides/E_Ink/912/User_Guide_PocketBook_912(EN).pdf
|
|
screen_size = (825, 1200)
|
|
dpi = 155.0
|
|
comic_screen_size = screen_size
|
|
|
|
|
|
output_profiles = [
|
|
OutputProfile, SonyReaderOutput, SonyReader300Output, SonyReader900Output,
|
|
SonyReaderT3Output, MSReaderOutput, MobipocketOutput, HanlinV3Output,
|
|
HanlinV5Output, CybookG3Output, CybookOpusOutput, KindleOutput, iPadOutput,
|
|
iPad3Output, KoboReaderOutput, TabletOutput, SamsungGalaxy,
|
|
SonyReaderLandscapeOutput, KindleDXOutput, IlliadOutput, NookHD,
|
|
IRexDR1000Output, IRexDR800Output, JetBook5Output, NookOutput,
|
|
NookColorOutput, PocketBook900Output,
|
|
PocketBookPro912Output, GenericEink, GenericEinkLarge, GenericEinkHD,
|
|
KindleFireOutput, KindlePaperWhiteOutput, KindleVoyageOutput,
|
|
KindlePaperWhite3Output, KindleOasisOutput
|
|
]
|
|
|
|
output_profiles.sort(key=lambda x: x.name.lower())
|