mirror of
https://github.com/microsoft/PowerToys.git
synced 2025-06-12 04:33:10 +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",
|
"ID":"D2D2C23B084D411DB66FE0C79D6C1B7H",
|
||||||
"ActionKeyword":"v2ex",
|
"ActionKeyword":"hn",
|
||||||
"Name":"Wox.Plugin.v2ex",
|
"Name":"Hacker News",
|
||||||
"Description":"v2ex viewer",
|
"Description":"Hacker News@https://news.ycombinator.com",
|
||||||
"Author":"qianlifeng",
|
"Author":"qianlifeng",
|
||||||
"Version":"1.0",
|
"Version":"1.0",
|
||||||
"Language":"python",
|
"Language":"python",
|
||||||
@ -10,4 +10,3 @@
|
|||||||
"IcoPath":"Images\\app.ico",
|
"IcoPath":"Images\\app.ico",
|
||||||
"ExecuteFileName":"main.py"
|
"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>
|
/// </summary>
|
||||||
public IPublicAPI API { get; set; }
|
public IPublicAPI API { get; set; }
|
||||||
|
|
||||||
|
public HttpProxy Proxy { get; set; }
|
||||||
|
|
||||||
#region Legacy APIs
|
#region Legacy APIs
|
||||||
|
|
||||||
[Obsolete("This method has been obsoleted, use API.ShellRun instead")]
|
[Obsolete("This method has been obsoleted, use API.ShellRun instead")]
|
||||||
|
@ -9,6 +9,5 @@ namespace Wox.Plugin
|
|||||||
{
|
{
|
||||||
public IPlugin Plugin { get; set; }
|
public IPlugin Plugin { get; set; }
|
||||||
public PluginMetadata Metadata { get; set; }
|
public PluginMetadata Metadata { get; set; }
|
||||||
public PluginInitContext InitContext { get; set; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -45,6 +45,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="AllowedLanguage.cs" />
|
<Compile Include="AllowedLanguage.cs" />
|
||||||
|
<Compile Include="HttpProxy.cs" />
|
||||||
<Compile Include="IPlugin.cs" />
|
<Compile Include="IPlugin.cs" />
|
||||||
<Compile Include="IPublicAPI.cs" />
|
<Compile Include="IPublicAPI.cs" />
|
||||||
<Compile Include="ISettingProvider.cs" />
|
<Compile Include="ISettingProvider.cs" />
|
||||||
|
@ -20,21 +20,14 @@ namespace Wox.PluginLoader
|
|||||||
plugins.AddRange(new BasePluginLoader<PythonPlugin>().LoadPlugin(pluginMetadatas));
|
plugins.AddRange(new BasePluginLoader<PythonPlugin>().LoadPlugin(pluginMetadatas));
|
||||||
|
|
||||||
Forker forker = new Forker();
|
Forker forker = new Forker();
|
||||||
foreach (IPlugin plugin in plugins.Select(pluginPair => pluginPair.Plugin))
|
foreach (PluginPair pluginPair in plugins)
|
||||||
{
|
{
|
||||||
IPlugin plugin1 = plugin;
|
PluginPair pair = pluginPair;
|
||||||
PluginPair pluginPair = plugins.FirstOrDefault(o => o.Plugin == plugin1);
|
forker.Fork(() => pair.Plugin.Init(new PluginInitContext()
|
||||||
if (pluginPair != null)
|
|
||||||
{
|
{
|
||||||
PluginMetadata metadata = pluginPair.Metadata;
|
CurrentPluginMetadata = pair.Metadata,
|
||||||
pluginPair.InitContext = new PluginInitContext()
|
API = App.Window
|
||||||
{
|
}));
|
||||||
CurrentPluginMetadata = metadata,
|
|
||||||
API = App.Window
|
|
||||||
};
|
|
||||||
|
|
||||||
forker.Fork(() => plugin1.Init(pluginPair.InitContext));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
forker.Join();
|
forker.Join();
|
||||||
|
Loading…
Reference in New Issue
Block a user