Add HackerNews python plugin as the Demo.

This commit is contained in:
qianlifeng 2014-07-10 18:39:04 +08:00
parent 5f7c1ea4f4
commit d89968cfa5
12 changed files with 76 additions and 53 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

@ -0,0 +1,27 @@
#encoding=utf8
from __future__ import unicode_literals
import requests
from bs4 import BeautifulSoup
import json
import webbrowser
from wox import Wox
class HackerNews(Wox):
def query(self,key):
r = requests.get('https://news.ycombinator.com/')
bs = BeautifulSoup(r.text)
results = []
for i in bs.select(".comhead"):
title = i.previous_sibling.text
url = i.previous_sibling["href"]
results.append({"Title": title ,"IcoPath":"Images/app.ico","JsonRPCAction":{"method": "openUrl", "parameters": url}})
return results
def openUrl(self,url):
webbrowser.open(url)
if __name__ == "__main__":
HackerNews()

View File

@ -1,8 +1,8 @@
{
"ID":"D2D2C23B084D411DB66FE0C79D6C2A6H",
"ActionKeyword":"v2ex",
"Name":"Wox.Plugin.v2ex",
"Description":"v2ex viewer",
"ID":"D2D2C23B084D411DB66FE0C79D6C1B7H",
"ActionKeyword":"hn",
"Name":"Hacker News",
"Description":"Hacker News@https://news.ycombinator.com",
"Author":"qianlifeng",
"Version":"1.0",
"Language":"python",
@ -10,4 +10,3 @@
"IcoPath":"Images\\app.ico",
"ExecuteFileName":"main.py"
}

View File

@ -0,0 +1 @@
d:\Personal\wox.jsonrpc\Output\Debug\PythonHome\python.exe main.py "{\"jsonrpc\": \"2.0\", \"method\": \"query\", \"params\": \"l\", \"id\": 1}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -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")

25
PythonHome/Lib/wox.py Normal file
View File

@ -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 []

10
Wox.Plugin/HttpProxy.cs Normal file
View File

@ -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; }
}
}

View File

@ -14,6 +14,8 @@ namespace Wox.Plugin
/// </summary>
public IPublicAPI API { get; set; }
public HttpProxy Proxy { get; set; }
#region Legacy APIs
[Obsolete("This method has been obsoleted, use API.ShellRun instead")]

View File

@ -9,6 +9,5 @@ namespace Wox.Plugin
{
public IPlugin Plugin { get; set; }
public PluginMetadata Metadata { get; set; }
public PluginInitContext InitContext { get; set; }
}
}

View File

@ -45,6 +45,7 @@
</ItemGroup>
<ItemGroup>
<Compile Include="AllowedLanguage.cs" />
<Compile Include="HttpProxy.cs" />
<Compile Include="IPlugin.cs" />
<Compile Include="IPublicAPI.cs" />
<Compile Include="ISettingProvider.cs" />

View File

@ -20,21 +20,14 @@ namespace Wox.PluginLoader
plugins.AddRange(new BasePluginLoader<PythonPlugin>().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();