【杂谈】 Listary自带的字典功能失效?没关系,让我们自己来改造它

写在开始:
本文内讨论的Listary版本号为 6.0.1,目前最高版本似乎是 6.0.5。文中提到的插件,官方也似乎将接口换成了异步的版本,但是考虑到同步调用和异步调用本质上程序逻辑没有根本的变化,代码主逻辑还是可以一样地跑通,或者直接原封不动换回同步版本也是能用的。

某天下午:

—— “NICE! Listary的字典能用了!!”
——“啥是Listary?”
——“啊这……”

Listary 是一个革命性的Windows搜索工具,借助 Listary软件,你可以快速搜索电脑文件、定位文件、执行智能命令、记录访问历史、快速切换目录、收藏常用项目等。

—— 来自某乎的回答

笔者就是嫌有道词典太臃肿,必应词典太卡,用Listary能大致以随叫随到的小搜索框功能就能实现诸如文件搜索、翻译、简单计算等实用的功能。

Snipaste_2021-12-23_15-05-32

Snipaste_2021-12-23_15-47-11

—— “原来你也玩原神”
—— “这是重点吗?”

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

Snipaste_2021-12-23_15-50-23

这么好用的功能就这么无了???不,今天就来解救这个功能!

定位问题

打开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有一点看不懂哇,不过编程无非那几招,ifvarnew还是能看得懂的,跟C#那可是 完全 一样的意思,细品一下嘛,说不定就会了。

第四眼,这花括号有点多,花里胡哨的,还中括号套花括号,眼睛有亿点抗不太住……

第五眼,… 第六眼,… …… ……

经过亿点的领悟,以及百度必应谷歌几位大佬的点拨,大致能看懂这货是在干什么了:

index.js 总览

这程序大致的框架分为三段:

  • 定义依赖库以及常量
  • 定义一个方法
  • 将方法返回

好家伙,直接返回一个方法,这不就是类似返回一个Func<>对象嘛。Easy。依赖库和常量部分就跳过了,我们先看看这个方法里定义了什么。

function search(query) { 在里面干了什么 }

以程序的视角,这在这个search(query)函数里,似乎就只干了两件事情:

  1. 定义了一个叫做 noResult 的变量
  2. 新构造了一个叫做Promise的类的实例并直接返回

noResult变量就不说了。直接看关键点,Promise类的实例,大致排版之后,这个实例的构造函数应该长这样:

new Promise
(
    (resolve, reject) => {
   
   
        var options = {
   
   
            /* 省略 */
        };
        request(options, 
            function (error, response, body) 
            {
   
   
                /* 省略 */
            }
        );
    }
)

这不就是一个 C# 里的匿名函数(lambda函数)嘛……这我可太熟悉了,经常往什么按钮点击、菜单点击时间里挂的不就是这玩意儿

(o, e) => {
   
    /*函数体省略*/ }

既然是个函数,那么这个函数的输入和输

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值