From 34fd9f3efa25887cd7cf0ba6496053e5c34ad07a Mon Sep 17 00:00:00 2001 From: chrox Date: Wed, 23 Apr 2014 21:57:48 +0800 Subject: [PATCH] add koreader plugin mechanism This should implement #505. --- frontend/apps/reader/modules/readermenu.lua | 4 ++ frontend/apps/reader/pluginloader.lua | 44 ++++++++++++++++++++ frontend/apps/reader/readerui.lua | 13 ++++++ reader.lua | 4 +- resources/icons/appbar.tools.png | Bin 0 -> 1843 bytes 5 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 frontend/apps/reader/pluginloader.lua create mode 100644 resources/icons/appbar.tools.png diff --git a/frontend/apps/reader/modules/readermenu.lua b/frontend/apps/reader/modules/readermenu.lua index e32c3bd19..486945974 100644 --- a/frontend/apps/reader/modules/readermenu.lua +++ b/frontend/apps/reader/modules/readermenu.lua @@ -28,6 +28,9 @@ function ReaderMenu:init() typeset = { icon = "resources/icons/appbar.page.text.png", }, + plugins = { + icon = "resources/icons/appbar.tools.png", + }, home = { icon = "resources/icons/appbar.home.png", callback = function() @@ -105,6 +108,7 @@ function ReaderMenu:onShowReaderMenu() self.tab_item_table.navi, self.tab_item_table.typeset, self.tab_item_table.main, + self.tab_item_table.plugins, self.tab_item_table.home, }, show_parent = menu_container, diff --git a/frontend/apps/reader/pluginloader.lua b/frontend/apps/reader/pluginloader.lua new file mode 100644 index 000000000..b53b8cc4d --- /dev/null +++ b/frontend/apps/reader/pluginloader.lua @@ -0,0 +1,44 @@ +local DEBUG = require("dbg") +-- lfs + +local PluginLoader = { + plugin_path = lfs.currentdir().."/plugins" +} + +function PluginLoader:loadPlugins() + if self.plugins then return self.plugins end + + self.plugins = {} + for f in lfs.dir(self.plugin_path) do + local path = self.plugin_path.."/"..f + local mode = lfs.attributes(path, "mode") + -- valid koreader plugin directory + if mode == "directory" and f:find(".+%.koplugin$") then + local mainfile = path.."/".."main.lua" + local package_path = package.path + local package_cpath = package.cpath + package.path = path.."/?.lua;"..package.path + package.cpath = path.."/lib/?.so;"..package.cpath + local ok, module = pcall(require, "main") + if not ok then + DEBUG("Error when loading", mainfile, module) + end + package.path = package_path + package.cpath = package_cpath + if ok then + module.path = path + table.insert(self.plugins, module) + end + end + end + + for _,plugin in ipairs(self.plugins) do + package.path = package.path..";"..plugin.path.."/?.lua" + package.cpath = package.cpath..";"..plugin.path.."/lib/?.so" + end + + return self.plugins +end + +return PluginLoader + diff --git a/frontend/apps/reader/readerui.lua b/frontend/apps/reader/readerui.lua index 8a3aed89b..ecf56471c 100644 --- a/frontend/apps/reader/readerui.lua +++ b/frontend/apps/reader/readerui.lua @@ -31,6 +31,7 @@ local ReaderDictionary = require("apps/reader/modules/readerdictionary") local ReaderHyphenation = require("apps/reader/modules/readerhyphenation") local ReaderActivityIndicator = require("apps/reader/modules/readeractivityindicator") local ReaderLink = require("apps/reader/modules/readerlink") +local PluginLoader = require("apps/reader/pluginloader") --[[ This is an abstraction for a reader interface @@ -261,6 +262,18 @@ function ReaderUI:init() document = self.document, }) end + + -- koreader plugins + for _,module in ipairs(PluginLoader:loadPlugins()) do + DEBUG("Loaded plugin", module.path) + table.insert(self, module:new{ + dialog = self.dialog, + view = self[1], + ui = self, + document = self.document, + }) + end + --DEBUG(self.doc_settings) -- we only read settings after all the widgets are initialized self:handleEvent(Event:new("ReadSettings", self.doc_settings)) diff --git a/reader.lua b/reader.lua index ba6d3c939..2cb04dfa7 100755 --- a/reader.lua +++ b/reader.lua @@ -1,8 +1,8 @@ #!./koreader-base require "defaults" -package.path = "./frontend/?.lua;./?.lua" -package.cpath = "?.so;/usr/lib/lua/?.so" +package.path = "?.lua;common/?.lua;frontend/?.lua" +package.cpath = "?.so;common/?.so;/usr/lib/lua/?.so" local DocSettings = require("docsettings") local _ = require("gettext") diff --git a/resources/icons/appbar.tools.png b/resources/icons/appbar.tools.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0d74c7fd2a66cf972dbac9ba19c9f1b71fd486 GIT binary patch literal 1843 zcmV-32h8}1P)00009a7bBm000fw z000fw0YWI7cmMzZ2XskIMF-vl6b?HoBaFHe000KkNkl8h%#!otG%_;`P(dcFSO!GknS3pVEhOiWCKg+bmcgTe6N!2`+F_xAQ0 z31nCdS5#C$2P-Kl>Ep+bm_fJzGcz-4wHm>Y zm6i47%a_pATdh`Te4S1=GBSc62QmjrOH0wy#$Yhuj}X+x#>O-n4L@>na`NctXi%Xb z0L{(Kf>VFt!iCSDKNk&Zg;SuAOJsq{!C0v6l72;m0ew3BGiwLj`E|W zq@;|EjiDP}xpD;y0040P`gNQoSfx@uefl(5fY#PlPMj4hR($&O3Ek?{sZ#_&OifK; z0RR9tY}kOqpw(($zI+)Jz~RG(IYD;p*nw_x^5jXzv%kL|7r^ayE0szdhJ=I!m&=6@ zP*7074`Mc(1Nqm~)cD=3Rx2(50HCg}4)b%qWXTf2H`s3_B_+@x<>lpk=j!TewhwJxGG&D5e0CaYC zB7z(_a)fa^e*8G+mPVuDkC6-~*~-YszyVOJ)o!=j;c%d*_2lFvG=uP4Wo2bmRTckw zUS1yVGRm>fpFit#Ivj?Kj0~+-8y_G4=FOWx(eB*2BQ8I`fB(Kn006-7@NiO65`Je1 z2?_7tzvsuX*=!LJ5hB#@-Mbg}ON>}p^?E&imxm4=;zYQ0>y|k6DJdzFlarwW002B5 z&&ri6ak|{SdpBpo-Mo1-JUm>4`pnEs{^BDN001yPK5jG`1s^v@eQRs02=$SXku^0n z6h#G>%n2GrQMI+T3WXw2$1N=_oXiTXUZGHwmX@Zbrbb3aGTX7DqN3{RYUnJI0D!Tf zp`o<2G^ilCTz=!m4aV*2)vM?=N1;&omlvS%~fX`uhCYi(szCR{!YHBS}gdG9a}zH#ehG9i>v)+1V*ocM=0! zzI<6weRp@aggr_L(A3m~RFdOj41?8bMUOpu zQzD{}F}JVK`Sa%qg1{g3n3$Mn&z}7&0F8}}X!UBfy0^FYz<~ptVvN)2{7V27MZJCd zwyCMfY&PfS=9)~VbLY-EoldXUTVG!Yb&Gzlv+0Kg=EefizhXv5k&>&j9R;xuXGCrTrWHPavBqk;f z4h~8NFfuZNNc08Oet5+ic&YnFRRNr2&x45{NbG&!^_U-!mdhr0` zUZgw|f`>gq%S+`W639jLId(68Qq0F|Ac4FxDEDG~7!&(6+n z+_;ewiXe!_#zrv!>@$J2Yu9qrGxp=hkIc+WK0r=Rj<}U%W@aWgH-5wPc1=pHBh+k|eim*~0IDAc%(#A4-znx3#q`Sg?Q{JUu=A>({RmJOPpIAV*L=E&xfAn>TNUR&XmTD@l?Bb71Z5 z?SksD0BD-#r+0F>JUcrZKXscsBLK#qyA(yaT&@={UbtK?ola*o8q?C!piAE0H!Ohp h|3>El<^ld)`vX}t$lboj^@;!h002ovPDHLkV1g^8d