From 8a5a7a5975cc05b5e51b6dbb96b69e15bc80d7d7 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 17 Aug 2012 20:05:25 +0530 Subject: [PATCH] Add fromaework for viewer plugins --- src/calibre/customize/__init__.py | 33 +++++++++++++++++++++++++ src/calibre/customize/ui.py | 9 ++++++- src/calibre/gui2/viewer/documentview.py | 10 ++++++-- 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/src/calibre/customize/__init__.py b/src/calibre/customize/__init__.py index ca43e8c2b5..6423a9824c 100644 --- a/src/calibre/customize/__init__.py +++ b/src/calibre/customize/__init__.py @@ -654,3 +654,36 @@ class StoreBase(Plugin): # {{{ raise NotImplementedError() # }}} + +class ViewerPlugin(Plugin): # {{{ + + ''' + These plugins are used to add functionality to the calibre viewer. + ''' + + def load_fonts(self): + ''' + This method is called once at viewer starup. It should load any fonts + it wants to make available. For example:: + + def load_fonts(): + from PyQt4.Qt import QFontDatabase + font_data = get_resources(['myfont1.ttf', 'myfont2.ttf']) + for raw in font_data.itervalues(): + QFontDatabase.addApplicationFontFromData(raw) + ''' + pass + + def load_javascript(self, evaljs): + ''' + This method is called every time a new HTML document is loaded in the + viewer. Use it to load javascript libraries into the viewer. For + example:: + + def load_javascript(self, evaljs): + js = get_resources('myjavascript.js') + evaljs(js) + ''' + pass +# }}} + diff --git a/src/calibre/customize/ui.py b/src/calibre/customize/ui.py index 9b750d2f7d..6725ae1b7a 100644 --- a/src/calibre/customize/ui.py +++ b/src/calibre/customize/ui.py @@ -8,7 +8,7 @@ from calibre.customize import (CatalogPlugin, FileTypePlugin, PluginNotFound, MetadataReaderPlugin, MetadataWriterPlugin, InterfaceActionBase as InterfaceAction, PreferencesPlugin, platform, InvalidPlugin, - StoreBase as Store) + StoreBase as Store, ViewerPlugin) from calibre.customize.conversion import InputFormatPlugin, OutputFormatPlugin from calibre.customize.zipplugin import loader from calibre.customize.profiles import InputProfile, OutputProfile @@ -481,6 +481,13 @@ def all_metadata_plugins(): yield plugin # }}} +# Viewer plugins {{{ +def all_viewer_plugins(): + for plugin in _initialized_plugins: + if isinstance(plugin, ViewerPlugin): + yield plugin +# }}} + # Initialize plugins {{{ _initialized_plugins = [] diff --git a/src/calibre/gui2/viewer/documentview.py b/src/calibre/gui2/viewer/documentview.py index eb5680b7b9..4863997201 100644 --- a/src/calibre/gui2/viewer/documentview.py +++ b/src/calibre/gui2/viewer/documentview.py @@ -17,6 +17,7 @@ from PyQt4.QtWebKit import QWebPage, QWebView, QWebSettings from calibre.gui2.viewer.flip import SlideFlip from calibre.gui2.shortcuts import Shortcuts from calibre import prints +from calibre.customize.ui import all_viewer_plugins from calibre.gui2.viewer.keys import SHORTCUTS from calibre.gui2.viewer.javascript import JavaScriptLoader from calibre.gui2.viewer.position import PagePosition @@ -90,6 +91,8 @@ class Document(QWebPage): # {{{ # Fonts load_builtin_fonts() + for pl in all_viewer_plugins(): + pl.load_fonts() self.set_font_settings() # Security @@ -169,8 +172,11 @@ class Document(QWebPage): # {{{ if self.loaded_javascript: return self.loaded_javascript = True - self.loaded_lang = self.js_loader(self.mainFrame().evaluateJavaScript, - self.current_language, self.hyphenate_default_lang) + evaljs = self.mainFrame().evaluateJavaScript + self.loaded_lang = self.js_loader(evaljs, self.current_language, + self.hyphenate_default_lang) + for pl in all_viewer_plugins(): + pl.load_javascript(evaljs) @pyqtSignature("") def animated_scroll_done(self):