mirror of https://github.com/einverne/dotfiles.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
4.0 KiB
95 lines
4.0 KiB
4 years ago
|
local obj={}
|
||
|
obj.__index = obj
|
||
|
|
||
|
obj.name = "youdaoDict"
|
||
|
obj.version = "1.0"
|
||
|
obj.author = "ashfinal <[email protected]>"
|
||
|
|
||
|
-- Internal function used to find our location, so we know where to load files from
|
||
|
local function script_path()
|
||
|
local str = debug.getinfo(2, "S").source:sub(2)
|
||
|
return str:match("(.*/)")
|
||
|
end
|
||
|
|
||
|
obj.spoonPath = script_path()
|
||
|
|
||
|
-- Define the source's overview. A unique `keyword` key should exist, so this source can be found.
|
||
|
obj.overview = {text="Type y ⇥ to use Yaodao dictionary.", image=hs.image.imageFromPath(obj.spoonPath .. "/resources/youdao.png"), keyword="y"}
|
||
|
-- Define the notice when a long-time request is being executed. It could be `nil`.
|
||
|
obj.notice = nil
|
||
|
|
||
|
local function youdaoTips()
|
||
|
local chooser_data = {
|
||
|
{text="Youdao Dictionary", subText="Type something to get it translated …", image=hs.image.imageFromPath(obj.spoonPath .. "/resources/youdao.png")}
|
||
|
}
|
||
|
return chooser_data
|
||
|
end
|
||
|
|
||
|
-- Define the function which will be called when the `keyword` triggers a new source. The returned value is a table. Read more: http://www.hammerspoon.org/docs/hs.chooser.html#choices
|
||
|
obj.init_func = youdaoTips
|
||
|
-- Insert a friendly tip at the head so users know what to do next.
|
||
|
-- As this source highly relys on queryChangedCallback, we'd better tip users in callback instead of here
|
||
|
obj.description = nil
|
||
|
|
||
|
-- As the user is typing, the callback function will be called for every keypress. The returned value is a table.
|
||
|
|
||
|
local function basic_extract(arg)
|
||
|
if arg then return arg.explains else return {} end
|
||
|
end
|
||
|
local function web_extract(arg)
|
||
|
if arg then
|
||
|
local value = hs.fnutils.imap(arg, function(item)
|
||
|
return item.key .. table.concat(item.value, ",")
|
||
|
end)
|
||
|
return value
|
||
|
else
|
||
|
return {}
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local function youdaoInstantTrans(querystr)
|
||
|
local youdao_keyfrom = 'hsearch'
|
||
|
local youdao_apikey = '1199732752'
|
||
|
local youdao_baseurl = 'http://fanyi.youdao.com/openapi.do?keyfrom=' .. youdao_keyfrom .. '&key=' .. youdao_apikey .. '&type=data&doctype=json&version=1.1&q='
|
||
|
if string.len(querystr) > 0 then
|
||
|
local encoded_query = hs.http.encodeForQuery(querystr)
|
||
|
local query_url = youdao_baseurl .. encoded_query
|
||
|
|
||
|
hs.http.asyncGet(query_url, nil, function(status, data)
|
||
|
if status == 200 then
|
||
|
if pcall(function() hs.json.decode(data) end) then
|
||
|
local decoded_data = hs.json.decode(data)
|
||
|
if decoded_data.errorCode == 0 then
|
||
|
local basictrans = basic_extract(decoded_data.basic)
|
||
|
local webtrans = web_extract(decoded_data.web)
|
||
|
local dictpool = hs.fnutils.concat(basictrans, webtrans)
|
||
|
if #dictpool > 0 then
|
||
|
local chooser_data = hs.fnutils.imap(dictpool, function(item)
|
||
|
return {text=item, image=hs.image.imageFromPath(obj.spoonPath .. "/resources/youdao.png"), output="clipboard", arg=item}
|
||
|
end)
|
||
|
-- Because we don't know when asyncGet will return data, we have to refresh hs.chooser choices in this callback.
|
||
|
if spoon.HSearch then
|
||
|
-- Make sure HSearch spoon is running now
|
||
|
spoon.HSearch.chooser:choices(chooser_data)
|
||
|
spoon.HSearch.chooser:refreshChoicesCallback()
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end)
|
||
|
else
|
||
|
local chooser_data = {
|
||
|
{text="Youdao Dictionary", subText="Type something to get it translated …", image=hs.image.imageFromPath(obj.spoonPath .. "/resources/youdao.png")}
|
||
|
}
|
||
|
if spoon.HSearch then
|
||
|
spoon.HSearch.chooser:choices(chooser_data)
|
||
|
spoon.HSearch.chooser:refreshChoicesCallback()
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
obj.callback = youdaoInstantTrans
|
||
|
|
||
|
return obj
|