%PDF- %PDF-
| Direktori : /usr/lib/calibre/calibre/ebooks/oeb/polish/ |
| Current File : //usr/lib/calibre/calibre/ebooks/oeb/polish/upgrade.py |
#!/usr/bin/env python3
# License: GPLv3 Copyright: 2018, Kovid Goyal <kovid at kovidgoyal.net>
import sys
from calibre.ebooks.metadata.opf_2_to_3 import upgrade_metadata
from calibre.ebooks.oeb.base import EPUB_NS, OEB_DOCS, xpath
from calibre.ebooks.oeb.parse_utils import ensure_namespace_prefixes
from calibre.ebooks.oeb.polish.container import OEB_FONTS
from calibre.ebooks.oeb.polish.opf import get_book_language
from calibre.ebooks.oeb.polish.toc import (
commit_nav_toc, find_existing_ncx_toc, get_landmarks, get_toc
)
def add_properties(item, *props):
existing = set((item.get('properties') or '').split())
existing |= set(props)
item.set('properties', ' '.join(sorted(existing)))
def fix_font_mime_types(container):
changed = False
for item in container.opf_xpath('//opf:manifest/opf:item[@href and @media-type]'):
mt = item.get('media-type') or ''
if mt.lower() in OEB_FONTS:
name = container.href_to_name(item.get('href'), container.opf_name)
item.set('media-type', container.guess_type(name))
changed = True
return changed
def collect_properties(container):
for item in container.opf_xpath('//opf:manifest/opf:item[@href and @media-type]'):
mt = item.get('media-type') or ''
if mt.lower() not in OEB_DOCS:
continue
name = container.href_to_name(item.get('href'), container.opf_name)
root = container.parsed(name)
root = ensure_namespace_prefixes(root, {'epub': EPUB_NS})
properties = set()
container.replace(name, root) # Ensure entities are converted
if xpath(root, '//svg:svg'):
properties.add('svg')
if xpath(root, '//h:script'):
properties.add('scripted')
if xpath(root, '//mathml:math'):
properties.add('mathml')
if xpath(root, '//epub:switch'):
properties.add('switch')
if properties:
add_properties(item, *tuple(properties))
guide_epubtype_map = {
'acknowledgements' : 'acknowledgments',
'other.afterword' : 'afterword',
'other.appendix' : 'appendix',
'other.backmatter' : 'backmatter',
'bibliography' : 'bibliography',
'text' : 'bodymatter',
'other.chapter' : 'chapter',
'colophon' : 'colophon',
'other.conclusion' : 'conclusion',
'other.contributors' : 'contributors',
'copyright-page' : 'copyright-page',
'cover' : 'cover',
'dedication' : 'dedication',
'other.division' : 'division',
'epigraph' : 'epigraph',
'other.epilogue' : 'epilogue',
'other.errata' : 'errata',
'other.footnotes' : 'footnotes',
'foreword' : 'foreword',
'other.frontmatter' : 'frontmatter',
'glossary' : 'glossary',
'other.halftitlepage': 'halftitlepage',
'other.imprint' : 'imprint',
'other.imprimatur' : 'imprimatur',
'index' : 'index',
'other.introduction' : 'introduction',
'other.landmarks' : 'landmarks',
'other.loa' : 'loa',
'loi' : 'loi',
'lot' : 'lot',
'other.lov' : 'lov',
'notes' : '',
'other.notice' : 'notice',
'other.other-credits': 'other-credits',
'other.part' : 'part',
'other.preamble' : 'preamble',
'preface' : 'preface',
'other.prologue' : 'prologue',
'other.rearnotes' : 'rearnotes',
'other.subchapter' : 'subchapter',
'title-page' : 'titlepage',
'toc' : 'toc',
'other.volume' : 'volume',
'other.warning' : 'warning'
}
def create_nav(container, toc, landmarks, previous_nav=None):
lang = get_book_language(container)
if lang == 'und':
lang = None
if landmarks:
for entry in landmarks:
entry['type'] = guide_epubtype_map.get(entry['type'].lower())
if entry['type'] == 'cover' and container.mime_map.get(entry['dest'], '').lower() in OEB_DOCS:
container.apply_unique_properties(entry['dest'], 'calibre:title-page')
commit_nav_toc(container, toc, lang=lang, landmarks=landmarks, previous_nav=previous_nav)
def epub_2_to_3(container, report, previous_nav=None, remove_ncx=True):
upgrade_metadata(container.opf)
collect_properties(container)
toc = get_toc(container)
toc_name = find_existing_ncx_toc(container)
if toc_name and remove_ncx:
container.remove_item(toc_name)
container.opf_xpath('./opf:spine')[0].attrib.pop('toc', None)
landmarks = get_landmarks(container)
for guide in container.opf_xpath('./opf:guide'):
guide.getparent().remove(guide)
create_nav(container, toc, landmarks, previous_nav)
container.opf.set('version', '3.0')
if fix_font_mime_types(container):
container.refresh_mime_map()
container.dirty(container.opf_name)
def upgrade_book(container, report, remove_ncx=True):
if container.book_type != 'epub' or container.opf_version_parsed.major >= 3:
report(_('No upgrade needed'))
return False
epub_2_to_3(container, report, remove_ncx=remove_ncx)
report(_('Updated EPUB from version 2 to 3'))
return True
if __name__ == '__main__':
from calibre.ebooks.oeb.polish.container import get_container
from calibre.utils.logging import default_log
default_log.filter_level = default_log.DEBUG
inbook = sys.argv[-1]
ebook = get_container(inbook, default_log)
if upgrade_book(ebook, print):
outbook = inbook.rpartition('.')[0] + '-upgraded.' + inbook.rpartition('.')[-1]
ebook.commit(outbook)
print('Upgraded book written to:', outbook)