mirror of
https://github.com/microsoft/PowerToys.git
synced 2025-06-07 17:42:45 +08:00
Add HackerNews python plugin as the Demo.
This commit is contained in:
parent
5f7c1ea4f4
commit
d89968cfa5
BIN
Plugins/Wox.Plugin.HackerNews/Images/app.ico
Normal file
BIN
Plugins/Wox.Plugin.HackerNews/Images/app.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 7.4 KiB |
27
Plugins/Wox.Plugin.HackerNews/main.py
Normal file
27
Plugins/Wox.Plugin.HackerNews/main.py
Normal 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()
|
@ -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"
|
||||
}
|
||||
|
1
Plugins/Wox.Plugin.HackerNews/run.bat
Normal file
1
Plugins/Wox.Plugin.HackerNews/run.bat
Normal 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 |
@ -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
25
PythonHome/Lib/wox.py
Normal 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
10
Wox.Plugin/HttpProxy.cs
Normal 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; }
|
||||
}
|
||||
}
|
@ -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")]
|
||||
|
@ -9,6 +9,5 @@ namespace Wox.Plugin
|
||||
{
|
||||
public IPlugin Plugin { get; set; }
|
||||
public PluginMetadata Metadata { get; set; }
|
||||
public PluginInitContext InitContext { get; set; }
|
||||
}
|
||||
}
|
||||
|
@ -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" />
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user