From d89968cfa5ac9352fe8db8e1630e92465bb750fb Mon Sep 17 00:00:00 2001 From: qianlifeng Date: Thu, 10 Jul 2014 18:39:04 +0800 Subject: [PATCH] Add HackerNews python plugin as the Demo. --- Plugins/Wox.Plugin.HackerNews/Images/app.ico | Bin 0 -> 7527 bytes Plugins/Wox.Plugin.HackerNews/main.py | 27 ++++++++++++++ .../plugin.json | 9 +++-- Plugins/Wox.Plugin.HackerNews/run.bat | 1 + Plugins/Wox.Plugin.V2ex/Images/app.ico | Bin 1150 -> 0 bytes Plugins/Wox.Plugin.V2ex/main.py | 34 ------------------ PythonHome/Lib/wox.py | 25 +++++++++++++ Wox.Plugin/HttpProxy.cs | 10 ++++++ Wox.Plugin/PluginInitContext.cs | 2 ++ Wox.Plugin/PluginPair.cs | 1 - Wox.Plugin/Wox.Plugin.csproj | 1 + Wox/PluginLoader/Plugins.cs | 19 ++++------ 12 files changed, 76 insertions(+), 53 deletions(-) create mode 100644 Plugins/Wox.Plugin.HackerNews/Images/app.ico create mode 100644 Plugins/Wox.Plugin.HackerNews/main.py rename Plugins/{Wox.Plugin.V2ex => Wox.Plugin.HackerNews}/plugin.json (53%) create mode 100644 Plugins/Wox.Plugin.HackerNews/run.bat delete mode 100644 Plugins/Wox.Plugin.V2ex/Images/app.ico delete mode 100644 Plugins/Wox.Plugin.V2ex/main.py create mode 100644 PythonHome/Lib/wox.py create mode 100644 Wox.Plugin/HttpProxy.cs diff --git a/Plugins/Wox.Plugin.HackerNews/Images/app.ico b/Plugins/Wox.Plugin.HackerNews/Images/app.ico new file mode 100644 index 0000000000000000000000000000000000000000..a415c1eaf189ee69d9ee54de5cb606cd9cdf06f4 GIT binary patch literal 7527 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 diff --git a/Plugins/Wox.Plugin.V2ex/main.py b/Plugins/Wox.Plugin.V2ex/main.py deleted file mode 100644 index ef3a1a504d..0000000000 --- a/Plugins/Wox.Plugin.V2ex/main.py +++ /dev/null @@ -1,34 +0,0 @@ -#encoding=utf8 - -from __future__ import unicode_literals -import requests -from bs4 import BeautifulSoup -import json -import webbrowser - -def safeSelectText(s,path): - return s.select(path)[0].text if len(s.select(path)) > 0 else "" - -def query(key): - r = requests.get('http://v2ex.com/?tab=all') - bs = BeautifulSoup(r.text) - results = [] - for i in bs.select(".box div.item"): - res = {} - title = safeSelectText(i,".item_title") - subTitle = safeSelectText(i,".fade") - url = "http://v2ex.com" + i.select(".item_title a")[0]["href"] - - res["Title"] = title - res["SubTitle"] = subTitle - res["ActionName"] = "openUrl" - res["IcoPath"] = "Images\\app.ico" - res["ActionPara"] = url - results.append(res) - return json.dumps(results) - -def openUrl(url): - webbrowser.open(url) - -if __name__ == "__main__": - print query("movie geo") diff --git a/PythonHome/Lib/wox.py b/PythonHome/Lib/wox.py new file mode 100644 index 0000000000..7f3be97e4f --- /dev/null +++ b/PythonHome/Lib/wox.py @@ -0,0 +1,25 @@ +#encoding=utf8 +import json +import sys +import inspect + +class Wox(object): + """ + Wox python plugin base + """ + + def __init__(self): + rpc_request = json.loads(sys.argv[1]) + request_method_name = rpc_request.get("method") + request_parameters = rpc_request.get("parameters") + methods = inspect.getmembers(self, predicate=inspect.ismethod) + + request_method = dict(methods)[request_method_name] + results = request_method(request_parameters) + print json.dumps({"result": results}) + + def query(self,query): + """ + sub class need to override this method + """ + return [] diff --git a/Wox.Plugin/HttpProxy.cs b/Wox.Plugin/HttpProxy.cs new file mode 100644 index 0000000000..967844374e --- /dev/null +++ b/Wox.Plugin/HttpProxy.cs @@ -0,0 +1,10 @@ +namespace Wox.Plugin +{ + public class HttpProxy + { + public string Address { get; set; } + public int Port { get; set; } + public string UserName { get; set; } + public string Password { get; set; } + } +} \ No newline at end of file diff --git a/Wox.Plugin/PluginInitContext.cs b/Wox.Plugin/PluginInitContext.cs index f38b1c1c70..edc343538b 100644 --- a/Wox.Plugin/PluginInitContext.cs +++ b/Wox.Plugin/PluginInitContext.cs @@ -14,6 +14,8 @@ namespace Wox.Plugin /// public IPublicAPI API { get; set; } + public HttpProxy Proxy { get; set; } + #region Legacy APIs [Obsolete("This method has been obsoleted, use API.ShellRun instead")] diff --git a/Wox.Plugin/PluginPair.cs b/Wox.Plugin/PluginPair.cs index 7ec5796d64..9d09f7d105 100644 --- a/Wox.Plugin/PluginPair.cs +++ b/Wox.Plugin/PluginPair.cs @@ -9,6 +9,5 @@ namespace Wox.Plugin { public IPlugin Plugin { get; set; } public PluginMetadata Metadata { get; set; } - public PluginInitContext InitContext { get; set; } } } diff --git a/Wox.Plugin/Wox.Plugin.csproj b/Wox.Plugin/Wox.Plugin.csproj index 558dc86573..a0dcbb2fca 100644 --- a/Wox.Plugin/Wox.Plugin.csproj +++ b/Wox.Plugin/Wox.Plugin.csproj @@ -45,6 +45,7 @@ + diff --git a/Wox/PluginLoader/Plugins.cs b/Wox/PluginLoader/Plugins.cs index 2fa0542c1b..beec41e792 100644 --- a/Wox/PluginLoader/Plugins.cs +++ b/Wox/PluginLoader/Plugins.cs @@ -20,21 +20,14 @@ namespace Wox.PluginLoader plugins.AddRange(new BasePluginLoader().LoadPlugin(pluginMetadatas)); Forker forker = new Forker(); - foreach (IPlugin plugin in plugins.Select(pluginPair => pluginPair.Plugin)) + foreach (PluginPair pluginPair in plugins) { - IPlugin plugin1 = plugin; - PluginPair pluginPair = plugins.FirstOrDefault(o => o.Plugin == plugin1); - if (pluginPair != null) + PluginPair pair = pluginPair; + forker.Fork(() => pair.Plugin.Init(new PluginInitContext() { - PluginMetadata metadata = pluginPair.Metadata; - pluginPair.InitContext = new PluginInitContext() - { - CurrentPluginMetadata = metadata, - API = App.Window - }; - - forker.Fork(() => plugin1.Init(pluginPair.InitContext)); - } + CurrentPluginMetadata = pair.Metadata, + API = App.Window + })); } forker.Join();