Пример #1
0
 def init_input_order(self, defaults=False):
     if defaults:
         input_map = prefs.defaults['input_format_order']
     else:
         input_map = prefs['input_format_order']
     all_formats = set()
     self.opt_input_order.clear()
     for fmt in all_input_formats().union({'ZIP', 'RAR'}):
         all_formats.add(fmt.upper())
     for format in input_map + list(all_formats.difference(input_map)):
         item = QListWidgetItem(format, self.opt_input_order)
         item.setData(Qt.UserRole, (format))
         item.setFlags(Qt.ItemIsEnabled|Qt.ItemIsSelectable)
Пример #2
0
 def init_input_order(self, defaults=False):
     if defaults:
         input_map = prefs.defaults['input_format_order']
     else:
         input_map = prefs['input_format_order']
     all_formats = set()
     self.opt_input_order.clear()
     for fmt in all_input_formats().union({'ZIP', 'RAR'}):
         all_formats.add(fmt.upper())
     for format in input_map + list(all_formats.difference(input_map)):
         item = QListWidgetItem(format, self.opt_input_order)
         item.setData(Qt.UserRole, (format))
         item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
Пример #3
0
 def specialise_plist(launcher, remove_types, plist):
     plist['CFBundleDisplayName'] = plist['CFBundleName'] = {
         'ebook-viewer':'E-book Viewer', 'ebook-edit':'Edit Book', 'calibre-debug': 'calibre (debug)',
     }[launcher]
     plist['CFBundleExecutable'] = launcher
     if launcher != 'calibre-debug':
         plist['CFBundleIconFile'] = launcher + '.icns'
     plist['CFBundleIdentifier'] = 'com.calibre-ebook.' + launcher
     if not remove_types:
         input_formats = sorted(all_input_formats())
         e = plist['CFBundleDocumentTypes'][0]
         exts = 'epub azw3'.split() if launcher == 'ebook-edit' else input_formats
         e['CFBundleTypeExtensions'] = exts
Пример #4
0
def extensions(basename):
    if basename == 'calibre.exe':
        from calibre.ebooks import BOOK_EXTENSIONS
        # We remove rar and zip as they interfere with 7-zip associations
        # http://www.mobileread.com/forums/showthread.php?t=256459
        return set(BOOK_EXTENSIONS) - {'rar', 'zip'}
    if basename == 'ebook-viewer.exe':
        from calibre.customize.ui import all_input_formats
        return set(all_input_formats())
    if basename == 'ebook-edit.exe':
        from calibre.ebooks.oeb.polish.main import SUPPORTED
        from calibre.ebooks.oeb.polish.import_book import IMPORTABLE
        return SUPPORTED | IMPORTABLE
Пример #5
0
def extensions(basename):
    if basename == 'calibre.exe':
        from calibre.ebooks import BOOK_EXTENSIONS
        # We remove rar and zip as they interfere with 7-zip associations
        # http://www.mobileread.com/forums/showthread.php?t=256459
        return set(BOOK_EXTENSIONS) - {'rar', 'zip'}
    if basename == 'ebook-viewer.exe':
        from calibre.customize.ui import all_input_formats
        return set(all_input_formats())
    if basename == 'ebook-edit.exe':
        from calibre.ebooks.oeb.polish.main import SUPPORTED
        from calibre.ebooks.oeb.polish.import_book import IMPORTABLE
        return SUPPORTED | IMPORTABLE
Пример #6
0
 def specialise_plist(launcher, remove_types, plist):
     plist['CFBundleDisplayName'] = plist['CFBundleName'] = {
         'ebook-viewer': 'E-book Viewer',
         'ebook-edit': 'Edit Book',
         'calibre-debug': 'calibre (debug)',
     }[launcher]
     plist['CFBundleExecutable'] = launcher
     if launcher != 'calibre-debug':
         plist['CFBundleIconFile'] = launcher + '.icns'
     plist['CFBundleIdentifier'] = 'com.calibre-ebook.' + launcher
     if not remove_types:
         input_formats = sorted(all_input_formats())
         e = plist['CFBundleDocumentTypes'][0]
         exts = 'epub azw3'.split(
         ) if launcher == 'ebook-edit' else input_formats
         e['CFBundleTypeExtensions'] = exts
Пример #7
0
    def setup_desktop_integration(self):  # {{{
        try:
            self.info('Setting up desktop integration...')

            env = os.environ.copy()
            cc = check_call
            if getattr(sys, 'frozen_path', False) and 'LD_LIBRARY_PATH' in env:
                paths = env.get('LD_LIBRARY_PATH', '').split(os.pathsep)
                paths = [x for x in paths if x]
                npaths = [x for x in paths if x != sys.frozen_path + '/lib']
                env['LD_LIBRARY_PATH'] = os.pathsep.join(npaths)
                cc = partial(check_call, env=env)

            with TemporaryDirectory() as tdir, CurrentDir(tdir), \
                                PreserveMIMEDefaults():
                render_img('mimetypes/lrf.png', 'calibre-lrf.png')
                cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-lrf.png application-lrf',
                   shell=True)
                self.icon_resources.append(
                    ('mimetypes', 'application-lrf', '128'))
                cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-lrf.png text-lrs',
                   shell=True)
                self.icon_resources.append(
                    ('mimetypes', 'application-lrs', '128'))
                render_img('mimetypes/mobi.png', 'calibre-mobi.png')
                cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-mobi.png application-x-mobipocket-ebook',
                   shell=True)
                self.icon_resources.append(
                    ('mimetypes', 'application-x-mobipocket-ebook', '128'))
                render_img('mimetypes/tpz.png', 'calibre-tpz.png')
                cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-tpz.png application-x-topaz-ebook',
                   shell=True)
                self.icon_resources.append(
                    ('mimetypes', 'application-x-topaz-ebook', '128'))
                render_img('mimetypes/azw2.png', 'calibre-azw2.png')
                cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-azw2.png application-x-kindle-application',
                   shell=True)
                self.icon_resources.append(
                    ('mimetypes', 'application-x-kindle-application', '128'))
                render_img('mimetypes/azw3.png', 'calibre-azw3.png')
                cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-azw3.png application-x-mobi8-ebook',
                   shell=True)
                self.icon_resources.append(
                    ('mimetypes', 'application-x-mobi8-ebook', '128'))
                render_img('lt.png', 'calibre-gui.png', width=256, height=256)
                cc('xdg-icon-resource install --noupdate --size 256 calibre-gui.png calibre-gui',
                   shell=True)
                self.icon_resources.append(('apps', 'calibre-gui', '256'))
                render_img('viewer.png',
                           'calibre-viewer.png',
                           width=256,
                           height=256)
                cc('xdg-icon-resource install --size 256 calibre-viewer.png calibre-viewer',
                   shell=True)
                self.icon_resources.append(('apps', 'calibre-viewer', '256'))
                render_img('tweak.png',
                           'calibre-ebook-edit.png',
                           width=256,
                           height=256)
                cc('xdg-icon-resource install --size 256 calibre-ebook-edit.png calibre-ebook-edit',
                   shell=True)
                self.icon_resources.append(
                    ('apps', 'calibre-ebook-edit', '256'))

                mimetypes = set([])
                for x in all_input_formats():
                    mt = guess_type('dummy.' + x)[0]
                    if mt and 'chemical' not in mt and 'ctc-posml' not in mt:
                        mimetypes.add(mt)

                def write_mimetypes(f):
                    f.write('MimeType=%s;\n' % ';'.join(mimetypes))

                from calibre.ebooks.oeb.polish.main import SUPPORTED
                f = open('calibre-lrfviewer.desktop', 'wb')
                f.write(VIEWER)
                f.close()
                f = open('calibre-ebook-viewer.desktop', 'wb')
                f.write(EVIEWER)
                write_mimetypes(f)
                f = open('calibre-ebook-edit.desktop', 'wb')
                f.write(ETWEAK)
                mt = [guess_type('a.' + x.lower())[0] for x in SUPPORTED]
                f.write('MimeType=%s;\n' % ';'.join(mt))
                f.close()
                f = open('calibre-gui.desktop', 'wb')
                f.write(GUI)
                write_mimetypes(f)
                f.close()
                des = ('calibre-gui.desktop', 'calibre-lrfviewer.desktop',
                       'calibre-ebook-viewer.desktop',
                       'calibre-ebook-edit.desktop')
                appdata = os.path.join(
                    os.path.dirname(self.opts.staging_sharedir), 'appdata')
                if not os.path.exists(appdata):
                    try:
                        os.mkdir(appdata)
                    except:
                        self.warning(
                            'Failed to create %s not installing appdata files'
                            % appdata)
                if os.path.exists(appdata) and not os.access(appdata, os.W_OK):
                    self.warning(
                        'Do not have write permissions for %s not installing appdata files'
                        % appdata)
                else:
                    from calibre.utils.localization import get_all_translators
                    translators = dict(get_all_translators())

                APPDATA = get_appdata()
                for x in des:
                    cmd = [
                        'xdg-desktop-menu', 'install', '--noupdate', './' + x
                    ]
                    cc(' '.join(cmd), shell=True)
                    self.menu_resources.append(x)
                    ak = x.partition('.')[0]
                    if ak in APPDATA and os.access(appdata, os.W_OK):
                        self.appdata_resources.append(
                            write_appdata(ak, APPDATA[ak], appdata,
                                          translators))
                cc(['xdg-desktop-menu', 'forceupdate'])
                MIME = P('calibre-mimetypes.xml')
                self.mime_resources.append(MIME)
                cc(['xdg-mime', 'install', MIME])
        except Exception:
            if self.opts.fatal_errors:
                raise
            self.task_failed('Setting up desktop integration failed')
Пример #8
0
    def setup_desktop_integration(self):  # {{{
        try:
            self.info('Setting up desktop integration...')

            env = os.environ.copy()
            cc = check_call
            if getattr(sys, 'frozen_path', False) and 'LD_LIBRARY_PATH' in env:
                paths = env.get('LD_LIBRARY_PATH', '').split(os.pathsep)
                paths = [x for x in paths if x]
                npaths = [x for x in paths if x != sys.frozen_path+'/lib']
                env['LD_LIBRARY_PATH'] = os.pathsep.join(npaths)
                cc = partial(check_call, env=env)

            with TemporaryDirectory() as tdir, CurrentDir(tdir), PreserveMIMEDefaults():

                def install_single_icon(iconsrc, basename, size, context, is_last_icon=False):
                    filename = '%s-%s.png' % (basename, size)
                    render_img(iconsrc, filename, width=int(size), height=int(size))
                    cmd = ['xdg-icon-resource', 'install', '--noupdate', '--context', context, '--size', str(size), filename, basename]
                    if is_last_icon:
                        del cmd[2]
                    cc(cmd)
                    self.icon_resources.append((context, basename, str(size)))

                def install_icons(iconsrc, basename, context, is_last_icon=False):
                    sizes = (16, 32, 48, 64, 128, 256)
                    for size in sizes:
                        install_single_icon(iconsrc, basename, size, context, is_last_icon and size is sizes[-1])

                icons = filter(None, [x.strip() for x in '''\
                    mimetypes/lrf.png application-lrf mimetypes
                    mimetypes/lrf.png text-lrs mimetypes
                    mimetypes/mobi.png application-x-mobipocket-ebook mimetypes
                    mimetypes/tpz.png application-x-topaz-ebook mimetypes
                    mimetypes/azw2.png application-x-kindle-application mimetypes
                    mimetypes/azw3.png application-x-mobi8-ebook mimetypes
                    lt.png calibre-gui apps
                    viewer.png calibre-viewer apps
                    tweak.png calibre-ebook-edit apps
                    '''.splitlines()])
                for line in icons:
                    iconsrc, basename, context = line.split()
                    install_icons(iconsrc, basename, context, is_last_icon=line is icons[-1])

                mimetypes = set()
                for x in all_input_formats():
                    mt = guess_type('dummy.'+x)[0]
                    if mt and 'chemical' not in mt and 'ctc-posml' not in mt:
                        mimetypes.add(mt)
                mimetypes.discard('application/octet-stream')

                def write_mimetypes(f):
                    f.write('MimeType=%s;\n'%';'.join(mimetypes))

                from calibre.ebooks.oeb.polish.main import SUPPORTED
                from calibre.ebooks.oeb.polish.import_book import IMPORTABLE
                f = open('calibre-lrfviewer.desktop', 'wb')
                f.write(VIEWER)
                f.close()
                f = open('calibre-ebook-viewer.desktop', 'wb')
                f.write(EVIEWER)
                write_mimetypes(f)
                f = open('calibre-ebook-edit.desktop', 'wb')
                f.write(ETWEAK)
                mt = {guess_type('a.' + x.lower())[0] for x in (SUPPORTED|IMPORTABLE)} - {None, 'application/octet-stream'}
                f.write('MimeType=%s;\n'%';'.join(mt))
                f.close()
                f = open('calibre-gui.desktop', 'wb')
                f.write(GUI)
                write_mimetypes(f)
                f.close()
                des = ('calibre-gui.desktop', 'calibre-lrfviewer.desktop',
                        'calibre-ebook-viewer.desktop', 'calibre-ebook-edit.desktop')
                appdata = os.path.join(os.path.dirname(self.opts.staging_sharedir), 'metainfo')
                if not os.path.exists(appdata):
                    try:
                        os.mkdir(appdata)
                    except:
                        self.warning('Failed to create %s not installing appdata files' % appdata)
                if os.path.exists(appdata) and not os.access(appdata, os.W_OK):
                    self.warning('Do not have write permissions for %s not installing appdata files' % appdata)
                else:
                    from calibre.utils.localization import get_all_translators
                    translators = dict(get_all_translators())

                APPDATA = get_appdata()
                for x in des:
                    cmd = ['xdg-desktop-menu', 'install', '--noupdate', './'+x]
                    cc(' '.join(cmd), shell=True)
                    self.menu_resources.append(x)
                    ak = x.partition('.')[0]
                    if ak in APPDATA and os.access(appdata, os.W_OK):
                        self.appdata_resources.append(write_appdata(ak, APPDATA[ak], appdata, translators))
                cc(['xdg-desktop-menu', 'forceupdate'])
                MIME = P('calibre-mimetypes.xml')
                self.mime_resources.append(MIME)
                cc(['xdg-mime', 'install', MIME])
        except Exception:
            if self.opts.fatal_errors:
                raise
            self.task_failed('Setting up desktop integration failed')
Пример #9
0
    def setup_completion(self): # {{{
        try:
            self.info('Setting up bash completion...')
            from calibre.ebooks.metadata.cli import option_parser as metaop, filetypes as meta_filetypes
            from calibre.ebooks.lrf.lrfparser import option_parser as lrf2lrsop
            from calibre.gui2.lrf_renderer.main import option_parser as lrfviewerop
            from calibre.gui2.viewer.main import option_parser as viewer_op
            from calibre.ebooks.metadata.sources.cli import option_parser as fem_op
            from calibre.gui2.main import option_parser as guiop
            from calibre.utils.smtp import option_parser as smtp_op
            from calibre.library.server.main import option_parser as serv_op
            from calibre.ebooks.epub.fix.main import option_parser as fix_op
            from calibre.ebooks import BOOK_EXTENSIONS
            input_formats = sorted(all_input_formats())
            bc = os.path.join(os.path.dirname(self.opts.staging_sharedir),
                'bash-completion')
            if os.path.exists(bc):
                f = os.path.join(bc, 'calibre')
            else:
                if isnetbsd:
                    f = os.path.join(self.opts.staging_root, 'share/bash_completion.d/calibre')
                else:
                    f = os.path.join(self.opts.staging_etc, 'bash_completion.d/calibre')
            if not os.path.exists(os.path.dirname(f)):
                os.makedirs(os.path.dirname(f))
            self.manifest.append(f)
            complete = 'calibre-complete'
            if getattr(sys, 'frozen_path', None):
                complete = os.path.join(getattr(sys, 'frozen_path'), complete)

            self.info('Installing bash completion to', f)
            with open(f, 'wb') as f:
                f.write('# calibre Bash Shell Completion\n')
                f.write(opts_and_exts('calibre', guiop, BOOK_EXTENSIONS))
                f.write(opts_and_exts('lrf2lrs', lrf2lrsop, ['lrf']))
                f.write(opts_and_exts('ebook-meta', metaop, list(meta_filetypes())))
                f.write(opts_and_exts('lrfviewer', lrfviewerop, ['lrf']))
                f.write(opts_and_exts('ebook-viewer', viewer_op, input_formats))
                f.write(opts_and_words('fetch-ebook-metadata', fem_op, []))
                f.write(opts_and_words('calibre-smtp', smtp_op, []))
                f.write(opts_and_words('calibre-server', serv_op, []))
                f.write(opts_and_exts('epub-fix', fix_op, ['epub']))
                f.write(textwrap.dedent('''
                _ebook_device_ls()
                {
                local pattern search listing prefix
                pattern="$1"
                search="$1"
                if [[ -n "{$pattern}" ]]; then
                    if [[ "${pattern:(-1)}" == "/" ]]; then
                    pattern=""
                    else
                    pattern="$(basename ${pattern} 2> /dev/null)"
                    search="$(dirname ${search} 2> /dev/null)"
                    fi
                fi

                if [[  "x${search}" == "x" || "x${search}" == "x." ]]; then
                    search="/"
                fi

                listing="$(ebook-device ls ${search} 2>/dev/null)"

                prefix="${search}"
                if [[ "x${prefix:(-1)}" != "x/" ]]; then
                    prefix="${prefix}/"
                fi

                echo $(compgen -P "${prefix}" -W "${listing}" "${pattern}")
                }

                _ebook_device()
                {
                local cur prev
                cur="${COMP_WORDS[COMP_CWORD]}"
                prev="${COMP_WORDS[COMP_CWORD-1]}"
                COMPREPLY=()
                case "${prev}" in
                    ls|rm|mkdir|touch|cat )
                        COMPREPLY=( $(_ebook_device_ls "${cur}") )
                        return 0
                        ;;
                    cp )
                        if [[ ${cur} == dev:* ]]; then
                        COMPREPLY=( $(_ebook_device_ls "${cur:7}") )
                        return 0
                        else
                        _filedir
                        return 0
                        fi
                        ;;
                    dev )
                        COMPREPLY=( $(compgen -W "cp ls rm mkdir touch cat info books df" "${cur}") )
                        return 0
                        ;;
                    * )
                        if [[ ${cur} == dev:* ]]; then
                        COMPREPLY=( $(_ebook_device_ls "${cur:7}") )
                        return 0
                        else
                        if [[ ${prev} == dev:* ]]; then
                            _filedir
                            return 0
                        else
                            COMPREPLY=( $(compgen -W "dev:" "${cur}") )
                            return 0
                        fi
                        return 0
                        fi
                    ;;
                esac
                }
                complete -o nospace  -F _ebook_device ebook-device

                complete -o nospace -C %s ebook-convert
                ''')%complete)
        except TypeError as err:
            if 'resolve_entities' in str(err):
                print 'You need python-lxml >= 2.0.5 for calibre'
                sys.exit(1)
            raise
        except:
            if self.opts.fatal_errors:
                raise
            self.task_failed('Setting up completion failed')
Пример #10
0
def write_completion(bash_comp_dest, zsh):
    from calibre.ebooks.metadata.cli import option_parser as metaop, filetypes as meta_filetypes
    from calibre.ebooks.lrf.lrfparser import option_parser as lrf2lrsop
    from calibre.gui2.lrf_renderer.main import option_parser as lrfviewerop
    from calibre.gui2.viewer.main import option_parser as viewer_op
    from calibre.gui2.tweak_book.main import option_parser as tweak_op
    from calibre.ebooks.metadata.sources.cli import option_parser as fem_op
    from calibre.gui2.main import option_parser as guiop
    from calibre.utils.smtp import option_parser as smtp_op
    from calibre.srv.standalone import create_option_parser as serv_op
    from calibre.ebooks.oeb.polish.main import option_parser as polish_op, SUPPORTED
    from calibre.ebooks.oeb.polish.import_book import IMPORTABLE
    from calibre.debug import option_parser as debug_op
    from calibre.ebooks import BOOK_EXTENSIONS
    from calibre.customize.ui import available_input_formats
    input_formats = sorted(all_input_formats())
    tweak_formats = sorted(x.lower() for x in SUPPORTED | IMPORTABLE)

    if bash_comp_dest and not os.path.exists(os.path.dirname(bash_comp_dest)):
        os.makedirs(os.path.dirname(bash_comp_dest))

    complete = 'calibre-complete'
    if getattr(sys, 'frozen_path', None):
        complete = os.path.join(getattr(sys, 'frozen_path'), complete)

    with open(bash_comp_dest or os.devnull, 'wb') as f:
        w = polyglot_write(f)

        def o_and_e(*args, **kwargs):
            w(opts_and_exts(*args, **kwargs))
            zsh.opts_and_exts(*args, **kwargs)

        def o_and_w(*args, **kwargs):
            w(opts_and_words(*args, **kwargs))
            zsh.opts_and_words(*args, **kwargs)

        w('# calibre Bash Shell Completion\n')
        o_and_e('calibre', guiop, BOOK_EXTENSIONS)
        o_and_e('lrf2lrs', lrf2lrsop, ['lrf'], file_map={'--output': ['lrs']})
        o_and_e('ebook-meta',
                metaop,
                list(meta_filetypes()),
                cover_opts=['--cover', '-c'],
                opf_opts=['--to-opf', '--from-opf'])
        o_and_e('ebook-polish',
                polish_op, [x.lower() for x in SUPPORTED],
                cover_opts=['--cover', '-c'],
                opf_opts=['--opf', '-o'])
        o_and_e('lrfviewer', lrfviewerop, ['lrf'])
        o_and_e('ebook-viewer', viewer_op, input_formats)
        o_and_e('ebook-edit', tweak_op, tweak_formats)
        o_and_w('fetch-ebook-metadata', fem_op, [])
        o_and_w('calibre-smtp', smtp_op, [])
        o_and_w('calibre-server', serv_op, [])
        o_and_e('calibre-debug',
                debug_op, ['py', 'recipe', 'mobi', 'azw', 'azw3', 'docx'],
                file_map={
                    '--tweak-book': ['epub', 'azw3', 'mobi'],
                    '--subset-font': ['ttf', 'otf'],
                    '--exec-file': ['py', 'recipe'],
                    '--add-simple-plugin': ['py'],
                    '--inspect-mobi': ['mobi', 'azw', 'azw3'],
                    '--viewer': sorted(available_input_formats()),
                })
        w(
            textwrap.dedent('''
        _ebook_device_ls()
        {
        local pattern search listing prefix
        pattern="$1"
        search="$1"
        if [[ -n "{$pattern}" ]]; then
            if [[ "${pattern:(-1)}" == "/" ]]; then
            pattern=""
            else
            pattern="$(basename ${pattern} 2> /dev/null)"
            search="$(dirname ${search} 2> /dev/null)"
            fi
        fi

        if [[  "x${search}" == "x" || "x${search}" == "x." ]]; then
            search="/"
        fi

        listing="$(ebook-device ls ${search} 2>/dev/null)"

        prefix="${search}"
        if [[ "x${prefix:(-1)}" != "x/" ]]; then
            prefix="${prefix}/"
        fi

        echo $(compgen -P "${prefix}" -W "${listing}" "${pattern}")
        }

        _ebook_device()
        {
        local cur prev
        cur="${COMP_WORDS[COMP_CWORD]}"
        prev="${COMP_WORDS[COMP_CWORD-1]}"
        COMPREPLY=()
        case "${prev}" in
            ls|rm|mkdir|touch|cat )
                COMPREPLY=( $(_ebook_device_ls "${cur}") )
                return 0
                ;;
            cp )
                if [[ ${cur} == dev:* ]]; then
                COMPREPLY=( $(_ebook_device_ls "${cur:7}") )
                return 0
                else
                _filedir
                return 0
                fi
                ;;
            dev )
                COMPREPLY=( $(compgen -W "cp ls rm mkdir touch cat info books df" "${cur}") )
                return 0
                ;;
            * )
                if [[ ${cur} == dev:* ]]; then
                COMPREPLY=( $(_ebook_device_ls "${cur:7}") )
                return 0
                else
                if [[ ${prev} == dev:* ]]; then
                    _filedir
                    return 0
                else
                    COMPREPLY=( $(compgen -W "dev:" "${cur}") )
                    return 0
                fi
                return 0
                fi
            ;;
        esac
        }
        complete -o nospace  -F _ebook_device ebook-device

        complete -o nospace -C %s ebook-convert
        ''') % complete)
    zsh.write()
Пример #11
0
    def setup_completion(self):  # {{{
        try:
            self.info('Setting up command-line completion...')
            from calibre.ebooks.metadata.cli import option_parser as metaop, filetypes as meta_filetypes
            from calibre.ebooks.lrf.lrfparser import option_parser as lrf2lrsop
            from calibre.gui2.lrf_renderer.main import option_parser as lrfviewerop
            from calibre.gui2.viewer.main import option_parser as viewer_op
            from calibre.gui2.tweak_book.main import option_parser as tweak_op
            from calibre.ebooks.metadata.sources.cli import option_parser as fem_op
            from calibre.gui2.main import option_parser as guiop
            from calibre.utils.smtp import option_parser as smtp_op
            from calibre.library.server.main import option_parser as serv_op
            from calibre.ebooks.oeb.polish.main import option_parser as polish_op, SUPPORTED
            from calibre.ebooks.oeb.polish.import_book import IMPORTABLE
            from calibre.debug import option_parser as debug_op
            from calibre.ebooks import BOOK_EXTENSIONS
            from calibre.customize.ui import available_input_formats
            input_formats = sorted(all_input_formats())
            tweak_formats = sorted(x.lower() for x in SUPPORTED|IMPORTABLE)
            zsh = ZshCompleter(self.opts)
            bc = os.path.join(os.path.dirname(self.opts.staging_sharedir),
                'bash-completion')
            if os.path.exists(bc):
                f = os.path.join(bc, 'calibre')
            else:
                if isnetbsd:
                    f = os.path.join(self.opts.staging_root, 'share/bash_completion.d/calibre')
                else:
                    f = os.path.join(self.opts.staging_etc, 'bash_completion.d/calibre')
            if not os.path.exists(os.path.dirname(f)):
                os.makedirs(os.path.dirname(f))
            bash_comp_dest, zsh_comp_dest = f, None
            if zsh.dest:
                self.info('Installing zsh completion to:', zsh.dest)
                self.manifest.append(zsh.dest)
                zsh_comp_dest = zsh.dest
            complete = 'calibre-complete'
            if getattr(sys, 'frozen_path', None):
                complete = os.path.join(getattr(sys, 'frozen_path'), complete)

            self.info('Installing bash completion to', f)
            with open(f, 'wb') as f:
                def o_and_e(*args, **kwargs):
                    f.write(opts_and_exts(*args, **kwargs))
                    zsh.opts_and_exts(*args, **kwargs)
                def o_and_w(*args, **kwargs):
                    f.write(opts_and_words(*args, **kwargs))
                    zsh.opts_and_words(*args, **kwargs)

                f.write('# calibre Bash Shell Completion\n')
                o_and_e('calibre', guiop, BOOK_EXTENSIONS)
                o_and_e('lrf2lrs', lrf2lrsop, ['lrf'], file_map={'--output':['lrs']})
                o_and_e('ebook-meta', metaop,
                        list(meta_filetypes()), cover_opts=['--cover', '-c'],
                        opf_opts=['--to-opf', '--from-opf'])
                o_and_e('ebook-polish', polish_op,
                        [x.lower() for x in SUPPORTED], cover_opts=['--cover', '-c'],
                        opf_opts=['--opf', '-o'])
                o_and_e('lrfviewer', lrfviewerop, ['lrf'])
                o_and_e('ebook-viewer', viewer_op, input_formats)
                o_and_e('ebook-edit', tweak_op, tweak_formats)
                o_and_w('fetch-ebook-metadata', fem_op, [])
                o_and_w('calibre-smtp', smtp_op, [])
                o_and_w('calibre-server', serv_op, [])
                o_and_e('calibre-debug', debug_op, ['py', 'recipe', 'mobi', 'azw', 'azw3', 'docx'], file_map={
                    '--tweak-book':['epub', 'azw3', 'mobi'],
                    '--subset-font':['ttf', 'otf'],
                    '--exec-file':['py', 'recipe'],
                    '--add-simple-plugin':['py'],
                    '--inspect-mobi':['mobi', 'azw', 'azw3'],
                    '--viewer':list(available_input_formats()),
                })
                f.write(textwrap.dedent('''
                _ebook_device_ls()
                {
                local pattern search listing prefix
                pattern="$1"
                search="$1"
                if [[ -n "{$pattern}" ]]; then
                    if [[ "${pattern:(-1)}" == "/" ]]; then
                    pattern=""
                    else
                    pattern="$(basename ${pattern} 2> /dev/null)"
                    search="$(dirname ${search} 2> /dev/null)"
                    fi
                fi

                if [[  "x${search}" == "x" || "x${search}" == "x." ]]; then
                    search="/"
                fi

                listing="$(ebook-device ls ${search} 2>/dev/null)"

                prefix="${search}"
                if [[ "x${prefix:(-1)}" != "x/" ]]; then
                    prefix="${prefix}/"
                fi

                echo $(compgen -P "${prefix}" -W "${listing}" "${pattern}")
                }

                _ebook_device()
                {
                local cur prev
                cur="${COMP_WORDS[COMP_CWORD]}"
                prev="${COMP_WORDS[COMP_CWORD-1]}"
                COMPREPLY=()
                case "${prev}" in
                    ls|rm|mkdir|touch|cat )
                        COMPREPLY=( $(_ebook_device_ls "${cur}") )
                        return 0
                        ;;
                    cp )
                        if [[ ${cur} == dev:* ]]; then
                        COMPREPLY=( $(_ebook_device_ls "${cur:7}") )
                        return 0
                        else
                        _filedir
                        return 0
                        fi
                        ;;
                    dev )
                        COMPREPLY=( $(compgen -W "cp ls rm mkdir touch cat info books df" "${cur}") )
                        return 0
                        ;;
                    * )
                        if [[ ${cur} == dev:* ]]; then
                        COMPREPLY=( $(_ebook_device_ls "${cur:7}") )
                        return 0
                        else
                        if [[ ${prev} == dev:* ]]; then
                            _filedir
                            return 0
                        else
                            COMPREPLY=( $(compgen -W "dev:" "${cur}") )
                            return 0
                        fi
                        return 0
                        fi
                    ;;
                esac
                }
                complete -o nospace  -F _ebook_device ebook-device

                complete -o nospace -C %s ebook-convert
                ''')%complete)
            zsh.write()
            self.manifest.extend((bash_comp_dest, zsh_comp_dest))
        except TypeError as err:
            if 'resolve_entities' in str(err):
                print 'You need python-lxml >= 2.0.5 for calibre'
                sys.exit(1)
            raise
        except EnvironmentError as e:
            if e.errno == errno.EACCES:
                self.warning('Failed to setup completion, permission denied')
        except:
            if self.opts.fatal_errors:
                raise
            self.task_failed('Setting up completion failed')
Пример #12
0
    def setup_desktop_integration(self):  # {{{
        try:
            self.info('Setting up desktop integration...')

            env = os.environ.copy()
            cc = check_call
            if getattr(sys, 'frozen_path', False) and 'LD_LIBRARY_PATH' in env:
                paths = env.get('LD_LIBRARY_PATH', '').split(os.pathsep)
                paths = [x for x in paths if x]
                npaths = [x for x in paths if x != sys.frozen_path+'/lib']
                env['LD_LIBRARY_PATH'] = os.pathsep.join(npaths)
                cc = partial(check_call, env=env)

            with TemporaryDirectory() as tdir, CurrentDir(tdir), \
                                PreserveMIMEDefaults():
                render_img('mimetypes/lrf.png', 'calibre-lrf.png')
                cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-lrf.png application-lrf', shell=True)
                self.icon_resources.append(('mimetypes', 'application-lrf', '128'))
                cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-lrf.png text-lrs', shell=True)
                self.icon_resources.append(('mimetypes', 'application-lrs',
                '128'))
                render_img('mimetypes/mobi.png', 'calibre-mobi.png')
                cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-mobi.png application-x-mobipocket-ebook', shell=True)
                self.icon_resources.append(('mimetypes', 'application-x-mobipocket-ebook', '128'))
                render_img('mimetypes/tpz.png', 'calibre-tpz.png')
                cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-tpz.png application-x-topaz-ebook', shell=True)
                self.icon_resources.append(('mimetypes', 'application-x-topaz-ebook', '128'))
                render_img('mimetypes/azw2.png', 'calibre-azw2.png')
                cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-azw2.png application-x-kindle-application', shell=True)
                self.icon_resources.append(('mimetypes', 'application-x-kindle-application', '128'))
                render_img('mimetypes/azw3.png', 'calibre-azw3.png')
                cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-azw3.png application-x-mobi8-ebook', shell=True)
                self.icon_resources.append(('mimetypes', 'application-x-mobi8-ebook', '128'))
                render_img('lt.png', 'calibre-gui.png', width=256, height=256)
                cc('xdg-icon-resource install --noupdate --size 256 calibre-gui.png calibre-gui', shell=True)
                self.icon_resources.append(('apps', 'calibre-gui', '128'))
                render_img('viewer.png', 'calibre-viewer.png')
                cc('xdg-icon-resource install --size 128 calibre-viewer.png calibre-viewer', shell=True)
                self.icon_resources.append(('apps', 'calibre-viewer', '128'))
                render_img('tweak.png', 'calibre-ebook-tweak.png')
                cc('xdg-icon-resource install --size 128 calibre-ebook-tweak.png calibre-ebook-tweak', shell=True)
                self.icon_resources.append(('apps', 'calibre-ebook-tweak', '128'))

                mimetypes = set([])
                for x in all_input_formats():
                    mt = guess_type('dummy.'+x)[0]
                    if mt and 'chemical' not in mt and 'ctc-posml' not in mt:
                        mimetypes.add(mt)

                def write_mimetypes(f):
                    f.write('MimeType=%s;\n'%';'.join(mimetypes))

                from calibre.ebooks.oeb.polish.main import SUPPORTED
                f = open('calibre-lrfviewer.desktop', 'wb')
                f.write(VIEWER)
                f.close()
                f = open('calibre-ebook-viewer.desktop', 'wb')
                f.write(EVIEWER)
                write_mimetypes(f)
                f = open('calibre-ebook-tweak.desktop', 'wb')
                f.write(ETWEAK)
                mt = [guess_type('a.' + x.lower())[0] for x in SUPPORTED]
                f.write('MimeType=%s;\n'%';'.join(mt))
                f.close()
                f = open('calibre-gui.desktop', 'wb')
                f.write(GUI)
                write_mimetypes(f)
                f.close()
                des = ('calibre-gui.desktop', 'calibre-lrfviewer.desktop',
                        'calibre-ebook-viewer.desktop', 'calibre-ebook-tweak.desktop')
                for x in des:
                    cmd = ['xdg-desktop-menu', 'install', '--noupdate', './'+x]
                    cc(' '.join(cmd), shell=True)
                    self.menu_resources.append(x)
                cc(['xdg-desktop-menu', 'forceupdate'])
                f = open('calibre-mimetypes.xml', 'wb')
                f.write(MIME)
                f.close()
                self.mime_resources.append('calibre-mimetypes.xml')
                cc('xdg-mime install ./calibre-mimetypes.xml', shell=True)
        except Exception:
            if self.opts.fatal_errors:
                raise
            self.task_failed('Setting up desktop integration failed')
Пример #13
0
    def setup_desktop_integration(self):  # {{{
        try:
            self.info("Setting up desktop integration...")

            env = os.environ.copy()
            cc = check_call
            if getattr(sys, "frozen_path", False) and "LD_LIBRARY_PATH" in env:
                paths = env.get("LD_LIBRARY_PATH", "").split(os.pathsep)
                paths = [x for x in paths if x]
                npaths = [x for x in paths if x != sys.frozen_path + "/lib"]
                env["LD_LIBRARY_PATH"] = os.pathsep.join(npaths)
                cc = partial(check_call, env=env)

            with TemporaryDirectory() as tdir, CurrentDir(tdir), PreserveMIMEDefaults():
                render_img("mimetypes/lrf.png", "calibre-lrf.png")
                cc(
                    "xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-lrf.png application-lrf",
                    shell=True,
                )
                self.icon_resources.append(("mimetypes", "application-lrf", "128"))
                cc(
                    "xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-lrf.png text-lrs",
                    shell=True,
                )
                self.icon_resources.append(("mimetypes", "application-lrs", "128"))
                render_img("mimetypes/mobi.png", "calibre-mobi.png")
                cc(
                    "xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-mobi.png application-x-mobipocket-ebook",
                    shell=True,
                )
                self.icon_resources.append(("mimetypes", "application-x-mobipocket-ebook", "128"))
                render_img("mimetypes/tpz.png", "calibre-tpz.png")
                cc(
                    "xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-tpz.png application-x-topaz-ebook",
                    shell=True,
                )
                self.icon_resources.append(("mimetypes", "application-x-topaz-ebook", "128"))
                render_img("mimetypes/azw2.png", "calibre-azw2.png")
                cc(
                    "xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-azw2.png application-x-kindle-application",
                    shell=True,
                )
                self.icon_resources.append(("mimetypes", "application-x-kindle-application", "128"))
                render_img("mimetypes/azw3.png", "calibre-azw3.png")
                cc(
                    "xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-azw3.png application-x-mobi8-ebook",
                    shell=True,
                )
                self.icon_resources.append(("mimetypes", "application-x-mobi8-ebook", "128"))
                render_img("lt.png", "calibre-gui.png", width=256, height=256)
                cc("xdg-icon-resource install --noupdate --size 256 calibre-gui.png calibre-gui", shell=True)
                self.icon_resources.append(("apps", "calibre-gui", "256"))
                render_img("viewer.png", "calibre-viewer.png", width=256, height=256)
                cc("xdg-icon-resource install --size 256 calibre-viewer.png calibre-viewer", shell=True)
                self.icon_resources.append(("apps", "calibre-viewer", "256"))
                render_img("tweak.png", "calibre-ebook-edit.png", width=256, height=256)
                cc("xdg-icon-resource install --size 256 calibre-ebook-edit.png calibre-ebook-edit", shell=True)
                self.icon_resources.append(("apps", "calibre-ebook-edit", "256"))

                mimetypes = set([])
                for x in all_input_formats():
                    mt = guess_type("dummy." + x)[0]
                    if mt and "chemical" not in mt and "ctc-posml" not in mt:
                        mimetypes.add(mt)

                def write_mimetypes(f):
                    f.write("MimeType=%s;\n" % ";".join(mimetypes))

                from calibre.ebooks.oeb.polish.main import SUPPORTED

                f = open("calibre-lrfviewer.desktop", "wb")
                f.write(VIEWER)
                f.close()
                f = open("calibre-ebook-viewer.desktop", "wb")
                f.write(EVIEWER)
                write_mimetypes(f)
                f = open("calibre-ebook-edit.desktop", "wb")
                f.write(ETWEAK)
                mt = [guess_type("a." + x.lower())[0] for x in SUPPORTED]
                f.write("MimeType=%s;\n" % ";".join(mt))
                f.close()
                f = open("calibre-gui.desktop", "wb")
                f.write(GUI)
                write_mimetypes(f)
                f.close()
                des = (
                    "calibre-gui.desktop",
                    "calibre-lrfviewer.desktop",
                    "calibre-ebook-viewer.desktop",
                    "calibre-ebook-edit.desktop",
                )
                appdata = os.path.join(os.path.dirname(self.opts.staging_sharedir), "appdata")
                if not os.path.exists(appdata):
                    try:
                        os.mkdir(appdata)
                    except:
                        self.warning("Failed to create %s not installing appdata files" % appdata)
                if os.path.exists(appdata) and not os.access(appdata, os.W_OK):
                    self.warning("Do not have write permissions for %s not installing appdata files" % appdata)
                else:
                    from calibre.utils.localization import get_all_translators

                    translators = dict(get_all_translators())

                APPDATA = get_appdata()
                for x in des:
                    cmd = ["xdg-desktop-menu", "install", "--noupdate", "./" + x]
                    cc(" ".join(cmd), shell=True)
                    self.menu_resources.append(x)
                    ak = x.partition(".")[0]
                    if ak in APPDATA and os.access(appdata, os.W_OK):
                        self.appdata_resources.append(write_appdata(ak, APPDATA[ak], appdata, translators))
                cc(["xdg-desktop-menu", "forceupdate"])
                MIME = P("calibre-mimetypes.xml")
                self.mime_resources.append(MIME)
                cc(["xdg-mime", "install", MIME])
        except Exception:
            if self.opts.fatal_errors:
                raise
            self.task_failed("Setting up desktop integration failed")
Пример #14
0
def write_completion(bash_comp_dest, zsh):
    from calibre.ebooks.metadata.cli import option_parser as metaop, filetypes as meta_filetypes
    from calibre.ebooks.lrf.lrfparser import option_parser as lrf2lrsop
    from calibre.gui2.lrf_renderer.main import option_parser as lrfviewerop
    from calibre.gui2.viewer.main import option_parser as viewer_op
    from calibre.gui2.tweak_book.main import option_parser as tweak_op
    from calibre.ebooks.metadata.sources.cli import option_parser as fem_op
    from calibre.gui2.main import option_parser as guiop
    from calibre.utils.smtp import option_parser as smtp_op
    from calibre.library.server.main import option_parser as serv_op
    from calibre.ebooks.oeb.polish.main import option_parser as polish_op, SUPPORTED
    from calibre.ebooks.oeb.polish.import_book import IMPORTABLE
    from calibre.debug import option_parser as debug_op
    from calibre.ebooks import BOOK_EXTENSIONS
    from calibre.customize.ui import available_input_formats

    input_formats = sorted(all_input_formats())
    tweak_formats = sorted(x.lower() for x in SUPPORTED | IMPORTABLE)

    if bash_comp_dest and not os.path.exists(os.path.dirname(bash_comp_dest)):
        os.makedirs(os.path.dirname(bash_comp_dest))

    complete = "calibre-complete"
    if getattr(sys, "frozen_path", None):
        complete = os.path.join(getattr(sys, "frozen_path"), complete)

    with open(bash_comp_dest or os.devnull, "wb") as f:

        def o_and_e(*args, **kwargs):
            f.write(opts_and_exts(*args, **kwargs))
            zsh.opts_and_exts(*args, **kwargs)

        def o_and_w(*args, **kwargs):
            f.write(opts_and_words(*args, **kwargs))
            zsh.opts_and_words(*args, **kwargs)

        f.write("# calibre Bash Shell Completion\n")
        o_and_e("calibre", guiop, BOOK_EXTENSIONS)
        o_and_e("lrf2lrs", lrf2lrsop, ["lrf"], file_map={"--output": ["lrs"]})
        o_and_e(
            "ebook-meta",
            metaop,
            list(meta_filetypes()),
            cover_opts=["--cover", "-c"],
            opf_opts=["--to-opf", "--from-opf"],
        )
        o_and_e(
            "ebook-polish",
            polish_op,
            [x.lower() for x in SUPPORTED],
            cover_opts=["--cover", "-c"],
            opf_opts=["--opf", "-o"],
        )
        o_and_e("lrfviewer", lrfviewerop, ["lrf"])
        o_and_e("ebook-viewer", viewer_op, input_formats)
        o_and_e("ebook-edit", tweak_op, tweak_formats)
        o_and_w("fetch-ebook-metadata", fem_op, [])
        o_and_w("calibre-smtp", smtp_op, [])
        o_and_w("calibre-server", serv_op, [])
        o_and_e(
            "calibre-debug",
            debug_op,
            ["py", "recipe", "mobi", "azw", "azw3", "docx"],
            file_map={
                "--tweak-book": ["epub", "azw3", "mobi"],
                "--subset-font": ["ttf", "otf"],
                "--exec-file": ["py", "recipe"],
                "--add-simple-plugin": ["py"],
                "--inspect-mobi": ["mobi", "azw", "azw3"],
                "--viewer": list(available_input_formats()),
            },
        )
        f.write(
            textwrap.dedent(
                """
        _ebook_device_ls()
        {
        local pattern search listing prefix
        pattern="$1"
        search="$1"
        if [[ -n "{$pattern}" ]]; then
            if [[ "${pattern:(-1)}" == "/" ]]; then
            pattern=""
            else
            pattern="$(basename ${pattern} 2> /dev/null)"
            search="$(dirname ${search} 2> /dev/null)"
            fi
        fi

        if [[  "x${search}" == "x" || "x${search}" == "x." ]]; then
            search="/"
        fi

        listing="$(ebook-device ls ${search} 2>/dev/null)"

        prefix="${search}"
        if [[ "x${prefix:(-1)}" != "x/" ]]; then
            prefix="${prefix}/"
        fi

        echo $(compgen -P "${prefix}" -W "${listing}" "${pattern}")
        }

        _ebook_device()
        {
        local cur prev
        cur="${COMP_WORDS[COMP_CWORD]}"
        prev="${COMP_WORDS[COMP_CWORD-1]}"
        COMPREPLY=()
        case "${prev}" in
            ls|rm|mkdir|touch|cat )
                COMPREPLY=( $(_ebook_device_ls "${cur}") )
                return 0
                ;;
            cp )
                if [[ ${cur} == dev:* ]]; then
                COMPREPLY=( $(_ebook_device_ls "${cur:7}") )
                return 0
                else
                _filedir
                return 0
                fi
                ;;
            dev )
                COMPREPLY=( $(compgen -W "cp ls rm mkdir touch cat info books df" "${cur}") )
                return 0
                ;;
            * )
                if [[ ${cur} == dev:* ]]; then
                COMPREPLY=( $(_ebook_device_ls "${cur:7}") )
                return 0
                else
                if [[ ${prev} == dev:* ]]; then
                    _filedir
                    return 0
                else
                    COMPREPLY=( $(compgen -W "dev:" "${cur}") )
                    return 0
                fi
                return 0
                fi
            ;;
        esac
        }
        complete -o nospace  -F _ebook_device ebook-device

        complete -o nospace -C %s ebook-convert
        """
            )
            % complete
        )
    zsh.write()
Пример #15
0
    def setup_desktop_integration(self):  # {{{
        try:
            self.info('Setting up desktop integration...')

            env = os.environ.copy()
            cc = check_call
            if getattr(sys, 'frozen_path', False) and 'LD_LIBRARY_PATH' in env:
                paths = env.get('LD_LIBRARY_PATH', '').split(os.pathsep)
                paths = [x for x in paths if x]
                npaths = [x for x in paths if x != sys.frozen_path + '/lib']
                env['LD_LIBRARY_PATH'] = os.pathsep.join(npaths)
                cc = partial(check_call, env=env)

            with TemporaryDirectory() as tdir, CurrentDir(tdir), \
                                PreserveMIMEDefaults():
                render_img('mimetypes/lrf.png', 'calibre-lrf.png')
                cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-lrf.png application-lrf',
                   shell=True)
                self.icon_resources.append(
                    ('mimetypes', 'application-lrf', '128'))
                cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-lrf.png text-lrs',
                   shell=True)
                self.icon_resources.append(
                    ('mimetypes', 'application-lrs', '128'))
                render_img('mimetypes/mobi.png', 'calibre-mobi.png')
                cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-mobi.png application-x-mobipocket-ebook',
                   shell=True)
                self.icon_resources.append(
                    ('mimetypes', 'application-x-mobipocket-ebook', '128'))
                render_img('mimetypes/tpz.png', 'calibre-tpz.png')
                cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-tpz.png application-x-topaz-ebook',
                   shell=True)
                self.icon_resources.append(
                    ('mimetypes', 'application-x-topaz-ebook', '128'))
                render_img('mimetypes/azw2.png', 'calibre-azw2.png')
                cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-azw2.png application-x-kindle-application',
                   shell=True)
                self.icon_resources.append(
                    ('mimetypes', 'application-x-kindle-application', '128'))
                render_img('mimetypes/azw3.png', 'calibre-azw3.png')
                cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-azw3.png application-x-mobi8-ebook',
                   shell=True)
                self.icon_resources.append(
                    ('mimetypes', 'application-x-mobi8-ebook', '128'))
                render_img('lt.png', 'calibre-gui.png', width=256, height=256)
                cc('xdg-icon-resource install --noupdate --size 256 calibre-gui.png calibre-gui',
                   shell=True)
                self.icon_resources.append(('apps', 'calibre-gui', '128'))
                render_img('viewer.png', 'calibre-viewer.png')
                cc('xdg-icon-resource install --size 128 calibre-viewer.png calibre-viewer',
                   shell=True)
                self.icon_resources.append(('apps', 'calibre-viewer', '128'))
                render_img('tweak.png', 'calibre-ebook-edit.png')
                cc('xdg-icon-resource install --size 128 calibre-ebook-edit.png calibre-ebook-edit',
                   shell=True)
                self.icon_resources.append(
                    ('apps', 'calibre-ebook-edit', '128'))

                mimetypes = set([])
                for x in all_input_formats():
                    mt = guess_type('dummy.' + x)[0]
                    if mt and 'chemical' not in mt and 'ctc-posml' not in mt:
                        mimetypes.add(mt)

                def write_mimetypes(f):
                    f.write('MimeType=%s;\n' % ';'.join(mimetypes))

                from calibre.ebooks.oeb.polish.main import SUPPORTED
                f = open('calibre-lrfviewer.desktop', 'wb')
                f.write(VIEWER)
                f.close()
                f = open('calibre-ebook-viewer.desktop', 'wb')
                f.write(EVIEWER)
                write_mimetypes(f)
                f = open('calibre-ebook-edit.desktop', 'wb')
                f.write(ETWEAK)
                mt = [guess_type('a.' + x.lower())[0] for x in SUPPORTED]
                f.write('MimeType=%s;\n' % ';'.join(mt))
                f.close()
                f = open('calibre-gui.desktop', 'wb')
                f.write(GUI)
                write_mimetypes(f)
                f.close()
                des = ('calibre-gui.desktop', 'calibre-lrfviewer.desktop',
                       'calibre-ebook-viewer.desktop',
                       'calibre-ebook-edit.desktop')
                for x in des:
                    cmd = [
                        'xdg-desktop-menu', 'install', '--noupdate', './' + x
                    ]
                    cc(' '.join(cmd), shell=True)
                    self.menu_resources.append(x)
                cc(['xdg-desktop-menu', 'forceupdate'])
                f = open('calibre-mimetypes.xml', 'wb')
                f.write(MIME)
                f.close()
                self.mime_resources.append('calibre-mimetypes.xml')
                cc('xdg-mime install ./calibre-mimetypes.xml', shell=True)
        except Exception:
            if self.opts.fatal_errors:
                raise
            self.task_failed('Setting up desktop integration failed')
Пример #16
0
    def setup_completion(self):  # {{{
        try:
            self.info('Setting up command-line completion...')
            from calibre.ebooks.metadata.cli import option_parser as metaop, filetypes as meta_filetypes
            from calibre.ebooks.lrf.lrfparser import option_parser as lrf2lrsop
            from calibre.gui2.lrf_renderer.main import option_parser as lrfviewerop
            from calibre.gui2.viewer.main import option_parser as viewer_op
            from calibre.gui2.tweak_book.main import option_parser as tweak_op
            from calibre.ebooks.metadata.sources.cli import option_parser as fem_op
            from calibre.gui2.main import option_parser as guiop
            from calibre.utils.smtp import option_parser as smtp_op
            from calibre.library.server.main import option_parser as serv_op
            from calibre.ebooks.oeb.polish.main import option_parser as polish_op, SUPPORTED
            from calibre.debug import option_parser as debug_op
            from calibre.ebooks import BOOK_EXTENSIONS
            from calibre.customize.ui import available_input_formats
            input_formats = sorted(all_input_formats())
            tweak_formats = sorted(x.lower() for x in SUPPORTED)
            zsh = ZshCompleter(self.opts)
            bc = os.path.join(os.path.dirname(self.opts.staging_sharedir),
                              'bash-completion')
            if os.path.exists(bc):
                f = os.path.join(bc, 'calibre')
            else:
                if isnetbsd:
                    f = os.path.join(self.opts.staging_root,
                                     'share/bash_completion.d/calibre')
                else:
                    f = os.path.join(self.opts.staging_etc,
                                     'bash_completion.d/calibre')
            if not os.path.exists(os.path.dirname(f)):
                os.makedirs(os.path.dirname(f))
            if zsh.dest:
                self.info('Installing zsh completion to:', zsh.dest)
                self.manifest.append(zsh.dest)
            self.manifest.append(f)
            complete = 'calibre-complete'
            if getattr(sys, 'frozen_path', None):
                complete = os.path.join(getattr(sys, 'frozen_path'), complete)

            self.info('Installing bash completion to', f)
            with open(f, 'wb') as f:

                def o_and_e(*args, **kwargs):
                    f.write(opts_and_exts(*args, **kwargs))
                    zsh.opts_and_exts(*args, **kwargs)

                def o_and_w(*args, **kwargs):
                    f.write(opts_and_words(*args, **kwargs))
                    zsh.opts_and_words(*args, **kwargs)

                f.write('# calibre Bash Shell Completion\n')
                o_and_e('calibre', guiop, BOOK_EXTENSIONS)
                o_and_e('lrf2lrs',
                        lrf2lrsop, ['lrf'],
                        file_map={'--output': ['lrs']})
                o_and_e('ebook-meta',
                        metaop,
                        list(meta_filetypes()),
                        cover_opts=['--cover', '-c'],
                        opf_opts=['--to-opf', '--from-opf'])
                o_and_e('ebook-polish',
                        polish_op, [x.lower() for x in SUPPORTED],
                        cover_opts=['--cover', '-c'],
                        opf_opts=['--opf', '-o'])
                o_and_e('lrfviewer', lrfviewerop, ['lrf'])
                o_and_e('ebook-viewer', viewer_op, input_formats)
                o_and_e('ebook-edit', tweak_op, tweak_formats)
                o_and_w('fetch-ebook-metadata', fem_op, [])
                o_and_w('calibre-smtp', smtp_op, [])
                o_and_w('calibre-server', serv_op, [])
                o_and_e('calibre-debug',
                        debug_op,
                        ['py', 'recipe', 'mobi', 'azw', 'azw3', 'docx'],
                        file_map={
                            '--tweak-book': ['epub', 'azw3', 'mobi'],
                            '--subset-font': ['ttf', 'otf'],
                            '--exec-file': ['py', 'recipe'],
                            '--add-simple-plugin': ['py'],
                            '--inspect-mobi': ['mobi', 'azw', 'azw3'],
                            '--viewer': list(available_input_formats()),
                        })
                f.write(
                    textwrap.dedent('''
                _ebook_device_ls()
                {
                local pattern search listing prefix
                pattern="$1"
                search="$1"
                if [[ -n "{$pattern}" ]]; then
                    if [[ "${pattern:(-1)}" == "/" ]]; then
                    pattern=""
                    else
                    pattern="$(basename ${pattern} 2> /dev/null)"
                    search="$(dirname ${search} 2> /dev/null)"
                    fi
                fi

                if [[  "x${search}" == "x" || "x${search}" == "x." ]]; then
                    search="/"
                fi

                listing="$(ebook-device ls ${search} 2>/dev/null)"

                prefix="${search}"
                if [[ "x${prefix:(-1)}" != "x/" ]]; then
                    prefix="${prefix}/"
                fi

                echo $(compgen -P "${prefix}" -W "${listing}" "${pattern}")
                }

                _ebook_device()
                {
                local cur prev
                cur="${COMP_WORDS[COMP_CWORD]}"
                prev="${COMP_WORDS[COMP_CWORD-1]}"
                COMPREPLY=()
                case "${prev}" in
                    ls|rm|mkdir|touch|cat )
                        COMPREPLY=( $(_ebook_device_ls "${cur}") )
                        return 0
                        ;;
                    cp )
                        if [[ ${cur} == dev:* ]]; then
                        COMPREPLY=( $(_ebook_device_ls "${cur:7}") )
                        return 0
                        else
                        _filedir
                        return 0
                        fi
                        ;;
                    dev )
                        COMPREPLY=( $(compgen -W "cp ls rm mkdir touch cat info books df" "${cur}") )
                        return 0
                        ;;
                    * )
                        if [[ ${cur} == dev:* ]]; then
                        COMPREPLY=( $(_ebook_device_ls "${cur:7}") )
                        return 0
                        else
                        if [[ ${prev} == dev:* ]]; then
                            _filedir
                            return 0
                        else
                            COMPREPLY=( $(compgen -W "dev:" "${cur}") )
                            return 0
                        fi
                        return 0
                        fi
                    ;;
                esac
                }
                complete -o nospace  -F _ebook_device ebook-device

                complete -o nospace -C %s ebook-convert
                ''') % complete)
            zsh.write()
        except TypeError as err:
            if 'resolve_entities' in str(err):
                print 'You need python-lxml >= 2.0.5 for calibre'
                sys.exit(1)
            raise
        except:
            if self.opts.fatal_errors:
                raise
            self.task_failed('Setting up completion failed')
Пример #17
0
    def setup_desktop_integration(self):  # {{{
        try:
            self.info('Setting up desktop integration...')

            env = os.environ.copy()
            cc = check_call
            if getattr(sys, 'frozen_path', False) and 'LD_LIBRARY_PATH' in env:
                paths = env.get('LD_LIBRARY_PATH', '').split(os.pathsep)
                paths = [x for x in paths if x]
                npaths = [x for x in paths if x != sys.frozen_path+'/lib']
                env['LD_LIBRARY_PATH'] = os.pathsep.join(npaths)
                cc = partial(check_call, env=env)

            with TemporaryDirectory() as tdir, CurrentDir(tdir), \
                                PreserveMIMEDefaults():
                render_img('mimetypes/lrf.png', 'calibre-lrf.png')
                cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-lrf.png application-lrf', shell=True)
                self.icon_resources.append(('mimetypes', 'application-lrf', '128'))
                cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-lrf.png text-lrs', shell=True)
                self.icon_resources.append(('mimetypes', 'application-lrs',
                '128'))
                render_img('mimetypes/mobi.png', 'calibre-mobi.png')
                cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-mobi.png application-x-mobipocket-ebook', shell=True)
                self.icon_resources.append(('mimetypes', 'application-x-mobipocket-ebook', '128'))
                render_img('mimetypes/tpz.png', 'calibre-tpz.png')
                cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-tpz.png application-x-topaz-ebook', shell=True)
                self.icon_resources.append(('mimetypes', 'application-x-topaz-ebook', '128'))
                render_img('mimetypes/azw2.png', 'calibre-azw2.png')
                cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-azw2.png application-x-kindle-application', shell=True)
                self.icon_resources.append(('mimetypes', 'application-x-kindle-application', '128'))
                render_img('mimetypes/azw3.png', 'calibre-azw3.png')
                cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-azw3.png application-x-mobi8-ebook', shell=True)
                self.icon_resources.append(('mimetypes', 'application-x-mobi8-ebook', '128'))
                render_img('lt.png', 'calibre-gui.png', width=256, height=256)
                cc('xdg-icon-resource install --noupdate --size 256 calibre-gui.png calibre-gui', shell=True)
                self.icon_resources.append(('apps', 'calibre-gui', '256'))
                render_img('viewer.png', 'calibre-viewer.png', width=256, height=256)
                cc('xdg-icon-resource install --size 256 calibre-viewer.png calibre-viewer', shell=True)
                self.icon_resources.append(('apps', 'calibre-viewer', '256'))
                render_img('tweak.png', 'calibre-ebook-edit.png', width=256, height=256)
                cc('xdg-icon-resource install --size 256 calibre-ebook-edit.png calibre-ebook-edit', shell=True)
                self.icon_resources.append(('apps', 'calibre-ebook-edit', '256'))

                mimetypes = set([])
                for x in all_input_formats():
                    mt = guess_type('dummy.'+x)[0]
                    if mt and 'chemical' not in mt and 'ctc-posml' not in mt:
                        mimetypes.add(mt)

                def write_mimetypes(f):
                    f.write('MimeType=%s;\n'%';'.join(mimetypes))

                from calibre.ebooks.oeb.polish.main import SUPPORTED
                f = open('calibre-lrfviewer.desktop', 'wb')
                f.write(VIEWER)
                f.close()
                f = open('calibre-ebook-viewer.desktop', 'wb')
                f.write(EVIEWER)
                write_mimetypes(f)
                f = open('calibre-ebook-edit.desktop', 'wb')
                f.write(ETWEAK)
                mt = [guess_type('a.' + x.lower())[0] for x in SUPPORTED]
                f.write('MimeType=%s;\n'%';'.join(mt))
                f.close()
                f = open('calibre-gui.desktop', 'wb')
                f.write(GUI)
                write_mimetypes(f)
                f.close()
                des = ('calibre-gui.desktop', 'calibre-lrfviewer.desktop',
                        'calibre-ebook-viewer.desktop', 'calibre-ebook-edit.desktop')
                appdata = os.path.join(os.path.dirname(self.opts.staging_sharedir), 'appdata')
                if not os.path.exists(appdata):
                    try:
                        os.mkdir(appdata)
                    except:
                        self.warning('Failed to create %s not installing appdata files' % appdata)
                if os.path.exists(appdata) and not os.access(appdata, os.W_OK):
                    self.warning('Do not have write permissions for %s not installing appdata files' % appdata)
                else:
                    from calibre.utils.localization import get_all_translators
                    translators = dict(get_all_translators())

                APPDATA = get_appdata()
                for x in des:
                    cmd = ['xdg-desktop-menu', 'install', '--noupdate', './'+x]
                    cc(' '.join(cmd), shell=True)
                    self.menu_resources.append(x)
                    ak = x.partition('.')[0]
                    if ak in APPDATA and os.access(appdata, os.W_OK):
                        self.appdata_resources.append(write_appdata(ak, APPDATA[ak], appdata, translators))
                cc(['xdg-desktop-menu', 'forceupdate'])
                MIME = P('calibre-mimetypes.xml')
                self.mime_resources.append(MIME)
                cc(['xdg-mime', 'install', MIME])
        except Exception:
            if self.opts.fatal_errors:
                raise
            self.task_failed('Setting up desktop integration failed')
Пример #18
0
def write_completion(bash_comp_dest, zsh):
    from calibre.ebooks.metadata.cli import option_parser as metaop, filetypes as meta_filetypes
    from calibre.ebooks.lrf.lrfparser import option_parser as lrf2lrsop
    from calibre.gui2.lrf_renderer.main import option_parser as lrfviewerop
    from calibre.gui2.viewer.main import option_parser as viewer_op
    from calibre.gui2.tweak_book.main import option_parser as tweak_op
    from calibre.ebooks.metadata.sources.cli import option_parser as fem_op
    from calibre.gui2.main import option_parser as guiop
    from calibre.utils.smtp import option_parser as smtp_op
    from calibre.srv.standalone import create_option_parser as serv_op
    from calibre.ebooks.oeb.polish.main import option_parser as polish_op, SUPPORTED
    from calibre.ebooks.oeb.polish.import_book import IMPORTABLE
    from calibre.debug import option_parser as debug_op
    from calibre.ebooks import BOOK_EXTENSIONS
    from calibre.customize.ui import available_input_formats
    input_formats = sorted(all_input_formats())
    tweak_formats = sorted(x.lower() for x in SUPPORTED|IMPORTABLE)

    if bash_comp_dest and not os.path.exists(os.path.dirname(bash_comp_dest)):
        os.makedirs(os.path.dirname(bash_comp_dest))

    complete = 'calibre-complete'
    if getattr(sys, 'frozen_path', None):
        complete = os.path.join(getattr(sys, 'frozen_path'), complete)

    with open(bash_comp_dest or os.devnull, 'wb') as f:
        def o_and_e(*args, **kwargs):
            f.write(opts_and_exts(*args, **kwargs))
            zsh.opts_and_exts(*args, **kwargs)

        def o_and_w(*args, **kwargs):
            f.write(opts_and_words(*args, **kwargs))
            zsh.opts_and_words(*args, **kwargs)

        f.write('# calibre Bash Shell Completion\n')
        o_and_e('calibre', guiop, BOOK_EXTENSIONS)
        o_and_e('lrf2lrs', lrf2lrsop, ['lrf'], file_map={'--output':['lrs']})
        o_and_e('ebook-meta', metaop,
                list(meta_filetypes()), cover_opts=['--cover', '-c'],
                opf_opts=['--to-opf', '--from-opf'])
        o_and_e('ebook-polish', polish_op,
                [x.lower() for x in SUPPORTED], cover_opts=['--cover', '-c'],
                opf_opts=['--opf', '-o'])
        o_and_e('lrfviewer', lrfviewerop, ['lrf'])
        o_and_e('ebook-viewer', viewer_op, input_formats)
        o_and_e('ebook-edit', tweak_op, tweak_formats)
        o_and_w('fetch-ebook-metadata', fem_op, [])
        o_and_w('calibre-smtp', smtp_op, [])
        o_and_w('calibre-server', serv_op, [])
        o_and_e('calibre-debug', debug_op, ['py', 'recipe', 'mobi', 'azw', 'azw3', 'docx'], file_map={
            '--tweak-book':['epub', 'azw3', 'mobi'],
            '--subset-font':['ttf', 'otf'],
            '--exec-file':['py', 'recipe'],
            '--add-simple-plugin':['py'],
            '--inspect-mobi':['mobi', 'azw', 'azw3'],
            '--viewer':sorted(available_input_formats()),
        })
        f.write(textwrap.dedent('''
        _ebook_device_ls()
        {
        local pattern search listing prefix
        pattern="$1"
        search="$1"
        if [[ -n "{$pattern}" ]]; then
            if [[ "${pattern:(-1)}" == "/" ]]; then
            pattern=""
            else
            pattern="$(basename ${pattern} 2> /dev/null)"
            search="$(dirname ${search} 2> /dev/null)"
            fi
        fi

        if [[  "x${search}" == "x" || "x${search}" == "x." ]]; then
            search="/"
        fi

        listing="$(ebook-device ls ${search} 2>/dev/null)"

        prefix="${search}"
        if [[ "x${prefix:(-1)}" != "x/" ]]; then
            prefix="${prefix}/"
        fi

        echo $(compgen -P "${prefix}" -W "${listing}" "${pattern}")
        }

        _ebook_device()
        {
        local cur prev
        cur="${COMP_WORDS[COMP_CWORD]}"
        prev="${COMP_WORDS[COMP_CWORD-1]}"
        COMPREPLY=()
        case "${prev}" in
            ls|rm|mkdir|touch|cat )
                COMPREPLY=( $(_ebook_device_ls "${cur}") )
                return 0
                ;;
            cp )
                if [[ ${cur} == dev:* ]]; then
                COMPREPLY=( $(_ebook_device_ls "${cur:7}") )
                return 0
                else
                _filedir
                return 0
                fi
                ;;
            dev )
                COMPREPLY=( $(compgen -W "cp ls rm mkdir touch cat info books df" "${cur}") )
                return 0
                ;;
            * )
                if [[ ${cur} == dev:* ]]; then
                COMPREPLY=( $(_ebook_device_ls "${cur:7}") )
                return 0
                else
                if [[ ${prev} == dev:* ]]; then
                    _filedir
                    return 0
                else
                    COMPREPLY=( $(compgen -W "dev:" "${cur}") )
                    return 0
                fi
                return 0
                fi
            ;;
        esac
        }
        complete -o nospace  -F _ebook_device ebook-device

        complete -o nospace -C %s ebook-convert
        ''')%complete)
    zsh.write()
Пример #19
0
    def setup_desktop_integration(self):  # {{{
        try:
            self.info('Setting up desktop integration...')

            env = os.environ.copy()
            cc = check_call
            if getattr(sys, 'frozen_path', False) and 'LD_LIBRARY_PATH' in env:
                paths = env.get('LD_LIBRARY_PATH', '').split(os.pathsep)
                paths = [x for x in paths if x]
                npaths = [x for x in paths if x != sys.frozen_path + '/lib']
                env['LD_LIBRARY_PATH'] = os.pathsep.join(npaths)
                cc = partial(check_call, env=env)

            with TemporaryDirectory() as tdir, CurrentDir(
                    tdir), PreserveMIMEDefaults():

                def install_single_icon(iconsrc,
                                        basename,
                                        size,
                                        context,
                                        is_last_icon=False):
                    filename = '%s-%s.png' % (basename, size)
                    render_img(iconsrc,
                               filename,
                               width=int(size),
                               height=int(size))
                    cmd = [
                        'xdg-icon-resource', 'install', '--noupdate',
                        '--context', context, '--size',
                        str(size), filename, basename
                    ]
                    if is_last_icon:
                        del cmd[2]
                    cc(cmd)
                    self.icon_resources.append((context, basename, str(size)))

                def install_icons(iconsrc,
                                  basename,
                                  context,
                                  is_last_icon=False):
                    sizes = (16, 32, 48, 64, 128, 256)
                    for size in sizes:
                        install_single_icon(iconsrc, basename, size, context,
                                            is_last_icon and size is sizes[-1])

                icons = list(
                    filter(None, [
                        x.strip() for x in '''\
                    mimetypes/lrf.png application-lrf mimetypes
                    mimetypes/lrf.png text-lrs mimetypes
                    mimetypes/mobi.png application-x-mobipocket-ebook mimetypes
                    mimetypes/tpz.png application-x-topaz-ebook mimetypes
                    mimetypes/azw2.png application-x-kindle-application mimetypes
                    mimetypes/azw3.png application-x-mobi8-ebook mimetypes
                    lt.png calibre-gui apps
                    viewer.png calibre-viewer apps
                    tweak.png calibre-ebook-edit apps
                    '''.splitlines()
                    ]))
                for line in icons:
                    iconsrc, basename, context = line.split()
                    install_icons(iconsrc,
                                  basename,
                                  context,
                                  is_last_icon=line is icons[-1])

                mimetypes = set()
                for x in all_input_formats():
                    mt = guess_type('dummy.' + x)[0]
                    if mt and 'chemical' not in mt and 'ctc-posml' not in mt:
                        mimetypes.add(mt)
                mimetypes.discard('application/octet-stream')

                def write_mimetypes(f):
                    polyglot_write(f)('MimeType=%s;\n' % ';'.join(mimetypes))

                from calibre.ebooks.oeb.polish.main import SUPPORTED
                from calibre.ebooks.oeb.polish.import_book import IMPORTABLE
                with open('calibre-lrfviewer.desktop', 'wb') as f:
                    polyglot_write(f)(VIEWER)
                with open('calibre-ebook-viewer.desktop', 'wb') as f:
                    polyglot_write(f)(EVIEWER)
                    write_mimetypes(f)
                with open('calibre-ebook-edit.desktop', 'wb') as f:
                    polyglot_write(f)(ETWEAK)
                    mt = {
                        guess_type('a.' + x.lower())[0]
                        for x in (SUPPORTED | IMPORTABLE)
                    } - {None, 'application/octet-stream'}
                    polyglot_write(f)('MimeType=%s;\n' % ';'.join(mt))
                with open('calibre-gui.desktop', 'wb') as f:
                    polyglot_write(f)(GUI)
                    write_mimetypes(f)
                des = ('calibre-gui.desktop', 'calibre-lrfviewer.desktop',
                       'calibre-ebook-viewer.desktop',
                       'calibre-ebook-edit.desktop')
                appdata = os.path.join(
                    os.path.dirname(self.opts.staging_sharedir), 'metainfo')
                if not os.path.exists(appdata):
                    try:
                        os.mkdir(appdata)
                    except:
                        self.warning(
                            'Failed to create %s not installing appdata files'
                            % appdata)
                if os.path.exists(appdata) and not os.access(appdata, os.W_OK):
                    self.warning(
                        'Do not have write permissions for %s not installing appdata files'
                        % appdata)
                else:
                    from calibre.utils.localization import get_all_translators
                    translators = dict(get_all_translators())

                APPDATA = get_appdata()
                for x in des:
                    cmd = [
                        'xdg-desktop-menu', 'install', '--noupdate', './' + x
                    ]
                    cc(' '.join(cmd), shell=True)
                    self.menu_resources.append(x)
                    ak = x.partition('.')[0]
                    if ak in APPDATA and os.access(appdata, os.W_OK):
                        self.appdata_resources.append(
                            write_appdata(ak, APPDATA[ak], appdata,
                                          translators))
                cc(['xdg-desktop-menu', 'forceupdate'])
                MIME = P('calibre-mimetypes.xml')
                self.mime_resources.append(MIME)
                cc(['xdg-mime', 'install', MIME])
        except Exception:
            if self.opts.fatal_errors:
                raise
            self.task_failed('Setting up desktop integration failed')
Пример #20
0
    def setup_completion(self): # {{{
        try:
            self.info('Setting up bash completion...')
            from calibre.ebooks.metadata.cli import option_parser as metaop, filetypes as meta_filetypes
            from calibre.ebooks.lrf.lrfparser import option_parser as lrf2lrsop
            from calibre.gui2.lrf_renderer.main import option_parser as lrfviewerop
            from calibre.gui2.viewer.main import option_parser as viewer_op
            from calibre.ebooks.metadata.sources.cli import option_parser as fem_op
            from calibre.gui2.main import option_parser as guiop
            from calibre.utils.smtp import option_parser as smtp_op
            from calibre.library.server.main import option_parser as serv_op
            from calibre.ebooks.epub.fix.main import option_parser as fix_op
            from calibre.ebooks import BOOK_EXTENSIONS
            input_formats = sorted(all_input_formats())
            bc = os.path.join(os.path.dirname(self.opts.staging_sharedir),
                'bash-completion')
            if os.path.exists(bc):
                f = os.path.join(bc, 'calibre')
            else:
                if isnetbsd:
                    f = os.path.join(self.opts.staging_root, 'share/bash_completion.d/calibre')
                else:
                    f = os.path.join(self.opts.staging_etc, 'bash_completion.d/calibre')
            if not os.path.exists(os.path.dirname(f)):
                os.makedirs(os.path.dirname(f))
            self.manifest.append(f)
            complete = 'calibre-complete'
            if getattr(sys, 'frozen_path', None):
                complete = os.path.join(getattr(sys, 'frozen_path'), complete)

            self.info('Installing bash completion to', f)
            with open(f, 'wb') as f:
                f.write('# calibre Bash Shell Completion\n')
                f.write(opts_and_exts('calibre', guiop, BOOK_EXTENSIONS))
                f.write(opts_and_exts('lrf2lrs', lrf2lrsop, ['lrf']))
                f.write(opts_and_exts('ebook-meta', metaop, list(meta_filetypes())))
                f.write(opts_and_exts('lrfviewer', lrfviewerop, ['lrf']))
                f.write(opts_and_exts('ebook-viewer', viewer_op, input_formats))
                f.write(opts_and_words('fetch-ebook-metadata', fem_op, []))
                f.write(opts_and_words('calibre-smtp', smtp_op, []))
                f.write(opts_and_words('calibre-server', serv_op, []))
                f.write(opts_and_exts('epub-fix', fix_op, ['epub']))
                f.write(textwrap.dedent('''
                _ebook_device_ls()
                {
                local pattern search listing prefix
                pattern="$1"
                search="$1"
                if [[ -n "{$pattern}" ]]; then
                    if [[ "${pattern:(-1)}" == "/" ]]; then
                    pattern=""
                    else
                    pattern="$(basename ${pattern} 2> /dev/null)"
                    search="$(dirname ${search} 2> /dev/null)"
                    fi
                fi

                if [[  "x${search}" == "x" || "x${search}" == "x." ]]; then
                    search="/"
                fi

                listing="$(ebook-device ls ${search} 2>/dev/null)"

                prefix="${search}"
                if [[ "x${prefix:(-1)}" != "x/" ]]; then
                    prefix="${prefix}/"
                fi

                echo $(compgen -P "${prefix}" -W "${listing}" "${pattern}")
                }

                _ebook_device()
                {
                local cur prev
                cur="${COMP_WORDS[COMP_CWORD]}"
                prev="${COMP_WORDS[COMP_CWORD-1]}"
                COMPREPLY=()
                case "${prev}" in
                    ls|rm|mkdir|touch|cat )
                        COMPREPLY=( $(_ebook_device_ls "${cur}") )
                        return 0
                        ;;
                    cp )
                        if [[ ${cur} == prs500:* ]]; then
                        COMPREPLY=( $(_ebook_device_ls "${cur:7}") )
                        return 0
                        else
                        _filedir
                        return 0
                        fi
                        ;;
                    prs500 )
                        COMPREPLY=( $(compgen -W "cp ls rm mkdir touch cat info books df" "${cur}") )
                        return 0
                        ;;
                    * )
                        if [[ ${cur} == prs500:* ]]; then
                        COMPREPLY=( $(_ebook_device_ls "${cur:7}") )
                        return 0
                        else
                        if [[ ${prev} == prs500:* ]]; then
                            _filedir
                            return 0
                        else
                            COMPREPLY=( $(compgen -W "prs500:" "${cur}") )
                            return 0
                        fi
                        return 0
                        fi
                    ;;
                esac
                }
                complete -o nospace  -F _ebook_device ebook-device

                complete -o nospace -C %s ebook-convert
                ''')%complete)
        except TypeError as err:
            if 'resolve_entities' in str(err):
                print 'You need python-lxml >= 2.0.5 for calibre'
                sys.exit(1)
            raise
        except:
            if self.opts.fatal_errors:
                raise
            self.task_failed('Setting up completion failed')