/* 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-zA-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 '' and there is '
  • ' in custom dictionary, it complements '
  • ' and move a caret where between '
  • ' and `
  • `." ).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(); } };