6415 lines
189 KiB
JavaScript
Raw Normal View History

2023-06-29 11:55:02 +08:00
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
"use strict";
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// node_modules/prettify-pinyin/index.js
var require_prettify_pinyin = __commonJS({
"node_modules/prettify-pinyin/index.js"(exports, module2) {
var replacements = {
"a": ["\u0101", "\xE1", "\u01CE", "\xE0"],
"e": ["\u0113", "\xE9", "\u011B", "\xE8"],
"u": ["\u016B", "\xFA", "\u01D4", "\xF9"],
"i": ["\u012B", "\xED", "\u01D0", "\xEC"],
"o": ["\u014D", "\xF3", "\u01D2", "\xF2"],
"\xFC": ["\u01D6", "\u01D8", "\u01DA", "\u01DC"]
};
var medials = ["i", "u", "\xFC"];
var prettify = function(str) {
str = str.replace("v", "\xFC");
var syllables = str.split(" ");
for (var i = 0; i < syllables.length; i++) {
var syllable = syllables[i];
var tone = parseInt(syllable[syllable.length - 1]);
if (tone <= 0 || tone > 5) {
console.error("invalid tone number:", tone, "in", syllable);
} else if (tone === 5) {
syllables[i] = syllable.slice(0, syllable.length - 1);
} else {
for (var j = 0; j < syllable.length; j++) {
var currentLetter = syllable[j];
var nextLetter = syllable[j + 1];
if (replacements[currentLetter]) {
var replaced;
var letterToReplace;
if (replacements[nextLetter] && medials.indexOf(currentLetter) >= 0) {
letterToReplace = nextLetter;
} else {
letterToReplace = currentLetter;
}
replaced = syllable.replace(letterToReplace, replacements[letterToReplace][tone - 1]);
syllables[i] = replaced.slice(0, replaced.length - 1);
break;
}
}
}
}
return syllables.join(" ");
};
module2.exports.prettify = prettify;
}
});
// node_modules/chinese-tokenizer/src/trie.js
var require_trie = __commonJS({
"node_modules/chinese-tokenizer/src/trie.js"(exports, module2) {
var Trie = class {
constructor() {
this.content = {};
}
getKeyObject(key, create = false) {
key = key.toString();
let chars = key === "" ? [key] : Array.from(key);
let obj = this.content;
for (let char of chars) {
if (obj[char] == null) {
if (create)
obj[char] = {};
else
return {};
}
obj = obj[char];
}
return obj;
}
get(key) {
let obj = this.getKeyObject(key);
return obj.values || [];
}
getPrefix(key) {
let inner = (key2, obj = null) => {
if (obj == null)
obj = this.getKeyObject(key2);
let result = obj.values ? [...obj.values] : [];
for (let char in obj) {
if (char === "values" || obj[char] == null)
continue;
result.push(...inner(key2 + char, obj[char]));
}
return result;
};
return inner(key);
}
push(key, value) {
let obj = this.getKeyObject(key, true);
if (obj.values == null)
obj.values = [];
if (!obj.values.includes(value))
obj.values.push(value);
return this;
}
};
module2.exports = Trie;
}
});
// node_modules/chinese-tokenizer/src/cedict.js
var require_cedict = __commonJS({
"node_modules/chinese-tokenizer/src/cedict.js"(exports, module2) {
var { prettify } = require_prettify_pinyin();
var Trie = require_trie();
function parseLine(line) {
let match = line.match(/^(\S+)\s(\S+)\s\[([^\]]+)\]\s\/(.+)\//);
if (match == null)
return;
let [, traditional, simplified, pinyin, english] = match;
pinyin = pinyin.replace(/u:/g, "\xFC");
let pinyinPretty = prettify(pinyin);
return { traditional, simplified, pinyin, pinyinPretty, english };
}
var Cedict = class {
load(contents) {
this.simplifiedTrie = new Trie();
this.traditionalTrie = new Trie();
let lines = contents.split("\n");
for (let line of lines) {
if (line.trim() === "" || line[0] === "#")
continue;
let entry = parseLine(line);
if (entry == null)
continue;
this.simplifiedTrie.push(entry.simplified, entry);
this.traditionalTrie.push(entry.traditional, entry);
}
}
get(word, traditional = false) {
return traditional ? this.traditionalTrie.get(word) : this.simplifiedTrie.get(word);
}
getPrefix(word, traditional = false) {
return traditional ? this.traditionalTrie.getPrefix(word) : this.simplifiedTrie.getPrefix(word);
}
};
module2.exports = Cedict;
}
});
// node_modules/chinese-tokenizer/src/main.js
var require_main = __commonJS({
"node_modules/chinese-tokenizer/src/main.js"(exports) {
var Cedict = require_cedict();
var chinesePunctuation = [
"\xB7",
"\xD7",
"\u2014",
"\u2018",
"\u2019",
"\u201C",
"\u201D",
"\u2026",
"\u3001",
"\u3002",
"\u300A",
"\u300B",
"\u300E",
"\u300F",
"\u3010",
"\u3011",
"\uFF01",
"\uFF08",
"\uFF09",
"\uFF0C",
"\uFF1A",
"\uFF1B",
"\uFF1F"
];
exports.load = function(contents) {
let dictionary = new Cedict();
dictionary.load(contents);
return function tokenize(text2) {
text2 = Array.from(text2.replace(/\r/g, ""));
let result = [];
let i = 0;
let [offset, line, column] = [0, 1, 1];
let [simplifiedPreference, traditionalPreference] = [0, 0];
let pushToken = (word) => {
let simplifiedEntries = dictionary.get(word, false);
let traditionalEntries = dictionary.get(word, true);
let entries = simplifiedEntries.length === 0 ? traditionalEntries : traditionalEntries.length === 0 ? simplifiedEntries : simplifiedPreference < traditionalPreference ? traditionalEntries : simplifiedPreference > traditionalPreference ? simplifiedEntries : traditionalEntries;
if (traditionalEntries.length === 0 && simplifiedEntries.length > 0) {
simplifiedPreference++;
} else if (simplifiedEntries.length === 0 && traditionalEntries.length > 0) {
traditionalPreference++;
}
result.push({
text: word,
traditional: entries[0] ? entries[0].traditional : word,
simplified: entries[0] ? entries[0].simplified : word,
position: {
offset,
line,
column
},
matches: entries.map(({ pinyin, pinyinPretty, english }) => ({
pinyin,
pinyinPretty,
english
}))
});
let wordArr = Array.from(word);
let lastLineBreakIndex = word.lastIndexOf("\n");
i += wordArr.length;
offset += word.length;
line += wordArr.filter((x) => x === "\n").length;
column = lastLineBreakIndex >= 0 ? word.length - lastLineBreakIndex : column + word.length;
};
while (i < text2.length) {
if (i !== text2.length - 1) {
let getTwo = text2.slice(i, i + 2).join("");
let simplifiedEntries = dictionary.getPrefix(getTwo, false);
let traditionalEntries = dictionary.getPrefix(getTwo, true);
let foundWord = null;
let foundEntries = null;
for (let entries of [traditionalEntries, simplifiedEntries]) {
for (let entry of entries) {
let matchText = entries === traditionalEntries ? entry.traditional : entry.simplified;
let word2 = text2.slice(i, i + Array.from(matchText).length).join("");
if (matchText === word2 && (foundWord == null || Array.from(word2).length > Array.from(foundWord).length)) {
foundWord = word2;
foundEntries = entries;
}
}
}
if (foundWord != null) {
pushToken(foundWord);
if (foundEntries === simplifiedEntries) {
simplifiedPreference++;
} else if (foundEntries === traditionalEntries) {
traditionalPreference++;
}
continue;
}
}
let character = text2[i];
let isChinese = (character2) => chinesePunctuation.includes(character2) || dictionary.get(character2, false).length > 0 || dictionary.get(character2, true).length > 0;
if (isChinese(character) || character.match(/\s/) != null) {
pushToken(character);
continue;
}
let end = i + 1;
for (; end < text2.length; end++) {
if (text2[end].match(/\s/) != null || isChinese(text2[end]))
break;
}
let word = text2.slice(i, end).join("");
pushToken(word);
}
return result;
};
};
}
});
// node_modules/ts-deepmerge/dist/index.js
var require_dist = __commonJS({
"node_modules/ts-deepmerge/dist/index.js"(exports) {
"use strict";
var __assign = exports && exports.__assign || function() {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __read = exports && exports.__read || function(o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m)
return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done)
ar.push(r.value);
} catch (error) {
e = { error };
} finally {
try {
if (r && !r.done && (m = i["return"]))
m.call(i);
} finally {
if (e)
throw e.error;
}
}
return ar;
};
var __spreadArray = exports && exports.__spreadArray || function(to, from, pack) {
if (pack || arguments.length === 2)
for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar)
ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
Object.defineProperty(exports, "__esModule", { value: true });
var isObject = function(obj) {
if (typeof obj === "object" && obj !== null) {
if (typeof Object.getPrototypeOf === "function") {
var prototype = Object.getPrototypeOf(obj);
return prototype === Object.prototype || prototype === null;
}
return Object.prototype.toString.call(obj) === "[object Object]";
}
return false;
};
var merge2 = function() {
var objects = [];
for (var _i = 0; _i < arguments.length; _i++) {
objects[_i] = arguments[_i];
}
return objects.reduce(function(result, current) {
if (Array.isArray(current)) {
throw new TypeError("Arguments provided to ts-deepmerge must be objects, not arrays.");
}
Object.keys(current).forEach(function(key) {
if (["__proto__", "constructor", "prototype"].includes(key)) {
return;
}
if (Array.isArray(result[key]) && Array.isArray(current[key])) {
result[key] = merge2.options.mergeArrays ? Array.from(new Set(result[key].concat(current[key]))) : current[key];
} else if (isObject(result[key]) && isObject(current[key])) {
result[key] = merge2(result[key], current[key]);
} else {
result[key] = current[key];
}
});
return result;
}, {});
};
var defaultOptions = {
mergeArrays: true
};
merge2.options = defaultOptions;
merge2.withOptions = function(options) {
var objects = [];
for (var _i = 1; _i < arguments.length; _i++) {
objects[_i - 1] = arguments[_i];
}
merge2.options = __assign({ mergeArrays: true }, options);
var result = merge2.apply(void 0, __spreadArray([], __read(objects), false));
merge2.options = defaultOptions;
return result;
};
exports.default = merge2;
}
});
// src/main.ts
var main_exports = {};
__export(main_exports, {
default: () => VariousComponents
});
module.exports = __toCommonJS(main_exports);
var import_obsidian6 = require("obsidian");
// src/ui/AutoCompleteSuggest.ts
var import_obsidian3 = require("obsidian");
// src/util/strings.ts
var regEmoji = new RegExp(
/[\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF]|[\uFE0E-\uFE0F]/,
"g"
);
function allAlphabets(text2) {
return Boolean(text2.match(/^[a-zA-Z0-9_-]+$/));
}
function excludeEmoji(text2) {
return text2.replace(regEmoji, "");
}
function encodeSpace(text2) {
return text2.replace(/ /g, "%20");
}
function lowerIncludes(one, other) {
return one.toLowerCase().includes(other.toLowerCase());
}
function lowerStartsWith(a, b) {
return a.toLowerCase().startsWith(b.toLowerCase());
}
function capitalizeFirstLetter(str) {
return str.charAt(0).toUpperCase() + str.slice(1);
}
function startsSmallLetterOnlyFirst(str) {
return Boolean(str.match(/^[A-Z][^A-Z]+$/));
}
function* splitRaw(text2, regexp) {
let previousIndex = 0;
for (let r of text2.matchAll(regexp)) {
if (previousIndex !== r.index) {
yield text2.slice(previousIndex, r.index);
}
yield text2[r.index];
previousIndex = r.index + 1;
}
if (previousIndex !== text2.length) {
yield text2.slice(previousIndex, text2.length);
}
}
// src/tokenizer/tokenizers/DefaultTokenizer.ts
function pickTokens(content, trimPattern) {
return content.split(trimPattern).filter((x) => x !== "");
}
var TRIM_CHAR_PATTERN = /[\n\t\[\]$/:?!=()<>"'.,|;*~ `]/g;
var DefaultTokenizer = class {
tokenize(content, raw) {
return raw ? Array.from(splitRaw(content, this.getTrimPattern())).filter(
(x) => x !== " "
) : pickTokens(content, this.getTrimPattern());
}
recursiveTokenize(content) {
const trimIndexes = Array.from(content.matchAll(this.getTrimPattern())).sort((a, b) => a.index - b.index).map((x) => x.index);
return [
{ word: content, offset: 0 },
...trimIndexes.map((i) => ({
word: content.slice(i + 1),
offset: i + 1
}))
];
}
getTrimPattern() {
return TRIM_CHAR_PATTERN;
}
shouldIgnoreOnCurrent(str) {
return false;
}
};
// src/tokenizer/tokenizers/ArabicTokenizer.ts
var ARABIC_TRIM_CHAR_PATTERN = /[\n\t\[\]$/:?!=()<>"'.,|;*~ `،؛]/g;
var ArabicTokenizer = class extends DefaultTokenizer {
getTrimPattern() {
return ARABIC_TRIM_CHAR_PATTERN;
}
};
// src/external/tiny-segmenter.ts
function TinySegmenter() {
var patterns = {
"[\u4E00\u4E8C\u4E09\u56DB\u4E94\u516D\u4E03\u516B\u4E5D\u5341\u767E\u5343\u4E07\u5104\u5146]": "M",
"[\u4E00-\u9FA0\u3005\u3006\u30F5\u30F6]": "H",
"[\u3041-\u3093]": "I",
"[\u30A1-\u30F4\u30FC\uFF71-\uFF9D\uFF9E\uFF70]": "K",
"[a-zA-Z\uFF41-\uFF5A\uFF21-\uFF3A]": "A",
"[0-9\uFF10-\uFF19]": "N"
};
this.chartype_ = [];
for (var i in patterns) {
var regexp = new RegExp();
regexp.compile(i);
this.chartype_.push([regexp, patterns[i]]);
}
this.BIAS__ = -332;
this.BC1__ = { HH: 6, II: 2461, KH: 406, OH: -1378 };
this.BC2__ = {
AA: -3267,
AI: 2744,
AN: -878,
HH: -4070,
HM: -1711,
HN: 4012,
HO: 3761,
IA: 1327,
IH: -1184,
II: -1332,
IK: 1721,
IO: 5492,
KI: 3831,
KK: -8741,
MH: -3132,
MK: 3334,
OO: -2920
};
this.BC3__ = {
HH: 996,
HI: 626,
HK: -721,
HN: -1307,
HO: -836,
IH: -301,
KK: 2762,
MK: 1079,
MM: 4034,
OA: -1652,
OH: 266
};
this.BP1__ = { BB: 295, OB: 304, OO: -125, UB: 352 };
this.BP2__ = { BO: 60, OO: -1762 };
this.BQ1__ = {
BHH: 1150,
BHM: 1521,
BII: -1158,
BIM: 886,
BMH: 1208,
BNH: 449,
BOH: -91,
BOO: -2597,
OHI: 451,
OIH: -296,
OKA: 1851,
OKH: -1020,
OKK: 904,
OOO: 2965
};
this.BQ2__ = {
BHH: 118,
BHI: -1159,
BHM: 466,
BIH: -919,
BKK: -1720,
BKO: 864,
OHH: -1139,
OHM: -181,
OIH: 153,
UHI: -1146
};
this.BQ3__ = {
BHH: -792,
BHI: 2664,
BII: -299,
BKI: 419,
BMH: 937,
BMM: 8335,
BNN: 998,
BOH: 775,
OHH: 2174,
OHM: 439,
OII: 280,
OKH: 1798,
OKI: -793,
OKO: -2242,
OMH: -2402,
OOO: 11699
};
this.BQ4__ = {
BHH: -3895,
BIH: 3761,
BII: -4654,
BIK: 1348,
BKK: -1806,
BMI: -3385,
BOO: -12396,
OAH: 926,
OHH: 266,
OHK: -2036,
ONN: -973
};
this.BW1__ = {
",\u3068": 660,
",\u540C": 727,
B1\u3042: 1404,
B1\u540C: 542,
"\u3001\u3068": 660,
"\u3001\u540C": 727,
"\u300D\u3068": 1682,
\u3042\u3063: 1505,
\u3044\u3046: 1743,
\u3044\u3063: -2055,
\u3044\u308B: 672,
\u3046\u3057: -4817,
\u3046\u3093: 665,
\u304B\u3089: 3472,
\u304C\u3089: 600,
\u3053\u3046: -790,
\u3053\u3068: 2083,
\u3053\u3093: -1262,
\u3055\u3089: -4143,
\u3055\u3093: 4573,
\u3057\u305F: 2641,
\u3057\u3066: 1104,
\u3059\u3067: -3399,
\u305D\u3053: 1977,
\u305D\u308C: -871,
\u305F\u3061: 1122,
\u305F\u3081: 601,
\u3063\u305F: 3463,
\u3064\u3044: -802,
\u3066\u3044: 805,
\u3066\u304D: 1249,
\u3067\u304D: 1127,
\u3067\u3059: 3445,
\u3067\u306F: 844,
\u3068\u3044: -4915,
\u3068\u307F: 1922,
\u3069\u3053: 3887,
\u306A\u3044: 5713,
\u306A\u3063: 3015,
\u306A\u3069: 7379,
\u306A\u3093: -1113,
\u306B\u3057: 2468,
\u306B\u306F: 1498,
\u306B\u3082: 1671,
\u306B\u5BFE: -912,
\u306E\u4E00: -501,
\u306E\u4E2D: 741,
\u307E\u305B: 2448,
\u307E\u3067: 1711,
\u307E\u307E: 2600,
\u307E\u308B: -2155,
\u3084\u3080: -1947,
\u3088\u3063: -2565,
\u308C\u305F: 2369,
\u308C\u3067: -913,
\u3092\u3057: 1860,
\u3092\u898B: 731,
\u4EA1\u304F: -1886,
\u4EAC\u90FD: 2558,
\u53D6\u308A: -2784,
\u5927\u304D: -2604,
\u5927\u962A: 1497,
\u5E73\u65B9: -2314,
\u5F15\u304D: -1336,
\u65E5\u672C: -195,
\u672C\u5F53: -2423,
\u6BCE\u65E5: -2113,
\u76EE\u6307: -724,
\uFF22\uFF11\u3042: 1404,
\uFF22\uFF11\u540C: 542,
"\uFF63\u3068": 1682
};
this.BW2__ = {
"..": -11822,
11: -669,
"\u2015\u2015": -5730,
"\u2212\u2212": -13175,
\u3044\u3046: -1609,
\u3046\u304B: 2490,
\u304B\u3057: -1350,
\u304B\u3082: -602,
\u304B\u3089: -7194,
\u304B\u308C: 4612,
\u304C\u3044: 853,
\u304C\u3089: -3198,
\u304D\u305F: 1941,
\u304F\u306A: -1597,
\u3053\u3068: -8392,
\u3053\u306E: -4193,
\u3055\u305B: 4533,
\u3055\u308C: 13168,
\u3055\u3093: -3977,
\u3057\u3044: -1819,
\u3057\u304B: -545,
\u3057\u305F: 5078,
\u3057\u3066: 972,
\u3057\u306A: 939,
\u305D\u306E: -3744,
\u305F\u3044: -1253,
\u305F\u305F: -662,
\u305F\u3060: -3857,
\u305F\u3061: -786,
\u305F\u3068: 1224,
\u305F\u306F: -939,
\u3063\u305F: 4589,
\u3063\u3066: 1647,
\u3063\u3068: -2094,
\u3066\u3044: 6144,
\u3066\u304D: 3640,
\u3066\u304F: 2551,
\u3066\u306F: -3110,
\u3066\u3082: -3065,
\u3067\u3044: 2666,
\u3067\u304D: -1528,
\u3067\u3057: -3828,
\u3067\u3059: -4761,
\u3067\u3082: -4203,
\u3068\u3044: 1890,
\u3068\u3053: -1746,
\u3068\u3068: -2279,
\u3068\u306E: 720,
\u3068\u307F: 5168,
\u3068\u3082: -3941,
\u306A\u3044: -2488,
\u306A\u304C: -1313,
\u306A\u3069: -6509,
\u306A\u306E: 2614,
\u306A\u3093: 3099,
\u306B\u304A: -1615,
\u306B\u3057: 2748,
\u306B\u306A: 2454,
\u306B\u3088: -7236,
\u306B\u5BFE: -14943,
\u306B\u5F93: -4688,
\u306B\u95A2: -11388,
\u306E\u304B: 2093,
\u306E\u3067: -7059,
\u306E\u306B: -6041,
\u306E\u306E: -6125,
\u306F\u3044: 1073,
\u306F\u304C: -1033,
\u306F\u305A: -2532,
\u3070\u308C: 1813,
\u307E\u3057: -1316,
\u307E\u3067: -6621,
\u307E\u308C: 5409,
\u3081\u3066: -3153,
\u3082\u3044: 2230,
\u3082\u306E: -10713,
\u3089\u304B: -944,
\u3089\u3057: -1611,
\u3089\u306B: -1897,
\u308A\u3057: 651,
\u308A\u307E: 1620,
\u308C\u305F: 4270,
\u308C\u3066: 849,
\u308C\u3070: 4114,
\u308D\u3046: 6067,
\u308F\u308C: 7901,
\u3092\u901A: -11877,
\u3093\u3060: 728,
\u3093\u306A: -4115,
\u4E00\u4EBA: 602,
\u4E00\u65B9: -1375,
\u4E00\u65E5: 970,
\u4E00\u90E8: -1051,
\u4E0A\u304C: -4479,
\u4F1A\u793E: -1116,
\u51FA\u3066: 2163,
\u5206\u306E: -7758,
\u540C\u515A: 970,
\u540C\u65E5: -913,
\u5927\u962A: -2471,
\u59D4\u54E1: -1250,
\u5C11\u306A: -1050,
\u5E74\u5EA6: -8669,
\u5E74\u9593: -1626,
\u5E9C\u770C: -2363,
\u624B\u6A29: -1982,
\u65B0\u805E: -4066,
\u65E5\u65B0: -722,
\u65E5\u672C: -7068,
\u65E5\u7C73: 3372,
\u66DC\u65E5: -601,
\u671D\u9BAE: -2355,
\u672C\u4EBA: -2697,
\u6771\u4EAC: -1543,
\u7136\u3068: -1384,
\u793E\u4F1A: -1276,
\u7ACB\u3066: -990,
\u7B2C\u306B: -1612,
\u7C73\u56FD: -4268,
"\uFF11\uFF11": -669
};
this.BW3__ = {
\u3042\u305F: -2194,
\u3042\u308A: 719,
\u3042\u308B: 3846,
"\u3044.": -1185,
"\u3044\u3002": -1185,
\u3044\u3044: 5308,
\u3044\u3048: 2079,
\u3044\u304F: 3029,
\u3044\u305F: 2056,
\u3044\u3063: 1883,
\u3044\u308B: 5600,
\u3044\u308F: 1527,
\u3046\u3061: 1117,
\u3046\u3068: 4798,
\u3048\u3068: 1454,
"\u304B.": 2857,
"\u304B\u3002": 2857,
\u304B\u3051: -743,
\u304B\u3063: -4098,
\u304B\u306B: -669,
\u304B\u3089: 6520,
\u304B\u308A: -2670,
"\u304C,": 1816,
"\u304C\u3001": 1816,
\u304C\u304D: -4855,
\u304C\u3051: -1127,
\u304C\u3063: -913,
\u304C\u3089: -4977,
\u304C\u308A: -2064,
\u304D\u305F: 1645,
\u3051\u3069: 1374,
\u3053\u3068: 7397,
\u3053\u306E: 1542,
\u3053\u308D: -2757,
\u3055\u3044: -714,
\u3055\u3092: 976,
"\u3057,": 1557,
"\u3057\u3001": 1557,
\u3057\u3044: -3714,
\u3057\u305F: 3562,
\u3057\u3066: 1449,
\u3057\u306A: 2608,
\u3057\u307E: 1200,
"\u3059.": -1310,
"\u3059\u3002": -1310,
\u3059\u308B: 6521,
"\u305A,": 3426,
"\u305A\u3001": 3426,
\u305A\u306B: 841,
\u305D\u3046: 428,
"\u305F.": 8875,
"\u305F\u3002": 8875,
\u305F\u3044: -594,
\u305F\u306E: 812,
\u305F\u308A: -1183,
\u305F\u308B: -853,
"\u3060.": 4098,
"\u3060\u3002": 4098,
\u3060\u3063: 1004,
\u3063\u305F: -4748,
\u3063\u3066: 300,
\u3066\u3044: 6240,
\u3066\u304A: 855,
\u3066\u3082: 302,
\u3067\u3059: 1437,
\u3067\u306B: -1482,
\u3067\u306F: 2295,
\u3068\u3046: -1387,
\u3068\u3057: 2266,
\u3068\u306E: 541,
\u3068\u3082: -3543,
\u3069\u3046: 4664,
\u306A\u3044: 1796,
\u306A\u304F: -903,
\u306A\u3069: 2135,
"\u306B,": -1021,
"\u306B\u3001": -1021,
\u306B\u3057: 1771,
\u306B\u306A: 1906,
\u306B\u306F: 2644,
"\u306E,": -724,
"\u306E\u3001": -724,
\u306E\u5B50: -1e3,
"\u306F,": 1337,
"\u306F\u3001": 1337,
\u3079\u304D: 2181,
\u307E\u3057: 1113,
\u307E\u3059: 6943,
\u307E\u3063: -1549,
\u307E\u3067: 6154,
\u307E\u308C: -793,
\u3089\u3057: 1479,
\u3089\u308C: 6820,
\u308B\u308B: 3818,
"\u308C,": 854,
"\u308C\u3001": 854,
\u308C\u305F: 1850,
\u308C\u3066: 1375,
\u308C\u3070: -3246,
\u308C\u308B: 1091,
\u308F\u308C: -605,
\u3093\u3060: 606,
\u3093\u3067: 798,
\u30AB\u6708: 990,
\u4F1A\u8B70: 860,
\u5165\u308A: 1232,
\u5927\u4F1A: 2217,
\u59CB\u3081: 1681,
\u5E02: 965,
\u65B0\u805E: -5055,
"\u65E5,": 974,
"\u65E5\u3001": 974,
\u793E\u4F1A: 2024,
\uFF76\u6708: 990
};
this.TC1__ = {
AAA: 1093,
HHH: 1029,
HHM: 580,
HII: 998,
HOH: -390,
HOM: -331,
IHI: 1169,
IOH: -142,
IOI: -1015,
IOM: 467,
MMH: 187,
OOI: -1832
};
this.TC2__ = {
HHO: 2088,
HII: -1023,
HMM: -1154,
IHI: -1965,
KKH: 703,
OII: -2649
};
this.TC3__ = {
AAA: -294,
HHH: 346,
HHI: -341,
HII: -1088,
HIK: 731,
HOH: -1486,
IHH: 128,
IHI: -3041,
IHO: -1935,
IIH: -825,
IIM: -1035,
IOI: -542,
KHH: -1216,
KKA: 491,
KKH: -1217,
KOK: -1009,
MHH: -2694,
MHM: -457,
MHO: 123,
MMH: -471,
NNH: -1689,
NNO: 662,
OHO: -3393
};
this.TC4__ = {
HHH: -203,
HHI: 1344,
HHK: 365,
HHM: -122,
HHN: 182,
HHO: 669,
HIH: 804,
HII: 679,
HOH: 446,
IHH: 695,
IHO: -2324,
IIH: 321,
III: 1497,
IIO: 656,
IOO: 54,
KAK: 4845,
KKA: 3386,
KKK: 3065,
MHH: -405,
MHI: 201,
MMH: -241,
MMM: 661,
MOM: 841
};
this.TQ1__ = {
BHHH: -227,
BHHI: 316,
BHIH: -132,
BIHH: 60,
BIII: 1595,
BNHH: -744,
BOHH: 225,
BOOO: -908,
OAKK: 482,
OHHH: 281,
OHIH: 249,
OIHI: 200,
OIIH: -68
};
this.TQ2__ = { BIHH: -1401, BIII: -1033, BKAK: -543, BOOO: -5591 };
this.TQ3__ = {
BHHH: 478,
BHHM: -1073,
BHIH: 222,
BHII: -504,
BIIH: -116,
BIII: -105,
BMHI: -863,
BMHM: -464,
BOMH: 620,
OHHH: 346,
OHHI: 1729,
OHII: 997,
OHMH: 481,
OIHH: 623,
OIIH: 1344,
OKAK: 2792,
OKHH: 587,
OKKA: 679,
OOHH: 110,
OOII: -685
};
this.TQ4__ = {
BHHH: -721,
BHHM: -3604,
BHII: -966,
BIIH: -607,
BIII: -2181,
OAAA: -2763,
OAKK: 180,
OHHH: -294,
OHHI: 2446,
OHHO: 480,
OHIH: -1573,
OIHH: 1935,
OIHI: -493,
OIIH: 626,
OIII: -4007,
OKAK: -8156
};
this.TW1__ = { \u306B\u3064\u3044: -4681, \u6771\u4EAC\u90FD: 2026 };
this.TW2__ = {
\u3042\u308B\u7A0B: -2049,
\u3044\u3063\u305F: -1256,
\u3053\u308D\u304C: -2434,
\u3057\u3087\u3046: 3873,
\u305D\u306E\u5F8C: -4430,
\u3060\u3063\u3066: -1049,
\u3066\u3044\u305F: 1833,
\u3068\u3057\u3066: -4657,
\u3068\u3082\u306B: -4517,
\u3082\u306E\u3067: 1882,
\u4E00\u6C17\u306B: -792,
\u521D\u3081\u3066: -1512,
\u540C\u6642\u306B: -8097,
\u5927\u304D\u306A: -1255,
\u5BFE\u3057\u3066: -2721,
\u793E\u4F1A\u515A: -3216
};
this.TW3__ = {
\u3044\u305F\u3060: -1734,
\u3057\u3066\u3044: 1314,
\u3068\u3057\u3066: -4314,
\u306B\u3064\u3044: -5483,
\u306B\u3068\u3063: -5989,
\u306B\u5F53\u305F: -6247,
"\u306E\u3067,": -727,
"\u306E\u3067\u3001": -727,
\u306E\u3082\u306E: -600,
\u308C\u304B\u3089: -3752,
\u5341\u4E8C\u6708: -2287
};
this.TW4__ = {
"\u3044\u3046.": 8576,
"\u3044\u3046\u3002": 8576,
\u304B\u3089\u306A: -2348,
\u3057\u3066\u3044: 2958,
"\u305F\u304C,": 1516,
"\u305F\u304C\u3001": 1516,
\u3066\u3044\u308B: 1538,
\u3068\u3044\u3046: 1349,
\u307E\u3057\u305F: 5543,
\u307E\u305B\u3093: 1097,
\u3088\u3046\u3068: -4258,
\u3088\u308B\u3068: 5865
};
this.UC1__ = { A: 484, K: 93, M: 645, O: -505 };
this.UC2__ = { A: 819, H: 1059, I: 409, M: 3987, N: 5775, O: 646 };
this.UC3__ = { A: -1370, I: 2311 };
this.UC4__ = {
A: -2643,
H: 1809,
I: -1032,
K: -3450,
M: 3565,
N: 3876,
O: 6646
};
this.UC5__ = { H: 313, I: -1238, K: -799, M: 539, O: -831 };
this.UC6__ = { H: -506, I: -253, K: 87, M: 247, O: -387 };
this.UP1__ = { O: -214 };
this.UP2__ = { B: 69, O: 935 };
this.UP3__ = { B: 189 };
this.UQ1__ = {
BH: 21,
BI: -12,
BK: -99,
BN: 142,
BO: -56,
OH: -95,
OI: 477,
OK: 410,
OO: -2422
};
this.UQ2__ = { BH: 216, BI: 113, OK: 1759 };
this.UQ3__ = {
BA: -479,
BH: 42,
BI: 1913,
BK: -7198,
BM: 3160,
BN: 6427,
BO: 14761,
OI: -827,
ON: -3212
};
this.UW1__ = {
",": 156,
"\u3001": 156,
"\u300C": -463,
\u3042: -941,
\u3046: -127,
\u304C: -553,
\u304D: 121,
\u3053: 505,
\u3067: -201,
\u3068: -547,
\u3069: -123,
\u306B: -789,
\u306E: -185,
\u306F: -847,
\u3082: -466,
\u3084: -470,
\u3088: 182,
\u3089: -292,
\u308A: 208,
\u308C: 169,
\u3092: -446,
\u3093: -137,
"\u30FB": -135,
\u4E3B: -402,
\u4EAC: -268,
\u533A: -912,
\u5348: 871,
\u56FD: -460,
\u5927: 561,
\u59D4: 729,
\u5E02: -411,
\u65E5: -141,
\u7406: 361,
\u751F: -408,
\u770C: -386,
\u90FD: -718,
"\uFF62": -463,
"\uFF65": -135
};
this.UW2__ = {
",": -829,
"\u3001": -829,
"\u3007": 892,
"\u300C": -645,
"\u300D": 3145,
\u3042: -538,
\u3044: 505,
\u3046: 134,
\u304A: -502,
\u304B: 1454,
\u304C: -856,
\u304F: -412,
\u3053: 1141,
\u3055: 878,
\u3056: 540,
\u3057: 1529,
\u3059: -675,
\u305B: 300,
\u305D: -1011,
\u305F: 188,
\u3060: 1837,
\u3064: -949,
\u3066: -291,
\u3067: -268,
\u3068: -981,
\u3069: 1273,
\u306A: 1063,
\u306B: -1764,
\u306E: 130,
\u306F: -409,
\u3072: -1273,
\u3079: 1261,
\u307E: 600,
\u3082: -1263,
\u3084: -402,
\u3088: 1639,
\u308A: -579,
\u308B: -694,
\u308C: 571,
\u3092: -2516,
\u3093: 2095,
\u30A2: -587,
\u30AB: 306,
\u30AD: 568,
\u30C3: 831,
\u4E09: -758,
\u4E0D: -2150,
\u4E16: -302,
\u4E2D: -968,
\u4E3B: -861,
\u4E8B: 492,
\u4EBA: -123,
\u4F1A: 978,
\u4FDD: 362,
\u5165: 548,
\u521D: -3025,
\u526F: -1566,
\u5317: -3414,
\u533A: -422,
\u5927: -1769,
\u5929: -865,
\u592A: -483,
\u5B50: -1519,
\u5B66: 760,
\u5B9F: 1023,
\u5C0F: -2009,
\u5E02: -813,
\u5E74: -1060,
\u5F37: 1067,
\u624B: -1519,
\u63FA: -1033,
\u653F: 1522,
\u6587: -1355,
\u65B0: -1682,
\u65E5: -1815,
\u660E: -1462,
\u6700: -630,
\u671D: -1843,
\u672C: -1650,
\u6771: -931,
\u679C: -665,
\u6B21: -2378,
\u6C11: -180,
\u6C17: -1740,
\u7406: 752,
\u767A: 529,
\u76EE: -1584,
\u76F8: -242,
\u770C: -1165,
\u7ACB: -763,
\u7B2C: 810,
\u7C73: 509,
\u81EA: -1353,
\u884C: 838,
\u897F: -744,
\u898B: -3874,
\u8ABF: 1010,
\u8B70: 1198,
\u8FBC: 3041,
\u958B: 1758,
\u9593: -1257,
"\uFF62": -645,
"\uFF63": 3145,
\uFF6F: 831,
\uFF71: -587,
\uFF76: 306,
\uFF77: 568
};
this.UW3__ = {
",": 4889,
1: -800,
"\u2212": -1723,
"\u3001": 4889,
\u3005: -2311,
"\u3007": 5827,
"\u300D": 2670,
"\u3013": -3573,
\u3042: -2696,
\u3044: 1006,
\u3046: 2342,
\u3048: 1983,
\u304A: -4864,
\u304B: -1163,
\u304C: 3271,
\u304F: 1004,
\u3051: 388,
\u3052: 401,
\u3053: -3552,
\u3054: -3116,
\u3055: -1058,
\u3057: -395,
\u3059: 584,
\u305B: 3685,
\u305D: -5228,
\u305F: 842,
\u3061: -521,
\u3063: -1444,
\u3064: -1081,
\u3066: 6167,
\u3067: 2318,
\u3068: 1691,
\u3069: -899,
\u306A: -2788,
\u306B: 2745,
\u306E: 4056,
\u306F: 4555,
\u3072: -2171,
\u3075: -1798,
\u3078: 1199,
\u307B: -5516,
\u307E: -4384,
\u307F: -120,
\u3081: 1205,
\u3082: 2323,
\u3084: -788,
\u3088: -202,
\u3089: 727,
\u308A: 649,
\u308B: 5905,
\u308C: 2773,
\u308F: -1207,
\u3092: 6620,
\u3093: -518,
\u30A2: 551,
\u30B0: 1319,
\u30B9: 874,
\u30C3: -1350,
\u30C8: 521,
\u30E0: 1109,
\u30EB: 1591,
\u30ED: 2201,
\u30F3: 278,
"\u30FB": -3794,
\u4E00: -1619,
\u4E0B: -1759,
\u4E16: -2087,
\u4E21: 3815,
\u4E2D: 653,
\u4E3B: -758,
\u4E88: -1193,
\u4E8C: 974,
\u4EBA: 2742,
\u4ECA: 792,
\u4ED6: 1889,
\u4EE5: -1368,
\u4F4E: 811,
\u4F55: 4265,
\u4F5C: -361,
\u4FDD: -2439,
\u5143: 4858,
\u515A: 3593,
\u5168: 1574,
\u516C: -3030,
\u516D: 755,
\u5171: -1880,
\u5186: 5807,
\u518D: 3095,
\u5206: 457,
\u521D: 2475,
\u5225: 1129,
\u524D: 2286,
\u526F: 4437,
\u529B: 365,
\u52D5: -949,
\u52D9: -1872,
\u5316: 1327,
\u5317: -1038,
\u533A: 4646,
\u5343: -2309,
\u5348: -783,
\u5354: -1006,
\u53E3: 483,
\u53F3: 1233,
\u5404: 3588,
\u5408: -241,
\u540C: 3906,
\u548C: -837,
\u54E1: 4513,
\u56FD: 642,
\u578B: 1389,
\u5834: 1219,
\u5916: -241,
\u59BB: 2016,
\u5B66: -1356,
\u5B89: -423,
\u5B9F: -1008,
\u5BB6: 1078,
\u5C0F: -513,
\u5C11: -3102,
\u5DDE: 1155,
\u5E02: 3197,
\u5E73: -1804,
\u5E74: 2416,
\u5E83: -1030,
\u5E9C: 1605,
\u5EA6: 1452,
\u5EFA: -2352,
\u5F53: -3885,
\u5F97: 1905,
\u601D: -1291,
\u6027: 1822,
\u6238: -488,
\u6307: -3973,
\u653F: -2013,
\u6559: -1479,
\u6570: 3222,
\u6587: -1489,
\u65B0: 1764,
\u65E5: 2099,
\u65E7: 5792,
\u6628: -661,
\u6642: -1248,
\u66DC: -951,
\u6700: -937,
\u6708: 4125,
\u671F: 360,
\u674E: 3094,
\u6751: 364,
\u6771: -805,
\u6838: 5156,
\u68EE: 2438,
\u696D: 484,
\u6C0F: 2613,
\u6C11: -1694,
\u6C7A: -1073,
\u6CD5: 1868,
\u6D77: -495,
\u7121: 979,
\u7269: 461,
\u7279: -3850,
\u751F: -273,
\u7528: 914,
\u753A: 1215,
\u7684: 7313,
\u76F4: -1835,
\u7701: 792,
\u770C: 6293,
\u77E5: -1528,
\u79C1: 4231,
\u7A0E: 401,
\u7ACB: -960,
\u7B2C: 1201,
\u7C73: 7767,
\u7CFB: 3066,
\u7D04: 3663,
\u7D1A: 1384,
\u7D71: -4229,
\u7DCF: 1163,
\u7DDA: 1255,
\u8005: 6457,
\u80FD: 725,
\u81EA: -2869,
\u82F1: 785,
\u898B: 1044,
\u8ABF: -562,
\u8CA1: -733,
\u8CBB: 1777,
\u8ECA: 1835,
\u8ECD: 1375,
\u8FBC: -1504,
\u901A: -1136,
\u9078: -681,
\u90CE: 1026,
\u90E1: 4404,
\u90E8: 1200,
\u91D1: 2163,
\u9577: 421,
\u958B: -1432,
\u9593: 1302,
\u95A2: -1282,
\u96E8: 2009,
\u96FB: -1045,
\u975E: 2066,
\u99C5: 1620,
"\uFF11": -800,
"\uFF63": 2670,
"\uFF65": -3794,
\uFF6F: -1350,
\uFF71: 551,
\uFF78\uFF9E: 1319,
\uFF7D: 874,
\uFF84: 521,
\uFF91: 1109,
\uFF99: 1591,
\uFF9B: 2201,
\uFF9D: 278
};
this.UW4__ = {
",": 3930,
".": 3508,
"\u2015": -4841,
"\u3001": 3930,
"\u3002": 3508,
"\u3007": 4999,
"\u300C": 1895,
"\u300D": 3798,
"\u3013": -5156,
\u3042: 4752,
\u3044: -3435,
\u3046: -640,
\u3048: -2514,
\u304A: 2405,
\u304B: 530,
\u304C: 6006,
\u304D: -4482,
\u304E: -3821,
\u304F: -3788,
\u3051: -4376,
\u3052: -4734,
\u3053: 2255,
\u3054: 1979,
\u3055: 2864,
\u3057: -843,
\u3058: -2506,
\u3059: -731,
\u305A: 1251,
\u305B: 181,
\u305D: 4091,
\u305F: 5034,
\u3060: 5408,
\u3061: -3654,
\u3063: -5882,
\u3064: -1659,
\u3066: 3994,
\u3067: 7410,
\u3068: 4547,
\u306A: 5433,
\u306B: 6499,
\u306C: 1853,
\u306D: 1413,
\u306E: 7396,
\u306F: 8578,
\u3070: 1940,
\u3072: 4249,
\u3073: -4134,
\u3075: 1345,
\u3078: 6665,
\u3079: -744,
\u307B: 1464,
\u307E: 1051,
\u307F: -2082,
\u3080: -882,
\u3081: -5046,
\u3082: 4169,
\u3083: -2666,
\u3084: 2795,
\u3087: -1544,
\u3088: 3351,
\u3089: -2922,
\u308A: -9726,
\u308B: -14896,
\u308C: -2613,
\u308D: -4570,
\u308F: -1783,
\u3092: 13150,
\u3093: -2352,
\u30AB: 2145,
\u30B3: 1789,
\u30BB: 1287,
\u30C3: -724,
\u30C8: -403,
\u30E1: -1635,
\u30E9: -881,
\u30EA: -541,
\u30EB: -856,
\u30F3: -3637,
"\u30FB": -4371,
\u30FC: -11870,
\u4E00: -2069,
\u4E2D: 2210,
\u4E88: 782,
\u4E8B: -190,
\u4E95: -1768,
\u4EBA: 1036,
\u4EE5: 544,
\u4F1A: 950,
\u4F53: -1286,
\u4F5C: 530,
\u5074: 4292,
\u5148: 601,
\u515A: -2006,
\u5171: -1212,
\u5185: 584,
\u5186: 788,
\u521D: 1347,
\u524D: 1623,
\u526F: 3879,
\u529B: -302,
\u52D5: -740,
\u52D9: -2715,
\u5316: 776,
\u533A: 4517,
\u5354: 1013,
\u53C2: 1555,
\u5408: -1834,
\u548C: -681,
\u54E1: -910,
\u5668: -851,
\u56DE: 1500,
\u56FD: -619,
\u5712: -1200,
\u5730: 866,
\u5834: -1410,
\u5841: -2094,
\u58EB: -1413,
\u591A: 1067,
\u5927: 571,
\u5B50: -4802,
\u5B66: -1397,
\u5B9A: -1057,
\u5BFA: -809,
\u5C0F: 1910,
\u5C4B: -1328,
\u5C71: -1500,
\u5CF6: -2056,
\u5DDD: -2667,
\u5E02: 2771,
\u5E74: 374,
\u5E81: -4556,
\u5F8C: 456,
\u6027: 553,
\u611F: 916,
\u6240: -1566,
\u652F: 856,
\u6539: 787,
\u653F: 2182,
\u6559: 704,
\u6587: 522,
\u65B9: -856,
\u65E5: 1798,
\u6642: 1829,
\u6700: 845,
\u6708: -9066,
\u6728: -485,
\u6765: -442,
\u6821: -360,
\u696D: -1043,
\u6C0F: 5388,
\u6C11: -2716,
\u6C17: -910,
\u6CA2: -939,
\u6E08: -543,
\u7269: -735,
\u7387: 672,
\u7403: -1267,
\u751F: -1286,
\u7523: -1101,
\u7530: -2900,
\u753A: 1826,
\u7684: 2586,
\u76EE: 922,
\u7701: -3485,
\u770C: 2997,
\u7A7A: -867,
\u7ACB: -2112,
\u7B2C: 788,
\u7C73: 2937,
\u7CFB: 786,
\u7D04: 2171,
\u7D4C: 1146,
\u7D71: -1169,
\u7DCF: 940,
\u7DDA: -994,
\u7F72: 749,
\u8005: 2145,
\u80FD: -730,
\u822C: -852,
\u884C: -792,
\u898F: 792,
\u8B66: -1184,
\u8B70: -244,
\u8C37: -1e3,
\u8CDE: 730,
\u8ECA: -1481,
\u8ECD: 1158,
\u8F2A: -1433,
\u8FBC: -3370,
\u8FD1: 929,
\u9053: -1291,
\u9078: 2596,
\u90CE: -4866,
\u90FD: 1192,
\u91CE: -1100,
\u9280: -2213,
\u9577: 357,
\u9593: -2344,
\u9662: -2297,
\u969B: -2604,
\u96FB: -878,
\u9818: -1659,
\u984C: -792,
\u9928: -1984,
\u9996: 1749,
\u9AD8: 2120,
"\uFF62": 1895,
"\uFF63": 3798,
"\uFF65": -4371,
\uFF6F: -724,
\uFF70: -11870,
\uFF76: 2145,
\uFF7A: 1789,
\uFF7E: 1287,
\uFF84: -403,
\uFF92: -1635,
\uFF97: -881,
\uFF98: -541,
\uFF99: -856,
\uFF9D: -3637
};
this.UW5__ = {
",": 465,
".": -299,
1: -514,
E2: -32768,
"]": -2762,
"\u3001": 465,
"\u3002": -299,
"\u300C": 363,
\u3042: 1655,
\u3044: 331,
\u3046: -503,
\u3048: 1199,
\u304A: 527,
\u304B: 647,
\u304C: -421,
\u304D: 1624,
\u304E: 1971,
\u304F: 312,
\u3052: -983,
\u3055: -1537,
\u3057: -1371,
\u3059: -852,
\u3060: -1186,
\u3061: 1093,
\u3063: 52,
\u3064: 921,
\u3066: -18,
\u3067: -850,
\u3068: -127,
\u3069: 1682,
\u306A: -787,
\u306B: -1224,
\u306E: -635,
\u306F: -578,
\u3079: 1001,
\u307F: 502,
\u3081: 865,
\u3083: 3350,
\u3087: 854,
\u308A: -208,
\u308B: 429,
\u308C: 504,
\u308F: 419,
\u3092: -1264,
\u3093: 327,
\u30A4: 241,
\u30EB: 451,
\u30F3: -343,
\u4E2D: -871,
\u4EAC: 722,
\u4F1A: -1153,
\u515A: -654,
\u52D9: 3519,
\u533A: -901,
\u544A: 848,
\u54E1: 2104,
\u5927: -1296,
\u5B66: -548,
\u5B9A: 1785,
\u5D50: -1304,
\u5E02: -2991,
\u5E2D: 921,
\u5E74: 1763,
\u601D: 872,
\u6240: -814,
\u6319: 1618,
\u65B0: -1682,
\u65E5: 218,
\u6708: -4353,
\u67FB: 932,
\u683C: 1356,
\u6A5F: -1508,
\u6C0F: -1347,
\u7530: 240,
\u753A: -3912,
\u7684: -3149,
\u76F8: 1319,
\u7701: -1052,
\u770C: -4003,
\u7814: -997,
\u793E: -278,
\u7A7A: -813,
\u7D71: 1955,
\u8005: -2233,
\u8868: 663,
\u8A9E: -1073,
\u8B70: 1219,
\u9078: -1018,
\u90CE: -368,
\u9577: 786,
\u9593: 1191,
\u984C: 2368,
\u9928: -689,
"\uFF11": -514,
\uFF25\uFF12: -32768,
"\uFF62": 363,
\uFF72: 241,
\uFF99: 451,
\uFF9D: -343
};
this.UW6__ = {
",": 227,
".": 808,
1: -270,
E1: 306,
"\u3001": 227,
"\u3002": 808,
\u3042: -307,
\u3046: 189,
\u304B: 241,
\u304C: -73,
\u304F: -121,
\u3053: -200,
\u3058: 1782,
\u3059: 383,
\u305F: -428,
\u3063: 573,
\u3066: -1014,
\u3067: 101,
\u3068: -105,
\u306A: -253,
\u306B: -149,
\u306E: -417,
\u306F: -236,
\u3082: -206,
\u308A: 187,
\u308B: -135,
\u3092: 195,
\u30EB: -673,
\u30F3: -496,
\u4E00: -277,
\u4E2D: 201,
\u4EF6: -800,
\u4F1A: 624,
\u524D: 302,
\u533A: 1792,
\u54E1: -1212,
\u59D4: 798,
\u5B66: -960,
\u5E02: 887,
\u5E83: -695,
\u5F8C: 535,
\u696D: -697,
\u76F8: 753,
\u793E: -507,
\u798F: 974,
\u7A7A: -822,
\u8005: 1811,
\u9023: 463,
\u90CE: 1082,
"\uFF11": -270,
\uFF25\uFF11: 306,
\uFF99: -673,
\uFF9D: -496
};
return this;
}
TinySegmenter.prototype.ctype_ = function(str) {
for (var i in this.chartype_) {
if (str.match(this.chartype_[i][0])) {
return this.chartype_[i][1];
}
}
return "O";
};
TinySegmenter.prototype.ts_ = function(v) {
if (v) {
return v;
}
return 0;
};
TinySegmenter.prototype.segment = function(input) {
if (input == null || input == void 0 || input == "") {
return [];
}
var result = [];
var seg = ["B3", "B2", "B1"];
var ctype = ["O", "O", "O"];
var o = input.split("");
for (i = 0; i < o.length; ++i) {
seg.push(o[i]);
ctype.push(this.ctype_(o[i]));
}
seg.push("E1");
seg.push("E2");
seg.push("E3");
ctype.push("O");
ctype.push("O");
ctype.push("O");
var word = seg[3];
var p1 = "U";
var p2 = "U";
var p3 = "U";
for (var i = 4; i < seg.length - 3; ++i) {
var score = this.BIAS__;
var w1 = seg[i - 3];
var w2 = seg[i - 2];
var w3 = seg[i - 1];
var w4 = seg[i];
var w5 = seg[i + 1];
var w6 = seg[i + 2];
var c1 = ctype[i - 3];
var c2 = ctype[i - 2];
var c3 = ctype[i - 1];
var c4 = ctype[i];
var c5 = ctype[i + 1];
var c6 = ctype[i + 2];
score += this.ts_(this.UP1__[p1]);
score += this.ts_(this.UP2__[p2]);
score += this.ts_(this.UP3__[p3]);
score += this.ts_(this.BP1__[p1 + p2]);
score += this.ts_(this.BP2__[p2 + p3]);
score += this.ts_(this.UW1__[w1]);
score += this.ts_(this.UW2__[w2]);
score += this.ts_(this.UW3__[w3]);
score += this.ts_(this.UW4__[w4]);
score += this.ts_(this.UW5__[w5]);
score += this.ts_(this.UW6__[w6]);
score += this.ts_(this.BW1__[w2 + w3]);
score += this.ts_(this.BW2__[w3 + w4]);
score += this.ts_(this.BW3__[w4 + w5]);
score += this.ts_(this.TW1__[w1 + w2 + w3]);
score += this.ts_(this.TW2__[w2 + w3 + w4]);
score += this.ts_(this.TW3__[w3 + w4 + w5]);
score += this.ts_(this.TW4__[w4 + w5 + w6]);
score += this.ts_(this.UC1__[c1]);
score += this.ts_(this.UC2__[c2]);
score += this.ts_(this.UC3__[c3]);
score += this.ts_(this.UC4__[c4]);
score += this.ts_(this.UC5__[c5]);
score += this.ts_(this.UC6__[c6]);
score += this.ts_(this.BC1__[c2 + c3]);
score += this.ts_(this.BC2__[c3 + c4]);
score += this.ts_(this.BC3__[c4 + c5]);
score += this.ts_(this.TC1__[c1 + c2 + c3]);
score += this.ts_(this.TC2__[c2 + c3 + c4]);
score += this.ts_(this.TC3__[c3 + c4 + c5]);
score += this.ts_(this.TC4__[c4 + c5 + c6]);
score += this.ts_(this.UQ1__[p1 + c1]);
score += this.ts_(this.UQ2__[p2 + c2]);
score += this.ts_(this.UQ3__[p3 + c3]);
score += this.ts_(this.BQ1__[p2 + c2 + c3]);
score += this.ts_(this.BQ2__[p2 + c3 + c4]);
score += this.ts_(this.BQ3__[p3 + c2 + c3]);
score += this.ts_(this.BQ4__[p3 + c3 + c4]);
score += this.ts_(this.TQ1__[p2 + c1 + c2 + c3]);
score += this.ts_(this.TQ2__[p2 + c2 + c3 + c4]);
score += this.ts_(this.TQ3__[p3 + c1 + c2 + c3]);
score += this.ts_(this.TQ4__[p3 + c2 + c3 + c4]);
var p = "O";
if (score > 0) {
result.push(word);
word = "";
p = "B";
}
p1 = p2;
p2 = p3;
p3 = p;
word += seg[i];
}
result.push(word);
return result;
};
var tiny_segmenter_default = TinySegmenter;
// src/tokenizer/tokenizers/JapaneseTokenizer.ts
var segmenter = new tiny_segmenter_default();
function pickTokensAsJapanese(content, trimPattern) {
return content.split(trimPattern).filter((x) => x !== "").flatMap((x) => segmenter.segment(x));
}
var JapaneseTokenizer = class {
tokenize(content, raw) {
return pickTokensAsJapanese(content, raw ? / /g : this.getTrimPattern());
}
recursiveTokenize(content) {
const tokens = segmenter.segment(content).flatMap(
(x) => x === " " ? x : x.split(" ").map((t) => t === "" ? " " : t)
);
const ret = [];
for (let i = 0; i < tokens.length; i++) {
if (i === 0 || tokens[i].length !== 1 || !Boolean(tokens[i].match(this.getTrimPattern()))) {
ret.push({
word: tokens.slice(i).join(""),
offset: tokens.slice(0, i).join("").length
});
}
}
return ret;
}
getTrimPattern() {
return TRIM_CHAR_PATTERN;
}
shouldIgnoreOnCurrent(str) {
return Boolean(str.match(/^[ぁ-んa--Z。、ー ]*$/));
}
};
// src/tokenizer/tokenizers/EnglishOnlyTokenizer.ts
var ENGLISH_PATTERN = /[a-zA-Z0-9_\-\\]/;
var EnglishOnlyTokenizer = class extends DefaultTokenizer {
tokenize(content, raw) {
const tokenized = Array.from(this._tokenize(content)).filter(
(x) => x.word.match(ENGLISH_PATTERN)
);
return raw ? tokenized.map((x) => x.word) : tokenized.map((x) => x.word).filter((x) => !x.match(this.getTrimPattern()));
}
recursiveTokenize(content) {
const offsets = Array.from(this._tokenize(content)).filter((x) => !x.word.match(this.getTrimPattern())).map((x) => x.offset);
return [
...offsets.map((i) => ({
word: content.slice(i),
offset: i
}))
];
}
*_tokenize(content) {
let startIndex = 0;
let previousType = "none";
for (let i = 0; i < content.length; i++) {
if (content[i].match(super.getTrimPattern())) {
yield { word: content.slice(startIndex, i), offset: startIndex };
previousType = "trim";
startIndex = i;
continue;
}
if (content[i].match(ENGLISH_PATTERN)) {
if (previousType === "english" || previousType === "none") {
previousType = "english";
continue;
}
yield { word: content.slice(startIndex, i), offset: startIndex };
previousType = "english";
startIndex = i;
continue;
}
if (previousType === "others" || previousType === "none") {
previousType = "others";
continue;
}
yield { word: content.slice(startIndex, i), offset: startIndex };
previousType = "others";
startIndex = i;
}
yield {
word: content.slice(startIndex, content.length),
offset: startIndex
};
}
};
// src/tokenizer/tokenizers/ChineseTokenizer.ts
var import_chinese_tokenizer = __toESM(require_main());
var ChineseTokenizer = class {
static create(dict) {
const ins = new ChineseTokenizer();
ins._tokenize = import_chinese_tokenizer.default.load(dict);
return ins;
}
tokenize(content, raw) {
return content.split(raw ? / /g : this.getTrimPattern()).filter((x) => x !== "").flatMap((x) => this._tokenize(x)).map((x) => x.text);
}
recursiveTokenize(content) {
const tokens = this._tokenize(content).map((x) => x.text);
const ret = [];
for (let i = 0; i < tokens.length; i++) {
if (i === 0 || tokens[i].length !== 1 || !Boolean(tokens[i].match(this.getTrimPattern()))) {
ret.push({
word: tokens.slice(i).join(""),
offset: tokens.slice(0, i).join("").length
});
}
}
return ret;
}
getTrimPattern() {
return TRIM_CHAR_PATTERN;
}
shouldIgnoreOnCurrent(str) {
return false;
}
};
// src/tokenizer/tokenizer.ts
async function createTokenizer(strategy, app) {
switch (strategy.name) {
case "default":
return new DefaultTokenizer();
case "english-only":
return new EnglishOnlyTokenizer();
case "arabic":
return new ArabicTokenizer();
case "japanese":
return new JapaneseTokenizer();
case "chinese":
const hasCedict = await app.vault.adapter.exists("./cedict_ts.u8");
if (!hasCedict) {
return Promise.reject(
new Error("cedict_ts.U8 doesn't exist in your vault root.")
);
}
const dict = await app.vault.adapter.read("./cedict_ts.u8");
return ChineseTokenizer.create(dict);
}
}
// src/tokenizer/TokenizeStrategy.ts
var _TokenizeStrategy = class {
constructor(name, triggerThreshold, indexingThreshold) {
this.name = name;
this.triggerThreshold = triggerThreshold;
this.indexingThreshold = indexingThreshold;
_TokenizeStrategy._values.push(this);
}
static fromName(name) {
return _TokenizeStrategy._values.find((x) => x.name === name);
}
static values() {
return _TokenizeStrategy._values;
}
};
var TokenizeStrategy = _TokenizeStrategy;
TokenizeStrategy._values = [];
TokenizeStrategy.DEFAULT = new _TokenizeStrategy("default", 3, 5);
TokenizeStrategy.ENGLISH_ONLY = new _TokenizeStrategy("english-only", 3, 5);
TokenizeStrategy.JAPANESE = new _TokenizeStrategy("japanese", 2, 2);
TokenizeStrategy.ARABIC = new _TokenizeStrategy("arabic", 3, 3);
TokenizeStrategy.CHINESE = new _TokenizeStrategy("chinese", 1, 2);
// src/app-helper.ts
var import_obsidian = require("obsidian");
var AppHelper = class {
constructor(app) {
this.unsafeApp = app;
}
equalsAsEditorPostion(one, other) {
return one.line === other.line && one.ch === other.ch;
}
getAliases(file) {
var _a, _b;
return (_b = (0, import_obsidian.parseFrontMatterAliases)(
(_a = this.unsafeApp.metadataCache.getFileCache(file)) == null ? void 0 : _a.frontmatter
)) != null ? _b : [];
}
getFrontMatter(file) {
var _a, _b, _c, _d;
const frontMatter = (_a = this.unsafeApp.metadataCache.getFileCache(file)) == null ? void 0 : _a.frontmatter;
if (!frontMatter) {
return void 0;
}
const tags = (_c = (_b = (0, import_obsidian.parseFrontMatterTags)(frontMatter)) == null ? void 0 : _b.map((x) => x.slice(1))) != null ? _c : [];
const aliases = (_d = (0, import_obsidian.parseFrontMatterAliases)(frontMatter)) != null ? _d : [];
const { position, ...rest } = frontMatter;
return {
...Object.fromEntries(
Object.entries(rest).map(([k, _v]) => [
k,
(0, import_obsidian.parseFrontMatterStringArray)(frontMatter, k)
])
),
tags,
tag: tags,
aliases,
alias: aliases
};
}
getMarkdownViewInActiveLeaf() {
if (!this.unsafeApp.workspace.getActiveViewOfType(import_obsidian.MarkdownView)) {
return null;
}
return this.unsafeApp.workspace.activeLeaf.view;
}
getActiveFile() {
return this.unsafeApp.workspace.getActiveFile();
}
isActiveFile(file) {
var _a;
return ((_a = this.getActiveFile()) == null ? void 0 : _a.path) === file.path;
}
getPreviousFile() {
var _a;
const fName = (_a = this.unsafeApp.workspace.getLastOpenFiles()) == null ? void 0 : _a[1];
if (!fName) {
return null;
}
return this.getMarkdownFileByPath(fName);
}
getCurrentDirname() {
var _a, _b;
return (_b = (_a = this.getActiveFile()) == null ? void 0 : _a.parent.path) != null ? _b : null;
}
getCurrentEditor() {
var _a, _b;
return (_b = (_a = this.getMarkdownViewInActiveLeaf()) == null ? void 0 : _a.editor) != null ? _b : null;
}
getSelection() {
var _a;
return (_a = this.getCurrentEditor()) == null ? void 0 : _a.getSelection();
}
getCurrentOffset(editor) {
return editor.posToOffset(editor.getCursor());
}
getCurrentLine(editor) {
return editor.getLine(editor.getCursor().line);
}
getCurrentLineUntilCursor(editor) {
return this.getCurrentLine(editor).slice(0, editor.getCursor().ch);
}
optimizeMarkdownLinkText(linkText) {
const activeFile = this.getActiveFile();
if (!activeFile) {
return null;
}
const path = this.linkText2Path(linkText);
if (!path) {
return linkText;
}
const file = this.getMarkdownFileByPath(path);
if (!file) {
return null;
}
const markdownLink = this.unsafeApp.fileManager.generateMarkdownLink(
file,
activeFile.path
);
return markdownLink.startsWith("[[") ? markdownLink.replace("[[", "").replace("]]", "") : markdownLink.replace("[", "").replace(/\]\(.+\)/g, "");
}
linkText2Path(linkText) {
var _a, _b;
const activeFile = this.getActiveFile();
if (!activeFile) {
return null;
}
return (_b = (_a = this.unsafeApp.metadataCache.getFirstLinkpathDest(
linkText,
activeFile.path
)) == null ? void 0 : _a.path) != null ? _b : null;
}
searchPhantomLinks() {
return Object.entries(this.unsafeApp.metadataCache.unresolvedLinks).flatMap(
([path, obj]) => Object.keys(obj).map((link) => ({ path, link }))
);
}
getMarkdownFileByPath(path) {
if (!path.endsWith(".md")) {
return null;
}
const abstractFile = this.unsafeApp.vault.getAbstractFileByPath(path);
if (!abstractFile) {
return null;
}
return abstractFile;
}
openMarkdownFile(file, newLeaf, offset = 0) {
var _a;
const leaf = this.unsafeApp.workspace.getLeaf(newLeaf);
leaf.openFile(file, (_a = this.unsafeApp.workspace.activeLeaf) == null ? void 0 : _a.getViewState()).then(() => {
this.unsafeApp.workspace.setActiveLeaf(leaf, true, true);
const viewOfType = this.unsafeApp.workspace.getActiveViewOfType(import_obsidian.MarkdownView);
if (viewOfType) {
const editor = viewOfType.editor;
const pos = editor.offsetToPos(offset);
editor.setCursor(pos);
editor.scrollIntoView({ from: pos, to: pos }, true);
}
});
}
getCurrentFrontMatter() {
const editor = this.getCurrentEditor();
if (!editor) {
return null;
}
if (!this.getActiveFile()) {
return null;
}
if (editor.getLine(0) !== "---") {
return null;
}
const endPosition = editor.getValue().indexOf("---", 3);
const currentOffset = this.getCurrentOffset(editor);
if (endPosition !== -1 && currentOffset >= endPosition) {
return null;
}
const keyLocations = Array.from(editor.getValue().matchAll(/.+:/g));
if (keyLocations.length === 0) {
return null;
}
const currentKeyLocation = keyLocations.filter((x) => x.index < currentOffset).last();
if (!currentKeyLocation) {
return null;
}
return currentKeyLocation[0].split(":")[0];
}
isIMEOn() {
var _a, _b, _c;
if (!this.unsafeApp.workspace.getActiveViewOfType(import_obsidian.MarkdownView)) {
return false;
}
const markdownView = this.unsafeApp.workspace.activeLeaf.view;
const cm5or6 = markdownView.editor.cm;
if (((_a = cm5or6 == null ? void 0 : cm5or6.inputState) == null ? void 0 : _a.composing) > 0) {
return true;
}
return !!((_c = (_b = cm5or6 == null ? void 0 : cm5or6.display) == null ? void 0 : _b.input) == null ? void 0 : _c.composing);
}
async writeLog(log) {
await this.unsafeApp.vault.adapter.append((0, import_obsidian.normalizePath)("log.md"), log);
}
get useWikiLinks() {
return !this.unsafeApp.vault.config.useMarkdownLinks;
}
};
// src/provider/CustomDictionaryWordProvider.ts
var import_obsidian2 = require("obsidian");
// src/util/collection-helper.ts
var groupBy = (values, toKey) => values.reduce(
(prev, cur, _1, _2, k = toKey(cur)) => ((prev[k] || (prev[k] = [])).push(cur), prev),
{}
);
function uniq(values) {
return [...new Set(values)];
}
function uniqBy(values, fn) {
const m = /* @__PURE__ */ new Map();
values.forEach((x) => {
const k = fn(x);
if (!m.has(k)) {
m.set(k, x);
}
});
return Array.from(m.values());
}
function uniqWith(arr, fn) {
return arr.filter(
(element2, index) => arr.findIndex((step) => fn(element2, step)) === index
);
}
function mirrorMap(collection, toValue) {
return collection.reduce((p, c) => ({ ...p, [toValue(c)]: toValue(c) }), {});
}
function max(collection, emptyValue) {
const select = (a, b) => a >= b ? a : b;
return collection.reduce(select, emptyValue);
}
// src/model/Word.ts
var _WordTypeMeta = class {
constructor(type, priority, group) {
this.type = type;
this.priority = priority;
this.group = group;
_WordTypeMeta._values.push(this);
_WordTypeMeta._dict[type] = this;
}
static of(type) {
return _WordTypeMeta._dict[type];
}
static values() {
return _WordTypeMeta._values;
}
};
var WordTypeMeta = _WordTypeMeta;
WordTypeMeta._values = [];
WordTypeMeta._dict = {};
WordTypeMeta.FRONT_MATTER = new _WordTypeMeta(
"frontMatter",
100,
"frontMatter"
);
WordTypeMeta.INTERNAL_LINK = new _WordTypeMeta(
"internalLink",
90,
"internalLink"
);
WordTypeMeta.CUSTOM_DICTIONARY = new _WordTypeMeta(
"customDictionary",
80,
"suggestion"
);
WordTypeMeta.CURRENT_FILE = new _WordTypeMeta(
"currentFile",
70,
"suggestion"
);
WordTypeMeta.CURRENT_VAULT = new _WordTypeMeta(
"currentVault",
60,
"suggestion"
);
// src/provider/suggester.ts
function suggestionUniqPredicate(a, b) {
if (a.value !== b.value) {
return false;
}
if (WordTypeMeta.of(a.type).group !== WordTypeMeta.of(b.type).group) {
return false;
}
if (a.type === "internalLink" && !a.phantom && a.createdPath !== b.createdPath) {
return false;
}
return true;
}
function pushWord(wordsByFirstLetter, key, word) {
if (wordsByFirstLetter[key] === void 0) {
wordsByFirstLetter[key] = [word];
return;
}
wordsByFirstLetter[key].push(word);
}
function judge(word, query, queryStartWithUpper) {
var _a;
if (query === "") {
return {
word: {
...word,
hit: word.value
},
value: word.value,
alias: false
};
}
if (lowerStartsWith(word.value, query)) {
if (queryStartWithUpper && word.type !== "internalLink" && word.type !== "frontMatter") {
const c = capitalizeFirstLetter(word.value);
return {
word: {
...word,
value: c,
hit: c
},
value: c,
alias: false
};
} else {
return {
word: {
...word,
hit: word.value
},
value: word.value,
alias: false
};
}
}
const matchedAlias = (_a = word.aliases) == null ? void 0 : _a.find((a) => lowerStartsWith(a, query));
if (matchedAlias) {
return {
word: {
...word,
hit: matchedAlias
},
value: matchedAlias,
alias: true
};
}
return {
word,
alias: false
};
}
function suggestWords(indexedWords, query, maxNum, option = {}) {
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
const { frontMatter, selectionHistoryStorage } = option;
const queryStartWithUpper = capitalizeFirstLetter(query) === query;
const flattenFrontMatterWords = () => {
var _a2, _b2;
if (frontMatter === "alias" || frontMatter === "aliases") {
return [];
}
if (frontMatter && ((_a2 = indexedWords.frontMatter) == null ? void 0 : _a2[frontMatter])) {
return Object.values((_b2 = indexedWords.frontMatter) == null ? void 0 : _b2[frontMatter]).flat();
}
return [];
};
const words = queryStartWithUpper ? frontMatter ? flattenFrontMatterWords() : [
...(_a = indexedWords.currentFile[query.charAt(0)]) != null ? _a : [],
...(_b = indexedWords.currentFile[query.charAt(0).toLowerCase()]) != null ? _b : [],
...(_c = indexedWords.currentVault[query.charAt(0)]) != null ? _c : [],
...(_d = indexedWords.currentVault[query.charAt(0).toLowerCase()]) != null ? _d : [],
...(_e = indexedWords.customDictionary[query.charAt(0)]) != null ? _e : [],
...(_f = indexedWords.customDictionary[query.charAt(0).toLowerCase()]) != null ? _f : [],
...(_g = indexedWords.internalLink[query.charAt(0)]) != null ? _g : [],
...(_h = indexedWords.internalLink[query.charAt(0).toLowerCase()]) != null ? _h : []
] : frontMatter ? flattenFrontMatterWords() : [
...(_i = indexedWords.currentFile[query.charAt(0)]) != null ? _i : [],
...(_j = indexedWords.currentFile[query.charAt(0).toUpperCase()]) != null ? _j : [],
...(_k = indexedWords.currentVault[query.charAt(0)]) != null ? _k : [],
...(_l = indexedWords.currentVault[query.charAt(0).toUpperCase()]) != null ? _l : [],
...(_m = indexedWords.customDictionary[query.charAt(0)]) != null ? _m : [],
...(_n = indexedWords.customDictionary[query.charAt(0).toUpperCase()]) != null ? _n : [],
...(_o = indexedWords.internalLink[query.charAt(0)]) != null ? _o : [],
...(_p = indexedWords.internalLink[query.charAt(0).toUpperCase()]) != null ? _p : []
];
const filteredJudgement = Array.from(words).map((x) => judge(x, query, queryStartWithUpper)).filter((x) => x.value !== void 0);
const latestUpdated = max(
filteredJudgement.map(
(x) => {
var _a2, _b2;
return (_b2 = (_a2 = selectionHistoryStorage == null ? void 0 : selectionHistoryStorage.getSelectionHistory(x.word)) == null ? void 0 : _a2.lastUpdated) != null ? _b2 : 0;
}
),
0
);
const candidate = filteredJudgement.sort((a, b) => {
const aWord = a.word;
const bWord = b.word;
const notSameWordType = aWord.type !== bWord.type;
if (frontMatter && notSameWordType) {
return bWord.type === "frontMatter" ? 1 : -1;
}
if (selectionHistoryStorage) {
const ret = selectionHistoryStorage.compare(
aWord,
bWord,
latestUpdated
);
if (ret !== 0) {
return ret;
}
}
if (a.value.length !== b.value.length) {
return a.value.length > b.value.length ? 1 : -1;
}
if (notSameWordType) {
return WordTypeMeta.of(bWord.type).priority > WordTypeMeta.of(aWord.type).priority ? 1 : -1;
}
if (a.alias !== b.alias) {
return a.alias ? 1 : -1;
}
return 0;
}).map((x) => x.word).slice(0, maxNum);
return uniqWith(candidate, suggestionUniqPredicate);
}
function judgeByPartialMatch(word, query, queryStartWithUpper) {
var _a, _b;
if (query === "") {
return {
word: { ...word, hit: word.value },
value: word.value,
alias: false
};
}
if (lowerStartsWith(word.value, query)) {
if (queryStartWithUpper && word.type !== "internalLink" && word.type !== "frontMatter") {
const c = capitalizeFirstLetter(word.value);
return { word: { ...word, value: c, hit: c }, value: c, alias: false };
} else {
return {
word: { ...word, hit: word.value },
value: word.value,
alias: false
};
}
}
const matchedAliasStarts = (_a = word.aliases) == null ? void 0 : _a.find(
(a) => lowerStartsWith(a, query)
);
if (matchedAliasStarts) {
return {
word: { ...word, hit: matchedAliasStarts },
value: matchedAliasStarts,
alias: true
};
}
if (lowerIncludes(word.value, query)) {
return {
word: { ...word, hit: word.value },
value: word.value,
alias: false
};
}
const matchedAliasIncluded = (_b = word.aliases) == null ? void 0 : _b.find(
(a) => lowerIncludes(a, query)
);
if (matchedAliasIncluded) {
return {
word: { ...word, hit: matchedAliasIncluded },
value: matchedAliasIncluded,
alias: true
};
}
return { word, alias: false };
}
function suggestWordsByPartialMatch(indexedWords, query, maxNum, option = {}) {
const { frontMatter, selectionHistoryStorage } = option;
const queryStartWithUpper = capitalizeFirstLetter(query) === query;
const flatObjectValues = (object) => Object.values(object).flat();
const flattenFrontMatterWords = () => {
var _a, _b;
if (frontMatter === "alias" || frontMatter === "aliases") {
return [];
}
if (frontMatter && ((_a = indexedWords.frontMatter) == null ? void 0 : _a[frontMatter])) {
return Object.values((_b = indexedWords.frontMatter) == null ? void 0 : _b[frontMatter]).flat();
}
return [];
};
const words = frontMatter ? flattenFrontMatterWords() : [
...flatObjectValues(indexedWords.currentFile),
...flatObjectValues(indexedWords.currentVault),
...flatObjectValues(indexedWords.customDictionary),
...flatObjectValues(indexedWords.internalLink)
];
const filteredJudgement = Array.from(words).map((x) => judgeByPartialMatch(x, query, queryStartWithUpper)).filter((x) => x.value !== void 0);
const latestUpdated = max(
filteredJudgement.map(
(x) => {
var _a, _b;
return (_b = (_a = selectionHistoryStorage == null ? void 0 : selectionHistoryStorage.getSelectionHistory(x.word)) == null ? void 0 : _a.lastUpdated) != null ? _b : 0;
}
),
0
);
const candidate = filteredJudgement.sort((a, b) => {
const aWord = a.word;
const bWord = b.word;
const notSameWordType = aWord.type !== bWord.type;
if (frontMatter && notSameWordType) {
return bWord.type === "frontMatter" ? 1 : -1;
}
if (selectionHistoryStorage) {
const ret = selectionHistoryStorage.compare(
aWord,
bWord,
latestUpdated
);
if (ret !== 0) {
return ret;
}
}
const as = lowerStartsWith(a.value, query);
const bs = lowerStartsWith(b.value, query);
if (as !== bs) {
return bs ? 1 : -1;
}
if (a.value.length !== b.value.length) {
return a.value.length > b.value.length ? 1 : -1;
}
if (notSameWordType) {
return WordTypeMeta.of(bWord.type).priority > WordTypeMeta.of(aWord.type).priority ? 1 : -1;
}
if (a.alias !== b.alias) {
return a.alias ? 1 : -1;
}
return 0;
}).map((x) => x.word).slice(0, maxNum);
return uniqWith(candidate, suggestionUniqPredicate);
}
// src/util/path.ts
function basename(path, ext) {
var _a, _b;
const name = (_b = (_a = path.match(/.+[\\/]([^\\/]+)[\\/]?$/)) == null ? void 0 : _a[1]) != null ? _b : path;
return ext && name.endsWith(ext) ? name.replace(ext, "") : name;
}
function dirname(path) {
var _a, _b;
return (_b = (_a = path.match(/(.+)[\\/].+$/)) == null ? void 0 : _a[1]) != null ? _b : ".";
}
function isURL(path) {
return Boolean(path.match(new RegExp("^https?://")));
}
// src/provider/CustomDictionaryWordProvider.ts
function escape(value) {
return value.replace(/\\/g, "__VariousComplementsEscape__").replace(/\n/g, "\\n").replace(/\t/g, "\\t").replace(/__VariousComplementsEscape__/g, "\\\\");
}
function unescape(value) {
return value.replace(/\\\\/g, "__VariousComplementsEscape__").replace(/\\n/g, "\n").replace(/\\t/g, " ").replace(/__VariousComplementsEscape__/g, "\\");
}
function jsonToWords(json, path, systemCaretSymbol) {
return json.words.map((x) => {
var _a;
return {
value: x.displayed || x.value,
description: x.description,
aliases: x.aliases,
type: "customDictionary",
createdPath: path,
insertedText: x.displayed ? x.value : void 0,
caretSymbol: (_a = json.caretSymbol) != null ? _a : systemCaretSymbol,
ignoreSpaceAfterCompletion: json.ignoreSpaceAfterCompletion
};
});
}
function lineToWord(line, delimiter, path, delimiterForDisplay, delimiterForHide, systemCaretSymbol) {
const [v, description, ...aliases] = line.split(delimiter.value);
let value = unescape(v);
let insertedText;
let displayedText = value;
if (delimiterForDisplay && value.includes(delimiterForDisplay)) {
[displayedText, insertedText] = value.split(delimiterForDisplay);
}
if (delimiterForHide && value.includes(delimiterForHide)) {
insertedText = value.replace(delimiterForHide, "");
displayedText = `${value.split(delimiterForHide)[0]} ...`;
}
return {
value: displayedText,
description,
aliases,
type: "customDictionary",
createdPath: path,
insertedText,
caretSymbol: systemCaretSymbol
};
}
function wordToLine(word, delimiter, dividerForDisplay) {
const value = word.insertedText && dividerForDisplay ? `${word.value}${dividerForDisplay}${word.insertedText}` : word.value;
const escapedValue = escape(value);
if (!word.description && !word.aliases) {
return escapedValue;
}
if (!word.aliases) {
return [escapedValue, word.description].join(delimiter.value);
}
return [escapedValue, word.description, ...word.aliases].join(
delimiter.value
);
}
function synonymAliases(name) {
const lessEmojiValue = excludeEmoji(name);
return name === lessEmojiValue ? [] : [lessEmojiValue];
}
var CustomDictionaryWordProvider = class {
constructor(app, appHelper) {
this.words = [];
this.wordByValue = {};
this.wordsByFirstLetter = {};
this.appHelper = appHelper;
this.fileSystemAdapter = app.vault.adapter;
}
get editablePaths() {
return this.paths.filter((x) => !isURL(x) && !x.endsWith(".json"));
}
async loadWords(path, option) {
const contents = isURL(path) ? await (0, import_obsidian2.request)({ url: path }) : await this.fileSystemAdapter.read(path);
const words = path.endsWith(".json") ? jsonToWords(JSON.parse(contents), path, option.caretSymbol) : contents.split(/\r\n|\n/).map((x) => x.replace(/%%.*%%/g, "")).filter((x) => x).map(
(x) => lineToWord(
x,
this.delimiter,
path,
option.delimiterForDisplay,
option.delimiterForHide,
option.caretSymbol
)
);
return words.filter(
(x) => !option.regexp || x.value.match(new RegExp(option.regexp))
);
}
async refreshCustomWords(option) {
this.clearWords();
for (const path of this.paths) {
try {
const words = await this.loadWords(path, option);
words.forEach((x) => this.addWord(x));
} catch (e) {
new import_obsidian2.Notice(
`\u26A0 Fail to load ${path} -- Various Complements Plugin --
${e}`,
0
);
}
}
}
async addWordWithDictionary(word, dictionaryPath) {
this.addWord(word);
await this.fileSystemAdapter.append(
dictionaryPath,
"\n" + wordToLine(word, this.delimiter, this.dividerForDisplay)
);
}
addWord(word) {
var _a, _b;
this.words.push(word);
const wordWithSynonym = {
...word,
aliases: [...(_a = word.aliases) != null ? _a : [], ...synonymAliases(word.value)]
};
this.wordByValue[wordWithSynonym.value] = wordWithSynonym;
pushWord(
this.wordsByFirstLetter,
wordWithSynonym.value.charAt(0),
wordWithSynonym
);
(_b = wordWithSynonym.aliases) == null ? void 0 : _b.forEach(
(a) => pushWord(this.wordsByFirstLetter, a.charAt(0), wordWithSynonym)
);
}
clearWords() {
this.words = [];
this.wordByValue = {};
this.wordsByFirstLetter = {};
}
get wordCount() {
return this.words.length;
}
setSettings(paths, delimiter, dividerForDisplay) {
this.paths = paths;
this.delimiter = delimiter;
this.dividerForDisplay = dividerForDisplay;
}
};
// src/provider/CurrentFileWordProvider.ts
var CurrentFileWordProvider = class {
constructor(app, appHelper) {
this.app = app;
this.appHelper = appHelper;
this.wordsByFirstLetter = {};
this.words = [];
}
async refreshWords(onlyEnglish, minNumberOfCharacters) {
this.clearWords();
const editor = this.appHelper.getCurrentEditor();
if (!editor) {
return;
}
const file = this.app.workspace.getActiveFile();
if (!file) {
return;
}
const currentToken = this.tokenizer.tokenize(
editor.getLine(editor.getCursor().line).slice(0, editor.getCursor().ch)
).last();
const content = await this.app.vault.cachedRead(file);
const tokens = this.tokenizer.tokenize(content).filter((x) => {
if (x.length < minNumberOfCharacters) {
return false;
}
if (this.tokenizer.shouldIgnoreOnCurrent(x)) {
return false;
}
return onlyEnglish ? allAlphabets(x) : true;
}).map((x) => startsSmallLetterOnlyFirst(x) ? x.toLowerCase() : x);
this.words = uniq(tokens).filter((x) => x !== currentToken).map((x) => ({
value: x,
type: "currentFile",
createdPath: file.path
}));
this.wordsByFirstLetter = groupBy(this.words, (x) => x.value.charAt(0));
}
clearWords() {
this.words = [];
this.wordsByFirstLetter = {};
}
get wordCount() {
return this.words.length;
}
setSettings(tokenizer) {
this.tokenizer = tokenizer;
}
};
// src/provider/InternalLinkWordProvider.ts
var InternalLinkWordProvider = class {
constructor(app, appHelper) {
this.app = app;
this.appHelper = appHelper;
this.words = [];
this.wordsByFirstLetter = {};
}
refreshWords(wordAsInternalLinkAlias, excludePathPrefixPatterns) {
var _a;
this.clearWords();
const synonymAliases3 = (name) => {
const lessEmojiValue = excludeEmoji(name);
return name === lessEmojiValue ? [] : [lessEmojiValue];
};
const resolvedInternalLinkWords = this.app.vault.getMarkdownFiles().filter(
(f) => excludePathPrefixPatterns.every((x) => !f.path.startsWith(x))
).flatMap((x) => {
const aliases = this.appHelper.getAliases(x);
if (wordAsInternalLinkAlias) {
return [
{
value: x.basename,
type: "internalLink",
createdPath: x.path,
aliases: synonymAliases3(x.basename),
description: x.path
},
...aliases.map((a) => ({
value: a,
type: "internalLink",
createdPath: x.path,
aliases: synonymAliases3(a),
description: x.path,
aliasMeta: {
origin: x.path
}
}))
];
} else {
return [
{
value: x.basename,
type: "internalLink",
createdPath: x.path,
aliases: [
...synonymAliases3(x.basename),
...aliases,
...aliases.flatMap(synonymAliases3)
],
description: x.path
}
];
}
});
const unresolvedInternalLinkWords = this.appHelper.searchPhantomLinks().map(({ path, link }) => {
return {
value: link,
type: "internalLink",
createdPath: path,
aliases: synonymAliases3(link),
description: `Appeared in -> ${path}`,
phantom: true
};
});
this.words = [...resolvedInternalLinkWords, ...unresolvedInternalLinkWords];
for (const word of this.words) {
pushWord(this.wordsByFirstLetter, word.value.charAt(0), word);
(_a = word.aliases) == null ? void 0 : _a.forEach(
(a) => pushWord(this.wordsByFirstLetter, a.charAt(0), word)
);
}
}
clearWords() {
this.words = [];
this.wordsByFirstLetter = {};
}
get wordCount() {
return this.words.length;
}
};
// src/provider/MatchStrategy.ts
var _MatchStrategy = class {
constructor(name, handler) {
this.name = name;
this.handler = handler;
_MatchStrategy._values.push(this);
}
static fromName(name) {
return _MatchStrategy._values.find((x) => x.name === name);
}
static values() {
return _MatchStrategy._values;
}
};
var MatchStrategy = _MatchStrategy;
MatchStrategy._values = [];
MatchStrategy.PREFIX = new _MatchStrategy("prefix", suggestWords);
MatchStrategy.PARTIAL = new _MatchStrategy(
"partial",
suggestWordsByPartialMatch
);
// src/option/CycleThroughSuggestionsKeys.ts
var _CycleThroughSuggestionsKeys = class {
constructor(name, nextKey, previousKey) {
this.name = name;
this.nextKey = nextKey;
this.previousKey = previousKey;
_CycleThroughSuggestionsKeys._values.push(this);
}
static fromName(name) {
return _CycleThroughSuggestionsKeys._values.find((x) => x.name === name);
}
static values() {
return _CycleThroughSuggestionsKeys._values;
}
};
var CycleThroughSuggestionsKeys = _CycleThroughSuggestionsKeys;
CycleThroughSuggestionsKeys._values = [];
CycleThroughSuggestionsKeys.NONE = new _CycleThroughSuggestionsKeys(
"None",
{ modifiers: [], key: null },
{ modifiers: [], key: null }
);
CycleThroughSuggestionsKeys.TAB = new _CycleThroughSuggestionsKeys(
"Tab, Shift+Tab",
{ modifiers: [], key: "Tab" },
{ modifiers: ["Shift"], key: "Tab" }
);
CycleThroughSuggestionsKeys.EMACS = new _CycleThroughSuggestionsKeys(
"Ctrl/Cmd+N, Ctrl/Cmd+P",
{ modifiers: ["Mod"], key: "N" },
{ modifiers: ["Mod"], key: "P" }
);
CycleThroughSuggestionsKeys.VIM = new _CycleThroughSuggestionsKeys(
"Ctrl/Cmd+J, Ctrl/Cmd+K",
{ modifiers: ["Mod"], key: "J" },
{ modifiers: ["Mod"], key: "K" }
);
// src/option/ColumnDelimiter.ts
var _ColumnDelimiter = class {
constructor(name, value) {
this.name = name;
this.value = value;
_ColumnDelimiter._values.push(this);
}
static fromName(name) {
return _ColumnDelimiter._values.find((x) => x.name === name);
}
static values() {
return _ColumnDelimiter._values;
}
};
var ColumnDelimiter = _ColumnDelimiter;
ColumnDelimiter._values = [];
ColumnDelimiter.TAB = new _ColumnDelimiter("Tab", " ");
ColumnDelimiter.COMMA = new _ColumnDelimiter("Comma", ",");
ColumnDelimiter.PIPE = new _ColumnDelimiter("Pipe", "|");
// src/option/SelectSuggestionKey.ts
var _SelectSuggestionKey = class {
constructor(name, keyBind) {
this.name = name;
this.keyBind = keyBind;
_SelectSuggestionKey._values.push(this);
}
static fromName(name) {
return _SelectSuggestionKey._values.find((x) => x.name === name);
}
static values() {
return _SelectSuggestionKey._values;
}
};
var SelectSuggestionKey = _SelectSuggestionKey;
SelectSuggestionKey._values = [];
SelectSuggestionKey.ENTER = new _SelectSuggestionKey("Enter", {
modifiers: [],
key: "Enter"
});
SelectSuggestionKey.TAB = new _SelectSuggestionKey("Tab", {
modifiers: [],
key: "Tab"
});
SelectSuggestionKey.MOD_ENTER = new _SelectSuggestionKey("Ctrl/Cmd+Enter", {
modifiers: ["Mod"],
key: "Enter"
});
SelectSuggestionKey.ALT_ENTER = new _SelectSuggestionKey("Alt+Enter", {
modifiers: ["Alt"],
key: "Enter"
});
SelectSuggestionKey.SHIFT_ENTER = new _SelectSuggestionKey("Shift+Enter", {
modifiers: ["Shift"],
key: "Enter"
});
SelectSuggestionKey.SPACE = new _SelectSuggestionKey("Space", {
modifiers: [],
key: " "
});
SelectSuggestionKey.SHIFT_SPACE = new _SelectSuggestionKey("Shift+Space", {
modifiers: ["Shift"],
key: " "
});
SelectSuggestionKey.BACKQUOTE = new _SelectSuggestionKey("Backquote", {
modifiers: [],
key: "`"
});
SelectSuggestionKey.None = new _SelectSuggestionKey("None", {
modifiers: [],
key: ""
});
// src/provider/CurrentVaultWordProvider.ts
var CurrentVaultWordProvider = class {
constructor(app, appHelper) {
this.app = app;
this.appHelper = appHelper;
this.wordsByFirstLetter = {};
this.words = [];
}
async refreshWords(minNumberOfCharacters) {
this.clearWords();
const currentDirname = this.appHelper.getCurrentDirname();
const markdownFilePaths = this.app.vault.getMarkdownFiles().map((x) => x.path).filter((p) => this.includePrefixPatterns.every((x) => p.startsWith(x))).filter((p) => this.excludePrefixPatterns.every((x) => !p.startsWith(x))).filter(
(p) => !this.onlyUnderCurrentDirectory || dirname(p) === currentDirname
);
let wordByValue = {};
for (const path of markdownFilePaths) {
const content = await this.app.vault.adapter.read(path);
const tokens = this.tokenizer.tokenize(content).filter(
(x) => x.length >= minNumberOfCharacters && !this.tokenizer.shouldIgnoreOnCurrent(x)
).map((x) => startsSmallLetterOnlyFirst(x) ? x.toLowerCase() : x);
for (const token of tokens) {
wordByValue[token] = {
value: token,
type: "currentVault",
createdPath: path,
description: path
};
}
}
this.words = Object.values(wordByValue);
this.wordsByFirstLetter = groupBy(this.words, (x) => x.value.charAt(0));
}
clearWords() {
this.words = [];
this.wordsByFirstLetter = {};
}
get wordCount() {
return this.words.length;
}
setSettings(tokenizer, includePrefixPatterns, excludePrefixPatterns, onlyUnderCurrentDirectory) {
this.tokenizer = tokenizer;
this.includePrefixPatterns = includePrefixPatterns;
this.excludePrefixPatterns = excludePrefixPatterns;
this.onlyUnderCurrentDirectory = onlyUnderCurrentDirectory;
}
};
// src/option/OpenSourceFileKeys.ts
var _OpenSourceFileKeys = class {
constructor(name, keyBind) {
this.name = name;
this.keyBind = keyBind;
_OpenSourceFileKeys._values.push(this);
}
static fromName(name) {
return _OpenSourceFileKeys._values.find((x) => x.name === name);
}
static values() {
return _OpenSourceFileKeys._values;
}
};
var OpenSourceFileKeys = _OpenSourceFileKeys;
OpenSourceFileKeys._values = [];
OpenSourceFileKeys.NONE = new _OpenSourceFileKeys("None", {
modifiers: [],
key: null
});
OpenSourceFileKeys.MOD_ENTER = new _OpenSourceFileKeys("Ctrl/Cmd+Enter", {
modifiers: ["Mod"],
key: "Enter"
});
OpenSourceFileKeys.ALT_ENTER = new _OpenSourceFileKeys("Alt+Enter", {
modifiers: ["Alt"],
key: "Enter"
});
OpenSourceFileKeys.SHIFT_ENTER = new _OpenSourceFileKeys("Shift+Enter", {
modifiers: ["Shift"],
key: "Enter"
});
// src/option/DescriptionOnSuggestion.ts
var _DescriptionOnSuggestion = class {
constructor(name, toDisplay) {
this.name = name;
this.toDisplay = toDisplay;
_DescriptionOnSuggestion._values.push(this);
}
static fromName(name) {
return _DescriptionOnSuggestion._values.find((x) => x.name === name);
}
static values() {
return _DescriptionOnSuggestion._values;
}
};
var DescriptionOnSuggestion = _DescriptionOnSuggestion;
DescriptionOnSuggestion._values = [];
DescriptionOnSuggestion.NONE = new _DescriptionOnSuggestion("None", () => null);
DescriptionOnSuggestion.SHORT = new _DescriptionOnSuggestion("Short", (word) => {
if (!word.description) {
return null;
}
return word.type === "customDictionary" ? word.description : basename(word.description);
});
DescriptionOnSuggestion.FULL = new _DescriptionOnSuggestion(
"Full",
(word) => {
var _a;
return (_a = word.description) != null ? _a : null;
}
);
// src/provider/FrontMatterWordProvider.ts
function synonymAliases2(name) {
const lessEmojiValue = excludeEmoji(name);
return name === lessEmojiValue ? [] : [lessEmojiValue];
}
function frontMatterToWords(file, key, values) {
return values.map((x) => ({
key,
value: x,
type: "frontMatter",
createdPath: file.path,
aliases: synonymAliases2(x)
}));
}
function pickWords(file, fm) {
return Object.entries(fm).filter(
([_key, value]) => value != null && (typeof value === "string" || typeof value[0] === "string")
).flatMap(([key, value]) => frontMatterToWords(file, key, value));
}
function extractAndUniqWords(wordsByCreatedPath) {
return uniqBy(
Object.values(wordsByCreatedPath).flat(),
(w) => w.key + w.value.toLowerCase()
);
}
function indexingWords(words) {
const wordsByKey = groupBy(words, (x) => x.key);
return Object.fromEntries(
Object.entries(wordsByKey).map(
([key, words2]) => [
key,
groupBy(words2, (w) => w.value.charAt(0))
]
)
);
}
var FrontMatterWordProvider = class {
constructor(app, appHelper) {
this.app = app;
this.appHelper = appHelper;
this.wordsByCreatedPath = {};
}
refreshWords() {
this.clearWords();
this.app.vault.getMarkdownFiles().forEach((f) => {
const fm = this.appHelper.getFrontMatter(f);
if (!fm) {
return;
}
this.wordsByCreatedPath[f.path] = pickWords(f, fm);
});
this.words = extractAndUniqWords(this.wordsByCreatedPath);
this.wordsByFirstLetterByKey = indexingWords(this.words);
}
updateWordIndex(file) {
const fm = this.appHelper.getFrontMatter(file);
if (!fm) {
return;
}
this.wordsByCreatedPath[file.path] = pickWords(file, fm);
}
updateWords() {
this.words = extractAndUniqWords(this.wordsByCreatedPath);
this.wordsByFirstLetterByKey = indexingWords(this.words);
}
clearWords() {
this.wordsByCreatedPath = {};
this.words = [];
this.wordsByFirstLetterByKey = {};
}
get wordCount() {
return this.words.length;
}
};
// src/provider/SpecificMatchStrategy.ts
var neverUsedHandler = (..._args) => [];
var _SpecificMatchStrategy = class {
constructor(name, handler) {
this.name = name;
this.handler = handler;
_SpecificMatchStrategy._values.push(this);
}
static fromName(name) {
return _SpecificMatchStrategy._values.find((x) => x.name === name);
}
static values() {
return _SpecificMatchStrategy._values;
}
};
var SpecificMatchStrategy = _SpecificMatchStrategy;
SpecificMatchStrategy._values = [];
SpecificMatchStrategy.INHERIT = new _SpecificMatchStrategy(
"inherit",
neverUsedHandler
);
SpecificMatchStrategy.PREFIX = new _SpecificMatchStrategy("prefix", suggestWords);
SpecificMatchStrategy.PARTIAL = new _SpecificMatchStrategy(
"partial",
suggestWordsByPartialMatch
);
// src/storage/SelectionHistoryStorage.ts
var SEC = 1e3;
var MIN = SEC * 60;
var HOUR = MIN * 60;
var DAY = HOUR * 24;
var WEEK = DAY * 7;
function calcScore(history, latestUpdated) {
if (!history) {
return 0;
}
if (history.lastUpdated === latestUpdated) {
return Number.MAX_SAFE_INTEGER;
}
const behind = Date.now() - history.lastUpdated;
if (behind < MIN) {
return 8 * history.count;
} else if (behind < HOUR) {
return 4 * history.count;
} else if (behind < DAY) {
return 2 * history.count;
} else if (behind < WEEK) {
return 0.5 * history.count;
} else {
return 0.25 * history.count;
}
}
var SelectionHistoryStorage = class {
constructor(data = {}, maxDaysToKeepHistory, maxNumberOfHistoryToKeep) {
this.data = data;
const now = Date.now();
this.version = now;
this.persistedVersion = now;
this.maxDaysToKeepHistory = maxDaysToKeepHistory;
this.maxNumberOfHistoryToKeep = maxNumberOfHistoryToKeep;
}
purge() {
var _a;
const now = Date.now();
const times = [];
for (const hit of Object.keys(this.data)) {
for (const value of Object.keys(this.data[hit])) {
for (const kind of Object.keys(this.data[hit][value])) {
if (this.maxDaysToKeepHistory && now - this.data[hit][value][kind].lastUpdated > this.maxDaysToKeepHistory * DAY) {
delete this.data[hit][value][kind];
} else {
times.push(this.data[hit][value][kind].lastUpdated);
}
}
if (Object.isEmpty(this.data[hit][value])) {
delete this.data[hit][value];
}
}
if (Object.isEmpty(this.data[hit])) {
delete this.data[hit];
}
}
if (this.maxNumberOfHistoryToKeep) {
const threshold = (_a = times.sort((a, b) => a > b ? -1 : 1).slice(0, this.maxNumberOfHistoryToKeep).at(-1)) != null ? _a : 0;
for (const hit of Object.keys(this.data)) {
for (const value of Object.keys(this.data[hit])) {
for (const kind of Object.keys(this.data[hit][value])) {
if (this.data[hit][value][kind].lastUpdated < threshold) {
delete this.data[hit][value][kind];
}
}
if (Object.isEmpty(this.data[hit][value])) {
delete this.data[hit][value];
}
}
if (Object.isEmpty(this.data[hit])) {
delete this.data[hit];
}
}
}
}
getSelectionHistory(word) {
var _a, _b;
return (_b = (_a = this.data[word.hit]) == null ? void 0 : _a[word.value]) == null ? void 0 : _b[word.type];
}
increment(word) {
if (!this.data[word.hit]) {
this.data[word.hit] = {};
}
if (!this.data[word.hit][word.value]) {
this.data[word.hit][word.value] = {};
}
if (this.data[word.hit][word.value][word.type]) {
this.data[word.hit][word.value][word.type] = {
count: this.data[word.hit][word.value][word.type].count + 1,
lastUpdated: Date.now()
};
} else {
this.data[word.hit][word.value][word.type] = {
count: 1,
lastUpdated: Date.now()
};
}
this.version = Date.now();
}
compare(w1, w2, latestUpdated) {
const score1 = calcScore(this.getSelectionHistory(w1), latestUpdated);
const score2 = calcScore(this.getSelectionHistory(w2), latestUpdated);
if (score1 === score2) {
return 0;
}
return score1 > score2 ? -1 : 1;
}
get shouldPersist() {
return this.version > this.persistedVersion;
}
syncPersistVersion() {
this.persistedVersion = this.version;
}
};
// src/ui/AutoCompleteSuggest.ts
function buildLogMessage(message, msec) {
return `${message}: ${Math.round(msec)}[ms]`;
}
var AutoCompleteSuggest = class extends import_obsidian3.EditorSuggest {
constructor(app, statusBar) {
super(app);
this.previousCurrentLine = "";
this.keymapEventHandler = [];
this.appHelper = new AppHelper(app);
this.statusBar = statusBar;
}
triggerComplete() {
const editor = this.appHelper.getCurrentEditor();
const activeFile = this.app.workspace.getActiveFile();
if (!editor || !activeFile) {
return;
}
this.runManually = true;
this.trigger(editor, activeFile, true);
}
hideCompletion() {
this.close();
}
static async new(app, settings, statusBar, onPersistSelectionHistory) {
const ins = new AutoCompleteSuggest(app, statusBar);
ins.currentFileWordProvider = new CurrentFileWordProvider(
ins.app,
ins.appHelper
);
ins.currentVaultWordProvider = new CurrentVaultWordProvider(
ins.app,
ins.appHelper
);
ins.customDictionaryWordProvider = new CustomDictionaryWordProvider(
ins.app,
ins.appHelper
);
ins.internalLinkWordProvider = new InternalLinkWordProvider(
ins.app,
ins.appHelper
);
ins.frontMatterWordProvider = new FrontMatterWordProvider(
ins.app,
ins.appHelper
);
ins.selectionHistoryStorage = new SelectionHistoryStorage(
settings.selectionHistoryTree,
settings.intelligentSuggestionPrioritization.maxDaysToKeepHistory,
settings.intelligentSuggestionPrioritization.maxNumberOfHistoryToKeep
);
ins.selectionHistoryStorage.purge();
await ins.updateSettings(settings);
ins.modifyEventRef = app.vault.on("modify", async (_) => {
var _a;
await ins.refreshCurrentFileTokens();
if ((_a = ins.selectionHistoryStorage) == null ? void 0 : _a.shouldPersist) {
ins.settings.selectionHistoryTree = ins.selectionHistoryStorage.data;
ins.selectionHistoryStorage.syncPersistVersion();
onPersistSelectionHistory();
}
});
ins.activeLeafChangeRef = app.workspace.on(
"active-leaf-change",
async (_) => {
await ins.refreshCurrentFileTokens();
ins.refreshInternalLinkTokens();
ins.updateFrontMatterToken();
}
);
ins.metadataCacheChangeRef = app.metadataCache.on("changed", (f) => {
ins.updateFrontMatterTokenIndex(f);
if (!ins.appHelper.isActiveFile(f)) {
ins.updateFrontMatterToken();
}
});
const cacheResolvedRef = app.metadataCache.on("resolved", async () => {
ins.refreshInternalLinkTokens();
ins.refreshFrontMatterTokens();
ins.refreshCustomDictionaryTokens();
ins.refreshCurrentVaultTokens();
ins.app.metadataCache.offref(cacheResolvedRef);
});
return ins;
}
predictableComplete() {
const editor = this.appHelper.getCurrentEditor();
if (!editor) {
return;
}
const cursor = editor.getCursor();
const currentToken = this.tokenizer.tokenize(editor.getLine(cursor.line).slice(0, cursor.ch)).last();
if (!currentToken) {
return;
}
let suggestion = this.tokenizer.tokenize(
editor.getRange({ line: Math.max(cursor.line - 50, 0), ch: 0 }, cursor)
).reverse().slice(1).find((x) => x.startsWith(currentToken));
if (!suggestion) {
suggestion = this.tokenizer.tokenize(
editor.getRange(cursor, {
line: Math.min(cursor.line + 50, editor.lineCount() - 1),
ch: 0
})
).find((x) => x.startsWith(currentToken));
}
if (!suggestion) {
return;
}
editor.replaceRange(
suggestion,
{ line: cursor.line, ch: cursor.ch - currentToken.length },
{ line: cursor.line, ch: cursor.ch }
);
this.close();
this.debounceClose();
}
unregister() {
this.app.vault.offref(this.modifyEventRef);
this.app.workspace.offref(this.activeLeafChangeRef);
this.app.metadataCache.offref(this.metadataCacheChangeRef);
}
get tokenizerStrategy() {
return TokenizeStrategy.fromName(this.settings.strategy);
}
get matchStrategy() {
return MatchStrategy.fromName(this.settings.matchStrategy);
}
get frontMatterComplementStrategy() {
return SpecificMatchStrategy.fromName(
this.settings.frontMatterComplementMatchStrategy
);
}
get minNumberTriggered() {
return this.settings.minNumberOfCharactersTriggered || this.tokenizerStrategy.triggerThreshold;
}
get currentFileMinNumberOfCharacters() {
return this.settings.currentFileMinNumberOfCharacters || this.tokenizerStrategy.indexingThreshold;
}
get currentVaultMinNumberOfCharacters() {
return this.settings.currentVaultMinNumberOfCharacters || this.tokenizerStrategy.indexingThreshold;
}
get descriptionOnSuggestion() {
return DescriptionOnSuggestion.fromName(
this.settings.descriptionOnSuggestion
);
}
get excludeInternalLinkPrefixPathPatterns() {
return this.settings.excludeInternalLinkPathPrefixPatterns.split("\n").filter((x) => x);
}
get indexedWords() {
return {
currentFile: this.currentFileWordProvider.wordsByFirstLetter,
currentVault: this.currentVaultWordProvider.wordsByFirstLetter,
customDictionary: this.customDictionaryWordProvider.wordsByFirstLetter,
internalLink: this.internalLinkWordProvider.wordsByFirstLetter,
frontMatter: this.frontMatterWordProvider.wordsByFirstLetterByKey
};
}
async updateSettings(settings) {
this.settings = settings;
this.statusBar.setMatchStrategy(this.matchStrategy);
this.statusBar.setComplementAutomatically(
this.settings.complementAutomatically
);
try {
this.tokenizer = await createTokenizer(this.tokenizerStrategy, this.app);
} catch (e) {
new import_obsidian3.Notice(e.message, 0);
}
this.currentFileWordProvider.setSettings(this.tokenizer);
this.currentVaultWordProvider.setSettings(
this.tokenizer,
settings.includeCurrentVaultPathPrefixPatterns.split("\n").filter((x) => x),
settings.excludeCurrentVaultPathPrefixPatterns.split("\n").filter((x) => x),
settings.includeCurrentVaultOnlyFilesUnderCurrentDirectory
);
this.customDictionaryWordProvider.setSettings(
settings.customDictionaryPaths.split("\n").filter((x) => x),
ColumnDelimiter.fromName(settings.columnDelimiter),
settings.delimiterToDivideSuggestionsForDisplayFromInsertion || null
);
this.debounceGetSuggestions = (0, import_obsidian3.debounce)(
(context, cb) => {
const start = performance.now();
this.showDebugLog(() => `[context.query]: ${context.query}`);
const parsedQuery = JSON.parse(context.query);
const words = parsedQuery.queries.filter(
(x, i, xs) => parsedQuery.currentFrontMatter || this.settings.minNumberOfWordsTriggeredPhrase + i - 1 < xs.length && x.word.length >= this.minNumberTriggered && !x.word.endsWith(" ")
).map((q) => {
const handler = parsedQuery.currentFrontMatter && this.frontMatterComplementStrategy !== SpecificMatchStrategy.INHERIT ? this.frontMatterComplementStrategy.handler : this.matchStrategy.handler;
return handler(
this.indexedWords,
q.word,
this.settings.maxNumberOfSuggestions,
{
frontMatter: parsedQuery.currentFrontMatter,
selectionHistoryStorage: this.selectionHistoryStorage
}
).map((word) => ({ ...word, offset: q.offset }));
}).flat();
cb(
uniqWith(words, suggestionUniqPredicate).slice(
0,
this.settings.maxNumberOfSuggestions
)
);
this.showDebugLog(
() => buildLogMessage("Get suggestions", performance.now() - start)
);
},
this.settings.delayMilliSeconds,
true
);
this.debounceClose = (0, import_obsidian3.debounce)(() => {
this.close();
}, this.settings.delayMilliSeconds + 50);
this.registerKeymaps();
}
registerKeymaps() {
const registerKeyAsIgnored = (modifiers, key) => {
this.keymapEventHandler.push(
this.scope.register(modifiers, key, () => {
this.close();
return true;
})
);
};
this.keymapEventHandler.forEach((x) => this.scope.unregister(x));
this.keymapEventHandler = [];
this.scope.unregister(this.scope.keys.find((x) => x.key === "Enter"));
this.scope.unregister(this.scope.keys.find((x) => x.key === "ArrowUp"));
this.scope.unregister(this.scope.keys.find((x) => x.key === "ArrowDown"));
const selectSuggestionKey = SelectSuggestionKey.fromName(
this.settings.selectSuggestionKeys
);
if (selectSuggestionKey !== SelectSuggestionKey.ENTER) {
registerKeyAsIgnored(
SelectSuggestionKey.ENTER.keyBind.modifiers,
SelectSuggestionKey.ENTER.keyBind.key
);
}
if (selectSuggestionKey !== SelectSuggestionKey.TAB) {
registerKeyAsIgnored(
SelectSuggestionKey.TAB.keyBind.modifiers,
SelectSuggestionKey.TAB.keyBind.key
);
}
if (selectSuggestionKey !== SelectSuggestionKey.None) {
this.keymapEventHandler.push(
this.scope.register(
selectSuggestionKey.keyBind.modifiers,
selectSuggestionKey.keyBind.key,
() => {
this.suggestions.useSelectedItem({});
return false;
}
)
);
}
this.scope.keys.find((x) => x.key === "Escape").func = () => {
this.close();
return this.settings.propagateEsc;
};
const selectNext = (evt) => {
this.suggestions.setSelectedItem(this.suggestions.selectedItem + 1, evt);
return false;
};
const selectPrevious = (evt) => {
this.suggestions.setSelectedItem(this.suggestions.selectedItem - 1, evt);
return false;
};
const cycleThroughSuggestionsKeys = CycleThroughSuggestionsKeys.fromName(
this.settings.additionalCycleThroughSuggestionsKeys
);
if (this.settings.disableUpDownKeysForCycleThroughSuggestionsKeys) {
this.keymapEventHandler.push(
this.scope.register([], "ArrowDown", () => {
this.close();
return true;
}),
this.scope.register([], "ArrowUp", () => {
this.close();
return true;
})
);
} else {
this.keymapEventHandler.push(
this.scope.register([], "ArrowDown", selectNext),
this.scope.register([], "ArrowUp", selectPrevious)
);
}
if (cycleThroughSuggestionsKeys !== CycleThroughSuggestionsKeys.NONE) {
if (cycleThroughSuggestionsKeys === CycleThroughSuggestionsKeys.TAB) {
this.scope.unregister(
this.scope.keys.find((x) => x.modifiers === "" && x.key === "Tab")
);
}
this.keymapEventHandler.push(
this.scope.register(
cycleThroughSuggestionsKeys.nextKey.modifiers,
cycleThroughSuggestionsKeys.nextKey.key,
selectNext
),
this.scope.register(
cycleThroughSuggestionsKeys.previousKey.modifiers,
cycleThroughSuggestionsKeys.previousKey.key,
selectPrevious
)
);
}
const openSourceFileKey = OpenSourceFileKeys.fromName(
this.settings.openSourceFileKey
);
if (openSourceFileKey !== OpenSourceFileKeys.NONE) {
this.keymapEventHandler.push(
this.scope.register(
openSourceFileKey.keyBind.modifiers,
openSourceFileKey.keyBind.key,
() => {
const item = this.suggestions.values[this.suggestions.selectedItem];
if (item.type !== "currentVault" && item.type !== "internalLink" && item.type !== "frontMatter") {
return false;
}
const markdownFile = this.appHelper.getMarkdownFileByPath(
item.createdPath
);
if (!markdownFile) {
new import_obsidian3.Notice(`Can't open ${item.createdPath}`);
return false;
}
this.appHelper.openMarkdownFile(markdownFile, true);
return false;
}
)
);
}
}
async refreshCurrentFileTokens() {
const start = performance.now();
this.statusBar.setCurrentFileIndexing();
if (!this.settings.enableCurrentFileComplement) {
this.statusBar.setCurrentFileDisabled();
this.currentFileWordProvider.clearWords();
this.showDebugLog(
() => buildLogMessage(
"\u{1F462} Skip: Index current file tokens",
performance.now() - start
)
);
return;
}
await this.currentFileWordProvider.refreshWords(
this.settings.onlyComplementEnglishOnCurrentFileComplement,
this.currentFileMinNumberOfCharacters
);
this.statusBar.setCurrentFileIndexed(
this.currentFileWordProvider.wordCount
);
this.showDebugLog(
() => buildLogMessage("Index current file tokens", performance.now() - start)
);
}
async refreshCurrentVaultTokens() {
const start = performance.now();
this.statusBar.setCurrentVaultIndexing();
if (!this.settings.enableCurrentVaultComplement) {
this.statusBar.setCurrentVaultDisabled();
this.currentVaultWordProvider.clearWords();
this.showDebugLog(
() => buildLogMessage(
"\u{1F462} Skip: Index current vault tokens",
performance.now() - start
)
);
return;
}
await this.currentVaultWordProvider.refreshWords(
this.currentVaultMinNumberOfCharacters
);
this.statusBar.setCurrentVaultIndexed(
this.currentVaultWordProvider.wordCount
);
this.showDebugLog(
() => buildLogMessage("Index current vault tokens", performance.now() - start)
);
}
async refreshCustomDictionaryTokens() {
const start = performance.now();
this.statusBar.setCustomDictionaryIndexing();
if (!this.settings.enableCustomDictionaryComplement) {
this.statusBar.setCustomDictionaryDisabled();
this.customDictionaryWordProvider.clearWords();
this.showDebugLog(
() => buildLogMessage(
"\u{1F462}Skip: Index custom dictionary tokens",
performance.now() - start
)
);
return;
}
await this.customDictionaryWordProvider.refreshCustomWords({
regexp: this.settings.customDictionaryWordRegexPattern,
delimiterForHide: this.settings.delimiterToHideSuggestion || void 0,
delimiterForDisplay: this.settings.delimiterToDivideSuggestionsForDisplayFromInsertion || void 0,
caretSymbol: this.settings.caretLocationSymbolAfterComplement || void 0
});
this.statusBar.setCustomDictionaryIndexed(
this.customDictionaryWordProvider.wordCount
);
this.showDebugLog(
() => buildLogMessage(
"Index custom dictionary tokens",
performance.now() - start
)
);
}
refreshInternalLinkTokens() {
const start = performance.now();
this.statusBar.setInternalLinkIndexing();
if (!this.settings.enableInternalLinkComplement) {
this.statusBar.setInternalLinkDisabled();
this.internalLinkWordProvider.clearWords();
this.showDebugLog(
() => buildLogMessage(
"\u{1F462}Skip: Index internal link tokens",
performance.now() - start
)
);
return;
}
this.internalLinkWordProvider.refreshWords(
this.settings.suggestInternalLinkWithAlias,
this.excludeInternalLinkPrefixPathPatterns
);
this.statusBar.setInternalLinkIndexed(
this.internalLinkWordProvider.wordCount
);
this.showDebugLog(
() => buildLogMessage("Index internal link tokens", performance.now() - start)
);
}
refreshFrontMatterTokens() {
const start = performance.now();
this.statusBar.setFrontMatterIndexing();
if (!this.settings.enableFrontMatterComplement) {
this.statusBar.setFrontMatterDisabled();
this.frontMatterWordProvider.clearWords();
this.showDebugLog(
() => buildLogMessage(
"\u{1F462}Skip: Index front matter tokens",
performance.now() - start
)
);
return;
}
this.frontMatterWordProvider.refreshWords();
this.statusBar.setFrontMatterIndexed(
this.frontMatterWordProvider.wordCount
);
this.showDebugLog(
() => buildLogMessage("Index front matter tokens", performance.now() - start)
);
}
updateFrontMatterTokenIndex(file) {
const start = performance.now();
if (!this.settings.enableFrontMatterComplement) {
this.showDebugLog(
() => buildLogMessage(
"\u{1F462}Skip: Update front matter token index",
performance.now() - start
)
);
return;
}
this.frontMatterWordProvider.updateWordIndex(file);
this.showDebugLog(
() => buildLogMessage(
"Update front matter token index",
performance.now() - start
)
);
}
updateFrontMatterToken() {
const start = performance.now();
if (!this.settings.enableFrontMatterComplement) {
this.showDebugLog(
() => buildLogMessage(
"\u{1F462}Skip: Update front matter token",
performance.now() - start
)
);
return;
}
this.frontMatterWordProvider.updateWords();
this.statusBar.setFrontMatterIndexed(
this.frontMatterWordProvider.wordCount
);
this.showDebugLog(
() => buildLogMessage("Update front matter token", performance.now() - start)
);
}
onTrigger(cursor, editor, file) {
var _a, _b, _c, _d, _e, _f;
const start = performance.now();
const showDebugLog = (message) => {
this.showDebugLog(() => `[onTrigger] ${message}`);
};
const onReturnNull = (message) => {
showDebugLog(message);
this.runManually = false;
this.close();
};
if (!this.settings.complementAutomatically && !this.isOpen && !this.runManually) {
onReturnNull("Don't show suggestions");
return null;
}
if (this.settings.disableSuggestionsDuringImeOn && this.appHelper.isIMEOn() && !this.runManually) {
onReturnNull("Don't show suggestions for IME");
return null;
}
const cl = this.appHelper.getCurrentLine(editor);
if (this.previousCurrentLine === cl && !this.runManually) {
this.previousCurrentLine = cl;
onReturnNull("Don't show suggestions because there are no changes");
return null;
}
this.previousCurrentLine = cl;
const currentLineUntilCursor = this.appHelper.getCurrentLineUntilCursor(editor);
if (currentLineUntilCursor.startsWith("---")) {
onReturnNull(
"Don't show suggestions because it supposes front matter or horizontal line"
);
return null;
}
if (currentLineUntilCursor.startsWith("~~~") || currentLineUntilCursor.startsWith("```")) {
onReturnNull(
"Don't show suggestions because it supposes front code block"
);
return null;
}
const tokens = this.tokenizer.tokenize(currentLineUntilCursor, true);
showDebugLog(`tokens is ${tokens}`);
const tokenized = this.tokenizer.recursiveTokenize(currentLineUntilCursor);
const currentTokens = tokenized.slice(
tokenized.length > this.settings.maxNumberOfWordsAsPhrase ? tokenized.length - this.settings.maxNumberOfWordsAsPhrase : 0
);
showDebugLog(`currentTokens is ${JSON.stringify(currentTokens)}`);
const currentToken = (_a = currentTokens[0]) == null ? void 0 : _a.word;
showDebugLog(`currentToken is ${currentToken}`);
if (!currentToken) {
onReturnNull(`Don't show suggestions because currentToken is empty`);
return null;
}
const currentTokenSeparatedWhiteSpace = (_b = currentLineUntilCursor.split(" ").last()) != null ? _b : "";
if (new RegExp(`^[${this.settings.firstCharactersDisableSuggestions}]`).test(
currentTokenSeparatedWhiteSpace
)) {
onReturnNull(
`Don't show suggestions for avoiding to conflict with the other commands.`
);
return null;
}
if (currentToken.length === 1 && Boolean(currentToken.match(this.tokenizer.getTrimPattern()))) {
onReturnNull(
`Don't show suggestions because currentToken is TRIM_PATTERN`
);
return null;
}
const currentFrontMatter = this.settings.enableFrontMatterComplement ? this.appHelper.getCurrentFrontMatter() : void 0;
showDebugLog(`Current front matter is ${currentFrontMatter}`);
if (!this.runManually && !currentFrontMatter && currentToken.length < this.minNumberTriggered) {
onReturnNull(
"Don't show suggestions because currentToken is less than minNumberTriggered option"
);
return null;
}
showDebugLog(buildLogMessage("onTrigger", performance.now() - start));
this.runManually = false;
if (currentFrontMatter && ((_c = currentTokens.last()) == null ? void 0 : _c.word.match(/[^ ] $/))) {
currentTokens.push({ word: "", offset: currentLineUntilCursor.length });
}
this.contextStartCh = cursor.ch - currentToken.length;
return {
start: {
ch: cursor.ch - ((_f = (_e = (_d = currentTokens.last()) == null ? void 0 : _d.word) == null ? void 0 : _e.length) != null ? _f : 0),
line: cursor.line
},
end: cursor,
query: JSON.stringify({
currentFrontMatter,
queries: currentTokens.map((x) => ({
...x,
offset: x.offset - currentTokens[0].offset
}))
})
};
}
getSuggestions(context) {
return new Promise((resolve) => {
this.debounceGetSuggestions(context, (words) => {
resolve(words);
});
});
}
renderSuggestion(word, el) {
const base = createDiv();
let text2 = word.value;
if (word.type === "customDictionary" && word.insertedText && this.settings.displayedTextSuffix) {
text2 += this.settings.displayedTextSuffix;
}
base.createDiv({
text: text2,
cls: word.type === "internalLink" && word.aliasMeta ? "various-complements__suggestion-item__content__alias" : void 0
});
const description = this.descriptionOnSuggestion.toDisplay(word);
if (description) {
base.createDiv({
cls: "various-complements__suggestion-item__description",
text: `${description}`
});
}
el.appendChild(base);
el.addClass("various-complements__suggestion-item");
switch (word.type) {
case "currentFile":
el.addClass("various-complements__suggestion-item__current-file");
break;
case "currentVault":
el.addClass("various-complements__suggestion-item__current-vault");
break;
case "customDictionary":
el.addClass("various-complements__suggestion-item__custom-dictionary");
break;
case "internalLink":
el.addClass("various-complements__suggestion-item__internal-link");
if (word.phantom) {
el.addClass("various-complements__suggestion-item__phantom");
}
break;
case "frontMatter":
el.addClass("various-complements__suggestion-item__front-matter");
break;
}
}
selectSuggestion(word, evt) {
var _a, _b;
if (!this.context) {
return;
}
let insertedText = word.value;
if (word.type === "internalLink") {
if (this.settings.suggestInternalLinkWithAlias && word.aliasMeta) {
const linkText = this.appHelper.optimizeMarkdownLinkText(
word.aliasMeta.origin
);
insertedText = this.appHelper.useWikiLinks ? `[[${linkText}|${word.value}]]` : `[${word.value}](${encodeSpace(linkText)}.md)`;
} else {
const linkText = this.appHelper.optimizeMarkdownLinkText(
word.phantom ? word.value : word.createdPath
);
insertedText = this.appHelper.useWikiLinks ? `[[${linkText}]]` : `[${linkText}](${encodeSpace(linkText)}.md)`;
}
}
if (word.type === "frontMatter" && this.settings.insertCommaAfterFrontMatterCompletion) {
insertedText = `${insertedText}, `;
} else {
if (this.settings.insertAfterCompletion && !(word.type === "customDictionary" && word.ignoreSpaceAfterCompletion)) {
insertedText = `${insertedText} `;
}
}
let positionToMove = -1;
if (word.type === "customDictionary") {
if (word.insertedText) {
insertedText = word.insertedText;
}
const caret = word.caretSymbol;
if (caret) {
positionToMove = insertedText.indexOf(caret);
insertedText = insertedText.replace(caret, "");
}
}
const editor = this.context.editor;
editor.replaceRange(
insertedText,
{
...this.context.start,
ch: this.contextStartCh + word.offset
},
this.context.end
);
if (positionToMove !== -1) {
editor.setCursor(
editor.offsetToPos(
editor.posToOffset(editor.getCursor()) - insertedText.length + positionToMove
)
);
}
if (this.appHelper.equalsAsEditorPostion(this.context.start, this.context.end)) {
editor.setCursor(
editor.offsetToPos(
editor.posToOffset(editor.getCursor()) + insertedText.length
)
);
}
(_a = this.selectionHistoryStorage) == null ? void 0 : _a.increment(word);
if (this.settings.showLogAboutPerformanceInConsole) {
console.log("--- history ---");
console.log((_b = this.selectionHistoryStorage) == null ? void 0 : _b.data);
}
this.close();
this.debounceClose();
}
showDebugLog(toMessage) {
if (this.settings.showLogAboutPerformanceInConsole) {
console.log(toMessage());
}
}
};
// src/setting/settings.ts
var import_obsidian4 = require("obsidian");
var DEFAULT_SETTINGS = {
strategy: "default",
matchStrategy: "prefix",
maxNumberOfSuggestions: 5,
maxNumberOfWordsAsPhrase: 3,
minNumberOfCharactersTriggered: 0,
minNumberOfWordsTriggeredPhrase: 1,
complementAutomatically: true,
delayMilliSeconds: 0,
disableSuggestionsDuringImeOn: false,
insertAfterCompletion: true,
firstCharactersDisableSuggestions: ":/^",
showMatchStrategy: true,
showComplementAutomatically: true,
showIndexingStatus: true,
descriptionOnSuggestion: "Short",
selectSuggestionKeys: "Enter",
additionalCycleThroughSuggestionsKeys: "None",
disableUpDownKeysForCycleThroughSuggestionsKeys: false,
openSourceFileKey: "None",
propagateEsc: false,
enableCurrentFileComplement: true,
currentFileMinNumberOfCharacters: 0,
onlyComplementEnglishOnCurrentFileComplement: false,
enableCurrentVaultComplement: false,
currentVaultMinNumberOfCharacters: 0,
includeCurrentVaultPathPrefixPatterns: "",
excludeCurrentVaultPathPrefixPatterns: "",
includeCurrentVaultOnlyFilesUnderCurrentDirectory: false,
enableCustomDictionaryComplement: false,
customDictionaryPaths: `https://raw.githubusercontent.com/first20hours/google-10000-english/master/google-10000-english-no-swears.txt`,
columnDelimiter: "Tab",
customDictionaryWordRegexPattern: "",
delimiterToHideSuggestion: "",
delimiterToDivideSuggestionsForDisplayFromInsertion: "",
caretLocationSymbolAfterComplement: "",
displayedTextSuffix: " => ...",
enableInternalLinkComplement: true,
suggestInternalLinkWithAlias: false,
excludeInternalLinkPathPrefixPatterns: "",
enableFrontMatterComplement: true,
frontMatterComplementMatchStrategy: "inherit",
insertCommaAfterFrontMatterCompletion: false,
intelligentSuggestionPrioritization: {
maxDaysToKeepHistory: 30,
maxNumberOfHistoryToKeep: 0
},
showLogAboutPerformanceInConsole: false,
selectionHistoryTree: {}
};
var VariousComplementsSettingTab = class extends import_obsidian4.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.plugin = plugin;
}
display() {
let { containerEl } = this;
containerEl.empty();
containerEl.createEl("h2", { text: "Various Complements - Settings" });
this.addMainSettings(containerEl);
this.addAppearanceSettings(containerEl);
this.addKeyCustomizationSettings(containerEl);
this.addCurrentFileComplementSettings(containerEl);
this.addCurrentVaultComplementSettings(containerEl);
this.addCustomDictionaryComplementSettings(containerEl);
this.addInternalLinkComplementSettings(containerEl);
this.addFrontMatterComplementSettings(containerEl);
this.addIntelligentSuggestionPrioritizationSettings(containerEl);
this.addDebugSettings(containerEl);
}
addMainSettings(containerEl) {
containerEl.createEl("h3", { text: "Main" });
new import_obsidian4.Setting(containerEl).setName("Strategy").addDropdown(
(tc) => tc.addOptions(mirrorMap(TokenizeStrategy.values(), (x) => x.name)).setValue(this.plugin.settings.strategy).onChange(async (value) => {
this.plugin.settings.strategy = value;
this.display();
await this.plugin.saveSettings({
currentFile: true,
currentVault: true
});
})
);
if (this.plugin.settings.strategy === TokenizeStrategy.CHINESE.name) {
const el = containerEl.createEl("div", {
cls: "various-complements__settings__warning"
});
el.createSpan({
text: "\u26A0 You need to download `cedict_ts.u8` from"
});
el.createEl("a", {
href: "https://www.mdbg.net/chinese/dictionary?page=cc-cedict",
text: " the site "
});
el.createSpan({
text: "and store it in vault root."
});
}
new import_obsidian4.Setting(containerEl).setName("Match strategy").addDropdown(
(tc) => tc.addOptions(mirrorMap(MatchStrategy.values(), (x) => x.name)).setValue(this.plugin.settings.matchStrategy).onChange(async (value) => {
this.plugin.settings.matchStrategy = value;
await this.plugin.saveSettings();
this.display();
})
);
if (this.plugin.settings.matchStrategy === MatchStrategy.PARTIAL.name) {
containerEl.createEl("div", {
text: "\u26A0 `partial` is more than 10 times slower than `prefix`",
cls: "various-complements__settings__warning"
});
}
new import_obsidian4.Setting(containerEl).setName("Max number of suggestions").addSlider(
(sc) => sc.setLimits(1, 255, 1).setValue(this.plugin.settings.maxNumberOfSuggestions).setDynamicTooltip().onChange(async (value) => {
this.plugin.settings.maxNumberOfSuggestions = value;
await this.plugin.saveSettings();
})
);
new import_obsidian4.Setting(containerEl).setName("Max number of words as a phrase").setDesc(`[\u26A0Warning] It makes slower more than N times (N is set value)`).addSlider(
(sc) => sc.setLimits(1, 10, 1).setValue(this.plugin.settings.maxNumberOfWordsAsPhrase).setDynamicTooltip().onChange(async (value) => {
this.plugin.settings.maxNumberOfWordsAsPhrase = value;
await this.plugin.saveSettings();
})
);
new import_obsidian4.Setting(containerEl).setName("Min number of characters for trigger").setDesc("It uses a default value of Strategy if set 0.").addSlider(
(sc) => sc.setLimits(0, 10, 1).setValue(this.plugin.settings.minNumberOfCharactersTriggered).setDynamicTooltip().onChange(async (value) => {
this.plugin.settings.minNumberOfCharactersTriggered = value;
await this.plugin.saveSettings();
})
);
new import_obsidian4.Setting(containerEl).setName("Min number of words for trigger").addSlider(
(sc) => sc.setLimits(1, 10, 1).setValue(this.plugin.settings.minNumberOfWordsTriggeredPhrase).setDynamicTooltip().onChange(async (value) => {
this.plugin.settings.minNumberOfWordsTriggeredPhrase = value;
await this.plugin.saveSettings();
})
);
new import_obsidian4.Setting(containerEl).setName("Complement automatically").addToggle((tc) => {
tc.setValue(this.plugin.settings.complementAutomatically).onChange(
async (value) => {
this.plugin.settings.complementAutomatically = value;
await this.plugin.saveSettings();
}
);
});
new import_obsidian4.Setting(containerEl).setName("Delay milli-seconds for trigger").addSlider(
(sc) => sc.setLimits(0, 1e3, 10).setValue(this.plugin.settings.delayMilliSeconds).setDynamicTooltip().onChange(async (value) => {
this.plugin.settings.delayMilliSeconds = value;
await this.plugin.saveSettings();
})
);
new import_obsidian4.Setting(containerEl).setName("Disable suggestions during IME on").addToggle((tc) => {
tc.setValue(
this.plugin.settings.disableSuggestionsDuringImeOn
).onChange(async (value) => {
this.plugin.settings.disableSuggestionsDuringImeOn = value;
await this.plugin.saveSettings();
});
});
new import_obsidian4.Setting(containerEl).setName("Insert space after completion").addToggle((tc) => {
tc.setValue(this.plugin.settings.insertAfterCompletion).onChange(
async (value) => {
this.plugin.settings.insertAfterCompletion = value;
await this.plugin.saveSettings();
}
);
});
new import_obsidian4.Setting(containerEl).setName("First characters to disable suggestions").addText((cb) => {
cb.setValue(
this.plugin.settings.firstCharactersDisableSuggestions
).onChange(async (value) => {
this.plugin.settings.firstCharactersDisableSuggestions = value;
await this.plugin.saveSettings();
});
});
}
addAppearanceSettings(containerEl) {
containerEl.createEl("h3", { text: "Appearance" });
new import_obsidian4.Setting(containerEl).setName("Show Match strategy").setDesc(
"Show Match strategy at the status bar. Changing this option requires a restart to take effect."
).addToggle((tc) => {
tc.setValue(this.plugin.settings.showMatchStrategy).onChange(
async (value) => {
this.plugin.settings.showMatchStrategy = value;
await this.plugin.saveSettings();
}
);
});
new import_obsidian4.Setting(containerEl).setName("Show Complement automatically").setDesc(
"Show complement automatically at the status bar. Changing this option requires a restart to take effect."
).addToggle((tc) => {
tc.setValue(this.plugin.settings.showComplementAutomatically).onChange(
async (value) => {
this.plugin.settings.showComplementAutomatically = value;
await this.plugin.saveSettings();
}
);
});
new import_obsidian4.Setting(containerEl).setName("Show Indexing status").setDesc(
"Show indexing status at the status bar. Changing this option requires a restart to take effect."
).addToggle((tc) => {
tc.setValue(this.plugin.settings.showIndexingStatus).onChange(
async (value) => {
this.plugin.settings.showIndexingStatus = value;
await this.plugin.saveSettings();
}
);
});
new import_obsidian4.Setting(containerEl).setName("Description on a suggestion").addDropdown(
(tc) => tc.addOptions(
mirrorMap(DescriptionOnSuggestion.values(), (x) => x.name)
).setValue(this.plugin.settings.descriptionOnSuggestion).onChange(async (value) => {
this.plugin.settings.descriptionOnSuggestion = value;
await this.plugin.saveSettings();
})
);
}
addKeyCustomizationSettings(containerEl) {
containerEl.createEl("h3", { text: "Key customization" });
new import_obsidian4.Setting(containerEl).setName("Select a suggestion key").addDropdown(
(tc) => tc.addOptions(mirrorMap(SelectSuggestionKey.values(), (x) => x.name)).setValue(this.plugin.settings.selectSuggestionKeys).onChange(async (value) => {
this.plugin.settings.selectSuggestionKeys = value;
await this.plugin.saveSettings();
})
);
new import_obsidian4.Setting(containerEl).setName("Additional cycle through suggestions keys").addDropdown(
(tc) => tc.addOptions(
mirrorMap(CycleThroughSuggestionsKeys.values(), (x) => x.name)
).setValue(this.plugin.settings.additionalCycleThroughSuggestionsKeys).onChange(async (value) => {
this.plugin.settings.additionalCycleThroughSuggestionsKeys = value;
await this.plugin.saveSettings();
})
);
new import_obsidian4.Setting(containerEl).setName("Disable the up/down keys for cycle through suggestions keys").addToggle((tc) => {
tc.setValue(
this.plugin.settings.disableUpDownKeysForCycleThroughSuggestionsKeys
).onChange(async (value) => {
this.plugin.settings.disableUpDownKeysForCycleThroughSuggestionsKeys = value;
await this.plugin.saveSettings();
});
});
new import_obsidian4.Setting(containerEl).setName("Open source file key").addDropdown(
(tc) => tc.addOptions(mirrorMap(OpenSourceFileKeys.values(), (x) => x.name)).setValue(this.plugin.settings.openSourceFileKey).onChange(async (value) => {
this.plugin.settings.openSourceFileKey = value;
await this.plugin.saveSettings();
})
);
new import_obsidian4.Setting(containerEl).setName("Propagate ESC").setDesc(
"It is handy if you use Vim mode because you can switch to Normal mode by one ESC, whether it shows suggestions or not."
).addToggle((tc) => {
tc.setValue(this.plugin.settings.propagateEsc).onChange(
async (value) => {
this.plugin.settings.propagateEsc = value;
await this.plugin.saveSettings();
}
);
});
}
addCurrentFileComplementSettings(containerEl) {
containerEl.createEl("h3", {
text: "Current file complement",
cls: "various-complements__settings__header various-complements__settings__header__current-file"
});
new import_obsidian4.Setting(containerEl).setName("Enable Current file complement").addToggle((tc) => {
tc.setValue(this.plugin.settings.enableCurrentFileComplement).onChange(
async (value) => {
this.plugin.settings.enableCurrentFileComplement = value;
await this.plugin.saveSettings({ currentFile: true });
this.display();
}
);
});
if (this.plugin.settings.enableCurrentFileComplement) {
new import_obsidian4.Setting(containerEl).setName("Min number of characters for indexing").setDesc("It uses a default value of Strategy if set 0.").addSlider(
(sc) => sc.setLimits(0, 15, 1).setValue(this.plugin.settings.currentFileMinNumberOfCharacters).setDynamicTooltip().onChange(async (value) => {
this.plugin.settings.currentFileMinNumberOfCharacters = value;
await this.plugin.saveSettings({ currentFile: true });
})
);
new import_obsidian4.Setting(containerEl).setName("Only complement English on current file complement").addToggle((tc) => {
tc.setValue(
this.plugin.settings.onlyComplementEnglishOnCurrentFileComplement
).onChange(async (value) => {
this.plugin.settings.onlyComplementEnglishOnCurrentFileComplement = value;
await this.plugin.saveSettings({ currentFile: true });
});
});
}
}
addCurrentVaultComplementSettings(containerEl) {
containerEl.createEl("h3", {
text: "Current vault complement",
cls: "various-complements__settings__header various-complements__settings__header__current-vault"
});
new import_obsidian4.Setting(containerEl).setName("Enable Current vault complement").addToggle((tc) => {
tc.setValue(this.plugin.settings.enableCurrentVaultComplement).onChange(
async (value) => {
this.plugin.settings.enableCurrentVaultComplement = value;
this.display();
await this.plugin.saveSettings({ currentVault: true });
}
);
});
if (this.plugin.settings.enableCurrentVaultComplement) {
new import_obsidian4.Setting(containerEl).setName("Min number of characters for indexing").setDesc("It uses a default value of Strategy if set 0.").addSlider(
(sc) => sc.setLimits(0, 15, 1).setValue(this.plugin.settings.currentVaultMinNumberOfCharacters).setDynamicTooltip().onChange(async (value) => {
this.plugin.settings.currentVaultMinNumberOfCharacters = value;
await this.plugin.saveSettings();
})
);
new import_obsidian4.Setting(containerEl).setName("Include prefix path patterns").setDesc("Prefix match path patterns to include files.").addTextArea((tac) => {
const el = tac.setValue(
this.plugin.settings.includeCurrentVaultPathPrefixPatterns
).setPlaceholder("Private/").onChange(async (value) => {
this.plugin.settings.includeCurrentVaultPathPrefixPatterns = value;
await this.plugin.saveSettings();
});
el.inputEl.className = "various-complements__settings__text-area-path";
return el;
});
new import_obsidian4.Setting(containerEl).setName("Exclude prefix path patterns").setDesc("Prefix match path patterns to exclude files.").addTextArea((tac) => {
const el = tac.setValue(
this.plugin.settings.excludeCurrentVaultPathPrefixPatterns
).setPlaceholder("Private/").onChange(async (value) => {
this.plugin.settings.excludeCurrentVaultPathPrefixPatterns = value;
await this.plugin.saveSettings();
});
el.inputEl.className = "various-complements__settings__text-area-path";
return el;
});
new import_obsidian4.Setting(containerEl).setName("Include only files under current directory").addToggle((tc) => {
tc.setValue(
this.plugin.settings.includeCurrentVaultOnlyFilesUnderCurrentDirectory
).onChange(async (value) => {
this.plugin.settings.includeCurrentVaultOnlyFilesUnderCurrentDirectory = value;
await this.plugin.saveSettings();
});
});
}
}
addCustomDictionaryComplementSettings(containerEl) {
containerEl.createEl("h3", {
text: "Custom dictionary complement",
cls: "various-complements__settings__header various-complements__settings__header__custom-dictionary"
});
new import_obsidian4.Setting(containerEl).setName("Enable Custom dictionary complement").addToggle((tc) => {
tc.setValue(
this.plugin.settings.enableCustomDictionaryComplement
).onChange(async (value) => {
this.plugin.settings.enableCustomDictionaryComplement = value;
await this.plugin.saveSettings({ customDictionary: true });
this.display();
});
});
if (this.plugin.settings.enableCustomDictionaryComplement) {
new import_obsidian4.Setting(containerEl).setName("Custom dictionary paths").setDesc(
"Specify either a relative path from Vault root or URL for each line."
).addTextArea((tac) => {
const el = tac.setValue(this.plugin.settings.customDictionaryPaths).setPlaceholder("dictionary.md").onChange(async (value) => {
this.plugin.settings.customDictionaryPaths = value;
await this.plugin.saveSettings();
});
el.inputEl.className = "various-complements__settings__text-area-path";
return el;
});
new import_obsidian4.Setting(containerEl).setName("Column delimiter").addDropdown(
(tc) => tc.addOptions(mirrorMap(ColumnDelimiter.values(), (x) => x.name)).setValue(this.plugin.settings.columnDelimiter).onChange(async (value) => {
this.plugin.settings.columnDelimiter = value;
await this.plugin.saveSettings();
})
);
new import_obsidian4.Setting(containerEl).setName("Word regex pattern").setDesc("Only load words that match the regular expression pattern.").addText((cb) => {
cb.setValue(
this.plugin.settings.customDictionaryWordRegexPattern
).onChange(async (value) => {
this.plugin.settings.customDictionaryWordRegexPattern = value;
await this.plugin.saveSettings();
});
});
new import_obsidian4.Setting(containerEl).setName("Delimiter to hide a suggestion").setDesc(
"If set ';;;', 'abcd;;;efg' is shown as 'abcd' on suggestions, but completes to 'abcdefg'."
).addText((cb) => {
cb.setValue(this.plugin.settings.delimiterToHideSuggestion).onChange(
async (value) => {
this.plugin.settings.delimiterToHideSuggestion = value;
await this.plugin.saveSettings();
}
);
});
new import_obsidian4.Setting(containerEl).setName(
"Delimiter to divide suggestions for display from ones for insertion"
).setDesc(
"If set ' >>> ', 'displayed >>> inserted' is shown as 'displayed' on suggestions, but completes to 'inserted'."
).addText((cb) => {
cb.setValue(
this.plugin.settings.delimiterToDivideSuggestionsForDisplayFromInsertion
).onChange(async (value) => {
this.plugin.settings.delimiterToDivideSuggestionsForDisplayFromInsertion = value;
await this.plugin.saveSettings();
});
});
new import_obsidian4.Setting(containerEl).setName("Caret location symbol after complement").setDesc(
"If set '<CARET>' and there is '<li><CARET></li>' in custom dictionary, it complements '<li></li>' and move a caret where between '<li>' and `</li>`."
).addText((cb) => {
cb.setValue(
this.plugin.settings.caretLocationSymbolAfterComplement
).onChange(async (value) => {
this.plugin.settings.caretLocationSymbolAfterComplement = value;
await this.plugin.saveSettings();
});
});
new import_obsidian4.Setting(containerEl).setName("Displayed text suffix").setDesc(
"It shows as a suffix of displayed text if there is a difference between displayed and inserted"
).addText((cb) => {
cb.setValue(this.plugin.settings.displayedTextSuffix).onChange(
async (value) => {
this.plugin.settings.displayedTextSuffix = value;
await this.plugin.saveSettings();
}
);
});
}
}
addInternalLinkComplementSettings(containerEl) {
containerEl.createEl("h3", {
text: "Internal link complement",
cls: "various-complements__settings__header various-complements__settings__header__internal-link"
});
new import_obsidian4.Setting(containerEl).setName("Enable Internal link complement").addToggle((tc) => {
tc.setValue(this.plugin.settings.enableInternalLinkComplement).onChange(
async (value) => {
this.plugin.settings.enableInternalLinkComplement = value;
await this.plugin.saveSettings({ internalLink: true });
this.display();
}
);
});
if (this.plugin.settings.enableInternalLinkComplement) {
new import_obsidian4.Setting(containerEl).setName("Suggest with an alias").addToggle((tc) => {
tc.setValue(
this.plugin.settings.suggestInternalLinkWithAlias
).onChange(async (value) => {
this.plugin.settings.suggestInternalLinkWithAlias = value;
await this.plugin.saveSettings({ internalLink: true });
});
});
new import_obsidian4.Setting(containerEl).setName("Exclude prefix path patterns").setDesc("Prefix match path patterns to exclude files.").addTextArea((tac) => {
const el = tac.setValue(
this.plugin.settings.excludeInternalLinkPathPrefixPatterns
).setPlaceholder("Private/").onChange(async (value) => {
this.plugin.settings.excludeInternalLinkPathPrefixPatterns = value;
await this.plugin.saveSettings();
});
el.inputEl.className = "various-complements__settings__text-area-path";
return el;
});
}
}
addFrontMatterComplementSettings(containerEl) {
containerEl.createEl("h3", {
text: "Front matter complement",
cls: "various-complements__settings__header various-complements__settings__header__front-matter"
});
new import_obsidian4.Setting(containerEl).setName("Enable Front matter complement").addToggle((tc) => {
tc.setValue(this.plugin.settings.enableFrontMatterComplement).onChange(
async (value) => {
this.plugin.settings.enableFrontMatterComplement = value;
await this.plugin.saveSettings({ frontMatter: true });
this.display();
}
);
});
if (this.plugin.settings.enableFrontMatterComplement) {
new import_obsidian4.Setting(containerEl).setName("Match strategy in the front matter").addDropdown(
(tc) => tc.addOptions(
mirrorMap(SpecificMatchStrategy.values(), (x) => x.name)
).setValue(this.plugin.settings.frontMatterComplementMatchStrategy).onChange(async (value) => {
this.plugin.settings.frontMatterComplementMatchStrategy = value;
await this.plugin.saveSettings();
})
);
new import_obsidian4.Setting(containerEl).setName("Insert comma after completion").addToggle((tc) => {
tc.setValue(
this.plugin.settings.insertCommaAfterFrontMatterCompletion
).onChange(async (value) => {
this.plugin.settings.insertCommaAfterFrontMatterCompletion = value;
await this.plugin.saveSettings();
});
});
}
}
addIntelligentSuggestionPrioritizationSettings(containerEl) {
containerEl.createEl("h3", {
text: "Intelligent suggestion prioritization",
cls: "various-complements__settings__header various-complements__settings__header__intelligent-suggestion-prioritization"
});
new import_obsidian4.Setting(containerEl).setName("Max days to keep history").setDesc("If set 0, it will never remove").addSlider(
(sc) => sc.setLimits(0, 365, 1).setValue(
this.plugin.settings.intelligentSuggestionPrioritization.maxDaysToKeepHistory
).setDynamicTooltip().onChange(async (value) => {
this.plugin.settings.intelligentSuggestionPrioritization.maxDaysToKeepHistory = value;
await this.plugin.saveSettings();
})
);
new import_obsidian4.Setting(containerEl).setName("Max number of history to keep").setDesc("If set 0, it will never remove").addSlider(
(sc) => sc.setLimits(0, 1e4, 1).setValue(
this.plugin.settings.intelligentSuggestionPrioritization.maxNumberOfHistoryToKeep
).setDynamicTooltip().onChange(async (value) => {
this.plugin.settings.intelligentSuggestionPrioritization.maxNumberOfHistoryToKeep = value;
await this.plugin.saveSettings();
})
);
}
addDebugSettings(containerEl) {
containerEl.createEl("h3", { text: "Debug" });
new import_obsidian4.Setting(containerEl).setName("Show log about performance in a console").addToggle((tc) => {
tc.setValue(
this.plugin.settings.showLogAboutPerformanceInConsole
).onChange(async (value) => {
this.plugin.settings.showLogAboutPerformanceInConsole = value;
await this.plugin.saveSettings();
});
});
}
async toggleMatchStrategy() {
switch (this.plugin.settings.matchStrategy) {
case "prefix":
this.plugin.settings.matchStrategy = "partial";
break;
case "partial":
this.plugin.settings.matchStrategy = "prefix";
break;
default:
new import_obsidian4.Notice("\u26A0Unexpected error");
}
await this.plugin.saveSettings();
}
async toggleComplementAutomatically() {
this.plugin.settings.complementAutomatically = !this.plugin.settings.complementAutomatically;
await this.plugin.saveSettings();
}
async ensureCustomDictionaryPath(path, state) {
const paths = this.plugin.settings.customDictionaryPaths.split("\n");
const exists = paths.some((x) => x === path);
if (exists && state === "present" || !exists && state === "absent") {
return false;
}
const newPaths = state === "present" ? [...paths, path] : paths.filter((x) => x !== path);
this.plugin.settings.customDictionaryPaths = newPaths.join("\n");
await this.plugin.saveSettings({ customDictionary: true });
return true;
}
getPluginSettingsAsJsonString() {
return JSON.stringify(
{
version: this.plugin.manifest.version,
mobile: this.app.isMobile,
settings: { ...this.plugin.settings, selectionHistoryTree: null }
},
null,
4
);
}
};
// src/ui/ProviderStatusBar.ts
var ProviderStatusBar = class {
constructor(currentFile, currentVault, customDictionary, internalLink, frontMatter, matchStrategy, complementAutomatically) {
this.currentFile = currentFile;
this.currentVault = currentVault;
this.customDictionary = customDictionary;
this.internalLink = internalLink;
this.frontMatter = frontMatter;
this.matchStrategy = matchStrategy;
this.complementAutomatically = complementAutomatically;
}
static new(statusBar, showMatchStrategy, showIndexingStatus, showComplementAutomatically) {
const currentFile = showIndexingStatus ? statusBar.createEl("span", {
text: "---",
cls: "various-complements__footer various-complements__footer__current-file"
}) : null;
const currentVault = showIndexingStatus ? statusBar.createEl("span", {
text: "---",
cls: "various-complements__footer various-complements__footer__current-vault"
}) : null;
const customDictionary = showIndexingStatus ? statusBar.createEl("span", {
text: "---",
cls: "various-complements__footer various-complements__footer__custom-dictionary"
}) : null;
const internalLink = showIndexingStatus ? statusBar.createEl("span", {
text: "---",
cls: "various-complements__footer various-complements__footer__internal-link"
}) : null;
const frontMatter = showIndexingStatus ? statusBar.createEl("span", {
text: "---",
cls: "various-complements__footer various-complements__footer__front-matter"
}) : null;
const matchStrategy = showMatchStrategy ? statusBar.createEl("span", {
text: "---",
cls: "various-complements__footer various-complements__footer__match-strategy"
}) : null;
const complementAutomatically = showComplementAutomatically ? statusBar.createEl("span", {
text: "---",
cls: "various-complements__footer various-complements__footer__complement-automatically"
}) : null;
return new ProviderStatusBar(
currentFile,
currentVault,
customDictionary,
internalLink,
frontMatter,
matchStrategy,
complementAutomatically
);
}
setOnClickStrategyListener(listener) {
var _a;
(_a = this.matchStrategy) == null ? void 0 : _a.addEventListener("click", listener);
}
setOnClickComplementAutomatically(listener) {
var _a;
(_a = this.complementAutomatically) == null ? void 0 : _a.addEventListener("click", listener);
}
setCurrentFileDisabled() {
var _a;
(_a = this.currentFile) == null ? void 0 : _a.setText("---");
}
setCurrentVaultDisabled() {
var _a;
(_a = this.currentVault) == null ? void 0 : _a.setText("---");
}
setCustomDictionaryDisabled() {
var _a;
(_a = this.customDictionary) == null ? void 0 : _a.setText("---");
}
setInternalLinkDisabled() {
var _a;
(_a = this.internalLink) == null ? void 0 : _a.setText("---");
}
setFrontMatterDisabled() {
var _a;
(_a = this.frontMatter) == null ? void 0 : _a.setText("---");
}
setCurrentFileIndexing() {
var _a;
(_a = this.currentFile) == null ? void 0 : _a.setText("indexing...");
}
setCurrentVaultIndexing() {
var _a;
(_a = this.currentVault) == null ? void 0 : _a.setText("indexing...");
}
setCustomDictionaryIndexing() {
var _a;
(_a = this.customDictionary) == null ? void 0 : _a.setText("indexing...");
}
setInternalLinkIndexing() {
var _a;
(_a = this.internalLink) == null ? void 0 : _a.setText("indexing...");
}
setFrontMatterIndexing() {
var _a;
(_a = this.frontMatter) == null ? void 0 : _a.setText("indexing...");
}
setCurrentFileIndexed(count) {
var _a;
(_a = this.currentFile) == null ? void 0 : _a.setText(String(count));
}
setCurrentVaultIndexed(count) {
var _a;
(_a = this.currentVault) == null ? void 0 : _a.setText(String(count));
}
setCustomDictionaryIndexed(count) {
var _a;
(_a = this.customDictionary) == null ? void 0 : _a.setText(String(count));
}
setInternalLinkIndexed(count) {
var _a;
(_a = this.internalLink) == null ? void 0 : _a.setText(String(count));
}
setFrontMatterIndexed(count) {
var _a;
(_a = this.frontMatter) == null ? void 0 : _a.setText(String(count));
}
setMatchStrategy(strategy) {
var _a;
(_a = this.matchStrategy) == null ? void 0 : _a.setText(strategy.name);
}
setComplementAutomatically(automatically) {
var _a;
(_a = this.complementAutomatically) == null ? void 0 : _a.setText(automatically ? "auto" : "manual");
}
};
// src/ui/CustomDictionaryWordAddModal.ts
var import_obsidian5 = require("obsidian");
// node_modules/svelte/internal/index.mjs
function noop() {
}
function assign(tar, src) {
for (const k in src)
tar[k] = src[k];
return tar;
}
function run(fn) {
return fn();
}
function blank_object() {
return /* @__PURE__ */ Object.create(null);
}
function run_all(fns) {
fns.forEach(run);
}
function is_function(thing) {
return typeof thing === "function";
}
function safe_not_equal(a, b) {
return a != a ? b == b : a !== b || (a && typeof a === "object" || typeof a === "function");
}
function is_empty(obj) {
return Object.keys(obj).length === 0;
}
function create_slot(definition, ctx, $$scope, fn) {
if (definition) {
const slot_ctx = get_slot_context(definition, ctx, $$scope, fn);
return definition[0](slot_ctx);
}
}
function get_slot_context(definition, ctx, $$scope, fn) {
return definition[1] && fn ? assign($$scope.ctx.slice(), definition[1](fn(ctx))) : $$scope.ctx;
}
function get_slot_changes(definition, $$scope, dirty, fn) {
if (definition[2] && fn) {
const lets = definition[2](fn(dirty));
if ($$scope.dirty === void 0) {
return lets;
}
if (typeof lets === "object") {
const merged = [];
const len = Math.max($$scope.dirty.length, lets.length);
for (let i = 0; i < len; i += 1) {
merged[i] = $$scope.dirty[i] | lets[i];
}
return merged;
}
return $$scope.dirty | lets;
}
return $$scope.dirty;
}
function update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn) {
if (slot_changes) {
const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);
slot.p(slot_context, slot_changes);
}
}
function get_all_dirty_from_scope($$scope) {
if ($$scope.ctx.length > 32) {
const dirty = [];
const length = $$scope.ctx.length / 32;
for (let i = 0; i < length; i++) {
dirty[i] = -1;
}
return dirty;
}
return -1;
}
function exclude_internal_props(props) {
const result = {};
for (const k in props)
if (k[0] !== "$")
result[k] = props[k];
return result;
}
function compute_rest_props(props, keys) {
const rest = {};
keys = new Set(keys);
for (const k in props)
if (!keys.has(k) && k[0] !== "$")
rest[k] = props[k];
return rest;
}
function null_to_empty(value) {
return value == null ? "" : value;
}
var is_hydrating = false;
function start_hydrating() {
is_hydrating = true;
}
function end_hydrating() {
is_hydrating = false;
}
function append(target, node) {
target.appendChild(node);
}
function append_styles(target, style_sheet_id, styles) {
const append_styles_to = get_root_for_style(target);
if (!append_styles_to.getElementById(style_sheet_id)) {
const style = element("style");
style.id = style_sheet_id;
style.textContent = styles;
append_stylesheet(append_styles_to, style);
}
}
function get_root_for_style(node) {
if (!node)
return document;
const root = node.getRootNode ? node.getRootNode() : node.ownerDocument;
if (root && root.host) {
return root;
}
return node.ownerDocument;
}
function append_stylesheet(node, style) {
append(node.head || node, style);
return style.sheet;
}
function insert(target, node, anchor) {
target.insertBefore(node, anchor || null);
}
function detach(node) {
node.parentNode.removeChild(node);
}
function destroy_each(iterations, detaching) {
for (let i = 0; i < iterations.length; i += 1) {
if (iterations[i])
iterations[i].d(detaching);
}
}
function element(name) {
return document.createElement(name);
}
function svg_element(name) {
return document.createElementNS("http://www.w3.org/2000/svg", name);
}
function text(data) {
return document.createTextNode(data);
}
function space() {
return text(" ");
}
function listen(node, event, handler, options) {
node.addEventListener(event, handler, options);
return () => node.removeEventListener(event, handler, options);
}
function attr(node, attribute, value) {
if (value == null)
node.removeAttribute(attribute);
else if (node.getAttribute(attribute) !== value)
node.setAttribute(attribute, value);
}
function set_svg_attributes(node, attributes) {
for (const key in attributes) {
attr(node, key, attributes[key]);
}
}
function children(element2) {
return Array.from(element2.childNodes);
}
function set_data(text2, data) {
data = "" + data;
if (text2.wholeText !== data)
text2.data = data;
}
function set_input_value(input, value) {
input.value = value == null ? "" : value;
}
function set_style(node, key, value, important) {
if (value === null) {
node.style.removeProperty(key);
} else {
node.style.setProperty(key, value, important ? "important" : "");
}
}
function select_option(select, value) {
for (let i = 0; i < select.options.length; i += 1) {
const option = select.options[i];
if (option.__value === value) {
option.selected = true;
return;
}
}
select.selectedIndex = -1;
}
function select_value(select) {
const selected_option = select.querySelector(":checked") || select.options[0];
return selected_option && selected_option.__value;
}
function toggle_class(element2, name, toggle) {
element2.classList[toggle ? "add" : "remove"](name);
}
function custom_event(type, detail, { bubbles = false, cancelable = false } = {}) {
const e = document.createEvent("CustomEvent");
e.initCustomEvent(type, bubbles, cancelable, detail);
return e;
}
var current_component;
function set_current_component(component) {
current_component = component;
}
function get_current_component() {
if (!current_component)
throw new Error("Function called outside component initialization");
return current_component;
}
function onMount(fn) {
get_current_component().$$.on_mount.push(fn);
}
function createEventDispatcher() {
const component = get_current_component();
return (type, detail, { cancelable = false } = {}) => {
const callbacks = component.$$.callbacks[type];
if (callbacks) {
const event = custom_event(type, detail, { cancelable });
callbacks.slice().forEach((fn) => {
fn.call(component, event);
});
return !event.defaultPrevented;
}
return true;
};
}
var dirty_components = [];
var binding_callbacks = [];
var render_callbacks = [];
var flush_callbacks = [];
var resolved_promise = Promise.resolve();
var update_scheduled = false;
function schedule_update() {
if (!update_scheduled) {
update_scheduled = true;
resolved_promise.then(flush);
}
}
function add_render_callback(fn) {
render_callbacks.push(fn);
}
var seen_callbacks = /* @__PURE__ */ new Set();
var flushidx = 0;
function flush() {
const saved_component = current_component;
do {
while (flushidx < dirty_components.length) {
const component = dirty_components[flushidx];
flushidx++;
set_current_component(component);
update(component.$$);
}
set_current_component(null);
dirty_components.length = 0;
flushidx = 0;
while (binding_callbacks.length)
binding_callbacks.pop()();
for (let i = 0; i < render_callbacks.length; i += 1) {
const callback = render_callbacks[i];
if (!seen_callbacks.has(callback)) {
seen_callbacks.add(callback);
callback();
}
}
render_callbacks.length = 0;
} while (dirty_components.length);
while (flush_callbacks.length) {
flush_callbacks.pop()();
}
update_scheduled = false;
seen_callbacks.clear();
set_current_component(saved_component);
}
function update($$) {
if ($$.fragment !== null) {
$$.update();
run_all($$.before_update);
const dirty = $$.dirty;
$$.dirty = [-1];
$$.fragment && $$.fragment.p($$.ctx, dirty);
$$.after_update.forEach(add_render_callback);
}
}
var outroing = /* @__PURE__ */ new Set();
var outros;
function transition_in(block, local) {
if (block && block.i) {
outroing.delete(block);
block.i(local);
}
}
function transition_out(block, local, detach2, callback) {
if (block && block.o) {
if (outroing.has(block))
return;
outroing.add(block);
outros.c.push(() => {
outroing.delete(block);
if (callback) {
if (detach2)
block.d(1);
callback();
}
});
block.o(local);
} else if (callback) {
callback();
}
}
var globals = typeof window !== "undefined" ? window : typeof globalThis !== "undefined" ? globalThis : global;
function get_spread_update(levels, updates) {
const update2 = {};
const to_null_out = {};
const accounted_for = { $$scope: 1 };
let i = levels.length;
while (i--) {
const o = levels[i];
const n = updates[i];
if (n) {
for (const key in o) {
if (!(key in n))
to_null_out[key] = 1;
}
for (const key in n) {
if (!accounted_for[key]) {
update2[key] = n[key];
accounted_for[key] = 1;
}
}
levels[i] = n;
} else {
for (const key in o) {
accounted_for[key] = 1;
}
}
}
for (const key in to_null_out) {
if (!(key in update2))
update2[key] = void 0;
}
return update2;
}
function create_component(block) {
block && block.c();
}
function mount_component(component, target, anchor, customElement) {
const { fragment, after_update } = component.$$;
fragment && fragment.m(target, anchor);
if (!customElement) {
add_render_callback(() => {
const new_on_destroy = component.$$.on_mount.map(run).filter(is_function);
if (component.$$.on_destroy) {
component.$$.on_destroy.push(...new_on_destroy);
} else {
run_all(new_on_destroy);
}
component.$$.on_mount = [];
});
}
after_update.forEach(add_render_callback);
}
function destroy_component(component, detaching) {
const $$ = component.$$;
if ($$.fragment !== null) {
run_all($$.on_destroy);
$$.fragment && $$.fragment.d(detaching);
$$.on_destroy = $$.fragment = null;
$$.ctx = [];
}
}
function make_dirty(component, i) {
if (component.$$.dirty[0] === -1) {
dirty_components.push(component);
schedule_update();
component.$$.dirty.fill(0);
}
component.$$.dirty[i / 31 | 0] |= 1 << i % 31;
}
function init(component, options, instance5, create_fragment5, not_equal, props, append_styles2, dirty = [-1]) {
const parent_component = current_component;
set_current_component(component);
const $$ = component.$$ = {
fragment: null,
ctx: [],
props,
update: noop,
not_equal,
bound: blank_object(),
on_mount: [],
on_destroy: [],
on_disconnect: [],
before_update: [],
after_update: [],
context: new Map(options.context || (parent_component ? parent_component.$$.context : [])),
callbacks: blank_object(),
dirty,
skip_bound: false,
root: options.target || parent_component.$$.root
};
append_styles2 && append_styles2($$.root);
let ready = false;
$$.ctx = instance5 ? instance5(component, options.props || {}, (i, ret, ...rest) => {
const value = rest.length ? rest[0] : ret;
if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {
if (!$$.skip_bound && $$.bound[i])
$$.bound[i](value);
if (ready)
make_dirty(component, i);
}
return ret;
}) : [];
$$.update();
ready = true;
run_all($$.before_update);
$$.fragment = create_fragment5 ? create_fragment5($$.ctx) : false;
if (options.target) {
if (options.hydrate) {
start_hydrating();
const nodes = children(options.target);
$$.fragment && $$.fragment.l(nodes);
nodes.forEach(detach);
} else {
$$.fragment && $$.fragment.c();
}
if (options.intro)
transition_in(component.$$.fragment);
mount_component(component, options.target, options.anchor, options.customElement);
end_hydrating();
flush();
}
set_current_component(parent_component);
}
var SvelteElement;
if (typeof HTMLElement === "function") {
SvelteElement = class extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: "open" });
}
connectedCallback() {
const { on_mount } = this.$$;
this.$$.on_disconnect = on_mount.map(run).filter(is_function);
for (const key in this.$$.slotted) {
this.appendChild(this.$$.slotted[key]);
}
}
attributeChangedCallback(attr2, _oldValue, newValue) {
this[attr2] = newValue;
}
disconnectedCallback() {
run_all(this.$$.on_disconnect);
}
$destroy() {
destroy_component(this, 1);
this.$destroy = noop;
}
$on(type, callback) {
if (!is_function(callback)) {
return noop;
}
const callbacks = this.$$.callbacks[type] || (this.$$.callbacks[type] = []);
callbacks.push(callback);
return () => {
const index = callbacks.indexOf(callback);
if (index !== -1)
callbacks.splice(index, 1);
};
}
$set($$props) {
if (this.$$set && !is_empty($$props)) {
this.$$.skip_bound = true;
this.$$set($$props);
this.$$.skip_bound = false;
}
}
};
}
var SvelteComponent = class {
$destroy() {
destroy_component(this, 1);
this.$destroy = noop;
}
$on(type, callback) {
if (!is_function(callback)) {
return noop;
}
const callbacks = this.$$.callbacks[type] || (this.$$.callbacks[type] = []);
callbacks.push(callback);
return () => {
const index = callbacks.indexOf(callback);
if (index !== -1)
callbacks.splice(index, 1);
};
}
$set($$props) {
if (this.$$set && !is_empty($$props)) {
this.$$.skip_bound = true;
this.$$set($$props);
this.$$.skip_bound = false;
}
}
};
// src/ui/component/ObsidianButton.svelte
function create_fragment(ctx) {
let button;
let current;
let mounted;
let dispose;
const default_slot_template = ctx[4].default;
const default_slot = create_slot(default_slot_template, ctx, ctx[3], null);
return {
c() {
button = element("button");
if (default_slot)
default_slot.c();
attr(button, "aria-label", ctx[0]);
button.disabled = ctx[1];
toggle_class(button, "mod-cta", !ctx[1]);
},
m(target, anchor) {
insert(target, button, anchor);
if (default_slot) {
default_slot.m(button, null);
}
current = true;
if (!mounted) {
dispose = listen(button, "click", ctx[2]);
mounted = true;
}
},
p(ctx2, [dirty]) {
if (default_slot) {
if (default_slot.p && (!current || dirty & 8)) {
update_slot_base(
default_slot,
default_slot_template,
ctx2,
ctx2[3],
!current ? get_all_dirty_from_scope(ctx2[3]) : get_slot_changes(default_slot_template, ctx2[3], dirty, null),
null
);
}
}
if (!current || dirty & 1) {
attr(button, "aria-label", ctx2[0]);
}
if (!current || dirty & 2) {
button.disabled = ctx2[1];
}
if (!current || dirty & 2) {
toggle_class(button, "mod-cta", !ctx2[1]);
}
},
i(local) {
if (current)
return;
transition_in(default_slot, local);
current = true;
},
o(local) {
transition_out(default_slot, local);
current = false;
},
d(detaching) {
if (detaching)
detach(button);
if (default_slot)
default_slot.d(detaching);
mounted = false;
dispose();
}
};
}
function instance($$self, $$props, $$invalidate) {
let { $$slots: slots = {}, $$scope } = $$props;
let { popup } = $$props;
let { disabled = false } = $$props;
const dispatcher = createEventDispatcher();
const handleClick = () => {
dispatcher("click");
};
$$self.$$set = ($$props2) => {
if ("popup" in $$props2)
$$invalidate(0, popup = $$props2.popup);
if ("disabled" in $$props2)
$$invalidate(1, disabled = $$props2.disabled);
if ("$$scope" in $$props2)
$$invalidate(3, $$scope = $$props2.$$scope);
};
return [popup, disabled, handleClick, $$scope, slots];
}
var ObsidianButton = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance, create_fragment, safe_not_equal, { popup: 0, disabled: 1 });
}
};
var ObsidianButton_default = ObsidianButton;
// node_modules/svelte-lucide-icons/icons/File.svelte
function create_fragment2(ctx) {
let svg;
let path;
let polyline;
let current;
const default_slot_template = ctx[3].default;
const default_slot = create_slot(default_slot_template, ctx, ctx[2], null);
let svg_levels = [
{ xmlns: "http://www.w3.org/2000/svg" },
{ width: ctx[0] },
{ height: ctx[0] },
{ viewBox: "0 0 24 24" },
{ fill: "none" },
{ stroke: "currentColor" },
{ "stroke-width": "2" },
{ "stroke-linecap": "round" },
{ "stroke-linejoin": "round" },
ctx[1]
];
let svg_data = {};
for (let i = 0; i < svg_levels.length; i += 1) {
svg_data = assign(svg_data, svg_levels[i]);
}
return {
c() {
svg = svg_element("svg");
if (default_slot)
default_slot.c();
path = svg_element("path");
polyline = svg_element("polyline");
attr(path, "d", "M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z");
attr(polyline, "points", "14 2 14 8 20 8");
set_svg_attributes(svg, svg_data);
},
m(target, anchor) {
insert(target, svg, anchor);
if (default_slot) {
default_slot.m(svg, null);
}
append(svg, path);
append(svg, polyline);
current = true;
},
p(ctx2, [dirty]) {
if (default_slot) {
if (default_slot.p && (!current || dirty & 4)) {
update_slot_base(
default_slot,
default_slot_template,
ctx2,
ctx2[2],
!current ? get_all_dirty_from_scope(ctx2[2]) : get_slot_changes(default_slot_template, ctx2[2], dirty, null),
null
);
}
}
set_svg_attributes(svg, svg_data = get_spread_update(svg_levels, [
{ xmlns: "http://www.w3.org/2000/svg" },
(!current || dirty & 1) && { width: ctx2[0] },
(!current || dirty & 1) && { height: ctx2[0] },
{ viewBox: "0 0 24 24" },
{ fill: "none" },
{ stroke: "currentColor" },
{ "stroke-width": "2" },
{ "stroke-linecap": "round" },
{ "stroke-linejoin": "round" },
dirty & 2 && ctx2[1]
]));
},
i(local) {
if (current)
return;
transition_in(default_slot, local);
current = true;
},
o(local) {
transition_out(default_slot, local);
current = false;
},
d(detaching) {
if (detaching)
detach(svg);
if (default_slot)
default_slot.d(detaching);
}
};
}
function instance2($$self, $$props, $$invalidate) {
const omit_props_names = ["size"];
let $$restProps = compute_rest_props($$props, omit_props_names);
let { $$slots: slots = {}, $$scope } = $$props;
let { size = 24 } = $$props;
$$self.$$set = ($$new_props) => {
$$props = assign(assign({}, $$props), exclude_internal_props($$new_props));
$$invalidate(1, $$restProps = compute_rest_props($$props, omit_props_names));
if ("size" in $$new_props)
$$invalidate(0, size = $$new_props.size);
if ("$$scope" in $$new_props)
$$invalidate(2, $$scope = $$new_props.$$scope);
};
return [size, $$restProps, $$scope, slots];
}
var File = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance2, create_fragment2, safe_not_equal, { size: 0 });
}
};
var File_default = File;
// src/ui/component/ObsidianIconButton.svelte
function add_css(target) {
append_styles(target, "svelte-12yh6aw", ".wrapper.svelte-12yh6aw{display:flex;justify-content:center;margin:0}.button-enabled.svelte-12yh6aw:hover{color:var(--interactive-accent)}.button-disabled.svelte-12yh6aw{color:var(--text-muted)}");
}
function create_fragment3(ctx) {
let div;
let button;
let button_class_value;
let current;
let mounted;
let dispose;
const default_slot_template = ctx[4].default;
const default_slot = create_slot(default_slot_template, ctx, ctx[3], null);
return {
c() {
div = element("div");
button = element("button");
if (default_slot)
default_slot.c();
attr(button, "aria-label", ctx[0]);
button.disabled = ctx[1];
attr(button, "class", button_class_value = null_to_empty(ctx[1] ? "button-disabled" : "button-enabled") + " svelte-12yh6aw");
set_style(button, "background-color", "transparent");
set_style(button, "padding", "0");
attr(div, "class", "wrapper svelte-12yh6aw");
},
m(target, anchor) {
insert(target, div, anchor);
append(div, button);
if (default_slot) {
default_slot.m(button, null);
}
current = true;
if (!mounted) {
dispose = listen(button, "click", ctx[2]);
mounted = true;
}
},
p(ctx2, [dirty]) {
if (default_slot) {
if (default_slot.p && (!current || dirty & 8)) {
update_slot_base(
default_slot,
default_slot_template,
ctx2,
ctx2[3],
!current ? get_all_dirty_from_scope(ctx2[3]) : get_slot_changes(default_slot_template, ctx2[3], dirty, null),
null
);
}
}
if (!current || dirty & 1) {
attr(button, "aria-label", ctx2[0]);
}
if (!current || dirty & 2) {
button.disabled = ctx2[1];
}
if (!current || dirty & 2 && button_class_value !== (button_class_value = null_to_empty(ctx2[1] ? "button-disabled" : "button-enabled") + " svelte-12yh6aw")) {
attr(button, "class", button_class_value);
}
},
i(local) {
if (current)
return;
transition_in(default_slot, local);
current = true;
},
o(local) {
transition_out(default_slot, local);
current = false;
},
d(detaching) {
if (detaching)
detach(div);
if (default_slot)
default_slot.d(detaching);
mounted = false;
dispose();
}
};
}
function instance3($$self, $$props, $$invalidate) {
let { $$slots: slots = {}, $$scope } = $$props;
let { popup } = $$props;
let { disabled = false } = $$props;
const dispatcher = createEventDispatcher();
const handleClick = () => {
if (!disabled) {
dispatcher("click");
}
};
$$self.$$set = ($$props2) => {
if ("popup" in $$props2)
$$invalidate(0, popup = $$props2.popup);
if ("disabled" in $$props2)
$$invalidate(1, disabled = $$props2.disabled);
if ("$$scope" in $$props2)
$$invalidate(3, $$scope = $$props2.$$scope);
};
return [popup, disabled, handleClick, $$scope, slots];
}
var ObsidianIconButton = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance3, create_fragment3, safe_not_equal, { popup: 0, disabled: 1 }, add_css);
}
};
var ObsidianIconButton_default = ObsidianIconButton;
// src/ui/component/CustomDictionaryWordAdd.svelte
function get_each_context(ctx, list, i) {
const child_ctx = ctx.slice();
child_ctx[26] = list[i];
return child_ctx;
}
function create_each_block(ctx) {
let option;
let t0_value = ctx[26].path + "";
let t0;
let t1;
let option_value_value;
return {
c() {
option = element("option");
t0 = text(t0_value);
t1 = space();
option.__value = option_value_value = ctx[26];
option.value = option.__value;
},
m(target, anchor) {
insert(target, option, anchor);
append(option, t0);
append(option, t1);
},
p(ctx2, dirty) {
if (dirty & 32 && t0_value !== (t0_value = ctx2[26].path + ""))
set_data(t0, t0_value);
if (dirty & 32 && option_value_value !== (option_value_value = ctx2[26])) {
option.__value = option_value_value;
option.value = option.__value;
}
},
d(detaching) {
if (detaching)
detach(option);
}
};
}
function create_default_slot_1(ctx) {
let file;
let current;
file = new File_default({});
return {
c() {
create_component(file.$$.fragment);
},
m(target, anchor) {
mount_component(file, target, anchor);
current = true;
},
i(local) {
if (current)
return;
transition_in(file.$$.fragment, local);
current = true;
},
o(local) {
transition_out(file.$$.fragment, local);
current = false;
},
d(detaching) {
destroy_component(file, detaching);
}
};
}
function create_if_block_1(ctx) {
let label;
let input;
let t;
let mounted;
let dispose;
return {
c() {
label = element("label");
input = element("input");
t = text("\n Distinguish between display and insertion");
attr(input, "type", "checkbox");
},
m(target, anchor) {
insert(target, label, anchor);
append(label, input);
input.checked = ctx[1];
append(label, t);
if (!mounted) {
dispose = listen(input, "change", ctx[21]);
mounted = true;
}
},
p(ctx2, dirty) {
if (dirty & 2) {
input.checked = ctx2[1];
}
},
d(detaching) {
if (detaching)
detach(label);
mounted = false;
dispose();
}
};
}
function create_if_block(ctx) {
let h3;
let t1;
let textarea;
let mounted;
let dispose;
return {
c() {
h3 = element("h3");
h3.textContent = "Displayed Word";
t1 = space();
textarea = element("textarea");
set_style(textarea, "width", "100%");
attr(textarea, "rows", "3");
},
m(target, anchor) {
insert(target, h3, anchor);
insert(target, t1, anchor);
insert(target, textarea, anchor);
set_input_value(textarea, ctx[3]);
ctx[23](textarea);
if (!mounted) {
dispose = listen(textarea, "input", ctx[22]);
mounted = true;
}
},
p(ctx2, dirty) {
if (dirty & 8) {
set_input_value(textarea, ctx2[3]);
}
},
d(detaching) {
if (detaching)
detach(h3);
if (detaching)
detach(t1);
if (detaching)
detach(textarea);
ctx[23](null);
mounted = false;
dispose();
}
};
}
function create_default_slot(ctx) {
let t;
return {
c() {
t = text("Submit");
},
m(target, anchor) {
insert(target, t, anchor);
},
d(detaching) {
if (detaching)
detach(t);
}
};
}
function create_fragment4(ctx) {
let div2;
let h2;
let t1;
let h30;
let t3;
let div0;
let select;
let t4;
let obsidianiconbutton;
let t5;
let h31;
let t6;
let t7;
let textarea0;
let t8;
let t9;
let t10;
let h32;
let t12;
let input;
let t13;
let h33;
let t15;
let textarea1;
let t16;
let div1;
let obsidianbutton;
let current;
let mounted;
let dispose;
let each_value = ctx[5];
let each_blocks = [];
for (let i = 0; i < each_value.length; i += 1) {
each_blocks[i] = create_each_block(get_each_context(ctx, each_value, i));
}
obsidianiconbutton = new ObsidianIconButton_default({
props: {
popup: "Open the file",
$$slots: { default: [create_default_slot_1] },
$$scope: { ctx }
}
});
obsidianiconbutton.$on("click", ctx[18]);
let if_block0 = ctx[11] && create_if_block_1(ctx);
let if_block1 = ctx[1] && create_if_block(ctx);
obsidianbutton = new ObsidianButton_default({
props: {
disabled: !ctx[12],
$$slots: { default: [create_default_slot] },
$$scope: { ctx }
}
});
obsidianbutton.$on("click", ctx[13]);
return {
c() {
div2 = element("div");
h2 = element("h2");
h2.textContent = "Add a word to a custom dictionary";
t1 = space();
h30 = element("h3");
h30.textContent = "Dictionary";
t3 = space();
div0 = element("div");
select = element("select");
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].c();
}
t4 = space();
create_component(obsidianiconbutton.$$.fragment);
t5 = space();
h31 = element("h3");
t6 = text(ctx[10]);
t7 = space();
textarea0 = element("textarea");
t8 = space();
if (if_block0)
if_block0.c();
t9 = space();
if (if_block1)
if_block1.c();
t10 = space();
h32 = element("h3");
h32.textContent = "Description";
t12 = space();
input = element("input");
t13 = space();
h33 = element("h3");
h33.textContent = "Aliases (for each line)";
t15 = space();
textarea1 = element("textarea");
t16 = space();
div1 = element("div");
create_component(obsidianbutton.$$.fragment);
attr(select, "class", "dropdown");
if (ctx[2] === void 0)
add_render_callback(() => ctx[17].call(select));
set_style(div0, "display", "flex");
set_style(div0, "gap", "10px");
set_style(textarea0, "width", "100%");
attr(textarea0, "rows", "3");
attr(input, "type", "text");
set_style(input, "width", "100%");
set_style(textarea1, "width", "100%");
attr(textarea1, "rows", "3");
set_style(div1, "text-align", "center");
set_style(div1, "width", "100%");
set_style(div1, "padding-top", "15px");
},
m(target, anchor) {
insert(target, div2, anchor);
append(div2, h2);
append(div2, t1);
append(div2, h30);
append(div2, t3);
append(div2, div0);
append(div0, select);
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].m(select, null);
}
select_option(select, ctx[2]);
append(div0, t4);
mount_component(obsidianiconbutton, div0, null);
append(div2, t5);
append(div2, h31);
append(h31, t6);
append(div2, t7);
append(div2, textarea0);
set_input_value(textarea0, ctx[0]);
ctx[20](textarea0);
append(div2, t8);
if (if_block0)
if_block0.m(div2, null);
append(div2, t9);
if (if_block1)
if_block1.m(div2, null);
append(div2, t10);
append(div2, h32);
append(div2, t12);
append(div2, input);
set_input_value(input, ctx[4]);
append(div2, t13);
append(div2, h33);
append(div2, t15);
append(div2, textarea1);
set_input_value(textarea1, ctx[8]);
append(div2, t16);
append(div2, div1);
mount_component(obsidianbutton, div1, null);
current = true;
if (!mounted) {
dispose = [
listen(select, "change", ctx[17]),
listen(textarea0, "input", ctx[19]),
listen(input, "input", ctx[24]),
listen(textarea1, "input", ctx[25])
];
mounted = true;
}
},
p(ctx2, [dirty]) {
if (dirty & 32) {
each_value = ctx2[5];
let i;
for (i = 0; i < each_value.length; i += 1) {
const child_ctx = get_each_context(ctx2, each_value, i);
if (each_blocks[i]) {
each_blocks[i].p(child_ctx, dirty);
} else {
each_blocks[i] = create_each_block(child_ctx);
each_blocks[i].c();
each_blocks[i].m(select, null);
}
}
for (; i < each_blocks.length; i += 1) {
each_blocks[i].d(1);
}
each_blocks.length = each_value.length;
}
if (dirty & 36) {
select_option(select, ctx2[2]);
}
const obsidianiconbutton_changes = {};
if (dirty & 536870912) {
obsidianiconbutton_changes.$$scope = { dirty, ctx: ctx2 };
}
obsidianiconbutton.$set(obsidianiconbutton_changes);
if (!current || dirty & 1024)
set_data(t6, ctx2[10]);
if (dirty & 1) {
set_input_value(textarea0, ctx2[0]);
}
if (ctx2[11]) {
if (if_block0) {
if_block0.p(ctx2, dirty);
} else {
if_block0 = create_if_block_1(ctx2);
if_block0.c();
if_block0.m(div2, t9);
}
} else if (if_block0) {
if_block0.d(1);
if_block0 = null;
}
if (ctx2[1]) {
if (if_block1) {
if_block1.p(ctx2, dirty);
} else {
if_block1 = create_if_block(ctx2);
if_block1.c();
if_block1.m(div2, t10);
}
} else if (if_block1) {
if_block1.d(1);
if_block1 = null;
}
if (dirty & 16 && input.value !== ctx2[4]) {
set_input_value(input, ctx2[4]);
}
if (dirty & 256) {
set_input_value(textarea1, ctx2[8]);
}
const obsidianbutton_changes = {};
if (dirty & 4096)
obsidianbutton_changes.disabled = !ctx2[12];
if (dirty & 536870912) {
obsidianbutton_changes.$$scope = { dirty, ctx: ctx2 };
}
obsidianbutton.$set(obsidianbutton_changes);
},
i(local) {
if (current)
return;
transition_in(obsidianiconbutton.$$.fragment, local);
transition_in(obsidianbutton.$$.fragment, local);
current = true;
},
o(local) {
transition_out(obsidianiconbutton.$$.fragment, local);
transition_out(obsidianbutton.$$.fragment, local);
current = false;
},
d(detaching) {
if (detaching)
detach(div2);
destroy_each(each_blocks, detaching);
destroy_component(obsidianiconbutton);
ctx[20](null);
if (if_block0)
if_block0.d();
if (if_block1)
if_block1.d();
destroy_component(obsidianbutton);
mounted = false;
run_all(dispose);
}
};
}
function instance4($$self, $$props, $$invalidate) {
let enableSubmit;
let enableDisplayedWord;
let firstWordTitle;
let { dictionaries } = $$props;
let { selectedDictionary } = $$props;
let { inputWord = "" } = $$props;
let { useDisplayedWord = false } = $$props;
let { displayedWord = "" } = $$props;
let { description = "" } = $$props;
let { aliases = [] } = $$props;
let { dividerForDisplay = "" } = $$props;
let { onSubmit } = $$props;
let { onClickFileIcon } = $$props;
let aliasesStr = aliases.join("\n");
let wordRef = null;
let displayedWordRef = null;
const handleSubmit = () => {
onSubmit(selectedDictionary.path, {
value: displayedWord || inputWord,
description,
aliases: aliasesStr.split("\n"),
type: "customDictionary",
createdPath: selectedDictionary.path,
insertedText: displayedWord ? inputWord : void 0
});
};
onMount(() => {
setTimeout(() => wordRef.focus(), 50);
});
function select_change_handler() {
selectedDictionary = select_value(this);
$$invalidate(2, selectedDictionary);
$$invalidate(5, dictionaries);
}
const click_handler = () => onClickFileIcon(selectedDictionary.path);
function textarea0_input_handler() {
inputWord = this.value;
$$invalidate(0, inputWord);
}
function textarea0_binding($$value) {
binding_callbacks[$$value ? "unshift" : "push"](() => {
wordRef = $$value;
$$invalidate(9, wordRef);
});
}
function input_change_handler() {
useDisplayedWord = this.checked;
$$invalidate(1, useDisplayedWord);
}
function textarea_input_handler() {
displayedWord = this.value;
$$invalidate(3, displayedWord);
}
function textarea_binding($$value) {
binding_callbacks[$$value ? "unshift" : "push"](() => {
displayedWordRef = $$value;
$$invalidate(7, displayedWordRef);
});
}
function input_input_handler() {
description = this.value;
$$invalidate(4, description);
}
function textarea1_input_handler() {
aliasesStr = this.value;
$$invalidate(8, aliasesStr);
}
$$self.$$set = ($$props2) => {
if ("dictionaries" in $$props2)
$$invalidate(5, dictionaries = $$props2.dictionaries);
if ("selectedDictionary" in $$props2)
$$invalidate(2, selectedDictionary = $$props2.selectedDictionary);
if ("inputWord" in $$props2)
$$invalidate(0, inputWord = $$props2.inputWord);
if ("useDisplayedWord" in $$props2)
$$invalidate(1, useDisplayedWord = $$props2.useDisplayedWord);
if ("displayedWord" in $$props2)
$$invalidate(3, displayedWord = $$props2.displayedWord);
if ("description" in $$props2)
$$invalidate(4, description = $$props2.description);
if ("aliases" in $$props2)
$$invalidate(14, aliases = $$props2.aliases);
if ("dividerForDisplay" in $$props2)
$$invalidate(15, dividerForDisplay = $$props2.dividerForDisplay);
if ("onSubmit" in $$props2)
$$invalidate(16, onSubmit = $$props2.onSubmit);
if ("onClickFileIcon" in $$props2)
$$invalidate(6, onClickFileIcon = $$props2.onClickFileIcon);
};
$$self.$$.update = () => {
if ($$self.$$.dirty & 1) {
$:
$$invalidate(12, enableSubmit = inputWord.length > 0);
}
if ($$self.$$.dirty & 32768) {
$:
$$invalidate(11, enableDisplayedWord = Boolean(dividerForDisplay));
}
if ($$self.$$.dirty & 2) {
$:
$$invalidate(10, firstWordTitle = useDisplayedWord ? "Inserted word" : "Word");
}
if ($$self.$$.dirty & 130) {
$: {
if (useDisplayedWord) {
displayedWordRef === null || displayedWordRef === void 0 ? void 0 : displayedWordRef.focus();
}
}
}
};
return [
inputWord,
useDisplayedWord,
selectedDictionary,
displayedWord,
description,
dictionaries,
onClickFileIcon,
displayedWordRef,
aliasesStr,
wordRef,
firstWordTitle,
enableDisplayedWord,
enableSubmit,
handleSubmit,
aliases,
dividerForDisplay,
onSubmit,
select_change_handler,
click_handler,
textarea0_input_handler,
textarea0_binding,
input_change_handler,
textarea_input_handler,
textarea_binding,
input_input_handler,
textarea1_input_handler
];
}
var CustomDictionaryWordAdd = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance4, create_fragment4, safe_not_equal, {
dictionaries: 5,
selectedDictionary: 2,
inputWord: 0,
useDisplayedWord: 1,
displayedWord: 3,
description: 4,
aliases: 14,
dividerForDisplay: 15,
onSubmit: 16,
onClickFileIcon: 6
});
}
};
var CustomDictionaryWordAdd_default = CustomDictionaryWordAdd;
// src/ui/CustomDictionaryWordAddModal.ts
var CustomDictionaryWordAddModal = class extends import_obsidian5.Modal {
constructor(app, dictionaryPaths, initialValue = "", dividerForDisplay = "", onSubmit) {
super(app);
const appHelper = new AppHelper(app);
const dictionaries = dictionaryPaths.map((x) => ({ id: x, path: x }));
const { contentEl } = this;
this.component = new CustomDictionaryWordAdd_default({
target: contentEl,
props: {
dictionaries,
selectedDictionary: dictionaries[0],
inputWord: initialValue,
dividerForDisplay,
onSubmit,
onClickFileIcon: (dictionaryPath) => {
const markdownFile = appHelper.getMarkdownFileByPath(dictionaryPath);
if (!markdownFile) {
new import_obsidian5.Notice(`Can't open ${dictionaryPath}`);
return;
}
this.close();
appHelper.openMarkdownFile(markdownFile, true);
}
}
});
}
onClose() {
super.onClose();
this.component.$destroy();
}
};
// src/main.ts
var import_ts_deepmerge = __toESM(require_dist());
var VariousComponents = class extends import_obsidian6.Plugin {
onunload() {
super.onunload();
this.suggester.unregister();
}
async onload() {
this.appHelper = new AppHelper(this.app);
this.registerEvent(
this.app.workspace.on("editor-menu", (menu) => {
if (!this.appHelper.getSelection()) {
return;
}
menu.addItem(
(item) => item.setTitle("Add to custom dictionary").setIcon("stacked-levels").onClick(() => {
this.addWordToCustomDictionary();
})
);
})
);
await this.loadSettings();
this.settingTab = new VariousComplementsSettingTab(this.app, this);
this.addSettingTab(this.settingTab);
this.statusBar = ProviderStatusBar.new(
this.addStatusBarItem(),
this.settings.showMatchStrategy,
this.settings.showIndexingStatus,
this.settings.showComplementAutomatically
);
this.statusBar.setOnClickStrategyListener(async () => {
await this.settingTab.toggleMatchStrategy();
});
this.statusBar.setOnClickComplementAutomatically(async () => {
await this.settingTab.toggleComplementAutomatically();
});
const debouncedSaveData = (0, import_obsidian6.debounce)(async () => {
await this.saveData(this.settings);
}, 5e3);
this.suggester = await AutoCompleteSuggest.new(
this.app,
this.settings,
this.statusBar,
debouncedSaveData
);
this.registerEditorSuggest(this.suggester);
this.addCommand({
id: "reload-custom-dictionaries",
name: "Reload custom dictionaries",
hotkeys: [{ modifiers: ["Mod", "Shift"], key: "r" }],
callback: async () => {
await this.suggester.refreshCustomDictionaryTokens();
}
});
this.addCommand({
id: "reload-current-vault",
name: "Reload current vault",
callback: async () => {
await this.suggester.refreshCurrentVaultTokens();
}
});
this.addCommand({
id: "toggle-match-strategy",
name: "Toggle Match strategy",
callback: async () => {
await this.settingTab.toggleMatchStrategy();
}
});
this.addCommand({
id: "toggle-complement-automatically",
name: "Toggle Complement automatically",
callback: async () => {
await this.settingTab.toggleComplementAutomatically();
}
});
this.addCommand({
id: "show-suggestions",
name: "Show suggestions",
hotkeys: [{ modifiers: ["Mod"], key: " " }],
callback: async () => {
this.suggester.triggerComplete();
}
});
this.addCommand({
id: "hide-suggestions",
name: "Hide suggestions",
callback: async () => {
this.suggester.hideCompletion();
}
});
this.addCommand({
id: "add-word-custom-dictionary",
name: "Add a word to a custom dictionary",
hotkeys: [{ modifiers: ["Mod", "Shift"], key: " " }],
callback: async () => {
this.addWordToCustomDictionary();
}
});
this.addCommand({
id: "predictable-complements",
name: "Predictable complement",
callback: async () => {
this.suggester.predictableComplete();
}
});
this.addCommand({
id: "copy-plugin-settings",
name: "Copy plugin settings",
callback: async () => {
await navigator.clipboard.writeText(
this.settingTab.getPluginSettingsAsJsonString()
);
new import_obsidian6.Notice("Copy settings of Various Complements");
}
});
}
async loadSettings() {
const currentSettings = await this.loadData();
this.settings = (0, import_ts_deepmerge.default)(DEFAULT_SETTINGS, currentSettings != null ? currentSettings : {});
}
async saveSettings(needUpdateTokens = {}) {
await this.saveData(this.settings);
await this.suggester.updateSettings(this.settings);
if (needUpdateTokens.currentFile) {
await this.suggester.refreshCurrentFileTokens();
}
if (needUpdateTokens.currentVault) {
await this.suggester.refreshCurrentVaultTokens();
}
if (needUpdateTokens.customDictionary) {
await this.suggester.refreshCustomDictionaryTokens();
}
if (needUpdateTokens.internalLink) {
await this.suggester.refreshInternalLinkTokens();
}
if (needUpdateTokens.frontMatter) {
await this.suggester.refreshFrontMatterTokens();
}
}
addWordToCustomDictionary() {
const selectedWord = this.appHelper.getSelection();
const provider = this.suggester.customDictionaryWordProvider;
const modal = new CustomDictionaryWordAddModal(
this.app,
provider.editablePaths,
selectedWord,
this.settings.delimiterToDivideSuggestionsForDisplayFromInsertion,
async (dictionaryPath, _word) => {
const word = {
..._word,
caretSymbol: this.settings.caretLocationSymbolAfterComplement
};
if (provider.wordByValue[word.value]) {
new import_obsidian6.Notice(`\u26A0 ${word.value} already exists`, 0);
return;
}
await provider.addWordWithDictionary(word, dictionaryPath);
new import_obsidian6.Notice(`Added ${word.value}`);
modal.close();
}
);
modal.open();
}
};