写在开始:
本文内讨论的Listary版本号为 6.0.1,目前最高版本似乎是 6.0.5。文中提到的插件,官方也似乎将接口换成了异步的版本,但是考虑到同步调用和异步调用本质上程序逻辑没有根本的变化,代码主逻辑还是可以一样地跑通,或者直接原封不动换回同步版本也是能用的。
某天下午:
—— “NICE! Listary的字典能用了!!”
——“啥是Listary?”
——“啊这……”
Listary 是一个革命性的Windows搜索工具,借助 Listary软件,你可以快速搜索电脑文件、定位文件、执行智能命令、记录访问历史、快速切换目录、收藏常用项目等。
—— 来自某乎的回答
笔者就是嫌有道词典太臃肿,必应词典太卡,用Listary能大致以随叫随到的小搜索框功能就能实现诸如文件搜索、翻译、简单计算等实用的功能。


—— “原来你也玩原神”
—— “这是重点吗?”
总之就是一个比较方便的小工具。当然也提供字典查词的功能…… 【本来是提供的
这搜索转圈可以转到你下班都转不完,根本读不出来内容。

这么好用的功能就这么无了???不,今天就来解救这个功能!
定位问题
打开Listary的设置,看了看字典是咋肥事,好家伙,是个插件,也没啥可以直接设置查询地址的地方,看来查询地址应该是在插件里写的,没法随意改动,那就得去改插件本身了。

直接对Listary进行了一番小调查,发现它的插件加载都在
C:\Users\<<username>>\AppData\Roaming\Listary\UserProfile\Extensions
这样一个文件夹里,Good,找到了一个叫做listary-extension-dict的文件夹,看起来就像是字典这个功能的文件夹,不错不错,直接打开,一个index.js映入眼帘,笔者人傻了,你一个Listary程序,从头到尾C#编译,最后插件编写来了个JavaScript?
怒翻Listary的安装文件夹,好家伙,藏了个node.js在里面。额滴个神,笔者寻思插件也是C#呢,合着得用JavaScript改?
打开这个index.js,内容如下……【在6.0.5版本内容略有差异,无伤大雅,6.0.5版本的最终修改后代码也会在最后一并放出,TL,DR: 跳到最后】
const request = require('request');
const api = "http://www.iciba.com/index.php";
function search(query) {
var noResult = {
title: "没有找到相关结果"
};
return new Promise((resolve, reject) => {
var options = {
method: 'GET',
url: api,
qs:
{
a: 'getWordMean',
c: 'search',
list: '1',
word: query
},
};
request(options, function (error, response, body) {
if (error) throw new Error(error);
var json = JSON.parse(body);
if (json.errno != 0) {
resolve([{
title: json.errmsg
}]);
return;
}
// console.log(json)
if (json.baesInfo.symbols) {
var results = json.baesInfo.symbols[0].parts.map(part => {
var meaning = part.part + " ";
meaning += part.means.join(";");
var result = {
title: meaning
}
return result;
});
resolve(results);
}
else if (json.baesInfo.translate_result) {
resolve([{
title: json.baesInfo.translate_result
}])
}
else {
resolve([{
title: noResult
}])
}
});
});
}
module.exports = {
search: search
};
第一眼,就印证了我之前的想法,果不其然api地址是写死的哇。把这个iciba相关地址(PHP是世界上最好的语言)直接放到浏览器里一看,芜湖,直接跳转到了主页,这API早就不好使了,这能查到词就有鬼了。
第二眼,// console.log(json)作者很细啊,把错误信息直接打印在了命令行里,后面一想反反正用户也看不到,注释了得了(狗头)。
第三眼,JavaScript有一点看不懂哇,不过编程无非那几招,if、var、new还是能看得懂的,跟C#那可是 完全 一样的意思,细品一下嘛,说不定就会了。
第四眼,这花括号有点多,花里胡哨的,还中括号套花括号,眼睛有亿点抗不太住……
第五眼,… 第六眼,… …… ……
经过亿点的领悟,以及百度必应谷歌几位大佬的点拨,大致能看懂这货是在干什么了:
index.js 总览
这程序大致的框架分为三段:
- 定义依赖库以及常量
- 定义一个方法
- 将方法返回
好家伙,直接返回一个方法,这不就是类似返回一个Func<>对象嘛。Easy。依赖库和常量部分就跳过了,我们先看看这个方法里定义了什么。
function search(query) { 在里面干了什么 }
以程序的视角,这在这个search(query)函数里,似乎就只干了两件事情:
- 定义了一个叫做
noResult的变量 - 新构造了一个叫做
Promise的类的实例并直接返回
noResult变量就不说了。直接看关键点,Promise类的实例,大致排版之后,这个实例的构造函数应该长这样:
new Promise
(
(resolve, reject) => {
var options = {
/* 省略 */
};
request(options,
function (error, response, body)
{
/* 省略 */
}
);
}
)
这不就是一个 C# 里的匿名函数(lambda函数)嘛……这我可太熟悉了,经常往什么按钮点击、菜单点击时间里挂的不就是这玩意儿
(o, e) => {
/*函数体省略*/ }
既然是个函数,那么这个函数的输入和输

最低0.47元/天 解锁文章
1752





