mqycn / huile8

英语差等生必备的 vscode 插件,解决 单词不会读、单词不认识的痛点

Home Page:https://marketplace.visualstudio.com/items?itemName=mqycn.huile8

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

老哥每次都要分析一次有哪些单词不好吧

mobi12 opened this issue · comments

建议增加对已翻译单词的记录,可以给文件建立一个数据结构用来保存已经分析过的单词。对于当前文件的新增内容,可以保存文档末尾的行数,并检查是否增加新行来判断是否有新的行产生,对新行的代码进行分析。还有就是已经学会的单词,可以作为减少分析次数的依据

建议增加对已翻译单词的记录,可以给文件建立一个数据结构用来保存已经分析过的单词。对于当前文件的新增内容,可以保存文档末尾的行数,并检查是否增加新行来判断是否有新的行产生,对新行的代码进行分析。还有就是已经学会的单词,可以作为减少分析次数的依据

非常感谢支持

之前考虑过保存 你提到的分析结果方案,后来放弃的,因为会产生大量的碎片

现在的方案,只有遇到新单词 时才会加载库,比 缓存文件更高效,也不会 产生碎片。缺点是占用内存 ,考虑到一个项目中最多也不过 几千条单词,这点内存可以忽略不记。

现在单词解析流程

估计你看到这里,没继续向下看,在 /src/word-provider.js
程序接收到单词列表,去 addWordTask 获取单词解释,这一步不是真实的去查询词库,存在缓存的

flush() {
const tree = [];
let element = {};
this.list.sort().forEach(word => {
let prefix = word.substr(0, 1);
if (element.prefix != prefix) {
element = {
prefix,
children: []
};
tree.push(element);
}
element.children.push(word);
});
this.tree = tree;
// 更新列表
this.changeTreeDataEmitter.fire(undefined);
// 创建翻译任务
addWordTask(this.list, () => {
this.flush();
});
}

addWordTask 的定义如下 /src/dictionary.js

只有遇到新单词是,会批量查询单词解释,并放入内存( localDictionary )缓存

再次打开包含相同单词的文件时,因为 undefinedWords 的列表为空,就不会去继续查询词库了

const addWordTask = (list, callback) => {
const undefinedWords = list.filter(item => !localDictionary[item]);
//存在 没有翻译结果的单词
if (undefinedWords.length > 0) {
wordApi.all(undefinedWords).then(datas => {
datas.forEach(data => {
if (data.status) {
localDictionary[data.word] = {
phonetic: data.phonetic,
translation: data.translation.replace(/\\n/g, '\n')
};
} else {
localDictionary[data.word] = {
error: data.message
};
}
});
callback();
});
}
};

单词列表的项目,可能会渲染1次或两次:

class WordItem extends vscode.TreeItem {
constructor(word) {
super(word);
this.word = word;
this.data = localDictionary[word];
};
get command() {
return {
command: CommandRead,
title: `播放 ${this.word}`,
arguments: [this]
};
}
get tooltip() {
return this.data ?
this.data.phonetic ?
[
`音标:[${this.data.phonetic}}]`,
`解释:${this.data.translation.replace(/\n/g, '\n ')}`
].join('\n')
: this.data.translation
: 'loading...';
}

初次打开源码,会渲染两次:

  1. 等待 Promise 解析中,这时显示 loading...
  2. Promise 解析完成,显示 音标和解释

第二次打开源码,因为已经有 localDictionary 缓存,只会渲染一次:

  1. localDictionary 缓存 中存在结果,显示 音标和解释