/
preload.js
130 lines (123 loc) · 3.67 KB
/
preload.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
const path = require("path");
const fs = require("fs");
function walker(mdDir) {
if (!fs.existsSync(mdDir)) {
return [];
}
let folders = [];
let files = [];
pathDir = fs.readdirSync(mdDir);
pathNext = pathDir.map((p) => path.join(mdDir, p));
pathNext.forEach((p) => {
stat = fs.statSync(p);
if (stat.isDirectory()) {
folders.push(p);
} else if (p.endsWith(".md")) {
files.push(p);
}
});
folders.forEach((p) => files.push(...walker(p)));
return files;
}
// 找到 Obsidian json 配置文件
function getObsidianJson() {
username = process.env["USERPROFILE"].split(path.sep)[2];
config =
"C:\\Users\\Administrator\\AppData\\Roaming\\obsidian\\obsidian.json";
configUser =
"C:\\Users\\" + username + "\\AppData\\Roaming\\obsidian\\obsidian.json";
if (fs.existsSync(configUser)) {
return configUser;
} else if (fs.existsSync(config)) {
return config;
}
}
function getObsidianItems() {
// 获取配置 JSON
configPath = getObsidianJson();
const configData = JSON.parse(fs.readFileSync(configPath, "utf-8"));
// 获取笔记库 ID 和笔记库路径
if (!configData) return;
const vaults = configData["vaults"];
const vaultsIDPath = Object.keys(vaults).map((key) => {
vaultsPath = vaults[key]["path"];
return { id: key, path: vaultsPath };
});
// 获取每个笔记的路径和所在笔记库 ID
const items = [];
vaultsIDPath.map((v) => {
mdPaths = walker(v["path"]);
mdPaths.map((mdPath) => {
items.push({
vualtid: v["id"],
mdpath: mdPath,
});
});
});
// 获取每个笔记的标题、内容
items.map((item) => {
mdTitle = path.basename(item["mdpath"]).slice(0, -3);
mdContent = fs.readFileSync(item["mdpath"], "utf-8");
item["mdtitle"] = mdTitle;
item["mdcontent"] = mdContent;
});
return items;
}
function searchObsidianItems(searchWord, items) {
const regexText = searchWord.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
// 'i'不区分大小写进行检索
const searchRegex = new RegExp(regexText, "i");
// 优先匹配标题
searchItems1 = items.filter(
(item) => item.mdtitle.search(searchRegex) !== -1
);
// 然后匹配正文
searchItems2 = items.filter(
(item) =>
item.mdtitle.search(searchRegex) == -1 &&
item.mdcontent.search(searchRegex) !== -1
);
// 合并匹配结果
searchItems = searchItems1.concat(searchItems2);
const callbackItems = [];
searchItems.map((item) => {
callbackItems.push({
title: "【" + item.mdtitle + "】",
description: item.mdcontent,
icon: "logo.png",
url: `obsidian://open?vault=${item.vualtid}&file=${item.mdtitle}`,
});
});
return callbackItems;
}
// 搜索功能
window.exports = {
"obsidian-search": {
mode: "list",
args: {
enter: (action, callbackSetList) => {
mdItems = getObsidianItems();
console.log(action.payload);
if (action.payload) {
// 直接调用setSubInputValue不生效,特殊处理
setTimeout(function () {
window.utools.setSubInputValue(action.payload);
}, 50);
callbackItems = searchObsidianItems(action.payload, mdItems);
return callbackSetList(callbackItems);
}
},
search: (action, searchWord, callbackSetList) => {
if (!searchWord) return callbackSetList();
callbackItems = searchObsidianItems(searchWord, mdItems);
return callbackSetList(callbackItems);
},
select: (action, itemData) => {
window.utools.hideMainWindow(false);
console.log(itemData.url);
utools.shellOpenExternal(itemData.url);
window.utools.outPlugin();
},
},
},
};