Пример #1
0
    def add_files(self):
        if current_container() is None:
            return error_dialog(self.gui, _('No open book'), _(
                'You must first open a book to tweak, before trying to create new files'
                ' in it.'), show=True)

        files = choose_files(self.gui, 'tweak-book-bulk-import-files', _('Choose files'))
        if files:
            folder_map = get_recommended_folders(current_container(), files)
            files = {x:('/'.join((folder, os.path.basename(x))) if folder else os.path.basename(x))
                     for x, folder in folder_map.iteritems()}
            self.commit_dirty_opf()
            self.add_savepoint(_('Add files'))
            c = current_container()
            for path, name in files.iteritems():
                i = 0
                while c.exists(name):
                    i += 1
                    name, ext = name.rpartition('.')[0::2]
                    name = '%s_%d.%s' % (name, i, ext)
                try:
                    with open(path, 'rb') as f:
                        c.add_file(name, f.read())
                except:
                    self.rewind_savepoint()
                    raise
            self.gui.file_list.build(c)
            if c.opf_name in editors:
                editors[c.opf_name].replace_data(c.raw_data(c.opf_name))
            self.set_modified()
Пример #2
0
 def do_import_file(self, path, hide_button=False):
     with open(path, 'rb') as f:
         self.file_data = f.read()
     name = os.path.basename(path)
     fmap = get_recommended_folders(current_container(), (name, ))
     if fmap[name]:
         name = '/'.join((fmap[name], name))
     self.name.setText(name)
     self.la.setText(_('Choose a name for the imported file'))
     if hide_button:
         self.imp_button.setVisible(False)
Пример #3
0
 def do_import_file(self, path, hide_button=False):
     with open(path, 'rb') as f:
         self.file_data = f.read()
     name = os.path.basename(path)
     fmap = get_recommended_folders(current_container(), (name,))
     if fmap[name]:
         name = '/'.join((fmap[name], name))
     self.name.setText(name)
     self.la.setText(_('Choose a name for the imported file'))
     if hide_button:
         self.imp_button.setVisible(False)
Пример #4
0
 def import_file(self):
     path = choose_files(self, 'tweak-book-new-resource-file', _('Choose file'), select_only_single_file=True)
     if path:
         path = path[0]
         with open(path, 'rb') as f:
             self.file_data = f.read()
         name = os.path.basename(path)
         fmap = get_recommended_folders(current_container(), (name,))
         if fmap[name]:
             name = '/'.join((fmap[name], name))
         self.name.setText(name)
         self.la.setText(_('Choose a name for the imported file'))
Пример #5
0
 def import_file(self):
     path = choose_files(self,
                         'tweak-book-new-resource-file',
                         _('Choose file'),
                         select_only_single_file=True)
     if path:
         path = path[0]
         with open(path, 'rb') as f:
             self.file_data = f.read()
         name = os.path.basename(path)
         fmap = get_recommended_folders(current_container(), (name, ))
         if fmap[name]:
             name = '/'.join((fmap[name], name))
         self.name.setText(name)
         self.la.setText(_('Choose a name for the imported file'))
Пример #6
0
 def get_name(name):
     return get_recommended_folders(current_container(),
                                    (name, ))[name] + '/' + name
Пример #7
0
def create_epub_cover(container, cover_path, existing_image, options=None):
    from calibre.ebooks.conversion.config import load_defaults
    from calibre.ebooks.oeb.transforms.cover import CoverManager

    ext = cover_path.rpartition('.')[-1].lower()
    cname, tname = 'cover.' + ext, 'titlepage.xhtml'
    recommended_folders = get_recommended_folders(container, (cname, tname))

    if existing_image:
        raster_cover = existing_image
        manifest_id = {v: k
                       for k, v in container.manifest_id_map.iteritems()
                       }[existing_image]
        raster_cover_item = container.opf_xpath('//opf:manifest/*[@id="%s"]' %
                                                manifest_id)[0]
    else:
        folder = recommended_folders[cname]
        if folder:
            cname = folder + '/' + cname
        raster_cover_item = container.generate_item(cname, id_prefix='cover')
        raster_cover = container.href_to_name(raster_cover_item.get('href'),
                                              container.opf_name)

        with open(cover_path, 'rb') as src, container.open(raster_cover,
                                                           'wb') as dest:
            shutil.copyfileobj(src, dest)
    if options is None:
        opts = load_defaults('epub_output')
        keep_aspect = opts.get('preserve_cover_aspect_ratio', False)
        no_svg = opts.get('no_svg_cover', False)
    else:
        keep_aspect = options.get('keep_aspect', False)
        no_svg = options.get('no_svg', False)
    if no_svg:
        style = 'style="height: 100%%"'
        templ = CoverManager.NONSVG_TEMPLATE.replace('__style__', style)
    else:
        width, height = 600, 800
        try:
            if existing_image:
                width, height = identify_data(
                    container.raw_data(existing_image, decode=False))[:2]
            else:
                width, height = identify(cover_path)[:2]
        except:
            container.log.exception("Failed to get width and height of cover")
        ar = 'xMidYMid meet' if keep_aspect else 'none'
        templ = CoverManager.SVG_TEMPLATE.replace('__ar__', ar)
        templ = templ.replace('__viewbox__', '0 0 %d %d' % (width, height))
        templ = templ.replace('__width__', str(width))
        templ = templ.replace('__height__', str(height))
    folder = recommended_folders[tname]
    if folder:
        tname = folder + '/' + tname
    titlepage_item = container.generate_item(tname, id_prefix='titlepage')
    titlepage = container.href_to_name(titlepage_item.get('href'),
                                       container.opf_name)
    raw = templ % container.name_to_href(raster_cover,
                                         titlepage).encode('utf-8')
    with container.open(titlepage, 'wb') as f:
        f.write(raw)

    # We have to make sure the raster cover item has id="cover" for the moron
    # that wrote the Nook firmware
    if raster_cover_item.get('id') != 'cover':
        from calibre.ebooks.oeb.base import uuid_id
        newid = uuid_id()
        for item in container.opf_xpath('//*[@id="cover"]'):
            item.set('id', newid)
        for item in container.opf_xpath('//*[@idref="cover"]'):
            item.set('idref', newid)
        raster_cover_item.set('id', 'cover')

    spine = container.opf_xpath('//opf:spine')[0]
    ref = spine.makeelement(OPF('itemref'), idref=titlepage_item.get('id'))
    container.insert_into_xml(spine, ref, index=0)
    guide = container.opf_get_or_create('guide')
    container.insert_into_xml(
        guide,
        guide.makeelement(OPF('reference'),
                          type='cover',
                          title=_('Cover'),
                          href=container.name_to_href(
                              titlepage, base=container.opf_name)))
    metadata = container.opf_get_or_create('metadata')
    meta = metadata.makeelement(OPF('meta'), name='cover')
    meta.set('content', raster_cover_item.get('id'))
    container.insert_into_xml(metadata, meta)

    return raster_cover, titlepage
Пример #8
0
 def get_name(name):
     folder = get_recommended_folders(current_container(),
                                      (name, ))[name] or ''
     if folder:
         folder += '/'
     return folder + name
Пример #9
0
def create_epub_cover(container, cover_path, existing_image, options=None):
    from calibre.ebooks.conversion.config import load_defaults
    from calibre.ebooks.oeb.transforms.cover import CoverManager

    try:
        ext = cover_path.rpartition('.')[-1].lower()
    except Exception:
        ext = 'jpeg'
    cname, tname = 'cover.' + ext, 'titlepage.xhtml'
    recommended_folders = get_recommended_folders(container, (cname, tname))

    if existing_image:
        raster_cover = existing_image
        manifest_id = {v:k for k, v in container.manifest_id_map.iteritems()}[existing_image]
        raster_cover_item = container.opf_xpath('//opf:manifest/*[@id="%s"]' % manifest_id)[0]
    else:
        folder = recommended_folders[cname]
        if folder:
            cname = folder + '/' + cname
        raster_cover_item = container.generate_item(cname, id_prefix='cover')
        raster_cover = container.href_to_name(raster_cover_item.get('href'), container.opf_name)

        with container.open(raster_cover, 'wb') as dest:
            if callable(cover_path):
                cover_path('write_image', dest)
            else:
                with lopen(cover_path, 'rb') as src:
                    shutil.copyfileobj(src, dest)
    if options is None:
        opts = load_defaults('epub_output')
        keep_aspect = opts.get('preserve_cover_aspect_ratio', False)
        no_svg = opts.get('no_svg_cover', False)
    else:
        keep_aspect = options.get('keep_aspect', False)
        no_svg = options.get('no_svg', False)
    if no_svg:
        style = 'style="height: 100%%"'
        templ = CoverManager.NONSVG_TEMPLATE.replace('__style__', style)
        has_svg = False
    else:
        if callable(cover_path):
            templ = (options or {}).get('template', CoverManager.SVG_TEMPLATE)
            has_svg = 'xlink:href' in templ
        else:
            width, height = 600, 800
            has_svg = True
            try:
                if existing_image:
                    width, height = identify(container.raw_data(existing_image, decode=False))[1:]
                else:
                    with lopen(cover_path, 'rb') as csrc:
                        width, height = identify(csrc)[1:]
            except:
                container.log.exception("Failed to get width and height of cover")
            ar = 'xMidYMid meet' if keep_aspect else 'none'
            templ = CoverManager.SVG_TEMPLATE.replace('__ar__', ar)
            templ = templ.replace('__viewbox__', '0 0 %d %d'%(width, height))
            templ = templ.replace('__width__', str(width))
            templ = templ.replace('__height__', str(height))
    folder = recommended_folders[tname]
    if folder:
        tname = folder + '/' + tname
    titlepage_item = container.generate_item(tname, id_prefix='titlepage')
    titlepage = container.href_to_name(titlepage_item.get('href'),
                                          container.opf_name)
    raw = templ%container.name_to_href(raster_cover, titlepage).encode('utf-8')
    with container.open(titlepage, 'wb') as f:
        f.write(raw)

    # We have to make sure the raster cover item has id="cover" for the moron
    # that wrote the Nook firmware
    if raster_cover_item.get('id') != 'cover':
        from calibre.ebooks.oeb.base import uuid_id
        newid = uuid_id()
        for item in container.opf_xpath('//*[@id="cover"]'):
            item.set('id', newid)
        for item in container.opf_xpath('//*[@idref="cover"]'):
            item.set('idref', newid)
        raster_cover_item.set('id', 'cover')

    spine = container.opf_xpath('//opf:spine')[0]
    ref = spine.makeelement(OPF('itemref'), idref=titlepage_item.get('id'))
    container.insert_into_xml(spine, ref, index=0)
    ver = container.opf_version_parsed
    if ver.major < 3:
        guide = container.opf_get_or_create('guide')
        container.insert_into_xml(guide, guide.makeelement(
            OPF('reference'), type='cover', title=_('Cover'),
            href=container.name_to_href(titlepage, base=container.opf_name)))
        metadata = container.opf_get_or_create('metadata')
        meta = metadata.makeelement(OPF('meta'), name='cover')
        meta.set('content', raster_cover_item.get('id'))
        container.insert_into_xml(metadata, meta)
    else:
        container.apply_unique_properties(raster_cover, 'cover-image')
        container.apply_unique_properties(titlepage, 'calibre:title-page')
        if has_svg:
            container.add_properties(titlepage, 'svg')

    return raster_cover, titlepage
Пример #10
0
def create_epub_cover(container, cover_path, existing_image, options=None):
    from calibre.ebooks.conversion.config import load_defaults
    from calibre.ebooks.oeb.transforms.cover import CoverManager

    try:
        ext = cover_path.rpartition(".")[-1].lower()
    except Exception:
        ext = "jpeg"
    cname, tname = "cover." + ext, "titlepage.xhtml"
    recommended_folders = get_recommended_folders(container, (cname, tname))

    if existing_image:
        raster_cover = existing_image
        manifest_id = {v: k for k, v in container.manifest_id_map.iteritems()}[existing_image]
        raster_cover_item = container.opf_xpath('//opf:manifest/*[@id="%s"]' % manifest_id)[0]
    else:
        folder = recommended_folders[cname]
        if folder:
            cname = folder + "/" + cname
        raster_cover_item = container.generate_item(cname, id_prefix="cover")
        raster_cover = container.href_to_name(raster_cover_item.get("href"), container.opf_name)

        with container.open(raster_cover, "wb") as dest:
            if callable(cover_path):
                cover_path("write_image", dest)
            else:
                with lopen(cover_path, "rb") as src:
                    shutil.copyfileobj(src, dest)
    if options is None:
        opts = load_defaults("epub_output")
        keep_aspect = opts.get("preserve_cover_aspect_ratio", False)
        no_svg = opts.get("no_svg_cover", False)
    else:
        keep_aspect = options.get("keep_aspect", False)
        no_svg = options.get("no_svg", False)
    if no_svg:
        style = 'style="height: 100%%"'
        templ = CoverManager.NONSVG_TEMPLATE.replace("__style__", style)
    else:
        if callable(cover_path):
            templ = (options or {}).get("template", CoverManager.SVG_TEMPLATE)
        else:
            width, height = 600, 800
            try:
                if existing_image:
                    width, height = identify(container.raw_data(existing_image, decode=False))[1:]
                else:
                    with lopen(cover_path, "rb") as csrc:
                        width, height = identify(csrc)[1:]
            except:
                container.log.exception("Failed to get width and height of cover")
            ar = "xMidYMid meet" if keep_aspect else "none"
            templ = CoverManager.SVG_TEMPLATE.replace("__ar__", ar)
            templ = templ.replace("__viewbox__", "0 0 %d %d" % (width, height))
            templ = templ.replace("__width__", str(width))
            templ = templ.replace("__height__", str(height))
    folder = recommended_folders[tname]
    if folder:
        tname = folder + "/" + tname
    titlepage_item = container.generate_item(tname, id_prefix="titlepage")
    titlepage = container.href_to_name(titlepage_item.get("href"), container.opf_name)
    raw = templ % container.name_to_href(raster_cover, titlepage).encode("utf-8")
    with container.open(titlepage, "wb") as f:
        f.write(raw)

    # We have to make sure the raster cover item has id="cover" for the moron
    # that wrote the Nook firmware
    if raster_cover_item.get("id") != "cover":
        from calibre.ebooks.oeb.base import uuid_id

        newid = uuid_id()
        for item in container.opf_xpath('//*[@id="cover"]'):
            item.set("id", newid)
        for item in container.opf_xpath('//*[@idref="cover"]'):
            item.set("idref", newid)
        raster_cover_item.set("id", "cover")

    spine = container.opf_xpath("//opf:spine")[0]
    ref = spine.makeelement(OPF("itemref"), idref=titlepage_item.get("id"))
    container.insert_into_xml(spine, ref, index=0)
    guide = container.opf_get_or_create("guide")
    container.insert_into_xml(
        guide,
        guide.makeelement(
            OPF("reference"),
            type="cover",
            title=_("Cover"),
            href=container.name_to_href(titlepage, base=container.opf_name),
        ),
    )
    metadata = container.opf_get_or_create("metadata")
    meta = metadata.makeelement(OPF("meta"), name="cover")
    meta.set("content", raster_cover_item.get("id"))
    container.insert_into_xml(metadata, meta)

    return raster_cover, titlepage
Пример #11
0
 def get_name(name):
     folder = get_recommended_folders(current_container(), (name,))[name] or ''
     if folder:
         folder += '/'
     return folder + name
Пример #12
0
 def get_name(name):
     return get_recommended_folders(current_container(), (name,))[name] + '/' + name