5186 lines
186 KiB
JavaScript
5186 lines
186 KiB
JavaScript
/*
|
|
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
if you want to view the source, please visit the github repository of this plugin
|
|
*/
|
|
|
|
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 __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
|
|
var __commonJS = (cb, mod) => function __require() {
|
|
return mod || (0, cb[Object.keys(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
};
|
|
var __export = (target, all) => {
|
|
__markAsModule(target);
|
|
for (var name in all)
|
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
};
|
|
var __reExport = (target, module2, desc) => {
|
|
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
|
|
for (let key of __getOwnPropNames(module2))
|
|
if (!__hasOwnProp.call(target, key) && key !== "default")
|
|
__defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
|
|
}
|
|
return target;
|
|
};
|
|
var __toModule = (module2) => {
|
|
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
|
|
};
|
|
var __publicField = (obj, key, value) => {
|
|
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
return value;
|
|
};
|
|
|
|
// node_modules/math-expression-evaluator/src/math_function.js
|
|
var require_math_function = __commonJS({
|
|
"node_modules/math-expression-evaluator/src/math_function.js"(exports, module2) {
|
|
"use strict";
|
|
var Mexp = function(parsed) {
|
|
this.value = parsed;
|
|
};
|
|
Mexp.math = {
|
|
isDegree: true,
|
|
acos: function(x) {
|
|
return Mexp.math.isDegree ? 180 / Math.PI * Math.acos(x) : Math.acos(x);
|
|
},
|
|
add: function(a, b) {
|
|
return a + b;
|
|
},
|
|
asin: function(x) {
|
|
return Mexp.math.isDegree ? 180 / Math.PI * Math.asin(x) : Math.asin(x);
|
|
},
|
|
atan: function(x) {
|
|
return Mexp.math.isDegree ? 180 / Math.PI * Math.atan(x) : Math.atan(x);
|
|
},
|
|
acosh: function(x) {
|
|
return Math.log(x + Math.sqrt(x * x - 1));
|
|
},
|
|
asinh: function(x) {
|
|
return Math.log(x + Math.sqrt(x * x + 1));
|
|
},
|
|
atanh: function(x) {
|
|
return Math.log((1 + x) / (1 - x));
|
|
},
|
|
C: function(n, r) {
|
|
var pro = 1;
|
|
var other = n - r;
|
|
var choice = r;
|
|
if (choice < other) {
|
|
choice = other;
|
|
other = r;
|
|
}
|
|
for (var i = choice + 1; i <= n; i++) {
|
|
pro *= i;
|
|
}
|
|
return pro / Mexp.math.fact(other);
|
|
},
|
|
changeSign: function(x) {
|
|
return -x;
|
|
},
|
|
cos: function(x) {
|
|
if (Mexp.math.isDegree)
|
|
x = Mexp.math.toRadian(x);
|
|
return Math.cos(x);
|
|
},
|
|
cosh: function(x) {
|
|
return (Math.pow(Math.E, x) + Math.pow(Math.E, -1 * x)) / 2;
|
|
},
|
|
div: function(a, b) {
|
|
return a / b;
|
|
},
|
|
fact: function(n) {
|
|
if (n % 1 !== 0)
|
|
return "NaN";
|
|
var pro = 1;
|
|
for (var i = 2; i <= n; i++) {
|
|
pro *= i;
|
|
}
|
|
return pro;
|
|
},
|
|
inverse: function(x) {
|
|
return 1 / x;
|
|
},
|
|
log: function(i) {
|
|
return Math.log(i) / Math.log(10);
|
|
},
|
|
mod: function(a, b) {
|
|
return a % b;
|
|
},
|
|
mul: function(a, b) {
|
|
return a * b;
|
|
},
|
|
P: function(n, r) {
|
|
var pro = 1;
|
|
for (var i = Math.floor(n) - Math.floor(r) + 1; i <= Math.floor(n); i++) {
|
|
pro *= i;
|
|
}
|
|
return pro;
|
|
},
|
|
Pi: function(low, high, ex) {
|
|
var pro = 1;
|
|
for (var i = low; i <= high; i++) {
|
|
pro *= Number(ex.postfixEval({
|
|
n: i
|
|
}));
|
|
}
|
|
return pro;
|
|
},
|
|
pow10x: function(e) {
|
|
var x = 1;
|
|
while (e--) {
|
|
x *= 10;
|
|
}
|
|
return x;
|
|
},
|
|
sigma: function(low, high, ex) {
|
|
var sum = 0;
|
|
for (var i = low; i <= high; i++) {
|
|
sum += Number(ex.postfixEval({
|
|
n: i
|
|
}));
|
|
}
|
|
return sum;
|
|
},
|
|
sin: function(x) {
|
|
if (Mexp.math.isDegree)
|
|
x = Mexp.math.toRadian(x);
|
|
return Math.sin(x);
|
|
},
|
|
sinh: function(x) {
|
|
return (Math.pow(Math.E, x) - Math.pow(Math.E, -1 * x)) / 2;
|
|
},
|
|
sub: function(a, b) {
|
|
return a - b;
|
|
},
|
|
tan: function(x) {
|
|
if (Mexp.math.isDegree)
|
|
x = Mexp.math.toRadian(x);
|
|
return Math.tan(x);
|
|
},
|
|
tanh: function(x) {
|
|
return Mexp.sinha(x) / Mexp.cosha(x);
|
|
},
|
|
toRadian: function(x) {
|
|
return x * Math.PI / 180;
|
|
}
|
|
};
|
|
Mexp.Exception = function(message) {
|
|
this.message = message;
|
|
};
|
|
module2.exports = Mexp;
|
|
}
|
|
});
|
|
|
|
// node_modules/math-expression-evaluator/src/lexer.js
|
|
var require_lexer = __commonJS({
|
|
"node_modules/math-expression-evaluator/src/lexer.js"(exports, module2) {
|
|
"use strict";
|
|
var Mexp = require_math_function();
|
|
function inc(arr, val) {
|
|
for (var i = 0; i < arr.length; i++) {
|
|
arr[i] += val;
|
|
}
|
|
return arr;
|
|
}
|
|
var token = [
|
|
"sin",
|
|
"cos",
|
|
"tan",
|
|
"pi",
|
|
"(",
|
|
")",
|
|
"P",
|
|
"C",
|
|
" ",
|
|
"asin",
|
|
"acos",
|
|
"atan",
|
|
"7",
|
|
"8",
|
|
"9",
|
|
"int",
|
|
"cosh",
|
|
"acosh",
|
|
"ln",
|
|
"^",
|
|
"root",
|
|
"4",
|
|
"5",
|
|
"6",
|
|
"/",
|
|
"!",
|
|
"tanh",
|
|
"atanh",
|
|
"Mod",
|
|
"1",
|
|
"2",
|
|
"3",
|
|
"*",
|
|
"sinh",
|
|
"asinh",
|
|
"e",
|
|
"log",
|
|
"0",
|
|
".",
|
|
"+",
|
|
"-",
|
|
",",
|
|
"Sigma",
|
|
"n",
|
|
"Pi",
|
|
"pow"
|
|
];
|
|
var show = [
|
|
"sin",
|
|
"cos",
|
|
"tan",
|
|
"π",
|
|
"(",
|
|
")",
|
|
"P",
|
|
"C",
|
|
" ",
|
|
"asin",
|
|
"acos",
|
|
"atan",
|
|
"7",
|
|
"8",
|
|
"9",
|
|
"Int",
|
|
"cosh",
|
|
"acosh",
|
|
" ln",
|
|
"^",
|
|
"root",
|
|
"4",
|
|
"5",
|
|
"6",
|
|
"÷",
|
|
"!",
|
|
"tanh",
|
|
"atanh",
|
|
" Mod ",
|
|
"1",
|
|
"2",
|
|
"3",
|
|
"×",
|
|
"sinh",
|
|
"asinh",
|
|
"e",
|
|
" log",
|
|
"0",
|
|
".",
|
|
"+",
|
|
"-",
|
|
",",
|
|
"Σ",
|
|
"n",
|
|
"Π",
|
|
"pow"
|
|
];
|
|
var eva = [
|
|
Mexp.math.sin,
|
|
Mexp.math.cos,
|
|
Mexp.math.tan,
|
|
"PI",
|
|
"(",
|
|
")",
|
|
Mexp.math.P,
|
|
Mexp.math.C,
|
|
" ".anchor,
|
|
Mexp.math.asin,
|
|
Mexp.math.acos,
|
|
Mexp.math.atan,
|
|
"7",
|
|
"8",
|
|
"9",
|
|
Math.floor,
|
|
Mexp.math.cosh,
|
|
Mexp.math.acosh,
|
|
Math.log,
|
|
Math.pow,
|
|
Math.sqrt,
|
|
"4",
|
|
"5",
|
|
"6",
|
|
Mexp.math.div,
|
|
Mexp.math.fact,
|
|
Mexp.math.tanh,
|
|
Mexp.math.atanh,
|
|
Mexp.math.mod,
|
|
"1",
|
|
"2",
|
|
"3",
|
|
Mexp.math.mul,
|
|
Mexp.math.sinh,
|
|
Mexp.math.asinh,
|
|
"E",
|
|
Mexp.math.log,
|
|
"0",
|
|
".",
|
|
Mexp.math.add,
|
|
Mexp.math.sub,
|
|
",",
|
|
Mexp.math.sigma,
|
|
"n",
|
|
Mexp.math.Pi,
|
|
Math.pow
|
|
];
|
|
var preced = {
|
|
0: 11,
|
|
1: 0,
|
|
2: 3,
|
|
3: 0,
|
|
4: 0,
|
|
5: 0,
|
|
6: 0,
|
|
7: 11,
|
|
8: 11,
|
|
9: 1,
|
|
10: 10,
|
|
11: 0,
|
|
12: 11,
|
|
13: 0,
|
|
14: -1
|
|
};
|
|
var type = [
|
|
0,
|
|
0,
|
|
0,
|
|
3,
|
|
4,
|
|
5,
|
|
10,
|
|
10,
|
|
14,
|
|
0,
|
|
0,
|
|
0,
|
|
1,
|
|
1,
|
|
1,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
10,
|
|
0,
|
|
1,
|
|
1,
|
|
1,
|
|
2,
|
|
7,
|
|
0,
|
|
0,
|
|
2,
|
|
1,
|
|
1,
|
|
1,
|
|
2,
|
|
0,
|
|
0,
|
|
3,
|
|
0,
|
|
1,
|
|
6,
|
|
9,
|
|
9,
|
|
11,
|
|
12,
|
|
13,
|
|
12,
|
|
8
|
|
];
|
|
var type0 = {
|
|
0: true,
|
|
1: true,
|
|
3: true,
|
|
4: true,
|
|
6: true,
|
|
8: true,
|
|
9: true,
|
|
12: true,
|
|
13: true,
|
|
14: true
|
|
};
|
|
var type1 = {
|
|
0: true,
|
|
1: true,
|
|
2: true,
|
|
3: true,
|
|
4: true,
|
|
5: true,
|
|
6: true,
|
|
7: true,
|
|
8: true,
|
|
9: true,
|
|
10: true,
|
|
11: true,
|
|
12: true,
|
|
13: true
|
|
};
|
|
var type1Asterick = {
|
|
0: true,
|
|
3: true,
|
|
4: true,
|
|
8: true,
|
|
12: true,
|
|
13: true
|
|
};
|
|
var empty = {};
|
|
var type3Asterick = {
|
|
0: true,
|
|
1: true,
|
|
3: true,
|
|
4: true,
|
|
6: true,
|
|
8: true,
|
|
12: true,
|
|
13: true
|
|
};
|
|
var type6 = {
|
|
1: true
|
|
};
|
|
var newAr = [
|
|
[],
|
|
["1", "2", "3", "7", "8", "9", "4", "5", "6", "+", "-", "*", "/", "(", ")", "^", "!", "P", "C", "e", "0", ".", ",", "n", " "],
|
|
["pi", "ln", "Pi"],
|
|
["sin", "cos", "tan", "Del", "int", "Mod", "log", "pow"],
|
|
["asin", "acos", "atan", "cosh", "root", "tanh", "sinh"],
|
|
["acosh", "atanh", "asinh", "Sigma"]
|
|
];
|
|
function match(str1, str2, i, x) {
|
|
for (var f = 0; f < x; f++) {
|
|
if (str1[i + f] !== str2[f]) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
Mexp.addToken = function(tokens) {
|
|
for (var i = 0; i < tokens.length; i++) {
|
|
var x = tokens[i].token.length;
|
|
var temp = -1;
|
|
newAr[x] = newAr[x] || [];
|
|
for (var y = 0; y < newAr[x].length; y++) {
|
|
if (tokens[i].token === newAr[x][y]) {
|
|
temp = token.indexOf(newAr[x][y]);
|
|
break;
|
|
}
|
|
}
|
|
if (temp === -1) {
|
|
token.push(tokens[i].token);
|
|
type.push(tokens[i].type);
|
|
if (newAr.length <= tokens[i].token.length) {
|
|
newAr[tokens[i].token.length] = [];
|
|
}
|
|
newAr[tokens[i].token.length].push(tokens[i].token);
|
|
eva.push(tokens[i].value);
|
|
show.push(tokens[i].show);
|
|
} else {
|
|
token[temp] = tokens[i].token;
|
|
type[temp] = tokens[i].type;
|
|
eva[temp] = tokens[i].value;
|
|
show[temp] = tokens[i].show;
|
|
}
|
|
}
|
|
};
|
|
function tokenize(string) {
|
|
var nodes = [];
|
|
var length = string.length;
|
|
var key, x, y;
|
|
for (var i = 0; i < length; i++) {
|
|
if (i < length - 1 && string[i] === " " && string[i + 1] === " ") {
|
|
continue;
|
|
}
|
|
key = "";
|
|
for (x = string.length - i > newAr.length - 2 ? newAr.length - 1 : string.length - i; x > 0; x--) {
|
|
if (newAr[x] === void 0)
|
|
continue;
|
|
for (y = 0; y < newAr[x].length; y++) {
|
|
if (match(string, newAr[x][y], i, x)) {
|
|
key = newAr[x][y];
|
|
y = newAr[x].length;
|
|
x = 0;
|
|
}
|
|
}
|
|
}
|
|
i += key.length - 1;
|
|
if (key === "") {
|
|
throw new Mexp.Exception("Can't understand after " + string.slice(i));
|
|
}
|
|
var index = token.indexOf(key);
|
|
nodes.push({
|
|
index,
|
|
token: key,
|
|
type: type[index],
|
|
eval: eva[index],
|
|
precedence: preced[type[index]],
|
|
show: show[index]
|
|
});
|
|
}
|
|
return nodes;
|
|
}
|
|
Mexp.lex = function(inp, tokens) {
|
|
"use strict";
|
|
var changeSignObj = {
|
|
value: Mexp.math.changeSign,
|
|
type: 0,
|
|
pre: 21,
|
|
show: "-"
|
|
};
|
|
var closingParObj = {
|
|
value: ")",
|
|
show: ")",
|
|
type: 5,
|
|
pre: 0
|
|
};
|
|
var openingParObj = {
|
|
value: "(",
|
|
type: 4,
|
|
pre: 0,
|
|
show: "("
|
|
};
|
|
var str = [openingParObj];
|
|
var ptc = [];
|
|
var inpStr = inp;
|
|
var allowed = type0;
|
|
var bracToClose = 0;
|
|
var asterick = empty;
|
|
var prevKey = "";
|
|
var i;
|
|
if (typeof tokens !== "undefined") {
|
|
Mexp.addToken(tokens);
|
|
}
|
|
var obj = {};
|
|
var nodes = tokenize(inpStr);
|
|
for (i = 0; i < nodes.length; i++) {
|
|
var node = nodes[i];
|
|
if (node.type === 14) {
|
|
if (i > 0 && i < nodes.length - 1 && nodes[i + 1].type === 1 && (nodes[i - 1].type === 1 || nodes[i - 1].type === 6))
|
|
throw new Mexp.Exception("Unexpected Space");
|
|
continue;
|
|
}
|
|
var index = node.index;
|
|
var cToken = node.token;
|
|
var cType = node.type;
|
|
var cEv = node.eval;
|
|
var cPre = node.precedence;
|
|
var cShow = node.show;
|
|
var pre = str[str.length - 1];
|
|
var j;
|
|
for (j = ptc.length; j--; ) {
|
|
if (ptc[j] === 0) {
|
|
if ([0, 2, 3, 4, 5, 9, 11, 12, 13].indexOf(cType) !== -1) {
|
|
if (allowed[cType] !== true) {
|
|
console.log(inp, node, nodes, allowed);
|
|
throw new Mexp.Exception(cToken + " is not allowed after " + prevKey);
|
|
}
|
|
str.push(closingParObj);
|
|
allowed = type1;
|
|
asterick = type3Asterick;
|
|
inc(ptc, -1).pop();
|
|
}
|
|
} else
|
|
break;
|
|
}
|
|
if (allowed[cType] !== true) {
|
|
throw new Mexp.Exception(cToken + " is not allowed after " + prevKey);
|
|
}
|
|
if (asterick[cType] === true) {
|
|
cType = 2;
|
|
cEv = Mexp.math.mul;
|
|
cShow = "×";
|
|
cPre = 3;
|
|
i = i - cToken.length;
|
|
}
|
|
obj = {
|
|
value: cEv,
|
|
type: cType,
|
|
pre: cPre,
|
|
show: cShow
|
|
};
|
|
if (cType === 0) {
|
|
allowed = type0;
|
|
asterick = empty;
|
|
inc(ptc, 2).push(2);
|
|
str.push(obj);
|
|
str.push(openingParObj);
|
|
} else if (cType === 1) {
|
|
if (pre.type === 1) {
|
|
pre.value += cEv;
|
|
inc(ptc, 1);
|
|
} else {
|
|
str.push(obj);
|
|
}
|
|
allowed = type1;
|
|
asterick = type1Asterick;
|
|
} else if (cType === 2) {
|
|
allowed = type0;
|
|
asterick = empty;
|
|
inc(ptc, 2);
|
|
str.push(obj);
|
|
} else if (cType === 3) {
|
|
str.push(obj);
|
|
allowed = type1;
|
|
asterick = type3Asterick;
|
|
} else if (cType === 4) {
|
|
inc(ptc, 1);
|
|
bracToClose++;
|
|
allowed = type0;
|
|
asterick = empty;
|
|
str.push(obj);
|
|
} else if (cType === 5) {
|
|
if (!bracToClose) {
|
|
throw new Mexp.Exception("Closing parenthesis are more than opening one, wait What!!!");
|
|
}
|
|
bracToClose--;
|
|
allowed = type1;
|
|
asterick = type3Asterick;
|
|
str.push(obj);
|
|
inc(ptc, 1);
|
|
} else if (cType === 6) {
|
|
if (pre.hasDec) {
|
|
throw new Mexp.Exception("Two decimals are not allowed in one number");
|
|
}
|
|
if (pre.type !== 1) {
|
|
pre = {
|
|
value: 0,
|
|
type: 1,
|
|
pre: 0
|
|
};
|
|
str.push(pre);
|
|
inc(ptc, -1);
|
|
}
|
|
allowed = type6;
|
|
inc(ptc, 1);
|
|
asterick = empty;
|
|
pre.value += cEv;
|
|
pre.hasDec = true;
|
|
} else if (cType === 7) {
|
|
allowed = type1;
|
|
asterick = type3Asterick;
|
|
inc(ptc, 1);
|
|
str.push(obj);
|
|
}
|
|
if (cType === 8) {
|
|
allowed = type0;
|
|
asterick = empty;
|
|
inc(ptc, 4).push(4);
|
|
str.push(obj);
|
|
str.push(openingParObj);
|
|
} else if (cType === 9) {
|
|
if (pre.type === 9) {
|
|
if (pre.value === Mexp.math.add) {
|
|
pre.value = cEv;
|
|
pre.show = cShow;
|
|
inc(ptc, 1);
|
|
} else if (pre.value === Mexp.math.sub && cShow === "-") {
|
|
pre.value = Mexp.math.add;
|
|
pre.show = "+";
|
|
inc(ptc, 1);
|
|
}
|
|
} else if (pre.type !== 5 && pre.type !== 7 && pre.type !== 1 && pre.type !== 3 && pre.type !== 13) {
|
|
if (cToken === "-") {
|
|
allowed = type0;
|
|
asterick = empty;
|
|
inc(ptc, 2).push(2);
|
|
str.push(changeSignObj);
|
|
str.push(openingParObj);
|
|
}
|
|
} else {
|
|
str.push(obj);
|
|
inc(ptc, 2);
|
|
}
|
|
allowed = type0;
|
|
asterick = empty;
|
|
} else if (cType === 10) {
|
|
allowed = type0;
|
|
asterick = empty;
|
|
inc(ptc, 2);
|
|
str.push(obj);
|
|
} else if (cType === 11) {
|
|
allowed = type0;
|
|
asterick = empty;
|
|
str.push(obj);
|
|
} else if (cType === 12) {
|
|
allowed = type0;
|
|
asterick = empty;
|
|
inc(ptc, 6).push(6);
|
|
str.push(obj);
|
|
str.push(openingParObj);
|
|
} else if (cType === 13) {
|
|
allowed = type1;
|
|
asterick = type3Asterick;
|
|
str.push(obj);
|
|
}
|
|
inc(ptc, -1);
|
|
prevKey = cToken;
|
|
}
|
|
for (j = ptc.length; j--; ) {
|
|
if (ptc[j] === 0) {
|
|
str.push(closingParObj);
|
|
inc(ptc, -1).pop();
|
|
} else
|
|
break;
|
|
}
|
|
if (allowed[5] !== true) {
|
|
throw new Mexp.Exception("complete the expression");
|
|
}
|
|
while (bracToClose--) {
|
|
str.push(closingParObj);
|
|
}
|
|
str.push(closingParObj);
|
|
return new Mexp(str);
|
|
};
|
|
module2.exports = Mexp;
|
|
}
|
|
});
|
|
|
|
// node_modules/math-expression-evaluator/src/postfix.js
|
|
var require_postfix = __commonJS({
|
|
"node_modules/math-expression-evaluator/src/postfix.js"(exports, module2) {
|
|
var Mexp = require_lexer();
|
|
Mexp.prototype.toPostfix = function() {
|
|
"use strict";
|
|
var post = [], elem, popped, prep, pre, ele;
|
|
var stack = [{ value: "(", type: 4, pre: 0 }];
|
|
var arr = this.value;
|
|
for (var i = 1; i < arr.length; i++) {
|
|
if (arr[i].type === 1 || arr[i].type === 3 || arr[i].type === 13) {
|
|
if (arr[i].type === 1)
|
|
arr[i].value = Number(arr[i].value);
|
|
post.push(arr[i]);
|
|
} else if (arr[i].type === 4) {
|
|
stack.push(arr[i]);
|
|
} else if (arr[i].type === 5) {
|
|
while ((popped = stack.pop()).type !== 4) {
|
|
post.push(popped);
|
|
}
|
|
} else if (arr[i].type === 11) {
|
|
while ((popped = stack.pop()).type !== 4) {
|
|
post.push(popped);
|
|
}
|
|
stack.push(popped);
|
|
} else {
|
|
elem = arr[i];
|
|
pre = elem.pre;
|
|
ele = stack[stack.length - 1];
|
|
prep = ele.pre;
|
|
var flag = ele.value == "Math.pow" && elem.value == "Math.pow";
|
|
if (pre > prep)
|
|
stack.push(elem);
|
|
else {
|
|
while (prep >= pre && !flag || flag && pre < prep) {
|
|
popped = stack.pop();
|
|
ele = stack[stack.length - 1];
|
|
post.push(popped);
|
|
prep = ele.pre;
|
|
flag = elem.value == "Math.pow" && ele.value == "Math.pow";
|
|
}
|
|
stack.push(elem);
|
|
}
|
|
}
|
|
}
|
|
return new Mexp(post);
|
|
};
|
|
module2.exports = Mexp;
|
|
}
|
|
});
|
|
|
|
// node_modules/math-expression-evaluator/src/postfix_evaluator.js
|
|
var require_postfix_evaluator = __commonJS({
|
|
"node_modules/math-expression-evaluator/src/postfix_evaluator.js"(exports, module2) {
|
|
var Mexp = require_postfix();
|
|
Mexp.prototype.postfixEval = function(UserDefined) {
|
|
"use strict";
|
|
UserDefined = UserDefined || {};
|
|
UserDefined.PI = Math.PI;
|
|
UserDefined.E = Math.E;
|
|
var stack = [], pop1, pop2, pop3;
|
|
var disp = [];
|
|
var temp = "";
|
|
var arr = this.value;
|
|
var bool = typeof UserDefined.n !== "undefined";
|
|
for (var i = 0; i < arr.length; i++) {
|
|
if (arr[i].type === 1) {
|
|
stack.push({ value: arr[i].value, type: 1 });
|
|
} else if (arr[i].type === 3) {
|
|
stack.push({ value: UserDefined[arr[i].value], type: 1 });
|
|
} else if (arr[i].type === 0) {
|
|
if (typeof stack[stack.length - 1].type === "undefined") {
|
|
stack[stack.length - 1].value.push(arr[i]);
|
|
} else
|
|
stack[stack.length - 1].value = arr[i].value(stack[stack.length - 1].value);
|
|
} else if (arr[i].type === 7) {
|
|
if (typeof stack[stack.length - 1].type === "undefined") {
|
|
stack[stack.length - 1].value.push(arr[i]);
|
|
} else
|
|
stack[stack.length - 1].value = arr[i].value(stack[stack.length - 1].value);
|
|
} else if (arr[i].type === 8) {
|
|
pop1 = stack.pop();
|
|
pop2 = stack.pop();
|
|
stack.push({ type: 1, value: arr[i].value(pop2.value, pop1.value) });
|
|
} else if (arr[i].type === 10) {
|
|
pop1 = stack.pop();
|
|
pop2 = stack.pop();
|
|
if (typeof pop2.type === "undefined") {
|
|
pop2.value = pop2.concat(pop1);
|
|
pop2.value.push(arr[i]);
|
|
stack.push(pop2);
|
|
} else if (typeof pop1.type === "undefined") {
|
|
pop1.unshift(pop2);
|
|
pop1.push(arr[i]);
|
|
stack.push(pop1);
|
|
} else {
|
|
stack.push({ type: 1, value: arr[i].value(pop2.value, pop1.value) });
|
|
}
|
|
} else if (arr[i].type === 2 || arr[i].type === 9) {
|
|
pop1 = stack.pop();
|
|
pop2 = stack.pop();
|
|
if (typeof pop2.type === "undefined") {
|
|
pop2 = pop2.concat(pop1);
|
|
pop2.push(arr[i]);
|
|
stack.push(pop2);
|
|
} else if (typeof pop1.type === "undefined") {
|
|
pop1.unshift(pop2);
|
|
pop1.push(arr[i]);
|
|
stack.push(pop1);
|
|
} else {
|
|
stack.push({ type: 1, value: arr[i].value(pop2.value, pop1.value) });
|
|
}
|
|
} else if (arr[i].type === 12) {
|
|
pop1 = stack.pop();
|
|
if (typeof pop1.type !== "undefined") {
|
|
pop1 = [pop1];
|
|
}
|
|
pop2 = stack.pop();
|
|
pop3 = stack.pop();
|
|
stack.push({ type: 1, value: arr[i].value(pop3.value, pop2.value, new Mexp(pop1)) });
|
|
} else if (arr[i].type === 13) {
|
|
if (bool) {
|
|
stack.push({ value: UserDefined[arr[i].value], type: 3 });
|
|
} else
|
|
stack.push([arr[i]]);
|
|
}
|
|
}
|
|
if (stack.length > 1) {
|
|
throw new Mexp.Exception("Uncaught Syntax error");
|
|
}
|
|
return stack[0].value > 1e15 ? "Infinity" : parseFloat(stack[0].value.toFixed(15));
|
|
};
|
|
Mexp.eval = function(str, tokens, obj) {
|
|
if (typeof tokens === "undefined") {
|
|
return this.lex(str).toPostfix().postfixEval();
|
|
} else if (typeof obj === "undefined") {
|
|
if (typeof tokens.length !== "undefined")
|
|
return this.lex(str, tokens).toPostfix().postfixEval();
|
|
else
|
|
return this.lex(str).toPostfix().postfixEval(tokens);
|
|
} else
|
|
return this.lex(str, tokens).toPostfix().postfixEval(obj);
|
|
};
|
|
module2.exports = Mexp;
|
|
}
|
|
});
|
|
|
|
// node_modules/math-expression-evaluator/src/formula_evaluator.js
|
|
var require_formula_evaluator = __commonJS({
|
|
"node_modules/math-expression-evaluator/src/formula_evaluator.js"(exports, module2) {
|
|
var Mexp = require_postfix_evaluator();
|
|
Mexp.prototype.formulaEval = function() {
|
|
"use strict";
|
|
var stack = [], pop1, pop2, pop3;
|
|
var disp = [];
|
|
var temp = "";
|
|
var arr = this.value;
|
|
for (var i = 0; i < arr.length; i++) {
|
|
if (arr[i].type === 1 || arr[i].type === 3) {
|
|
disp.push({ value: arr[i].type === 3 ? arr[i].show : arr[i].value, type: 1 });
|
|
} else if (arr[i].type === 13) {
|
|
disp.push({ value: arr[i].show, type: 1 });
|
|
} else if (arr[i].type === 0) {
|
|
disp[disp.length - 1] = { value: arr[i].show + (arr[i].show != "-" ? "(" : "") + disp[disp.length - 1].value + (arr[i].show != "-" ? ")" : ""), type: 0 };
|
|
} else if (arr[i].type === 7) {
|
|
disp[disp.length - 1] = { value: (disp[disp.length - 1].type != 1 ? "(" : "") + disp[disp.length - 1].value + (disp[disp.length - 1].type != 1 ? ")" : "") + arr[i].show, type: 7 };
|
|
} else if (arr[i].type === 10) {
|
|
pop1 = disp.pop();
|
|
pop2 = disp.pop();
|
|
if (arr[i].show === "P" || arr[i].show === "C")
|
|
disp.push({ value: "<sup>" + pop2.value + "</sup>" + arr[i].show + "<sub>" + pop1.value + "</sub>", type: 10 });
|
|
else
|
|
disp.push({ value: (pop2.type != 1 ? "(" : "") + pop2.value + (pop2.type != 1 ? ")" : "") + "<sup>" + pop1.value + "</sup>", type: 1 });
|
|
} else if (arr[i].type === 2 || arr[i].type === 9) {
|
|
pop1 = disp.pop();
|
|
pop2 = disp.pop();
|
|
disp.push({ value: (pop2.type != 1 ? "(" : "") + pop2.value + (pop2.type != 1 ? ")" : "") + arr[i].show + (pop1.type != 1 ? "(" : "") + pop1.value + (pop1.type != 1 ? ")" : ""), type: arr[i].type });
|
|
} else if (arr[i].type === 12) {
|
|
pop1 = disp.pop();
|
|
pop2 = disp.pop();
|
|
pop3 = disp.pop();
|
|
disp.push({ value: arr[i].show + "(" + pop3.value + "," + pop2.value + "," + pop1.value + ")", type: 12 });
|
|
}
|
|
}
|
|
return disp[0].value;
|
|
};
|
|
module2.exports = Mexp;
|
|
}
|
|
});
|
|
|
|
// src/index.ts
|
|
__export(exports, {
|
|
default: () => ButtonsPlugin
|
|
});
|
|
var import_obsidian20 = __toModule(require("obsidian"));
|
|
|
|
// src/utils.ts
|
|
var import_obsidian = __toModule(require("obsidian"));
|
|
|
|
// src/buttonStore.ts
|
|
var buttonStore;
|
|
var getStore = (isMobile) => isMobile ? buttonStore : JSON.parse(localStorage.getItem("buttons"));
|
|
var initializeButtonStore = (app, storeEvents) => {
|
|
const files = app.vault.getMarkdownFiles();
|
|
const blocksArr = files.map((file) => {
|
|
const cache = app.metadataCache.getFileCache(file);
|
|
return buildButtonArray(cache, file);
|
|
}).filter((arr) => arr !== void 0).flat();
|
|
localStorage.setItem("buttons", JSON.stringify(blocksArr));
|
|
buttonStore = blocksArr;
|
|
storeEvents.trigger("index-complete");
|
|
};
|
|
var addButtonToStore = (app, file) => {
|
|
const cache = app.metadataCache.getFileCache(file);
|
|
const buttons = buildButtonArray(cache, file);
|
|
const store = getStore(app.isMobile);
|
|
const newStore = buttons && store ? removeDuplicates([...buttons, ...store]) : store ? removeDuplicates(store) : buttons ? removeDuplicates(buttons) : [];
|
|
localStorage.setItem("buttons", JSON.stringify(newStore));
|
|
buttonStore = newStore;
|
|
};
|
|
var getButtonFromStore = async (app, args) => {
|
|
const store = getStore(app.isMobile);
|
|
args.id;
|
|
if (args.id) {
|
|
const storedButton = store && store.filter((item) => `button-${args.id}` === item.id)[0];
|
|
if (storedButton) {
|
|
const file = app.vault.getAbstractFileByPath(storedButton.path);
|
|
const content = await app.vault.cachedRead(file);
|
|
const contentArray = content.split("\n");
|
|
const button = contentArray.slice(storedButton.position.start.line + 1, storedButton.position.end.line).join("\n");
|
|
const storedArgs = createArgumentObject(button);
|
|
return {
|
|
args: { ...storedArgs, ...args },
|
|
id: storedButton.id.split("button-")[1]
|
|
};
|
|
}
|
|
}
|
|
};
|
|
var getButtonById = async (app, id) => {
|
|
const store = getStore(app.isMobile);
|
|
const readArgsByBlockId = async (blockId) => {
|
|
const btn = (store || []).find((item) => `button-${blockId}` === item.id);
|
|
if (!btn)
|
|
return void 0;
|
|
const file = app.vault.getAbstractFileByPath(btn.path);
|
|
const content = await app.vault.cachedRead(file);
|
|
const contentArray = content.split("\n");
|
|
const button = contentArray.slice(btn.position.start.line + 1, btn.position.end.line).join("\n");
|
|
return createArgumentObject(button);
|
|
};
|
|
const resolveInheritedArgs = async (startId, visited = new Set(), depth = 0) => {
|
|
if (depth > 3)
|
|
return void 0;
|
|
if (visited.has(startId))
|
|
return void 0;
|
|
visited.add(startId);
|
|
const childArgs = await readArgsByBlockId(startId);
|
|
if (!childArgs)
|
|
return void 0;
|
|
const parentId = typeof childArgs.id === "string" ? childArgs.id.trim() : "";
|
|
if (!parentId)
|
|
return childArgs;
|
|
const parentArgs = await resolveInheritedArgs(parentId, visited, depth + 1);
|
|
if (!parentArgs)
|
|
return childArgs;
|
|
return { ...parentArgs, ...childArgs };
|
|
};
|
|
const merged = await resolveInheritedArgs(id);
|
|
if (merged)
|
|
return merged;
|
|
};
|
|
var getButtonSwapById = async (app, id) => {
|
|
const store = getStore(app.isMobile);
|
|
const storedButton = store.filter((item) => `button-${id}` === item.id)[0];
|
|
if (storedButton) {
|
|
return storedButton.swap;
|
|
}
|
|
};
|
|
var setButtonSwapById = async (app, id, newSwap) => {
|
|
const store = getStore(app.isMobile);
|
|
const storedButton = store.filter((item) => `button-${id}` === item.id)[0];
|
|
if (storedButton) {
|
|
storedButton.swap = newSwap;
|
|
const newStore = removeDuplicates([...store, storedButton]);
|
|
localStorage.setItem("buttons", JSON.stringify(newStore));
|
|
buttonStore = newStore;
|
|
}
|
|
};
|
|
var buildButtonArray = (cache, file) => {
|
|
const blocks = cache && cache.blocks;
|
|
if (blocks) {
|
|
const blockKeys = Array.from(Object.keys(blocks));
|
|
const blockArray = blockKeys.map((key) => blocks[key]).map((obj) => {
|
|
obj["path"] = file.path;
|
|
obj["swap"] = 0;
|
|
return obj;
|
|
}).filter((block) => block.id.includes("button"));
|
|
return blockArray;
|
|
}
|
|
};
|
|
function removeDuplicates(arr) {
|
|
return arr && arr[0] ? arr.filter((v, i, a) => a.findIndex((t) => t.id === v.id || t.path === v.path && t.position.start.line === v.position.start.line && t.position.end.line === v.position.end.line) === i) : arr;
|
|
}
|
|
|
|
// src/utils.ts
|
|
function nanoid(num) {
|
|
let result = "";
|
|
const characters = "abcdefghijklmnopqrstuvwxyz0123456789";
|
|
const charactersLength = characters.length;
|
|
for (let i = 0; i < num; i++) {
|
|
result += characters.charAt(Math.floor(Math.random() * charactersLength));
|
|
}
|
|
return result;
|
|
}
|
|
var insertButton = (app, outputObject) => {
|
|
const buttonArr = [];
|
|
buttonArr.push("```button");
|
|
outputObject.name && buttonArr.push(`name ${outputObject.name}`);
|
|
if (outputObject.type && outputObject.type.includes("note") && outputObject.noteTitle && outputObject.openMethod) {
|
|
const noteType = `note(${outputObject.noteTitle}, ${outputObject.openMethod}) ${outputObject.type.replace("note ", "")}`;
|
|
buttonArr.push(`type ${noteType}`);
|
|
outputObject.action && buttonArr.push(`action ${outputObject.action}`);
|
|
} else {
|
|
outputObject.type && buttonArr.push(`type ${outputObject.type}`);
|
|
outputObject.action && buttonArr.push(`action ${outputObject.action}`);
|
|
}
|
|
outputObject.id && buttonArr.push(`id ${outputObject.id}`);
|
|
outputObject.swap && buttonArr.push(`swap ${outputObject.swap}`);
|
|
outputObject.remove && buttonArr.push(`remove ${outputObject.remove}`);
|
|
outputObject.replace && buttonArr.push(`replace ${outputObject.replace}`);
|
|
outputObject.templater === true && buttonArr.push(`templater ${outputObject.templater}`);
|
|
outputObject.color && buttonArr.push(`color ${outputObject.color}`);
|
|
outputObject.customColor && buttonArr.push(`customColor ${outputObject.customColor}`);
|
|
outputObject.customTextColor && buttonArr.push(`customTextColor ${outputObject.customTextColor}`);
|
|
outputObject.class && buttonArr.push(`class ${outputObject.class}`);
|
|
outputObject.folder && buttonArr.push(`folder ${outputObject.folder}`);
|
|
outputObject.prompt && buttonArr.push(`prompt ${outputObject.prompt}`);
|
|
if (outputObject.actions && Array.isArray(outputObject.actions) && outputObject.actions.length > 0) {
|
|
buttonArr.push(`actions ${JSON.stringify(outputObject.actions)}`);
|
|
}
|
|
buttonArr.push("```");
|
|
outputObject.blockId ? buttonArr.push(`^button-${outputObject.blockId}`) : buttonArr.push(`^button-${nanoid(4)}`);
|
|
const page = app.workspace.getActiveViewOfType(import_obsidian.MarkdownView);
|
|
const editor = page.editor;
|
|
editor.replaceSelection(buttonArr.join("\n"));
|
|
addButtonToStore(app, page.file);
|
|
};
|
|
var insertInlineButton = (app, id) => {
|
|
const page = app.workspace.getActiveViewOfType(import_obsidian.MarkdownView);
|
|
const editor = page.editor;
|
|
editor.replaceSelection(`\`button-${id}\``);
|
|
};
|
|
var createArgumentObject = (source) => {
|
|
const lines = source.split("\n");
|
|
const acc = {};
|
|
const knownArguments = new Set([
|
|
"name",
|
|
"type",
|
|
"action",
|
|
"id",
|
|
"swap",
|
|
"remove",
|
|
"replace",
|
|
"templater",
|
|
"color",
|
|
"customcolor",
|
|
"customtextcolor",
|
|
"class",
|
|
"folder",
|
|
"prompt",
|
|
"actions",
|
|
"width",
|
|
"height",
|
|
"align"
|
|
]);
|
|
for (let i = 0; i < lines.length; i++) {
|
|
const line = lines[i];
|
|
const split = line.split(" ");
|
|
const key = split[0]?.toLowerCase();
|
|
if (!key)
|
|
continue;
|
|
if (key === "name") {
|
|
const parseLines = [line.replace(/^name\s*/, "")];
|
|
let destructor = parseMultiLine(lines, i, parseLines);
|
|
if (destructor.parseValue[0] == "{") {
|
|
acc[key] = destructor.parseValue.slice(1, -1).trim();
|
|
} else {
|
|
acc[key] = destructor.parseValue.trim();
|
|
}
|
|
i = destructor.i;
|
|
} else if (key === "actions") {
|
|
const jsonLines = [line.replace(/^actions\s*/, "")];
|
|
let destructor = parseMultiLine(lines, i, jsonLines);
|
|
try {
|
|
acc[key] = JSON.parse(destructor.parseValue);
|
|
} catch (e) {
|
|
acc[key] = [];
|
|
new import_obsidian.Notice(`Error: Malformed JSON in actions field. Please check your chain button syntax.`, 4e3);
|
|
}
|
|
i = destructor.i;
|
|
} else if (key === "action") {
|
|
const actionLines = [line.replace(/^action\s*/, "")];
|
|
while (i + 1 < lines.length) {
|
|
const nextLine = lines[i + 1];
|
|
if (nextLine.startsWith("```")) {
|
|
break;
|
|
}
|
|
if (nextLine.trim() !== "" && !nextLine.startsWith(" ") && !nextLine.startsWith(" ")) {
|
|
const potentialKey = nextLine.split(" ")[0]?.toLowerCase();
|
|
if (knownArguments.has(potentialKey)) {
|
|
break;
|
|
}
|
|
}
|
|
i++;
|
|
actionLines.push(nextLine);
|
|
}
|
|
const actionContent = actionLines.join("\n").replace(/\s+$/, "");
|
|
acc[key] = actionContent;
|
|
} else {
|
|
const value = split.slice(1).join(" ").trim();
|
|
acc[key] = value;
|
|
}
|
|
}
|
|
return acc;
|
|
};
|
|
var createContentArray = async (app) => {
|
|
const activeView = app.workspace.getActiveViewOfType(import_obsidian.MarkdownView);
|
|
if (activeView) {
|
|
const file = activeView.file;
|
|
const content = await app.vault.read(file);
|
|
return { contentArray: content.split("\n"), file };
|
|
}
|
|
new import_obsidian.Notice("Could not get Active View", 1e3);
|
|
console.error("could not get active view");
|
|
};
|
|
var handleValueArray = (value, callback) => {
|
|
if (value.includes("[") && value.includes("]")) {
|
|
const args = value.match(/\[(.*)\]/);
|
|
if (args[1]) {
|
|
const argArray = args[1].split(/,\s?/);
|
|
if (argArray[0]) {
|
|
callback(argArray);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
async function getNewArgs(app, position) {
|
|
const activeView = app.workspace.getActiveViewOfType(import_obsidian.MarkdownView);
|
|
const newContent = await app.vault.cachedRead(activeView.file).then((content) => content.split("\n"));
|
|
const newButton = newContent.splice(position.lineStart, position.lineEnd - position.lineStart).join("\n").replace("```button", "").replace("```", "");
|
|
return { args: createArgumentObject(newButton) };
|
|
}
|
|
var wrapAround = (value, size) => {
|
|
return (value % size + size) % size;
|
|
};
|
|
var parseMultiLine = (lines, iStart, parseLinesStart) => {
|
|
let i = iStart;
|
|
let parseLines = parseLinesStart;
|
|
let bracketCount = 0;
|
|
let braceCount = 0;
|
|
let inString = false;
|
|
let escaped = false;
|
|
let parseValue;
|
|
for (const char of parseLines[0]) {
|
|
if (escaped) {
|
|
escaped = false;
|
|
continue;
|
|
}
|
|
if (char === "\\") {
|
|
escaped = true;
|
|
continue;
|
|
}
|
|
if (char === '"' && !escaped) {
|
|
inString = !inString;
|
|
continue;
|
|
}
|
|
if (!inString) {
|
|
if (char === "[")
|
|
bracketCount++;
|
|
else if (char === "]")
|
|
bracketCount--;
|
|
else if (char === "{")
|
|
braceCount++;
|
|
else if (char === "}")
|
|
braceCount--;
|
|
}
|
|
}
|
|
while ((bracketCount > 0 || braceCount > 0) && i + 1 < lines.length) {
|
|
i++;
|
|
const nextLine = lines[i];
|
|
parseLines.push(nextLine);
|
|
for (const char of nextLine) {
|
|
if (escaped) {
|
|
escaped = false;
|
|
continue;
|
|
}
|
|
if (char === "\\") {
|
|
escaped = true;
|
|
continue;
|
|
}
|
|
if (char === '"' && !escaped) {
|
|
inString = !inString;
|
|
continue;
|
|
}
|
|
if (!inString) {
|
|
if (char === "[")
|
|
bracketCount++;
|
|
else if (char === "]")
|
|
bracketCount--;
|
|
else if (char === "{")
|
|
braceCount++;
|
|
else if (char === "}")
|
|
braceCount--;
|
|
}
|
|
}
|
|
}
|
|
const parseString = parseLines.join("\n").trim();
|
|
parseValue = parseString;
|
|
return { parseValue, i };
|
|
};
|
|
|
|
// src/events.ts
|
|
var buttonEventListener = (app, callback) => {
|
|
return app.metadataCache.on("changed", (file) => {
|
|
callback(app, file);
|
|
});
|
|
};
|
|
var openFileListener = (app, storeEvents, callback) => {
|
|
return app.workspace.on("file-open", () => {
|
|
callback(app, storeEvents);
|
|
});
|
|
};
|
|
|
|
// src/modal.ts
|
|
var import_obsidian18 = __toModule(require("obsidian"));
|
|
|
|
// src/button.ts
|
|
var import_obsidian16 = __toModule(require("obsidian"));
|
|
|
|
// src/buttonTypes/calculate.ts
|
|
var import_obsidian9 = __toModule(require("obsidian"));
|
|
var import_math_expression_evaluator = __toModule(require_formula_evaluator());
|
|
|
|
// src/handlers/removeButton.ts
|
|
var removeButton = async (app, remove2, lineStart, lineEnd) => {
|
|
const { contentArray, file } = await createContentArray(app);
|
|
const store = getStore(app.isMobile);
|
|
if (remove2 === "true") {
|
|
const numberOfItems = lineEnd - lineStart;
|
|
contentArray.splice(lineStart, numberOfItems + 1);
|
|
if (contentArray[lineStart] && contentArray[lineStart].includes("^button-")) {
|
|
contentArray.splice(lineStart, 1);
|
|
}
|
|
const content = contentArray.join("\n");
|
|
await app.vault.modify(file, content);
|
|
return;
|
|
}
|
|
if (lineStart === lineEnd) {
|
|
contentArray.splice(lineStart, 1);
|
|
const content = contentArray.join("\n");
|
|
await app.vault.modify(file, content);
|
|
return;
|
|
}
|
|
handleValueArray(remove2, async (argArray) => {
|
|
if (!store) {
|
|
return;
|
|
}
|
|
const buttons = store.filter((item) => {
|
|
let exists = false;
|
|
argArray.forEach((arg) => {
|
|
if (item.id === `button-${arg}` && item.path === file.path) {
|
|
exists = true;
|
|
}
|
|
});
|
|
return exists;
|
|
});
|
|
if (buttons && buttons.length > 0) {
|
|
let offset2 = 0;
|
|
buttons.forEach((button) => {
|
|
const start2 = button.position.start.line - offset2;
|
|
const numLines = button.position.end.line - button.position.start.line;
|
|
contentArray.splice(start2, numLines + 2);
|
|
offset2 += numLines + 2;
|
|
});
|
|
const content = contentArray.join("\n");
|
|
await app.vault.modify(file, content);
|
|
}
|
|
});
|
|
};
|
|
|
|
// src/handlers/removeSection.ts
|
|
var removeSection = async (app, section, buttonPosition, preCapturedCursorLine) => {
|
|
const { contentArray, file } = await createContentArray(app);
|
|
if (section.includes("[") && section.includes("]")) {
|
|
const args = section.match(/\[(.*)\]/);
|
|
if (args && args[1]) {
|
|
if (args[1].trim().toLowerCase() === "cursor") {
|
|
if (preCapturedCursorLine !== void 0) {
|
|
if (preCapturedCursorLine >= 0 && preCapturedCursorLine < contentArray.length) {
|
|
contentArray.splice(preCapturedCursorLine, 1);
|
|
const content = contentArray.join("\n");
|
|
await app.vault.modify(file, content);
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
const argArray = args[1].split(/,\s?/);
|
|
if (argArray[0]) {
|
|
let startLine;
|
|
const firstArgRelative = argArray[0].match(/^([+-])(\d+)$/);
|
|
if (firstArgRelative && buttonPosition) {
|
|
const operator = firstArgRelative[1];
|
|
const offset2 = parseInt(firstArgRelative[2]);
|
|
if (operator === "+") {
|
|
startLine = buttonPosition.lineEnd + 1 + offset2;
|
|
} else {
|
|
startLine = buttonPosition.lineStart + 1 - offset2;
|
|
if (startLine < 1) {
|
|
startLine = 1;
|
|
}
|
|
}
|
|
} else {
|
|
startLine = parseInt(argArray[0]);
|
|
}
|
|
const start2 = startLine - 1;
|
|
if (argArray.length === 1) {
|
|
contentArray.splice(start2, 1);
|
|
} else {
|
|
let endLine;
|
|
const secondArgRelative = argArray[1].match(/^([+-])(\d+)$/);
|
|
if (secondArgRelative && buttonPosition) {
|
|
const operator = secondArgRelative[1];
|
|
const offset2 = parseInt(secondArgRelative[2]);
|
|
if (operator === "+") {
|
|
endLine = buttonPosition.lineEnd + 1 + offset2;
|
|
} else {
|
|
endLine = buttonPosition.lineStart + 1 - offset2;
|
|
if (endLine < 1) {
|
|
endLine = 1;
|
|
}
|
|
}
|
|
} else {
|
|
endLine = parseInt(argArray[1]);
|
|
}
|
|
if (!isNaN(endLine)) {
|
|
const numLines = endLine - start2;
|
|
if (numLines > 0) {
|
|
contentArray.splice(start2, numLines);
|
|
}
|
|
}
|
|
}
|
|
const content = contentArray.join("\n");
|
|
await app.vault.modify(file, content);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
// src/handlers/prependContent.ts
|
|
var import_obsidian3 = __toModule(require("obsidian"));
|
|
|
|
// src/templater.ts
|
|
var import_obsidian2 = __toModule(require("obsidian"));
|
|
async function templater(app, template2, _target) {
|
|
const activeFile = template2 || app.workspace.getActiveFile();
|
|
const targetFile = _target || activeFile;
|
|
if (!activeFile) {
|
|
new import_obsidian2.Notice("No active file found for templater processing.");
|
|
return;
|
|
}
|
|
const config = {
|
|
template_file: template2,
|
|
active_file: activeFile,
|
|
target_file: targetFile,
|
|
run_mode: "DynamicProcessor"
|
|
};
|
|
const plugins = app.plugins.plugins;
|
|
const exists = plugins["templater-obsidian"];
|
|
if (!exists) {
|
|
new import_obsidian2.Notice("Templater is not installed. Please install it.");
|
|
return;
|
|
}
|
|
try {
|
|
const { templater: templater3 } = plugins["templater-obsidian"];
|
|
const functions = await templater3.functions_generator.internal_functions.generate_object(config);
|
|
functions.user = {};
|
|
const userScriptFunctions = await templater3.functions_generator.user_functions.user_script_functions.generate_user_script_functions(config);
|
|
userScriptFunctions.forEach((value, key) => {
|
|
functions.user[key] = value;
|
|
});
|
|
if (activeFile) {
|
|
const userSystemFunctions = await templater3.functions_generator.user_functions.user_system_functions.generate_system_functions(config);
|
|
userSystemFunctions.forEach((value, key) => {
|
|
functions.user[key] = value;
|
|
});
|
|
}
|
|
return async (command2) => {
|
|
return await templater3.parser.parse_commands(command2, functions);
|
|
};
|
|
} catch (error) {
|
|
console.error("Error setting up templater functions:", error);
|
|
new import_obsidian2.Notice("Error setting up templater functions. Check console for details.");
|
|
return;
|
|
}
|
|
}
|
|
async function processTemplate(app, file) {
|
|
try {
|
|
const content = await app.vault.read(file);
|
|
const runTemplater = await templater(app, file, file);
|
|
if (runTemplater) {
|
|
const processed = await runTemplater(content);
|
|
return processed;
|
|
}
|
|
} catch (e) {
|
|
new import_obsidian2.Notice(`There was an error processing the template!`, 2e3);
|
|
}
|
|
}
|
|
var templater_default = templater;
|
|
|
|
// src/handlers/prependContent.ts
|
|
var prependContent = async (app, insert, lineStart, isTemplater) => {
|
|
const activeView = app.workspace.getActiveViewOfType(import_obsidian3.MarkdownView);
|
|
if (activeView) {
|
|
const file = activeView.file;
|
|
let content = await app.vault.read(file);
|
|
const contentArray = content.split("\n");
|
|
if (typeof insert === "string") {
|
|
const lines = insert.split("\n");
|
|
contentArray.splice(lineStart, 0, ...lines);
|
|
} else {
|
|
if (isTemplater) {
|
|
const runTemplater = await templater_default(app, insert, file);
|
|
const templateContent = await app.vault.read(insert);
|
|
const processed = await runTemplater(templateContent);
|
|
const lines = processed.split("\n");
|
|
contentArray.splice(lineStart, 0, ...lines);
|
|
} else {
|
|
activeView.editor.setCursor(lineStart);
|
|
await app.internalPlugins?.plugins["templates"].instance.insertTemplate(insert);
|
|
return;
|
|
}
|
|
}
|
|
content = contentArray.join("\n");
|
|
await app.vault.modify(file, content);
|
|
} else {
|
|
new import_obsidian3.Notice("There was an issue prepending content, please try again", 2e3);
|
|
}
|
|
};
|
|
|
|
// src/handlers/appendContent.ts
|
|
var import_obsidian4 = __toModule(require("obsidian"));
|
|
var appendContent = async (app, insert, lineEnd, isTemplater) => {
|
|
const activeView = app.workspace.getActiveViewOfType(import_obsidian4.MarkdownView);
|
|
if (activeView) {
|
|
const file = activeView.file;
|
|
let content = await app.vault.read(file);
|
|
const contentArray = content.split("\n");
|
|
let insertionPoint;
|
|
if (contentArray[lineEnd + 1] && contentArray[lineEnd + 1].includes("^button")) {
|
|
insertionPoint = lineEnd + 2;
|
|
} else {
|
|
insertionPoint = lineEnd + 1;
|
|
}
|
|
if (typeof insert === "string") {
|
|
const lines = insert.split("\n");
|
|
contentArray.splice(insertionPoint, 0, ...lines);
|
|
} else {
|
|
if (isTemplater) {
|
|
const runTemplater = await templater_default(app, insert, file);
|
|
const content2 = await app.vault.read(insert);
|
|
const processed = await runTemplater(content2);
|
|
const lines = processed.split("\n");
|
|
contentArray.splice(insertionPoint, 0, ...lines);
|
|
} else {
|
|
activeView.editor.setCursor(insertionPoint);
|
|
await app.internalPlugins?.plugins["templates"].instance.insertTemplate(insert);
|
|
return;
|
|
}
|
|
}
|
|
content = contentArray.join("\n");
|
|
await app.vault.modify(file, content);
|
|
} else {
|
|
new import_obsidian4.Notice("There was an issue appending content, please try again", 2e3);
|
|
}
|
|
};
|
|
|
|
// src/handlers/addContentAtLine.ts
|
|
var import_obsidian5 = __toModule(require("obsidian"));
|
|
var addContentAtLine = async (app, insert, type, isTemplater, buttonPosition) => {
|
|
let insertionPoint;
|
|
const relativeMatch = type.match(/line\(([+-])(\d+)\)/);
|
|
if (relativeMatch && buttonPosition) {
|
|
const operator = relativeMatch[1];
|
|
const offset2 = parseInt(relativeMatch[2]);
|
|
if (operator === "+") {
|
|
insertionPoint = buttonPosition.lineEnd + offset2;
|
|
} else {
|
|
insertionPoint = buttonPosition.lineStart - offset2;
|
|
if (insertionPoint < 0) {
|
|
insertionPoint = 0;
|
|
}
|
|
}
|
|
} else {
|
|
const lineNumber = type.match(/(\d+)/g);
|
|
if (lineNumber && lineNumber[0]) {
|
|
insertionPoint = parseInt(lineNumber[0]) - 1;
|
|
} else {
|
|
new import_obsidian5.Notice("There was an issue parsing the line number, please try again", 2e3);
|
|
return;
|
|
}
|
|
}
|
|
const activeView = app.workspace.getActiveViewOfType(import_obsidian5.MarkdownView);
|
|
if (activeView) {
|
|
const file = activeView.file;
|
|
let content = await app.vault.read(file);
|
|
const contentArray = content.split("\n");
|
|
if (typeof insert === "string") {
|
|
const lines = insert.split("\n");
|
|
contentArray.splice(insertionPoint, 0, ...lines);
|
|
} else {
|
|
if (isTemplater) {
|
|
const runTemplater = await templater_default(app, insert, file);
|
|
const content2 = await app.vault.read(insert);
|
|
const processed = await runTemplater(content2);
|
|
const lines = processed.split("\n");
|
|
contentArray.splice(insertionPoint, 0, ...lines);
|
|
} else {
|
|
activeView.editor.setCursor(insertionPoint);
|
|
await app.internalPlugins?.plugins["templates"].instance.insertTemplate(insert);
|
|
return;
|
|
}
|
|
}
|
|
content = contentArray.join("\n");
|
|
await app.vault.modify(file, content);
|
|
}
|
|
};
|
|
|
|
// src/handlers/addContentAtCursor.ts
|
|
var import_obsidian6 = __toModule(require("obsidian"));
|
|
var addContentAtCursor = async (app, insert, isTemplater) => {
|
|
const activeView = app.workspace.getActiveViewOfType(import_obsidian6.MarkdownView);
|
|
if (activeView) {
|
|
const editor = activeView.editor;
|
|
const cursor = editor.getCursor();
|
|
if (typeof insert === "string") {
|
|
editor.replaceRange(insert, cursor);
|
|
const lines = insert.split("\n");
|
|
if (lines.length === 1) {
|
|
editor.setCursor({
|
|
line: cursor.line,
|
|
ch: cursor.ch + insert.length
|
|
});
|
|
} else {
|
|
editor.setCursor({
|
|
line: cursor.line + lines.length - 1,
|
|
ch: lines[lines.length - 1].length
|
|
});
|
|
}
|
|
} else {
|
|
if (isTemplater) {
|
|
const file = activeView.file;
|
|
const runTemplater = await templater_default(app, insert, file);
|
|
if (runTemplater) {
|
|
const templateContent = await app.vault.read(insert);
|
|
const processed = await runTemplater(templateContent);
|
|
editor.replaceRange(processed, cursor);
|
|
const lines = processed.split("\n");
|
|
if (lines.length === 1) {
|
|
editor.setCursor({
|
|
line: cursor.line,
|
|
ch: cursor.ch + processed.length
|
|
});
|
|
} else {
|
|
editor.setCursor({
|
|
line: cursor.line + lines.length - 1,
|
|
ch: lines[lines.length - 1].length
|
|
});
|
|
}
|
|
} else {
|
|
new import_obsidian6.Notice("Failed to initialize Templater processor", 2e3);
|
|
return;
|
|
}
|
|
} else {
|
|
await app.internalPlugins?.plugins["templates"].instance.insertTemplate(insert);
|
|
}
|
|
}
|
|
} else {
|
|
new import_obsidian6.Notice("There was an issue inserting content at cursor, please try again", 2e3);
|
|
}
|
|
};
|
|
|
|
// src/handlers/createNote.ts
|
|
var import_obsidian8 = __toModule(require("obsidian"));
|
|
|
|
// src/nameModal.ts
|
|
var import_obsidian7 = __toModule(require("obsidian"));
|
|
var nameModal = class extends import_obsidian7.Modal {
|
|
constructor(app, onSubmit, defaultName) {
|
|
super(app);
|
|
__publicField(this, "result");
|
|
__publicField(this, "defaultName");
|
|
__publicField(this, "onSubmit");
|
|
this.onSubmit = onSubmit;
|
|
this.defaultName = defaultName;
|
|
}
|
|
onOpen() {
|
|
const { contentEl } = this;
|
|
contentEl.createEl("h1", { text: "Name of new note" });
|
|
new import_obsidian7.Setting(contentEl).setName("Name").addText((text2) => {
|
|
text2.setPlaceholder(this.defaultName);
|
|
text2.onChange((value) => {
|
|
this.result = value;
|
|
});
|
|
});
|
|
new import_obsidian7.Setting(contentEl).addButton((btn) => btn.setButtonText("Create Note").setCta().onClick(() => {
|
|
this.close();
|
|
this.onSubmit(this.result);
|
|
}));
|
|
}
|
|
onClose() {
|
|
const { contentEl } = this;
|
|
contentEl.empty();
|
|
}
|
|
};
|
|
|
|
// src/handlers/createNote.ts
|
|
var createNote = async (app, type, folder, prompt, filePath, isTemplater) => {
|
|
const path = type.match(/\(([\s\S]*?),?\s?(vsplit|hsplit|split|tab|same|false)?\)/);
|
|
if (path) {
|
|
let fullPath = `${path[1]}.md`;
|
|
const fileName = fullPath.substring(fullPath.lastIndexOf("/"));
|
|
fullPath = folder ? `${folder}/${fullPath}` : fullPath;
|
|
const directoryPath = fullPath.substring(0, fullPath.lastIndexOf("/"));
|
|
if (directoryPath && !app.vault.getAbstractFileByPath(directoryPath)) {
|
|
console.log("trying to create folder at: ", directoryPath);
|
|
await app.vault.createFolder(directoryPath);
|
|
}
|
|
try {
|
|
if (prompt === "true") {
|
|
const promptedName = await new Promise((res) => new nameModal(app, res, fileName).open());
|
|
fullPath = promptedName ? `${directoryPath}/${promptedName}.md` : fullPath;
|
|
}
|
|
const originalActiveView = app.workspace.getActiveViewOfType(import_obsidian8.MarkdownView);
|
|
const originalActiveLeaf = originalActiveView?.leaf;
|
|
let file;
|
|
if (typeof filePath === "string") {
|
|
file = await app.vault.create(fullPath, filePath);
|
|
} else {
|
|
if (isTemplater) {
|
|
const templateContent = await app.vault.read(filePath);
|
|
file = await app.vault.create(fullPath, templateContent);
|
|
const runTemplater = await templater_default(app, filePath, file);
|
|
const content = await app.vault.read(filePath);
|
|
const processed = await runTemplater(content);
|
|
await app.vault.modify(file, processed);
|
|
} else {
|
|
file = await app.vault.create(fullPath, "");
|
|
const tempLeaf = app.workspace.getLeaf("tab");
|
|
try {
|
|
await tempLeaf.openFile(file);
|
|
await app.internalPlugins?.plugins["templates"].instance.insertTemplate(filePath);
|
|
} finally {
|
|
tempLeaf.detach();
|
|
}
|
|
}
|
|
}
|
|
const openOption = path[2];
|
|
if (openOption === "false") {
|
|
return;
|
|
} else if (openOption === "vsplit") {
|
|
const leaf = app.workspace.getLeaf("split", "vertical");
|
|
await leaf.openFile(file);
|
|
} else if (openOption === "hsplit") {
|
|
const leaf = app.workspace.getLeaf("split", "horizontal");
|
|
await leaf.openFile(file);
|
|
} else if (openOption === "split") {
|
|
const leaf = app.workspace.getLeaf("split", "vertical");
|
|
await leaf.openFile(file);
|
|
} else if (openOption === "tab") {
|
|
const leaf = app.workspace.getLeaf("tab");
|
|
await leaf.openFile(file);
|
|
} else if (openOption === "same") {
|
|
if (originalActiveLeaf && originalActiveLeaf.view) {
|
|
await originalActiveLeaf.openFile(file);
|
|
} else {
|
|
const currentActiveView = app.workspace.getActiveViewOfType(import_obsidian8.MarkdownView);
|
|
if (currentActiveView?.leaf) {
|
|
await currentActiveView.leaf.openFile(file);
|
|
} else {
|
|
await app.workspace.getLeaf().openFile(file);
|
|
}
|
|
}
|
|
} else {
|
|
await app.workspace.getLeaf().openFile(file);
|
|
}
|
|
} catch (e) {
|
|
console.error("Error in Buttons: ", e);
|
|
new import_obsidian8.Notice("There was an error! Maybe the file already exists?", 2e3);
|
|
}
|
|
} else {
|
|
new import_obsidian8.Notice(`couldn't parse the path!`, 2e3);
|
|
}
|
|
};
|
|
|
|
// src/parser.ts
|
|
var getButtonPosition = (content, args) => {
|
|
let finalPosition;
|
|
const possiblePositions = [];
|
|
let possiblePosition = { lineStart: 0, lineEnd: 0 };
|
|
const contentArray = content.split("\n");
|
|
let open = false;
|
|
contentArray.forEach((item, index) => {
|
|
if (item.includes("```")) {
|
|
if (open === false) {
|
|
possiblePosition.lineStart = index;
|
|
open = true;
|
|
} else {
|
|
possiblePosition.lineEnd = index;
|
|
possiblePositions.push(possiblePosition);
|
|
possiblePosition = { lineStart: 0, lineEnd: 0 };
|
|
open = false;
|
|
}
|
|
}
|
|
});
|
|
possiblePositions.forEach((position) => {
|
|
const codeblock = contentArray.slice(position.lineStart, position.lineEnd + 1).join("\n");
|
|
if (codeblock.includes("button") && codeblock.includes(args.name)) {
|
|
finalPosition = position;
|
|
}
|
|
});
|
|
return finalPosition;
|
|
};
|
|
var getInlineButtonPosition = async (app, id) => {
|
|
const content = await createContentArray(app);
|
|
const position = { lineStart: 0, lineEnd: 0 };
|
|
content.contentArray.map((line) => line.split(" ")).forEach((words, index) => {
|
|
words.forEach((word) => {
|
|
if (word.startsWith("`button")) {
|
|
if (word === `\`button-${id}\``) {
|
|
position.lineStart = index;
|
|
position.lineEnd = index;
|
|
}
|
|
}
|
|
});
|
|
});
|
|
return position;
|
|
};
|
|
var getBlockButtonPositionById = async (app, id) => {
|
|
const store = getStore(app.isMobile);
|
|
if (!store || !id)
|
|
return void 0;
|
|
const activeFile = app.workspace.getActiveFile();
|
|
if (!activeFile)
|
|
return void 0;
|
|
const button = store.find((item) => item.id === `button-${id}` && item.path === activeFile.path);
|
|
if (!button)
|
|
return void 0;
|
|
return {
|
|
lineStart: button.position.start.line,
|
|
lineEnd: button.position.end.line
|
|
};
|
|
};
|
|
var findNumber = async (app, lineNumber) => {
|
|
const content = await createContentArray(app);
|
|
const value = [];
|
|
content.contentArray.forEach((line, index) => {
|
|
if (index === lineNumber - 1) {
|
|
value.push(line);
|
|
}
|
|
});
|
|
const convertWords = value.join("").replace("plus", "+").replace("minus", "-").replace("times", "*").replace(/divide(d)?(\sby)?/g, "/");
|
|
const numbers = convertWords.replace(/\s/g, "").match(/[^\w:]*?\d+?/g);
|
|
return numbers;
|
|
};
|
|
|
|
// src/buttonTypes/calculate.ts
|
|
var calculate = async (app, { action }, position) => {
|
|
let equation = action;
|
|
const variables = action.match(/\$[0-9]*/g);
|
|
if (variables) {
|
|
const output = variables.map(async (value) => {
|
|
const activeView = app.workspace.getActiveViewOfType(import_obsidian9.MarkdownView);
|
|
if (activeView) {
|
|
const lineNumber = parseInt(value.substring(1));
|
|
const numbers = await findNumber(app, lineNumber);
|
|
return { variable: value, numbers };
|
|
} else {
|
|
new import_obsidian9.Notice(`couldn't read file`, 2e3);
|
|
}
|
|
});
|
|
const resolved = await Promise.all(output);
|
|
resolved.forEach((term) => {
|
|
if (term.numbers) {
|
|
equation = equation.replace(term.variable, term.numbers.join(""));
|
|
} else {
|
|
new import_obsidian9.Notice("Check the line number in your calculate button", 3e3);
|
|
equation = void 0;
|
|
}
|
|
});
|
|
}
|
|
const fun = equation && import_math_expression_evaluator.default.eval(equation);
|
|
if (fun !== null && fun !== void 0) {
|
|
appendContent(app, `Result: ${fun}`, position.lineEnd, false);
|
|
}
|
|
};
|
|
|
|
// src/buttonTypes/remove.ts
|
|
var remove = async (app, { remove: remove2 }, { lineStart, lineEnd }) => {
|
|
await removeButton(app, remove2, lineStart, lineEnd);
|
|
};
|
|
|
|
// src/buttonTypes/replace.ts
|
|
var import_obsidian10 = __toModule(require("obsidian"));
|
|
var replace = async (app, { replace: replace2 }, position) => {
|
|
let cursorPosition;
|
|
if (replace2.includes("[cursor]")) {
|
|
const activeView = app.workspace.getActiveViewOfType(import_obsidian10.MarkdownView);
|
|
if (activeView) {
|
|
const editor = activeView.editor;
|
|
const cursor = editor.getCursor();
|
|
cursorPosition = cursor.line;
|
|
}
|
|
}
|
|
await removeSection(app, replace2, position, cursorPosition);
|
|
};
|
|
|
|
// src/buttonTypes/text.ts
|
|
var text = async (app, args, position) => {
|
|
if (args.type.includes("prepend")) {
|
|
await prependContent(app, args.action, position.lineStart, false);
|
|
}
|
|
if (args.type.includes("append")) {
|
|
await appendContent(app, args.action, position.lineEnd, false);
|
|
}
|
|
if (args.type.includes("note")) {
|
|
createNote(app, args.type, args.folder, args.prompt, args.action, false);
|
|
}
|
|
if (args.type.includes("line")) {
|
|
await addContentAtLine(app, args.action, args.type, false, position);
|
|
}
|
|
if (args.type.includes("cursor")) {
|
|
await addContentAtCursor(app, args.action, false);
|
|
}
|
|
};
|
|
|
|
// src/buttonTypes/template.ts
|
|
var import_obsidian11 = __toModule(require("obsidian"));
|
|
var findTemplate = (app, templateFile, templatesEnabled, templaterPluginEnabled) => {
|
|
const allFiles = app.vault.getFiles();
|
|
const results = [];
|
|
if (templatesEnabled) {
|
|
const folder = app.internalPlugins.plugins.templates.instance.options.folder;
|
|
if (folder) {
|
|
const folderLower = folder.toLowerCase();
|
|
const coreTemplateFile = allFiles.find((file) => file.path.toLowerCase() === `${folderLower}/${templateFile}.md`);
|
|
if (coreTemplateFile) {
|
|
results.push({
|
|
file: coreTemplateFile,
|
|
source: "core",
|
|
isTemplater: false
|
|
});
|
|
}
|
|
}
|
|
}
|
|
if (templaterPluginEnabled) {
|
|
const templaterPlugin = app.plugins?.plugins["templater-obsidian"];
|
|
const folder = templaterPlugin?.settings?.templates_folder;
|
|
if (folder) {
|
|
const folderLower = folder.toLowerCase();
|
|
const templaterFile = allFiles.find((file) => file.path.toLowerCase() === `${folderLower}/${templateFile}.md`);
|
|
if (templaterFile) {
|
|
results.push({
|
|
file: templaterFile,
|
|
source: "templater",
|
|
isTemplater: true
|
|
});
|
|
}
|
|
}
|
|
}
|
|
if (results.length === 0) {
|
|
return { file: null, isTemplater: false, source: "none" };
|
|
} else if (results.length === 1) {
|
|
const result = results[0];
|
|
return {
|
|
file: result.file,
|
|
isTemplater: result.isTemplater,
|
|
source: result.source
|
|
};
|
|
} else {
|
|
const templaterResult = results.find((r) => r.source === "templater");
|
|
const coreResult = results.find((r) => r.source === "core");
|
|
if (templaterResult && coreResult) {
|
|
new import_obsidian11.Notice(`Found template "${templateFile}" in both Core Templates and Templater folders. Using Templater version.`, 3e3);
|
|
return {
|
|
file: templaterResult.file,
|
|
isTemplater: templaterResult.isTemplater,
|
|
source: templaterResult.source
|
|
};
|
|
}
|
|
const result = results[0];
|
|
return {
|
|
file: result.file,
|
|
isTemplater: result.isTemplater,
|
|
source: result.source
|
|
};
|
|
}
|
|
};
|
|
var template = async (app, args, position) => {
|
|
const templatesEnabled = app.internalPlugins.plugins.templates.enabled;
|
|
const templaterPluginEnabled = !!app.plugins.plugins["templater-obsidian"];
|
|
const templateFile = args.action.toLowerCase();
|
|
if (!templatesEnabled && !templaterPluginEnabled) {
|
|
new import_obsidian11.Notice("You need to have the Templates or Templater plugin enabled and Template folder defined", 2e3);
|
|
return;
|
|
}
|
|
const searchResult = findTemplate(app, templateFile, templatesEnabled, templaterPluginEnabled);
|
|
if (!searchResult.file) {
|
|
const availableFolders = [];
|
|
if (templatesEnabled) {
|
|
const coreFolder = app.internalPlugins.plugins.templates.instance.options.folder;
|
|
if (coreFolder)
|
|
availableFolders.push(`Core Templates: ${coreFolder}`);
|
|
}
|
|
if (templaterPluginEnabled) {
|
|
const templaterPlugin = app.plugins?.plugins["templater-obsidian"];
|
|
const templaterFolder = templaterPlugin?.settings?.templates_folder;
|
|
if (templaterFolder)
|
|
availableFolders.push(`Templater: ${templaterFolder}`);
|
|
}
|
|
const folderList = availableFolders.length > 0 ? `
|
|
|
|
Searched in: ${availableFolders.join(", ")}` : "";
|
|
new import_obsidian11.Notice(`Couldn't find template "${templateFile}.md" in any configured template folder.${folderList}`, 4e3);
|
|
return;
|
|
}
|
|
const { file, isTemplater } = searchResult;
|
|
try {
|
|
if (args.type.includes("prepend")) {
|
|
await prependContent(app, file, position.lineStart, isTemplater);
|
|
}
|
|
if (args.type.includes("append")) {
|
|
await appendContent(app, file, position.lineEnd, isTemplater);
|
|
}
|
|
if (args.type.includes("note")) {
|
|
createNote(app, args.type, args.folder, args.prompt, file, isTemplater);
|
|
}
|
|
if (args.type.includes("line")) {
|
|
await addContentAtLine(app, file, args.type, isTemplater, position);
|
|
}
|
|
if (args.type.includes("cursor")) {
|
|
await addContentAtCursor(app, file, isTemplater);
|
|
}
|
|
} catch (error) {
|
|
console.error("Error executing template action:", error);
|
|
new import_obsidian11.Notice(`Error executing template "${templateFile}". Check console for details.`, 3e3);
|
|
}
|
|
};
|
|
|
|
// src/buttonTypes/link.ts
|
|
var link = ({ action }) => {
|
|
const link2 = action.trim();
|
|
window.open(link2);
|
|
};
|
|
|
|
// src/buttonTypes/copy.ts
|
|
var copy = ({ action }) => {
|
|
navigator.clipboard.writeText(action);
|
|
};
|
|
|
|
// src/buttonTypes/command.ts
|
|
var import_obsidian12 = __toModule(require("obsidian"));
|
|
var command = (app, args, buttonStart) => {
|
|
const allCommands = app.commands.listCommands();
|
|
const action = args.action;
|
|
const command2 = allCommands.filter((command3) => command3.name.toUpperCase() === action.toUpperCase().trim())[0];
|
|
if (!command2) {
|
|
new import_obsidian12.Notice(`Command "${action}" not found. Available commands can be found in the Command Palette.`);
|
|
console.error(`Button command error: Command "${action}" not found.`);
|
|
console.log("Available commands:", allCommands.map((cmd) => cmd.name));
|
|
return;
|
|
}
|
|
try {
|
|
if (args.type.includes("prepend")) {
|
|
app.workspace.getActiveViewOfType(import_obsidian12.MarkdownView).editor.setCursor(buttonStart.lineStart, 0);
|
|
app.commands.executeCommandById(command2.id);
|
|
}
|
|
if (args.type.includes("append")) {
|
|
app.workspace.getActiveViewOfType(import_obsidian12.MarkdownView).editor.setCursor(buttonStart.lineEnd + 2, 0);
|
|
app.commands.executeCommandById(command2.id);
|
|
}
|
|
if (args.type === "command") {
|
|
app.commands.executeCommandById(command2.id);
|
|
}
|
|
} catch (error) {
|
|
new import_obsidian12.Notice(`Failed to execute command "${action}": ${error.message}`);
|
|
console.error(`Button command execution error:`, error);
|
|
}
|
|
};
|
|
|
|
// src/buttonTypes/swap.ts
|
|
var import_obsidian14 = __toModule(require("obsidian"));
|
|
|
|
// src/buttonTypes/templater.ts
|
|
var import_obsidian13 = __toModule(require("obsidian"));
|
|
var templater2 = async (app, position) => {
|
|
const activeView = app.workspace.getActiveViewOfType(import_obsidian13.MarkdownView);
|
|
if (activeView) {
|
|
await activeView.save();
|
|
const file = activeView.file;
|
|
const content = await processTemplate(app, file);
|
|
const { args } = await getNewArgs(app, position);
|
|
const cachedData = [];
|
|
const cacheChange = app.vault.on("modify", (file2) => {
|
|
cachedData.push(file2.unsafeCachedData);
|
|
});
|
|
setTimeout(async () => {
|
|
const button = content.split("\n").splice(position.lineStart, position.lineEnd - position.lineStart + 2).join("\n");
|
|
let finalContent;
|
|
if (cachedData[0]) {
|
|
const cachedContent = cachedData[cachedData.length - 1].split("\n");
|
|
let addOne = false;
|
|
if (args.type.includes("prepend")) {
|
|
addOne = true;
|
|
} else if (args.type.includes("line")) {
|
|
const lineNumber = args.type.match(/(\d+)/g);
|
|
if (lineNumber[0]) {
|
|
const line = parseInt(lineNumber[0]) - 1;
|
|
if (line < position.lineStart && !args.replace) {
|
|
addOne = true;
|
|
}
|
|
}
|
|
}
|
|
if (addOne) {
|
|
cachedContent.splice(position.lineStart + 1, position.lineEnd - position.lineStart + 2, button);
|
|
} else {
|
|
cachedContent.splice(position.lineStart, position.lineEnd - position.lineStart + 2, button);
|
|
}
|
|
finalContent = cachedContent.join("\n");
|
|
} else {
|
|
finalContent = content;
|
|
}
|
|
await app.vault.modify(file, finalContent);
|
|
app.metadataCache.offref(cacheChange);
|
|
}, 200);
|
|
return args;
|
|
}
|
|
};
|
|
|
|
// src/buttonTypes/swap.ts
|
|
var swap = async (app, swap2, id, inline, file, buttonStart) => {
|
|
handleValueArray(swap2, async (argArray) => {
|
|
const swap3 = await getButtonSwapById(app, id);
|
|
const newSwap = swap3 + 1 > argArray.length - 1 ? 0 : swap3 + 1;
|
|
setButtonSwapById(app, id, newSwap);
|
|
let args = await getButtonById(app, argArray[swap3]);
|
|
let position;
|
|
let content;
|
|
if (args) {
|
|
if (args.templater) {
|
|
args = await templater2(app, position);
|
|
if (inline) {
|
|
new import_obsidian14.Notice("templater args don't work with inline buttons yet", 2e3);
|
|
}
|
|
}
|
|
if (args.type === "command") {
|
|
command(app, args, buttonStart);
|
|
}
|
|
if (args.type === "link") {
|
|
link(args);
|
|
}
|
|
if (args.type && args.type.includes("template")) {
|
|
content = await app.vault.read(file);
|
|
position = inline ? await getInlineButtonPosition(app, id) : getButtonPosition(content, args);
|
|
await template(app, args, position);
|
|
}
|
|
if (args.type === "calculate") {
|
|
await calculate(app, args, position);
|
|
}
|
|
if (args.type && args.type.includes("text")) {
|
|
content = await app.vault.read(file);
|
|
position = inline ? await getInlineButtonPosition(app, id) : getButtonPosition(content, args);
|
|
await text(app, args, position);
|
|
}
|
|
if (args.remove) {
|
|
content = await app.vault.read(file);
|
|
position = inline ? await getInlineButtonPosition(app, id) : getButtonPosition(content, args);
|
|
await remove(app, args, position);
|
|
}
|
|
if (args.replace) {
|
|
content = await app.vault.read(file);
|
|
position = inline ? await getInlineButtonPosition(app, id) : getButtonPosition(content, args);
|
|
await replace(app, args, position);
|
|
}
|
|
}
|
|
});
|
|
};
|
|
|
|
// src/buttonTypes/chain.ts
|
|
var import_obsidian15 = __toModule(require("obsidian"));
|
|
var chain = async (app, args, position, inline, id, file) => {
|
|
if (!Array.isArray(args.actions)) {
|
|
new import_obsidian15.Notice("No actions array found for chain button.");
|
|
return;
|
|
}
|
|
for (const actionObj of args.actions) {
|
|
try {
|
|
const actionArgs = { ...args, ...actionObj };
|
|
let processedAction = actionArgs.action;
|
|
let processedType = actionArgs.type;
|
|
let processedFolder = actionArgs.folder;
|
|
if (args.templater) {
|
|
try {
|
|
const activeFile = file || app.workspace.getActiveFile();
|
|
if (activeFile) {
|
|
const runTemplater = await templater_default(app, activeFile, activeFile);
|
|
if (runTemplater) {
|
|
if (actionArgs.action && actionArgs.action.includes("<%")) {
|
|
processedAction = await runTemplater(actionArgs.action);
|
|
}
|
|
if (actionArgs.type && actionArgs.type.includes("<%")) {
|
|
processedType = await runTemplater(actionArgs.type);
|
|
}
|
|
if (actionArgs.folder && actionArgs.folder.includes("<%")) {
|
|
processedFolder = await runTemplater(actionArgs.folder);
|
|
}
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.error("Error processing templater in chain action:", error);
|
|
new import_obsidian15.Notice("Error processing templater in chain action. Check console for details.", 2e3);
|
|
}
|
|
}
|
|
actionArgs.action = processedAction;
|
|
actionArgs.type = processedType;
|
|
actionArgs.folder = processedFolder;
|
|
let currentPosition = position;
|
|
if (actionArgs.type && (actionArgs.type.includes("text") || actionArgs.type.includes("template"))) {
|
|
if (file) {
|
|
const content = await app.vault.read(file);
|
|
currentPosition = inline && id ? await getInlineButtonPosition(app, id) : getButtonPosition(content, actionArgs);
|
|
}
|
|
}
|
|
if (actionArgs.type && actionArgs.type.includes("command")) {
|
|
command(app, actionArgs, currentPosition);
|
|
} else if (actionArgs.type === "copy") {
|
|
copy(actionArgs);
|
|
} else if (actionArgs.type === "link") {
|
|
link(actionArgs);
|
|
} else if (actionArgs.type && actionArgs.type.includes("template")) {
|
|
await template(app, actionArgs, currentPosition);
|
|
} else if (actionArgs.type === "calculate") {
|
|
await calculate(app, actionArgs, currentPosition);
|
|
} else if (actionArgs.type && actionArgs.type.includes("text")) {
|
|
await text(app, actionArgs, currentPosition);
|
|
} else if (actionArgs.type === "chain") {
|
|
await chain(app, actionArgs, currentPosition, inline, id, file);
|
|
} else {
|
|
new import_obsidian15.Notice(`Unsupported action type in chain: ${actionArgs.type}`);
|
|
}
|
|
} catch (e) {
|
|
console.error("Error executing chain action:", actionObj, e);
|
|
new import_obsidian15.Notice(`Error executing chain action: ${actionObj.type}`);
|
|
}
|
|
}
|
|
};
|
|
|
|
// src/button.ts
|
|
var createButton = ({
|
|
app,
|
|
el,
|
|
args,
|
|
inline,
|
|
id,
|
|
component,
|
|
clickOverride
|
|
}) => {
|
|
const button = el.createEl("button", {
|
|
cls: [
|
|
args.class ? `${args.class} ${args.color}` : `button-default ${args.color ? args.color : ""}`,
|
|
inline ? "button-inline" : ""
|
|
]
|
|
});
|
|
if (args.customcolor) {
|
|
button.style.backgroundColor = args.customcolor;
|
|
}
|
|
if (args.customtextcolor) {
|
|
button.style.color = args.customtextcolor;
|
|
}
|
|
import_obsidian16.MarkdownRenderer.render(app, args.name, button, app.workspace.getActiveFile()?.path || "", component);
|
|
const numberOfLines = args.name.split("\n").length;
|
|
let paddingTop = "auto";
|
|
let paddingBottom = "auto";
|
|
let alignment = args.align?.split(" ") || ["center", "middle"];
|
|
if (args.height) {
|
|
if (alignment.includes("top")) {
|
|
alignment = alignment.filter((a) => a !== "top");
|
|
paddingBottom = parseFloat(args.height) - 1.2 * numberOfLines + "em";
|
|
} else if (alignment.includes("bottom")) {
|
|
alignment = alignment.filter((a) => a !== "bottom");
|
|
paddingTop = parseFloat(args.height) - 1.2 * numberOfLines + "em";
|
|
} else {
|
|
alignment = alignment.filter((a) => a !== "middle");
|
|
paddingTop = (parseFloat(args.height) - 1.2 * numberOfLines) / 2 + "em";
|
|
paddingBottom = (parseFloat(args.height) - 1.2 * numberOfLines) / 2 + "em";
|
|
}
|
|
}
|
|
if (args.width) {
|
|
args.width += "em";
|
|
} else {
|
|
args.width = "auto";
|
|
}
|
|
button.innerHTML = `<div style='width: ${args.width};padding-top: ${paddingTop};padding-bottom: ${paddingBottom};text-align: ${alignment[0] || "center"};line-height: 1.2em;'>${button.innerHTML.slice(14, -4)}</div>`;
|
|
args.id ? button.setAttribute("id", args.id) : "";
|
|
button.on("click", "button", () => {
|
|
clickOverride ? clickOverride.click(...clickOverride.params) : clickHandler(app, args, inline, id);
|
|
});
|
|
return button;
|
|
};
|
|
var clickHandler = async (app, args, inline, id) => {
|
|
const activeView = app.workspace.getActiveViewOfType(import_obsidian16.MarkdownView);
|
|
const activeFile = activeView?.file || app.workspace.getActiveFile();
|
|
if (!activeFile) {
|
|
new import_obsidian16.Notice("No active file found. Buttons can only be used with files.");
|
|
return;
|
|
}
|
|
let content = await app.vault.read(activeFile);
|
|
const idFirstPosition = !inline && id ? await getBlockButtonPositionById(app, id) : void 0;
|
|
const buttonStart = idFirstPosition ?? getButtonPosition(content, args);
|
|
let position = inline ? await getInlineButtonPosition(app, id) : idFirstPosition ?? getButtonPosition(content, args);
|
|
let processedAction = args.action;
|
|
let processedType = args.type;
|
|
let processedFolder = args.folder;
|
|
if (args.templater) {
|
|
try {
|
|
const runTemplater = await templater_default(app, activeFile, activeFile);
|
|
if (runTemplater) {
|
|
if (args.action && args.action.includes("<%")) {
|
|
processedAction = await runTemplater(args.action);
|
|
}
|
|
if (args.type && args.type.includes("<%")) {
|
|
processedType = await runTemplater(args.type);
|
|
}
|
|
if (args.folder && args.folder.includes("<%")) {
|
|
processedFolder = await runTemplater(args.folder);
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.error("Error processing templater in button:", error);
|
|
new import_obsidian16.Notice("Error processing templater in button. Check console for details.", 2e3);
|
|
}
|
|
}
|
|
const processedArgs = { ...args, action: processedAction, type: processedType, folder: processedFolder };
|
|
if (args.replace) {
|
|
replace(app, processedArgs, position);
|
|
}
|
|
if (processedArgs.type && processedArgs.type.includes("command")) {
|
|
command(app, processedArgs, buttonStart);
|
|
}
|
|
if (processedArgs.type === "copy") {
|
|
copy(processedArgs);
|
|
}
|
|
if (processedArgs.type === "link") {
|
|
link(processedArgs);
|
|
}
|
|
if (processedArgs.type && processedArgs.type.includes("template")) {
|
|
content = await app.vault.read(activeFile);
|
|
position = inline ? await getInlineButtonPosition(app, id) : await getBlockButtonPositionById(app, id) ?? getButtonPosition(content, args);
|
|
await template(app, processedArgs, position);
|
|
}
|
|
if (processedArgs.type === "calculate") {
|
|
await calculate(app, processedArgs, position);
|
|
}
|
|
if (processedArgs.type && processedArgs.type.includes("text")) {
|
|
content = await app.vault.read(activeFile);
|
|
position = inline ? await getInlineButtonPosition(app, id) : await getBlockButtonPositionById(app, id) ?? getButtonPosition(content, args);
|
|
await text(app, processedArgs, position);
|
|
}
|
|
if (args.swap) {
|
|
if (!inline) {
|
|
new import_obsidian16.Notice("swap args only work in inline buttons for now", 2e3);
|
|
} else {
|
|
await swap(app, args.swap, id, inline, activeFile, buttonStart);
|
|
}
|
|
}
|
|
if (args.remove) {
|
|
content = await app.vault.read(activeFile);
|
|
await remove(app, processedArgs, position);
|
|
}
|
|
if (processedArgs.type === "chain") {
|
|
await chain(app, processedArgs, position, inline, id, activeFile);
|
|
return;
|
|
}
|
|
};
|
|
|
|
// src/suggest.ts
|
|
var import_obsidian17 = __toModule(require("obsidian"));
|
|
|
|
// node_modules/@popperjs/core/lib/enums.js
|
|
var top = "top";
|
|
var bottom = "bottom";
|
|
var right = "right";
|
|
var left = "left";
|
|
var auto = "auto";
|
|
var basePlacements = [top, bottom, right, left];
|
|
var start = "start";
|
|
var end = "end";
|
|
var clippingParents = "clippingParents";
|
|
var viewport = "viewport";
|
|
var popper = "popper";
|
|
var reference = "reference";
|
|
var variationPlacements = /* @__PURE__ */ basePlacements.reduce(function(acc, placement) {
|
|
return acc.concat([placement + "-" + start, placement + "-" + end]);
|
|
}, []);
|
|
var placements = /* @__PURE__ */ [].concat(basePlacements, [auto]).reduce(function(acc, placement) {
|
|
return acc.concat([placement, placement + "-" + start, placement + "-" + end]);
|
|
}, []);
|
|
var beforeRead = "beforeRead";
|
|
var read = "read";
|
|
var afterRead = "afterRead";
|
|
var beforeMain = "beforeMain";
|
|
var main = "main";
|
|
var afterMain = "afterMain";
|
|
var beforeWrite = "beforeWrite";
|
|
var write = "write";
|
|
var afterWrite = "afterWrite";
|
|
var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];
|
|
|
|
// node_modules/@popperjs/core/lib/dom-utils/getNodeName.js
|
|
function getNodeName(element) {
|
|
return element ? (element.nodeName || "").toLowerCase() : null;
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/dom-utils/getWindow.js
|
|
function getWindow(node) {
|
|
if (node == null) {
|
|
return window;
|
|
}
|
|
if (node.toString() !== "[object Window]") {
|
|
var ownerDocument = node.ownerDocument;
|
|
return ownerDocument ? ownerDocument.defaultView || window : window;
|
|
}
|
|
return node;
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/dom-utils/instanceOf.js
|
|
function isElement(node) {
|
|
var OwnElement = getWindow(node).Element;
|
|
return node instanceof OwnElement || node instanceof Element;
|
|
}
|
|
function isHTMLElement(node) {
|
|
var OwnElement = getWindow(node).HTMLElement;
|
|
return node instanceof OwnElement || node instanceof HTMLElement;
|
|
}
|
|
function isShadowRoot(node) {
|
|
if (typeof ShadowRoot === "undefined") {
|
|
return false;
|
|
}
|
|
var OwnElement = getWindow(node).ShadowRoot;
|
|
return node instanceof OwnElement || node instanceof ShadowRoot;
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/modifiers/applyStyles.js
|
|
function applyStyles(_ref) {
|
|
var state = _ref.state;
|
|
Object.keys(state.elements).forEach(function(name) {
|
|
var style = state.styles[name] || {};
|
|
var attributes = state.attributes[name] || {};
|
|
var element = state.elements[name];
|
|
if (!isHTMLElement(element) || !getNodeName(element)) {
|
|
return;
|
|
}
|
|
Object.assign(element.style, style);
|
|
Object.keys(attributes).forEach(function(name2) {
|
|
var value = attributes[name2];
|
|
if (value === false) {
|
|
element.removeAttribute(name2);
|
|
} else {
|
|
element.setAttribute(name2, value === true ? "" : value);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
function effect(_ref2) {
|
|
var state = _ref2.state;
|
|
var initialStyles = {
|
|
popper: {
|
|
position: state.options.strategy,
|
|
left: "0",
|
|
top: "0",
|
|
margin: "0"
|
|
},
|
|
arrow: {
|
|
position: "absolute"
|
|
},
|
|
reference: {}
|
|
};
|
|
Object.assign(state.elements.popper.style, initialStyles.popper);
|
|
state.styles = initialStyles;
|
|
if (state.elements.arrow) {
|
|
Object.assign(state.elements.arrow.style, initialStyles.arrow);
|
|
}
|
|
return function() {
|
|
Object.keys(state.elements).forEach(function(name) {
|
|
var element = state.elements[name];
|
|
var attributes = state.attributes[name] || {};
|
|
var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]);
|
|
var style = styleProperties.reduce(function(style2, property) {
|
|
style2[property] = "";
|
|
return style2;
|
|
}, {});
|
|
if (!isHTMLElement(element) || !getNodeName(element)) {
|
|
return;
|
|
}
|
|
Object.assign(element.style, style);
|
|
Object.keys(attributes).forEach(function(attribute) {
|
|
element.removeAttribute(attribute);
|
|
});
|
|
});
|
|
};
|
|
}
|
|
var applyStyles_default = {
|
|
name: "applyStyles",
|
|
enabled: true,
|
|
phase: "write",
|
|
fn: applyStyles,
|
|
effect,
|
|
requires: ["computeStyles"]
|
|
};
|
|
|
|
// node_modules/@popperjs/core/lib/utils/getBasePlacement.js
|
|
function getBasePlacement(placement) {
|
|
return placement.split("-")[0];
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js
|
|
function getBoundingClientRect(element) {
|
|
var rect = element.getBoundingClientRect();
|
|
return {
|
|
width: rect.width,
|
|
height: rect.height,
|
|
top: rect.top,
|
|
right: rect.right,
|
|
bottom: rect.bottom,
|
|
left: rect.left,
|
|
x: rect.left,
|
|
y: rect.top
|
|
};
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js
|
|
function getLayoutRect(element) {
|
|
var clientRect = getBoundingClientRect(element);
|
|
var width = element.offsetWidth;
|
|
var height = element.offsetHeight;
|
|
if (Math.abs(clientRect.width - width) <= 1) {
|
|
width = clientRect.width;
|
|
}
|
|
if (Math.abs(clientRect.height - height) <= 1) {
|
|
height = clientRect.height;
|
|
}
|
|
return {
|
|
x: element.offsetLeft,
|
|
y: element.offsetTop,
|
|
width,
|
|
height
|
|
};
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/dom-utils/contains.js
|
|
function contains(parent, child) {
|
|
var rootNode = child.getRootNode && child.getRootNode();
|
|
if (parent.contains(child)) {
|
|
return true;
|
|
} else if (rootNode && isShadowRoot(rootNode)) {
|
|
var next = child;
|
|
do {
|
|
if (next && parent.isSameNode(next)) {
|
|
return true;
|
|
}
|
|
next = next.parentNode || next.host;
|
|
} while (next);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js
|
|
function getComputedStyle(element) {
|
|
return getWindow(element).getComputedStyle(element);
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/dom-utils/isTableElement.js
|
|
function isTableElement(element) {
|
|
return ["table", "td", "th"].indexOf(getNodeName(element)) >= 0;
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js
|
|
function getDocumentElement(element) {
|
|
return ((isElement(element) ? element.ownerDocument : element.document) || window.document).documentElement;
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/dom-utils/getParentNode.js
|
|
function getParentNode(element) {
|
|
if (getNodeName(element) === "html") {
|
|
return element;
|
|
}
|
|
return element.assignedSlot || element.parentNode || (isShadowRoot(element) ? element.host : null) || getDocumentElement(element);
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js
|
|
function getTrueOffsetParent(element) {
|
|
if (!isHTMLElement(element) || getComputedStyle(element).position === "fixed") {
|
|
return null;
|
|
}
|
|
return element.offsetParent;
|
|
}
|
|
function getContainingBlock(element) {
|
|
var isFirefox = navigator.userAgent.toLowerCase().indexOf("firefox") !== -1;
|
|
var isIE = navigator.userAgent.indexOf("Trident") !== -1;
|
|
if (isIE && isHTMLElement(element)) {
|
|
var elementCss = getComputedStyle(element);
|
|
if (elementCss.position === "fixed") {
|
|
return null;
|
|
}
|
|
}
|
|
var currentNode = getParentNode(element);
|
|
while (isHTMLElement(currentNode) && ["html", "body"].indexOf(getNodeName(currentNode)) < 0) {
|
|
var css = getComputedStyle(currentNode);
|
|
if (css.transform !== "none" || css.perspective !== "none" || css.contain === "paint" || ["transform", "perspective"].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === "filter" || isFirefox && css.filter && css.filter !== "none") {
|
|
return currentNode;
|
|
} else {
|
|
currentNode = currentNode.parentNode;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
function getOffsetParent(element) {
|
|
var window2 = getWindow(element);
|
|
var offsetParent = getTrueOffsetParent(element);
|
|
while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === "static") {
|
|
offsetParent = getTrueOffsetParent(offsetParent);
|
|
}
|
|
if (offsetParent && (getNodeName(offsetParent) === "html" || getNodeName(offsetParent) === "body" && getComputedStyle(offsetParent).position === "static")) {
|
|
return window2;
|
|
}
|
|
return offsetParent || getContainingBlock(element) || window2;
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js
|
|
function getMainAxisFromPlacement(placement) {
|
|
return ["top", "bottom"].indexOf(placement) >= 0 ? "x" : "y";
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/utils/math.js
|
|
var max = Math.max;
|
|
var min = Math.min;
|
|
var round = Math.round;
|
|
|
|
// node_modules/@popperjs/core/lib/utils/within.js
|
|
function within(min2, value, max2) {
|
|
return max(min2, min(value, max2));
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/utils/getFreshSideObject.js
|
|
function getFreshSideObject() {
|
|
return {
|
|
top: 0,
|
|
right: 0,
|
|
bottom: 0,
|
|
left: 0
|
|
};
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/utils/mergePaddingObject.js
|
|
function mergePaddingObject(paddingObject) {
|
|
return Object.assign({}, getFreshSideObject(), paddingObject);
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/utils/expandToHashMap.js
|
|
function expandToHashMap(value, keys) {
|
|
return keys.reduce(function(hashMap, key) {
|
|
hashMap[key] = value;
|
|
return hashMap;
|
|
}, {});
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/modifiers/arrow.js
|
|
var toPaddingObject = function toPaddingObject2(padding, state) {
|
|
padding = typeof padding === "function" ? padding(Object.assign({}, state.rects, {
|
|
placement: state.placement
|
|
})) : padding;
|
|
return mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements));
|
|
};
|
|
function arrow(_ref) {
|
|
var _state$modifiersData$;
|
|
var state = _ref.state, name = _ref.name, options = _ref.options;
|
|
var arrowElement = state.elements.arrow;
|
|
var popperOffsets2 = state.modifiersData.popperOffsets;
|
|
var basePlacement = getBasePlacement(state.placement);
|
|
var axis = getMainAxisFromPlacement(basePlacement);
|
|
var isVertical = [left, right].indexOf(basePlacement) >= 0;
|
|
var len = isVertical ? "height" : "width";
|
|
if (!arrowElement || !popperOffsets2) {
|
|
return;
|
|
}
|
|
var paddingObject = toPaddingObject(options.padding, state);
|
|
var arrowRect = getLayoutRect(arrowElement);
|
|
var minProp = axis === "y" ? top : left;
|
|
var maxProp = axis === "y" ? bottom : right;
|
|
var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets2[axis] - state.rects.popper[len];
|
|
var startDiff = popperOffsets2[axis] - state.rects.reference[axis];
|
|
var arrowOffsetParent = getOffsetParent(arrowElement);
|
|
var clientSize = arrowOffsetParent ? axis === "y" ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;
|
|
var centerToReference = endDiff / 2 - startDiff / 2;
|
|
var min2 = paddingObject[minProp];
|
|
var max2 = clientSize - arrowRect[len] - paddingObject[maxProp];
|
|
var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;
|
|
var offset2 = within(min2, center, max2);
|
|
var axisProp = axis;
|
|
state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset2, _state$modifiersData$.centerOffset = offset2 - center, _state$modifiersData$);
|
|
}
|
|
function effect2(_ref2) {
|
|
var state = _ref2.state, options = _ref2.options;
|
|
var _options$element = options.element, arrowElement = _options$element === void 0 ? "[data-popper-arrow]" : _options$element;
|
|
if (arrowElement == null) {
|
|
return;
|
|
}
|
|
if (typeof arrowElement === "string") {
|
|
arrowElement = state.elements.popper.querySelector(arrowElement);
|
|
if (!arrowElement) {
|
|
return;
|
|
}
|
|
}
|
|
if (true) {
|
|
if (!isHTMLElement(arrowElement)) {
|
|
console.error(['Popper: "arrow" element must be an HTMLElement (not an SVGElement).', "To use an SVG arrow, wrap it in an HTMLElement that will be used as", "the arrow."].join(" "));
|
|
}
|
|
}
|
|
if (!contains(state.elements.popper, arrowElement)) {
|
|
if (true) {
|
|
console.error(['Popper: "arrow" modifier\'s `element` must be a child of the popper', "element."].join(" "));
|
|
}
|
|
return;
|
|
}
|
|
state.elements.arrow = arrowElement;
|
|
}
|
|
var arrow_default = {
|
|
name: "arrow",
|
|
enabled: true,
|
|
phase: "main",
|
|
fn: arrow,
|
|
effect: effect2,
|
|
requires: ["popperOffsets"],
|
|
requiresIfExists: ["preventOverflow"]
|
|
};
|
|
|
|
// node_modules/@popperjs/core/lib/modifiers/computeStyles.js
|
|
var unsetSides = {
|
|
top: "auto",
|
|
right: "auto",
|
|
bottom: "auto",
|
|
left: "auto"
|
|
};
|
|
function roundOffsetsByDPR(_ref) {
|
|
var x = _ref.x, y = _ref.y;
|
|
var win = window;
|
|
var dpr = win.devicePixelRatio || 1;
|
|
return {
|
|
x: round(round(x * dpr) / dpr) || 0,
|
|
y: round(round(y * dpr) / dpr) || 0
|
|
};
|
|
}
|
|
function mapToStyles(_ref2) {
|
|
var _Object$assign2;
|
|
var popper2 = _ref2.popper, popperRect = _ref2.popperRect, placement = _ref2.placement, offsets = _ref2.offsets, position = _ref2.position, gpuAcceleration = _ref2.gpuAcceleration, adaptive = _ref2.adaptive, roundOffsets = _ref2.roundOffsets;
|
|
var _ref3 = roundOffsets === true ? roundOffsetsByDPR(offsets) : typeof roundOffsets === "function" ? roundOffsets(offsets) : offsets, _ref3$x = _ref3.x, x = _ref3$x === void 0 ? 0 : _ref3$x, _ref3$y = _ref3.y, y = _ref3$y === void 0 ? 0 : _ref3$y;
|
|
var hasX = offsets.hasOwnProperty("x");
|
|
var hasY = offsets.hasOwnProperty("y");
|
|
var sideX = left;
|
|
var sideY = top;
|
|
var win = window;
|
|
if (adaptive) {
|
|
var offsetParent = getOffsetParent(popper2);
|
|
var heightProp = "clientHeight";
|
|
var widthProp = "clientWidth";
|
|
if (offsetParent === getWindow(popper2)) {
|
|
offsetParent = getDocumentElement(popper2);
|
|
if (getComputedStyle(offsetParent).position !== "static") {
|
|
heightProp = "scrollHeight";
|
|
widthProp = "scrollWidth";
|
|
}
|
|
}
|
|
offsetParent = offsetParent;
|
|
if (placement === top) {
|
|
sideY = bottom;
|
|
y -= offsetParent[heightProp] - popperRect.height;
|
|
y *= gpuAcceleration ? 1 : -1;
|
|
}
|
|
if (placement === left) {
|
|
sideX = right;
|
|
x -= offsetParent[widthProp] - popperRect.width;
|
|
x *= gpuAcceleration ? 1 : -1;
|
|
}
|
|
}
|
|
var commonStyles = Object.assign({
|
|
position
|
|
}, adaptive && unsetSides);
|
|
if (gpuAcceleration) {
|
|
var _Object$assign;
|
|
return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? "0" : "", _Object$assign[sideX] = hasX ? "0" : "", _Object$assign.transform = (win.devicePixelRatio || 1) < 2 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign));
|
|
}
|
|
return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : "", _Object$assign2[sideX] = hasX ? x + "px" : "", _Object$assign2.transform = "", _Object$assign2));
|
|
}
|
|
function computeStyles(_ref4) {
|
|
var state = _ref4.state, options = _ref4.options;
|
|
var _options$gpuAccelerat = options.gpuAcceleration, gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, _options$adaptive = options.adaptive, adaptive = _options$adaptive === void 0 ? true : _options$adaptive, _options$roundOffsets = options.roundOffsets, roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;
|
|
if (true) {
|
|
var transitionProperty = getComputedStyle(state.elements.popper).transitionProperty || "";
|
|
if (adaptive && ["transform", "top", "right", "bottom", "left"].some(function(property) {
|
|
return transitionProperty.indexOf(property) >= 0;
|
|
})) {
|
|
console.warn(["Popper: Detected CSS transitions on at least one of the following", 'CSS properties: "transform", "top", "right", "bottom", "left".', "\n\n", 'Disable the "computeStyles" modifier\'s `adaptive` option to allow', "for smooth transitions, or remove these properties from the CSS", "transition declaration on the popper element if only transitioning", "opacity or background-color for example.", "\n\n", "We recommend using the popper element as a wrapper around an inner", "element that can have any CSS property transitioned for animations."].join(" "));
|
|
}
|
|
}
|
|
var commonStyles = {
|
|
placement: getBasePlacement(state.placement),
|
|
popper: state.elements.popper,
|
|
popperRect: state.rects.popper,
|
|
gpuAcceleration
|
|
};
|
|
if (state.modifiersData.popperOffsets != null) {
|
|
state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {
|
|
offsets: state.modifiersData.popperOffsets,
|
|
position: state.options.strategy,
|
|
adaptive,
|
|
roundOffsets
|
|
})));
|
|
}
|
|
if (state.modifiersData.arrow != null) {
|
|
state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {
|
|
offsets: state.modifiersData.arrow,
|
|
position: "absolute",
|
|
adaptive: false,
|
|
roundOffsets
|
|
})));
|
|
}
|
|
state.attributes.popper = Object.assign({}, state.attributes.popper, {
|
|
"data-popper-placement": state.placement
|
|
});
|
|
}
|
|
var computeStyles_default = {
|
|
name: "computeStyles",
|
|
enabled: true,
|
|
phase: "beforeWrite",
|
|
fn: computeStyles,
|
|
data: {}
|
|
};
|
|
|
|
// node_modules/@popperjs/core/lib/modifiers/eventListeners.js
|
|
var passive = {
|
|
passive: true
|
|
};
|
|
function effect3(_ref) {
|
|
var state = _ref.state, instance = _ref.instance, options = _ref.options;
|
|
var _options$scroll = options.scroll, scroll = _options$scroll === void 0 ? true : _options$scroll, _options$resize = options.resize, resize = _options$resize === void 0 ? true : _options$resize;
|
|
var window2 = getWindow(state.elements.popper);
|
|
var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);
|
|
if (scroll) {
|
|
scrollParents.forEach(function(scrollParent) {
|
|
scrollParent.addEventListener("scroll", instance.update, passive);
|
|
});
|
|
}
|
|
if (resize) {
|
|
window2.addEventListener("resize", instance.update, passive);
|
|
}
|
|
return function() {
|
|
if (scroll) {
|
|
scrollParents.forEach(function(scrollParent) {
|
|
scrollParent.removeEventListener("scroll", instance.update, passive);
|
|
});
|
|
}
|
|
if (resize) {
|
|
window2.removeEventListener("resize", instance.update, passive);
|
|
}
|
|
};
|
|
}
|
|
var eventListeners_default = {
|
|
name: "eventListeners",
|
|
enabled: true,
|
|
phase: "write",
|
|
fn: function fn() {
|
|
},
|
|
effect: effect3,
|
|
data: {}
|
|
};
|
|
|
|
// node_modules/@popperjs/core/lib/utils/getOppositePlacement.js
|
|
var hash = {
|
|
left: "right",
|
|
right: "left",
|
|
bottom: "top",
|
|
top: "bottom"
|
|
};
|
|
function getOppositePlacement(placement) {
|
|
return placement.replace(/left|right|bottom|top/g, function(matched) {
|
|
return hash[matched];
|
|
});
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js
|
|
var hash2 = {
|
|
start: "end",
|
|
end: "start"
|
|
};
|
|
function getOppositeVariationPlacement(placement) {
|
|
return placement.replace(/start|end/g, function(matched) {
|
|
return hash2[matched];
|
|
});
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js
|
|
function getWindowScroll(node) {
|
|
var win = getWindow(node);
|
|
var scrollLeft = win.pageXOffset;
|
|
var scrollTop = win.pageYOffset;
|
|
return {
|
|
scrollLeft,
|
|
scrollTop
|
|
};
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js
|
|
function getWindowScrollBarX(element) {
|
|
return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js
|
|
function getViewportRect(element) {
|
|
var win = getWindow(element);
|
|
var html = getDocumentElement(element);
|
|
var visualViewport = win.visualViewport;
|
|
var width = html.clientWidth;
|
|
var height = html.clientHeight;
|
|
var x = 0;
|
|
var y = 0;
|
|
if (visualViewport) {
|
|
width = visualViewport.width;
|
|
height = visualViewport.height;
|
|
if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {
|
|
x = visualViewport.offsetLeft;
|
|
y = visualViewport.offsetTop;
|
|
}
|
|
}
|
|
return {
|
|
width,
|
|
height,
|
|
x: x + getWindowScrollBarX(element),
|
|
y
|
|
};
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js
|
|
function getDocumentRect(element) {
|
|
var _element$ownerDocumen;
|
|
var html = getDocumentElement(element);
|
|
var winScroll = getWindowScroll(element);
|
|
var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;
|
|
var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);
|
|
var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);
|
|
var x = -winScroll.scrollLeft + getWindowScrollBarX(element);
|
|
var y = -winScroll.scrollTop;
|
|
if (getComputedStyle(body || html).direction === "rtl") {
|
|
x += max(html.clientWidth, body ? body.clientWidth : 0) - width;
|
|
}
|
|
return {
|
|
width,
|
|
height,
|
|
x,
|
|
y
|
|
};
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js
|
|
function isScrollParent(element) {
|
|
var _getComputedStyle = getComputedStyle(element), overflow = _getComputedStyle.overflow, overflowX = _getComputedStyle.overflowX, overflowY = _getComputedStyle.overflowY;
|
|
return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js
|
|
function getScrollParent(node) {
|
|
if (["html", "body", "#document"].indexOf(getNodeName(node)) >= 0) {
|
|
return node.ownerDocument.body;
|
|
}
|
|
if (isHTMLElement(node) && isScrollParent(node)) {
|
|
return node;
|
|
}
|
|
return getScrollParent(getParentNode(node));
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js
|
|
function listScrollParents(element, list) {
|
|
var _element$ownerDocumen;
|
|
if (list === void 0) {
|
|
list = [];
|
|
}
|
|
var scrollParent = getScrollParent(element);
|
|
var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);
|
|
var win = getWindow(scrollParent);
|
|
var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;
|
|
var updatedList = list.concat(target);
|
|
return isBody ? updatedList : updatedList.concat(listScrollParents(getParentNode(target)));
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/utils/rectToClientRect.js
|
|
function rectToClientRect(rect) {
|
|
return Object.assign({}, rect, {
|
|
left: rect.x,
|
|
top: rect.y,
|
|
right: rect.x + rect.width,
|
|
bottom: rect.y + rect.height
|
|
});
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js
|
|
function getInnerBoundingClientRect(element) {
|
|
var rect = getBoundingClientRect(element);
|
|
rect.top = rect.top + element.clientTop;
|
|
rect.left = rect.left + element.clientLeft;
|
|
rect.bottom = rect.top + element.clientHeight;
|
|
rect.right = rect.left + element.clientWidth;
|
|
rect.width = element.clientWidth;
|
|
rect.height = element.clientHeight;
|
|
rect.x = rect.left;
|
|
rect.y = rect.top;
|
|
return rect;
|
|
}
|
|
function getClientRectFromMixedType(element, clippingParent) {
|
|
return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isHTMLElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element)));
|
|
}
|
|
function getClippingParents(element) {
|
|
var clippingParents2 = listScrollParents(getParentNode(element));
|
|
var canEscapeClipping = ["absolute", "fixed"].indexOf(getComputedStyle(element).position) >= 0;
|
|
var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;
|
|
if (!isElement(clipperElement)) {
|
|
return [];
|
|
}
|
|
return clippingParents2.filter(function(clippingParent) {
|
|
return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== "body";
|
|
});
|
|
}
|
|
function getClippingRect(element, boundary, rootBoundary) {
|
|
var mainClippingParents = boundary === "clippingParents" ? getClippingParents(element) : [].concat(boundary);
|
|
var clippingParents2 = [].concat(mainClippingParents, [rootBoundary]);
|
|
var firstClippingParent = clippingParents2[0];
|
|
var clippingRect = clippingParents2.reduce(function(accRect, clippingParent) {
|
|
var rect = getClientRectFromMixedType(element, clippingParent);
|
|
accRect.top = max(rect.top, accRect.top);
|
|
accRect.right = min(rect.right, accRect.right);
|
|
accRect.bottom = min(rect.bottom, accRect.bottom);
|
|
accRect.left = max(rect.left, accRect.left);
|
|
return accRect;
|
|
}, getClientRectFromMixedType(element, firstClippingParent));
|
|
clippingRect.width = clippingRect.right - clippingRect.left;
|
|
clippingRect.height = clippingRect.bottom - clippingRect.top;
|
|
clippingRect.x = clippingRect.left;
|
|
clippingRect.y = clippingRect.top;
|
|
return clippingRect;
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/utils/getVariation.js
|
|
function getVariation(placement) {
|
|
return placement.split("-")[1];
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/utils/computeOffsets.js
|
|
function computeOffsets(_ref) {
|
|
var reference2 = _ref.reference, element = _ref.element, placement = _ref.placement;
|
|
var basePlacement = placement ? getBasePlacement(placement) : null;
|
|
var variation = placement ? getVariation(placement) : null;
|
|
var commonX = reference2.x + reference2.width / 2 - element.width / 2;
|
|
var commonY = reference2.y + reference2.height / 2 - element.height / 2;
|
|
var offsets;
|
|
switch (basePlacement) {
|
|
case top:
|
|
offsets = {
|
|
x: commonX,
|
|
y: reference2.y - element.height
|
|
};
|
|
break;
|
|
case bottom:
|
|
offsets = {
|
|
x: commonX,
|
|
y: reference2.y + reference2.height
|
|
};
|
|
break;
|
|
case right:
|
|
offsets = {
|
|
x: reference2.x + reference2.width,
|
|
y: commonY
|
|
};
|
|
break;
|
|
case left:
|
|
offsets = {
|
|
x: reference2.x - element.width,
|
|
y: commonY
|
|
};
|
|
break;
|
|
default:
|
|
offsets = {
|
|
x: reference2.x,
|
|
y: reference2.y
|
|
};
|
|
}
|
|
var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;
|
|
if (mainAxis != null) {
|
|
var len = mainAxis === "y" ? "height" : "width";
|
|
switch (variation) {
|
|
case start:
|
|
offsets[mainAxis] = offsets[mainAxis] - (reference2[len] / 2 - element[len] / 2);
|
|
break;
|
|
case end:
|
|
offsets[mainAxis] = offsets[mainAxis] + (reference2[len] / 2 - element[len] / 2);
|
|
break;
|
|
default:
|
|
}
|
|
}
|
|
return offsets;
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/utils/detectOverflow.js
|
|
function detectOverflow(state, options) {
|
|
if (options === void 0) {
|
|
options = {};
|
|
}
|
|
var _options = options, _options$placement = _options.placement, placement = _options$placement === void 0 ? state.placement : _options$placement, _options$boundary = _options.boundary, boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, _options$rootBoundary = _options.rootBoundary, rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, _options$elementConte = _options.elementContext, elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, _options$altBoundary = _options.altBoundary, altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, _options$padding = _options.padding, padding = _options$padding === void 0 ? 0 : _options$padding;
|
|
var paddingObject = mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements));
|
|
var altContext = elementContext === popper ? reference : popper;
|
|
var referenceElement = state.elements.reference;
|
|
var popperRect = state.rects.popper;
|
|
var element = state.elements[altBoundary ? altContext : elementContext];
|
|
var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary);
|
|
var referenceClientRect = getBoundingClientRect(referenceElement);
|
|
var popperOffsets2 = computeOffsets({
|
|
reference: referenceClientRect,
|
|
element: popperRect,
|
|
strategy: "absolute",
|
|
placement
|
|
});
|
|
var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets2));
|
|
var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect;
|
|
var overflowOffsets = {
|
|
top: clippingClientRect.top - elementClientRect.top + paddingObject.top,
|
|
bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,
|
|
left: clippingClientRect.left - elementClientRect.left + paddingObject.left,
|
|
right: elementClientRect.right - clippingClientRect.right + paddingObject.right
|
|
};
|
|
var offsetData = state.modifiersData.offset;
|
|
if (elementContext === popper && offsetData) {
|
|
var offset2 = offsetData[placement];
|
|
Object.keys(overflowOffsets).forEach(function(key) {
|
|
var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;
|
|
var axis = [top, bottom].indexOf(key) >= 0 ? "y" : "x";
|
|
overflowOffsets[key] += offset2[axis] * multiply;
|
|
});
|
|
}
|
|
return overflowOffsets;
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js
|
|
function computeAutoPlacement(state, options) {
|
|
if (options === void 0) {
|
|
options = {};
|
|
}
|
|
var _options = options, placement = _options.placement, boundary = _options.boundary, rootBoundary = _options.rootBoundary, padding = _options.padding, flipVariations = _options.flipVariations, _options$allowedAutoP = _options.allowedAutoPlacements, allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP;
|
|
var variation = getVariation(placement);
|
|
var placements2 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function(placement2) {
|
|
return getVariation(placement2) === variation;
|
|
}) : basePlacements;
|
|
var allowedPlacements = placements2.filter(function(placement2) {
|
|
return allowedAutoPlacements.indexOf(placement2) >= 0;
|
|
});
|
|
if (allowedPlacements.length === 0) {
|
|
allowedPlacements = placements2;
|
|
if (true) {
|
|
console.error(["Popper: The `allowedAutoPlacements` option did not allow any", "placements. Ensure the `placement` option matches the variation", "of the allowed placements.", 'For example, "auto" cannot be used to allow "bottom-start".', 'Use "auto-start" instead.'].join(" "));
|
|
}
|
|
}
|
|
var overflows = allowedPlacements.reduce(function(acc, placement2) {
|
|
acc[placement2] = detectOverflow(state, {
|
|
placement: placement2,
|
|
boundary,
|
|
rootBoundary,
|
|
padding
|
|
})[getBasePlacement(placement2)];
|
|
return acc;
|
|
}, {});
|
|
return Object.keys(overflows).sort(function(a, b) {
|
|
return overflows[a] - overflows[b];
|
|
});
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/modifiers/flip.js
|
|
function getExpandedFallbackPlacements(placement) {
|
|
if (getBasePlacement(placement) === auto) {
|
|
return [];
|
|
}
|
|
var oppositePlacement = getOppositePlacement(placement);
|
|
return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];
|
|
}
|
|
function flip(_ref) {
|
|
var state = _ref.state, options = _ref.options, name = _ref.name;
|
|
if (state.modifiersData[name]._skip) {
|
|
return;
|
|
}
|
|
var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, specifiedFallbackPlacements = options.fallbackPlacements, padding = options.padding, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, _options$flipVariatio = options.flipVariations, flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, allowedAutoPlacements = options.allowedAutoPlacements;
|
|
var preferredPlacement = state.options.placement;
|
|
var basePlacement = getBasePlacement(preferredPlacement);
|
|
var isBasePlacement = basePlacement === preferredPlacement;
|
|
var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));
|
|
var placements2 = [preferredPlacement].concat(fallbackPlacements).reduce(function(acc, placement2) {
|
|
return acc.concat(getBasePlacement(placement2) === auto ? computeAutoPlacement(state, {
|
|
placement: placement2,
|
|
boundary,
|
|
rootBoundary,
|
|
padding,
|
|
flipVariations,
|
|
allowedAutoPlacements
|
|
}) : placement2);
|
|
}, []);
|
|
var referenceRect = state.rects.reference;
|
|
var popperRect = state.rects.popper;
|
|
var checksMap = new Map();
|
|
var makeFallbackChecks = true;
|
|
var firstFittingPlacement = placements2[0];
|
|
for (var i = 0; i < placements2.length; i++) {
|
|
var placement = placements2[i];
|
|
var _basePlacement = getBasePlacement(placement);
|
|
var isStartVariation = getVariation(placement) === start;
|
|
var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;
|
|
var len = isVertical ? "width" : "height";
|
|
var overflow = detectOverflow(state, {
|
|
placement,
|
|
boundary,
|
|
rootBoundary,
|
|
altBoundary,
|
|
padding
|
|
});
|
|
var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;
|
|
if (referenceRect[len] > popperRect[len]) {
|
|
mainVariationSide = getOppositePlacement(mainVariationSide);
|
|
}
|
|
var altVariationSide = getOppositePlacement(mainVariationSide);
|
|
var checks = [];
|
|
if (checkMainAxis) {
|
|
checks.push(overflow[_basePlacement] <= 0);
|
|
}
|
|
if (checkAltAxis) {
|
|
checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);
|
|
}
|
|
if (checks.every(function(check) {
|
|
return check;
|
|
})) {
|
|
firstFittingPlacement = placement;
|
|
makeFallbackChecks = false;
|
|
break;
|
|
}
|
|
checksMap.set(placement, checks);
|
|
}
|
|
if (makeFallbackChecks) {
|
|
var numberOfChecks = flipVariations ? 3 : 1;
|
|
var _loop = function _loop2(_i2) {
|
|
var fittingPlacement = placements2.find(function(placement2) {
|
|
var checks2 = checksMap.get(placement2);
|
|
if (checks2) {
|
|
return checks2.slice(0, _i2).every(function(check) {
|
|
return check;
|
|
});
|
|
}
|
|
});
|
|
if (fittingPlacement) {
|
|
firstFittingPlacement = fittingPlacement;
|
|
return "break";
|
|
}
|
|
};
|
|
for (var _i = numberOfChecks; _i > 0; _i--) {
|
|
var _ret = _loop(_i);
|
|
if (_ret === "break")
|
|
break;
|
|
}
|
|
}
|
|
if (state.placement !== firstFittingPlacement) {
|
|
state.modifiersData[name]._skip = true;
|
|
state.placement = firstFittingPlacement;
|
|
state.reset = true;
|
|
}
|
|
}
|
|
var flip_default = {
|
|
name: "flip",
|
|
enabled: true,
|
|
phase: "main",
|
|
fn: flip,
|
|
requiresIfExists: ["offset"],
|
|
data: {
|
|
_skip: false
|
|
}
|
|
};
|
|
|
|
// node_modules/@popperjs/core/lib/modifiers/hide.js
|
|
function getSideOffsets(overflow, rect, preventedOffsets) {
|
|
if (preventedOffsets === void 0) {
|
|
preventedOffsets = {
|
|
x: 0,
|
|
y: 0
|
|
};
|
|
}
|
|
return {
|
|
top: overflow.top - rect.height - preventedOffsets.y,
|
|
right: overflow.right - rect.width + preventedOffsets.x,
|
|
bottom: overflow.bottom - rect.height + preventedOffsets.y,
|
|
left: overflow.left - rect.width - preventedOffsets.x
|
|
};
|
|
}
|
|
function isAnySideFullyClipped(overflow) {
|
|
return [top, right, bottom, left].some(function(side) {
|
|
return overflow[side] >= 0;
|
|
});
|
|
}
|
|
function hide(_ref) {
|
|
var state = _ref.state, name = _ref.name;
|
|
var referenceRect = state.rects.reference;
|
|
var popperRect = state.rects.popper;
|
|
var preventedOffsets = state.modifiersData.preventOverflow;
|
|
var referenceOverflow = detectOverflow(state, {
|
|
elementContext: "reference"
|
|
});
|
|
var popperAltOverflow = detectOverflow(state, {
|
|
altBoundary: true
|
|
});
|
|
var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);
|
|
var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);
|
|
var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);
|
|
var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);
|
|
state.modifiersData[name] = {
|
|
referenceClippingOffsets,
|
|
popperEscapeOffsets,
|
|
isReferenceHidden,
|
|
hasPopperEscaped
|
|
};
|
|
state.attributes.popper = Object.assign({}, state.attributes.popper, {
|
|
"data-popper-reference-hidden": isReferenceHidden,
|
|
"data-popper-escaped": hasPopperEscaped
|
|
});
|
|
}
|
|
var hide_default = {
|
|
name: "hide",
|
|
enabled: true,
|
|
phase: "main",
|
|
requiresIfExists: ["preventOverflow"],
|
|
fn: hide
|
|
};
|
|
|
|
// node_modules/@popperjs/core/lib/modifiers/offset.js
|
|
function distanceAndSkiddingToXY(placement, rects, offset2) {
|
|
var basePlacement = getBasePlacement(placement);
|
|
var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;
|
|
var _ref = typeof offset2 === "function" ? offset2(Object.assign({}, rects, {
|
|
placement
|
|
})) : offset2, skidding = _ref[0], distance = _ref[1];
|
|
skidding = skidding || 0;
|
|
distance = (distance || 0) * invertDistance;
|
|
return [left, right].indexOf(basePlacement) >= 0 ? {
|
|
x: distance,
|
|
y: skidding
|
|
} : {
|
|
x: skidding,
|
|
y: distance
|
|
};
|
|
}
|
|
function offset(_ref2) {
|
|
var state = _ref2.state, options = _ref2.options, name = _ref2.name;
|
|
var _options$offset = options.offset, offset2 = _options$offset === void 0 ? [0, 0] : _options$offset;
|
|
var data = placements.reduce(function(acc, placement) {
|
|
acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset2);
|
|
return acc;
|
|
}, {});
|
|
var _data$state$placement = data[state.placement], x = _data$state$placement.x, y = _data$state$placement.y;
|
|
if (state.modifiersData.popperOffsets != null) {
|
|
state.modifiersData.popperOffsets.x += x;
|
|
state.modifiersData.popperOffsets.y += y;
|
|
}
|
|
state.modifiersData[name] = data;
|
|
}
|
|
var offset_default = {
|
|
name: "offset",
|
|
enabled: true,
|
|
phase: "main",
|
|
requires: ["popperOffsets"],
|
|
fn: offset
|
|
};
|
|
|
|
// node_modules/@popperjs/core/lib/modifiers/popperOffsets.js
|
|
function popperOffsets(_ref) {
|
|
var state = _ref.state, name = _ref.name;
|
|
state.modifiersData[name] = computeOffsets({
|
|
reference: state.rects.reference,
|
|
element: state.rects.popper,
|
|
strategy: "absolute",
|
|
placement: state.placement
|
|
});
|
|
}
|
|
var popperOffsets_default = {
|
|
name: "popperOffsets",
|
|
enabled: true,
|
|
phase: "read",
|
|
fn: popperOffsets,
|
|
data: {}
|
|
};
|
|
|
|
// node_modules/@popperjs/core/lib/utils/getAltAxis.js
|
|
function getAltAxis(axis) {
|
|
return axis === "x" ? "y" : "x";
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/modifiers/preventOverflow.js
|
|
function preventOverflow(_ref) {
|
|
var state = _ref.state, options = _ref.options, name = _ref.name;
|
|
var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, padding = options.padding, _options$tether = options.tether, tether = _options$tether === void 0 ? true : _options$tether, _options$tetherOffset = options.tetherOffset, tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;
|
|
var overflow = detectOverflow(state, {
|
|
boundary,
|
|
rootBoundary,
|
|
padding,
|
|
altBoundary
|
|
});
|
|
var basePlacement = getBasePlacement(state.placement);
|
|
var variation = getVariation(state.placement);
|
|
var isBasePlacement = !variation;
|
|
var mainAxis = getMainAxisFromPlacement(basePlacement);
|
|
var altAxis = getAltAxis(mainAxis);
|
|
var popperOffsets2 = state.modifiersData.popperOffsets;
|
|
var referenceRect = state.rects.reference;
|
|
var popperRect = state.rects.popper;
|
|
var tetherOffsetValue = typeof tetherOffset === "function" ? tetherOffset(Object.assign({}, state.rects, {
|
|
placement: state.placement
|
|
})) : tetherOffset;
|
|
var data = {
|
|
x: 0,
|
|
y: 0
|
|
};
|
|
if (!popperOffsets2) {
|
|
return;
|
|
}
|
|
if (checkMainAxis || checkAltAxis) {
|
|
var mainSide = mainAxis === "y" ? top : left;
|
|
var altSide = mainAxis === "y" ? bottom : right;
|
|
var len = mainAxis === "y" ? "height" : "width";
|
|
var offset2 = popperOffsets2[mainAxis];
|
|
var min2 = popperOffsets2[mainAxis] + overflow[mainSide];
|
|
var max2 = popperOffsets2[mainAxis] - overflow[altSide];
|
|
var additive = tether ? -popperRect[len] / 2 : 0;
|
|
var minLen = variation === start ? referenceRect[len] : popperRect[len];
|
|
var maxLen = variation === start ? -popperRect[len] : -referenceRect[len];
|
|
var arrowElement = state.elements.arrow;
|
|
var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {
|
|
width: 0,
|
|
height: 0
|
|
};
|
|
var arrowPaddingObject = state.modifiersData["arrow#persistent"] ? state.modifiersData["arrow#persistent"].padding : getFreshSideObject();
|
|
var arrowPaddingMin = arrowPaddingObject[mainSide];
|
|
var arrowPaddingMax = arrowPaddingObject[altSide];
|
|
var arrowLen = within(0, referenceRect[len], arrowRect[len]);
|
|
var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - tetherOffsetValue : minLen - arrowLen - arrowPaddingMin - tetherOffsetValue;
|
|
var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + tetherOffsetValue : maxLen + arrowLen + arrowPaddingMax + tetherOffsetValue;
|
|
var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);
|
|
var clientOffset = arrowOffsetParent ? mainAxis === "y" ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;
|
|
var offsetModifierValue = state.modifiersData.offset ? state.modifiersData.offset[state.placement][mainAxis] : 0;
|
|
var tetherMin = popperOffsets2[mainAxis] + minOffset - offsetModifierValue - clientOffset;
|
|
var tetherMax = popperOffsets2[mainAxis] + maxOffset - offsetModifierValue;
|
|
if (checkMainAxis) {
|
|
var preventedOffset = within(tether ? min(min2, tetherMin) : min2, offset2, tether ? max(max2, tetherMax) : max2);
|
|
popperOffsets2[mainAxis] = preventedOffset;
|
|
data[mainAxis] = preventedOffset - offset2;
|
|
}
|
|
if (checkAltAxis) {
|
|
var _mainSide = mainAxis === "x" ? top : left;
|
|
var _altSide = mainAxis === "x" ? bottom : right;
|
|
var _offset = popperOffsets2[altAxis];
|
|
var _min = _offset + overflow[_mainSide];
|
|
var _max = _offset - overflow[_altSide];
|
|
var _preventedOffset = within(tether ? min(_min, tetherMin) : _min, _offset, tether ? max(_max, tetherMax) : _max);
|
|
popperOffsets2[altAxis] = _preventedOffset;
|
|
data[altAxis] = _preventedOffset - _offset;
|
|
}
|
|
}
|
|
state.modifiersData[name] = data;
|
|
}
|
|
var preventOverflow_default = {
|
|
name: "preventOverflow",
|
|
enabled: true,
|
|
phase: "main",
|
|
fn: preventOverflow,
|
|
requiresIfExists: ["offset"]
|
|
};
|
|
|
|
// node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js
|
|
function getHTMLElementScroll(element) {
|
|
return {
|
|
scrollLeft: element.scrollLeft,
|
|
scrollTop: element.scrollTop
|
|
};
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js
|
|
function getNodeScroll(node) {
|
|
if (node === getWindow(node) || !isHTMLElement(node)) {
|
|
return getWindowScroll(node);
|
|
} else {
|
|
return getHTMLElementScroll(node);
|
|
}
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js
|
|
function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {
|
|
if (isFixed === void 0) {
|
|
isFixed = false;
|
|
}
|
|
var documentElement = getDocumentElement(offsetParent);
|
|
var rect = getBoundingClientRect(elementOrVirtualElement);
|
|
var isOffsetParentAnElement = isHTMLElement(offsetParent);
|
|
var scroll = {
|
|
scrollLeft: 0,
|
|
scrollTop: 0
|
|
};
|
|
var offsets = {
|
|
x: 0,
|
|
y: 0
|
|
};
|
|
if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
|
|
if (getNodeName(offsetParent) !== "body" || isScrollParent(documentElement)) {
|
|
scroll = getNodeScroll(offsetParent);
|
|
}
|
|
if (isHTMLElement(offsetParent)) {
|
|
offsets = getBoundingClientRect(offsetParent);
|
|
offsets.x += offsetParent.clientLeft;
|
|
offsets.y += offsetParent.clientTop;
|
|
} else if (documentElement) {
|
|
offsets.x = getWindowScrollBarX(documentElement);
|
|
}
|
|
}
|
|
return {
|
|
x: rect.left + scroll.scrollLeft - offsets.x,
|
|
y: rect.top + scroll.scrollTop - offsets.y,
|
|
width: rect.width,
|
|
height: rect.height
|
|
};
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/utils/orderModifiers.js
|
|
function order(modifiers) {
|
|
var map = new Map();
|
|
var visited = new Set();
|
|
var result = [];
|
|
modifiers.forEach(function(modifier) {
|
|
map.set(modifier.name, modifier);
|
|
});
|
|
function sort(modifier) {
|
|
visited.add(modifier.name);
|
|
var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);
|
|
requires.forEach(function(dep) {
|
|
if (!visited.has(dep)) {
|
|
var depModifier = map.get(dep);
|
|
if (depModifier) {
|
|
sort(depModifier);
|
|
}
|
|
}
|
|
});
|
|
result.push(modifier);
|
|
}
|
|
modifiers.forEach(function(modifier) {
|
|
if (!visited.has(modifier.name)) {
|
|
sort(modifier);
|
|
}
|
|
});
|
|
return result;
|
|
}
|
|
function orderModifiers(modifiers) {
|
|
var orderedModifiers = order(modifiers);
|
|
return modifierPhases.reduce(function(acc, phase) {
|
|
return acc.concat(orderedModifiers.filter(function(modifier) {
|
|
return modifier.phase === phase;
|
|
}));
|
|
}, []);
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/utils/debounce.js
|
|
function debounce(fn2) {
|
|
var pending;
|
|
return function() {
|
|
if (!pending) {
|
|
pending = new Promise(function(resolve) {
|
|
Promise.resolve().then(function() {
|
|
pending = void 0;
|
|
resolve(fn2());
|
|
});
|
|
});
|
|
}
|
|
return pending;
|
|
};
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/utils/format.js
|
|
function format(str) {
|
|
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
args[_key - 1] = arguments[_key];
|
|
}
|
|
return [].concat(args).reduce(function(p, c) {
|
|
return p.replace(/%s/, c);
|
|
}, str);
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/utils/validateModifiers.js
|
|
var INVALID_MODIFIER_ERROR = 'Popper: modifier "%s" provided an invalid %s property, expected %s but got %s';
|
|
var MISSING_DEPENDENCY_ERROR = 'Popper: modifier "%s" requires "%s", but "%s" modifier is not available';
|
|
var VALID_PROPERTIES = ["name", "enabled", "phase", "fn", "effect", "requires", "options"];
|
|
function validateModifiers(modifiers) {
|
|
modifiers.forEach(function(modifier) {
|
|
Object.keys(modifier).forEach(function(key) {
|
|
switch (key) {
|
|
case "name":
|
|
if (typeof modifier.name !== "string") {
|
|
console.error(format(INVALID_MODIFIER_ERROR, String(modifier.name), '"name"', '"string"', '"' + String(modifier.name) + '"'));
|
|
}
|
|
break;
|
|
case "enabled":
|
|
if (typeof modifier.enabled !== "boolean") {
|
|
console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"enabled"', '"boolean"', '"' + String(modifier.enabled) + '"'));
|
|
}
|
|
case "phase":
|
|
if (modifierPhases.indexOf(modifier.phase) < 0) {
|
|
console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"phase"', "either " + modifierPhases.join(", "), '"' + String(modifier.phase) + '"'));
|
|
}
|
|
break;
|
|
case "fn":
|
|
if (typeof modifier.fn !== "function") {
|
|
console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"fn"', '"function"', '"' + String(modifier.fn) + '"'));
|
|
}
|
|
break;
|
|
case "effect":
|
|
if (typeof modifier.effect !== "function") {
|
|
console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"effect"', '"function"', '"' + String(modifier.fn) + '"'));
|
|
}
|
|
break;
|
|
case "requires":
|
|
if (!Array.isArray(modifier.requires)) {
|
|
console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"requires"', '"array"', '"' + String(modifier.requires) + '"'));
|
|
}
|
|
break;
|
|
case "requiresIfExists":
|
|
if (!Array.isArray(modifier.requiresIfExists)) {
|
|
console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"requiresIfExists"', '"array"', '"' + String(modifier.requiresIfExists) + '"'));
|
|
}
|
|
break;
|
|
case "options":
|
|
case "data":
|
|
break;
|
|
default:
|
|
console.error('PopperJS: an invalid property has been provided to the "' + modifier.name + '" modifier, valid properties are ' + VALID_PROPERTIES.map(function(s) {
|
|
return '"' + s + '"';
|
|
}).join(", ") + '; but "' + key + '" was provided.');
|
|
}
|
|
modifier.requires && modifier.requires.forEach(function(requirement) {
|
|
if (modifiers.find(function(mod) {
|
|
return mod.name === requirement;
|
|
}) == null) {
|
|
console.error(format(MISSING_DEPENDENCY_ERROR, String(modifier.name), requirement, requirement));
|
|
}
|
|
});
|
|
});
|
|
});
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/utils/uniqueBy.js
|
|
function uniqueBy(arr, fn2) {
|
|
var identifiers = new Set();
|
|
return arr.filter(function(item) {
|
|
var identifier = fn2(item);
|
|
if (!identifiers.has(identifier)) {
|
|
identifiers.add(identifier);
|
|
return true;
|
|
}
|
|
});
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/utils/mergeByName.js
|
|
function mergeByName(modifiers) {
|
|
var merged = modifiers.reduce(function(merged2, current) {
|
|
var existing = merged2[current.name];
|
|
merged2[current.name] = existing ? Object.assign({}, existing, current, {
|
|
options: Object.assign({}, existing.options, current.options),
|
|
data: Object.assign({}, existing.data, current.data)
|
|
}) : current;
|
|
return merged2;
|
|
}, {});
|
|
return Object.keys(merged).map(function(key) {
|
|
return merged[key];
|
|
});
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/createPopper.js
|
|
var INVALID_ELEMENT_ERROR = "Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.";
|
|
var INFINITE_LOOP_ERROR = "Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.";
|
|
var DEFAULT_OPTIONS = {
|
|
placement: "bottom",
|
|
modifiers: [],
|
|
strategy: "absolute"
|
|
};
|
|
function areValidElements() {
|
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
args[_key] = arguments[_key];
|
|
}
|
|
return !args.some(function(element) {
|
|
return !(element && typeof element.getBoundingClientRect === "function");
|
|
});
|
|
}
|
|
function popperGenerator(generatorOptions) {
|
|
if (generatorOptions === void 0) {
|
|
generatorOptions = {};
|
|
}
|
|
var _generatorOptions = generatorOptions, _generatorOptions$def = _generatorOptions.defaultModifiers, defaultModifiers2 = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, _generatorOptions$def2 = _generatorOptions.defaultOptions, defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;
|
|
return function createPopper2(reference2, popper2, options) {
|
|
if (options === void 0) {
|
|
options = defaultOptions;
|
|
}
|
|
var state = {
|
|
placement: "bottom",
|
|
orderedModifiers: [],
|
|
options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),
|
|
modifiersData: {},
|
|
elements: {
|
|
reference: reference2,
|
|
popper: popper2
|
|
},
|
|
attributes: {},
|
|
styles: {}
|
|
};
|
|
var effectCleanupFns = [];
|
|
var isDestroyed = false;
|
|
var instance = {
|
|
state,
|
|
setOptions: function setOptions(options2) {
|
|
cleanupModifierEffects();
|
|
state.options = Object.assign({}, defaultOptions, state.options, options2);
|
|
state.scrollParents = {
|
|
reference: isElement(reference2) ? listScrollParents(reference2) : reference2.contextElement ? listScrollParents(reference2.contextElement) : [],
|
|
popper: listScrollParents(popper2)
|
|
};
|
|
var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers2, state.options.modifiers)));
|
|
state.orderedModifiers = orderedModifiers.filter(function(m) {
|
|
return m.enabled;
|
|
});
|
|
if (true) {
|
|
var modifiers = uniqueBy([].concat(orderedModifiers, state.options.modifiers), function(_ref) {
|
|
var name = _ref.name;
|
|
return name;
|
|
});
|
|
validateModifiers(modifiers);
|
|
if (getBasePlacement(state.options.placement) === auto) {
|
|
var flipModifier = state.orderedModifiers.find(function(_ref2) {
|
|
var name = _ref2.name;
|
|
return name === "flip";
|
|
});
|
|
if (!flipModifier) {
|
|
console.error(['Popper: "auto" placements require the "flip" modifier be', "present and enabled to work."].join(" "));
|
|
}
|
|
}
|
|
var _getComputedStyle = getComputedStyle(popper2), marginTop = _getComputedStyle.marginTop, marginRight = _getComputedStyle.marginRight, marginBottom = _getComputedStyle.marginBottom, marginLeft = _getComputedStyle.marginLeft;
|
|
if ([marginTop, marginRight, marginBottom, marginLeft].some(function(margin) {
|
|
return parseFloat(margin);
|
|
})) {
|
|
console.warn(['Popper: CSS "margin" styles cannot be used to apply padding', "between the popper and its reference element or boundary.", "To replicate margin, use the `offset` modifier, as well as", "the `padding` option in the `preventOverflow` and `flip`", "modifiers."].join(" "));
|
|
}
|
|
}
|
|
runModifierEffects();
|
|
return instance.update();
|
|
},
|
|
forceUpdate: function forceUpdate() {
|
|
if (isDestroyed) {
|
|
return;
|
|
}
|
|
var _state$elements = state.elements, reference3 = _state$elements.reference, popper3 = _state$elements.popper;
|
|
if (!areValidElements(reference3, popper3)) {
|
|
if (true) {
|
|
console.error(INVALID_ELEMENT_ERROR);
|
|
}
|
|
return;
|
|
}
|
|
state.rects = {
|
|
reference: getCompositeRect(reference3, getOffsetParent(popper3), state.options.strategy === "fixed"),
|
|
popper: getLayoutRect(popper3)
|
|
};
|
|
state.reset = false;
|
|
state.placement = state.options.placement;
|
|
state.orderedModifiers.forEach(function(modifier) {
|
|
return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);
|
|
});
|
|
var __debug_loops__ = 0;
|
|
for (var index = 0; index < state.orderedModifiers.length; index++) {
|
|
if (true) {
|
|
__debug_loops__ += 1;
|
|
if (__debug_loops__ > 100) {
|
|
console.error(INFINITE_LOOP_ERROR);
|
|
break;
|
|
}
|
|
}
|
|
if (state.reset === true) {
|
|
state.reset = false;
|
|
index = -1;
|
|
continue;
|
|
}
|
|
var _state$orderedModifie = state.orderedModifiers[index], fn2 = _state$orderedModifie.fn, _state$orderedModifie2 = _state$orderedModifie.options, _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, name = _state$orderedModifie.name;
|
|
if (typeof fn2 === "function") {
|
|
state = fn2({
|
|
state,
|
|
options: _options,
|
|
name,
|
|
instance
|
|
}) || state;
|
|
}
|
|
}
|
|
},
|
|
update: debounce(function() {
|
|
return new Promise(function(resolve) {
|
|
instance.forceUpdate();
|
|
resolve(state);
|
|
});
|
|
}),
|
|
destroy: function destroy() {
|
|
cleanupModifierEffects();
|
|
isDestroyed = true;
|
|
}
|
|
};
|
|
if (!areValidElements(reference2, popper2)) {
|
|
if (true) {
|
|
console.error(INVALID_ELEMENT_ERROR);
|
|
}
|
|
return instance;
|
|
}
|
|
instance.setOptions(options).then(function(state2) {
|
|
if (!isDestroyed && options.onFirstUpdate) {
|
|
options.onFirstUpdate(state2);
|
|
}
|
|
});
|
|
function runModifierEffects() {
|
|
state.orderedModifiers.forEach(function(_ref3) {
|
|
var name = _ref3.name, _ref3$options = _ref3.options, options2 = _ref3$options === void 0 ? {} : _ref3$options, effect4 = _ref3.effect;
|
|
if (typeof effect4 === "function") {
|
|
var cleanupFn = effect4({
|
|
state,
|
|
name,
|
|
instance,
|
|
options: options2
|
|
});
|
|
var noopFn = function noopFn2() {
|
|
};
|
|
effectCleanupFns.push(cleanupFn || noopFn);
|
|
}
|
|
});
|
|
}
|
|
function cleanupModifierEffects() {
|
|
effectCleanupFns.forEach(function(fn2) {
|
|
return fn2();
|
|
});
|
|
effectCleanupFns = [];
|
|
}
|
|
return instance;
|
|
};
|
|
}
|
|
|
|
// node_modules/@popperjs/core/lib/popper.js
|
|
var defaultModifiers = [eventListeners_default, popperOffsets_default, computeStyles_default, applyStyles_default, offset_default, flip_default, preventOverflow_default, arrow_default, hide_default];
|
|
var createPopper = /* @__PURE__ */ popperGenerator({
|
|
defaultModifiers
|
|
});
|
|
|
|
// src/suggest.ts
|
|
var Suggest = class {
|
|
constructor(owner, containerEl, scope) {
|
|
__publicField(this, "owner");
|
|
__publicField(this, "values");
|
|
__publicField(this, "suggestions");
|
|
__publicField(this, "selectedItem");
|
|
__publicField(this, "containerEl");
|
|
this.owner = owner;
|
|
this.containerEl = containerEl;
|
|
containerEl.on("click", ".suggestion-item", this.onSuggestionClick.bind(this));
|
|
containerEl.on("mousemove", ".suggestion-item", this.onSuggestionMouseover.bind(this));
|
|
scope.register([], "ArrowUp", (event) => {
|
|
if (!event.isComposing) {
|
|
this.setSelectedItem(this.selectedItem - 1, true);
|
|
return false;
|
|
}
|
|
});
|
|
scope.register([], "ArrowDown", (event) => {
|
|
if (!event.isComposing) {
|
|
this.setSelectedItem(this.selectedItem + 1, true);
|
|
return false;
|
|
}
|
|
});
|
|
scope.register([], "Enter", (event) => {
|
|
if (!event.isComposing) {
|
|
this.useSelectedItem(event);
|
|
return false;
|
|
}
|
|
});
|
|
}
|
|
onSuggestionClick(event, el) {
|
|
event.preventDefault();
|
|
const item = this.suggestions.indexOf(el);
|
|
this.setSelectedItem(item, false);
|
|
this.useSelectedItem(event);
|
|
}
|
|
onSuggestionMouseover(_event, el) {
|
|
const item = this.suggestions.indexOf(el);
|
|
this.setSelectedItem(item, false);
|
|
}
|
|
setSuggestions(values) {
|
|
this.containerEl.empty();
|
|
const suggestionEls = [];
|
|
values.forEach((value) => {
|
|
const suggestionEl = this.containerEl.createDiv("suggestion-item");
|
|
this.owner.renderSuggestion(value, suggestionEl);
|
|
suggestionEls.push(suggestionEl);
|
|
});
|
|
this.values = values;
|
|
this.suggestions = suggestionEls;
|
|
this.setSelectedItem(0, false);
|
|
}
|
|
useSelectedItem(event) {
|
|
const currentValue = this.values[this.selectedItem];
|
|
if (currentValue) {
|
|
this.owner.selectSuggestion(currentValue, event);
|
|
}
|
|
}
|
|
setSelectedItem(selectedIndex, scrollIntoView) {
|
|
const normalizedIndex = wrapAround(selectedIndex, this.suggestions.length);
|
|
const prevSelectedSuggestion = this.suggestions[this.selectedItem];
|
|
const selectedSuggestion = this.suggestions[normalizedIndex];
|
|
prevSelectedSuggestion?.removeClass("is-selected");
|
|
selectedSuggestion?.addClass("is-selected");
|
|
this.selectedItem = normalizedIndex;
|
|
if (scrollIntoView) {
|
|
selectedSuggestion.scrollIntoView(false);
|
|
}
|
|
}
|
|
};
|
|
var TextInputSuggest = class {
|
|
constructor(app, inputEl) {
|
|
__publicField(this, "app");
|
|
__publicField(this, "inputEl");
|
|
__publicField(this, "popper");
|
|
__publicField(this, "scope");
|
|
__publicField(this, "suggestEl");
|
|
__publicField(this, "suggest");
|
|
this.app = app;
|
|
this.inputEl = inputEl;
|
|
this.scope = new import_obsidian17.Scope();
|
|
this.suggestEl = createDiv("suggestion-container");
|
|
const suggestion = this.suggestEl.createDiv("suggestion");
|
|
this.suggest = new Suggest(this, suggestion, this.scope);
|
|
this.scope.register([], "Escape", this.close.bind(this));
|
|
this.inputEl.addEventListener("input", this.onInputChanged.bind(this));
|
|
this.inputEl.addEventListener("focus", this.onInputChanged.bind(this));
|
|
this.inputEl.addEventListener("blur", this.close.bind(this));
|
|
this.suggestEl.on("mousedown", ".suggestion-container", (event) => {
|
|
event.preventDefault();
|
|
});
|
|
}
|
|
onInputChanged() {
|
|
const inputStr = this.inputEl.value;
|
|
const suggestions = this.getSuggestions(inputStr);
|
|
if (suggestions.length > 0) {
|
|
this.suggest.setSuggestions(suggestions);
|
|
this.open(this.app.dom.appContainerEl, this.inputEl);
|
|
}
|
|
}
|
|
open(container, inputEl) {
|
|
this.app.keymap.pushScope(this.scope);
|
|
container.appendChild(this.suggestEl);
|
|
this.popper = createPopper(inputEl, this.suggestEl, {
|
|
placement: "bottom-start",
|
|
modifiers: [
|
|
{
|
|
name: "sameWidth",
|
|
enabled: true,
|
|
fn: ({ state, instance }) => {
|
|
const targetWidth = `${state.rects.reference.width}px`;
|
|
if (state.styles.popper.width === targetWidth) {
|
|
return;
|
|
}
|
|
state.styles.popper.width = targetWidth;
|
|
instance.update();
|
|
},
|
|
phase: "beforeWrite",
|
|
requires: ["computeStyles"]
|
|
}
|
|
]
|
|
});
|
|
}
|
|
close() {
|
|
this.app.keymap.popScope(this.scope);
|
|
this.suggest.setSuggestions([]);
|
|
this.popper && this.popper.destroy();
|
|
this.suggestEl.detach();
|
|
}
|
|
};
|
|
var CommandSuggest = class extends TextInputSuggest {
|
|
getSuggestions(inputStr) {
|
|
const commands = this.app.commands.commands;
|
|
const commandNames = [];
|
|
const inputLowerCase = inputStr.toLowerCase();
|
|
for (const command2 in commands) {
|
|
const commandObj = commands[command2];
|
|
if (commandObj.name.toLowerCase().contains(inputLowerCase)) {
|
|
commandNames.push(commandObj);
|
|
}
|
|
}
|
|
return commandNames;
|
|
}
|
|
renderSuggestion(command2, el) {
|
|
el.setText(command2.name);
|
|
}
|
|
selectSuggestion(command2) {
|
|
this.inputEl.value = command2.name;
|
|
this.inputEl.trigger("input");
|
|
this.close();
|
|
}
|
|
};
|
|
var TemplateSuggest = class extends TextInputSuggest {
|
|
constructor() {
|
|
super(...arguments);
|
|
__publicField(this, "templatesEnabled", this.app.internalPlugins.plugins.templates.enabled);
|
|
__publicField(this, "templaterPluginEnabled", !!this.app.plugins.plugins["templater-obsidian"]);
|
|
__publicField(this, "getTemplateFolders", () => {
|
|
const folders = [];
|
|
if (this.templatesEnabled) {
|
|
const coreFolder = this.app.internalPlugins.plugins.templates.instance.options.folder;
|
|
if (coreFolder) {
|
|
folders.push(coreFolder.toLowerCase());
|
|
}
|
|
}
|
|
if (this.templaterPluginEnabled) {
|
|
const templaterPlugin = this.app.plugins.plugins["templater-obsidian"];
|
|
const templaterFolder = templaterPlugin?.settings?.templates_folder;
|
|
if (templaterFolder) {
|
|
folders.push(templaterFolder.toLowerCase());
|
|
}
|
|
}
|
|
return folders;
|
|
});
|
|
}
|
|
getSuggestions(inputStr) {
|
|
const abstractFiles = this.app.vault.getAllLoadedFiles();
|
|
const files = [];
|
|
const lowerCaseInputStr = inputStr.toLowerCase();
|
|
const folders = this.getTemplateFolders();
|
|
if (folders.length === 0) {
|
|
return files;
|
|
}
|
|
abstractFiles.forEach((file) => {
|
|
let exists = false;
|
|
folders.forEach((folder) => {
|
|
if (file.path.toLowerCase().contains(`${folder}/`)) {
|
|
exists = true;
|
|
}
|
|
});
|
|
if (file instanceof import_obsidian17.TFile && file.extension === "md" && exists && file.path.toLowerCase().contains(lowerCaseInputStr)) {
|
|
files.push(file);
|
|
}
|
|
});
|
|
return files;
|
|
}
|
|
renderSuggestion(file, el) {
|
|
const fileName = file.name.split(".")[0];
|
|
const folders = this.getTemplateFolders();
|
|
let source = "";
|
|
for (const folder of folders) {
|
|
if (file.path.toLowerCase().contains(`${folder}/`)) {
|
|
if (this.templatesEnabled) {
|
|
const coreFolder = this.app.internalPlugins.plugins.templates.instance.options.folder?.toLowerCase();
|
|
if (coreFolder === folder) {
|
|
source = " (Core)";
|
|
break;
|
|
}
|
|
}
|
|
if (this.templaterPluginEnabled) {
|
|
const templaterPlugin = this.app.plugins.plugins["templater-obsidian"];
|
|
const templaterFolder = templaterPlugin?.settings?.templates_folder?.toLowerCase();
|
|
if (templaterFolder === folder) {
|
|
source = " (Templater)";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
el.setText(fileName + source);
|
|
}
|
|
selectSuggestion(file) {
|
|
this.inputEl.value = file.name.split(".")[0];
|
|
this.inputEl.trigger("input");
|
|
this.close();
|
|
}
|
|
};
|
|
var ButtonSuggest = class extends TextInputSuggest {
|
|
getSuggestions() {
|
|
const buttonStore2 = getStore(this.app.isMobile);
|
|
const buttons = [];
|
|
buttonStore2.forEach((button) => {
|
|
const trimmed = button.id.split("-")[1];
|
|
buttons.push(trimmed);
|
|
});
|
|
return buttons;
|
|
}
|
|
renderSuggestion(button, el) {
|
|
el.setText(button);
|
|
}
|
|
selectSuggestion(button) {
|
|
this.inputEl.value = this.inputEl.value + button;
|
|
this.inputEl.trigger("input");
|
|
this.close();
|
|
}
|
|
};
|
|
|
|
// src/modal.ts
|
|
var ButtonModal = class extends import_obsidian18.Modal {
|
|
constructor(app) {
|
|
super(app);
|
|
__publicField(this, "activeView");
|
|
__publicField(this, "activeEditor");
|
|
__publicField(this, "activeCursor");
|
|
__publicField(this, "buttonPreviewEl", createEl("p"));
|
|
__publicField(this, "previewComponent", null);
|
|
__publicField(this, "commandSuggestEl", createEl("input", { type: "text" }));
|
|
__publicField(this, "fileSuggestEl", createEl("input", { type: "text" }));
|
|
__publicField(this, "removeSuggestEl", createEl("input", { type: "text" }));
|
|
__publicField(this, "swapSuggestEl", createEl("input", { type: "text" }));
|
|
__publicField(this, "idSuggestEl", createEl("input", { type: "text" }));
|
|
__publicField(this, "removeSuggest");
|
|
__publicField(this, "swapSuggest");
|
|
__publicField(this, "idSuggest");
|
|
__publicField(this, "commandSuggest");
|
|
__publicField(this, "fileSuggest");
|
|
__publicField(this, "handleCommandChange");
|
|
__publicField(this, "handleCommandBlur");
|
|
__publicField(this, "handleFileChange");
|
|
__publicField(this, "handleFileBlur");
|
|
__publicField(this, "outputObject", {
|
|
name: "My Awesome Button",
|
|
type: "",
|
|
action: "",
|
|
swap: "",
|
|
remove: "",
|
|
replace: "",
|
|
id: "",
|
|
templater: false,
|
|
class: "",
|
|
color: "",
|
|
customColor: "",
|
|
customTextColor: "",
|
|
blockId: "",
|
|
folder: "",
|
|
prompt: false,
|
|
openMethod: "",
|
|
noteTitle: "My New Note",
|
|
actions: []
|
|
});
|
|
this.commandSuggest = new CommandSuggest(this.app, this.commandSuggestEl);
|
|
this.commandSuggestEl.placeholder = "Toggle Pin";
|
|
this.commandSuggestEl.addEventListener("change", (e) => {
|
|
this.outputObject.action = e.target.value;
|
|
});
|
|
this.commandSuggestEl.addEventListener("blur", (e) => {
|
|
this.outputObject.action = e.target.value;
|
|
});
|
|
this.fileSuggest = new TemplateSuggest(this.app, this.fileSuggestEl);
|
|
this.fileSuggestEl.placeholder = "My Template";
|
|
this.fileSuggestEl.addEventListener("change", (e) => {
|
|
this.outputObject.action = e.target.value;
|
|
});
|
|
this.fileSuggestEl.addEventListener("blur", (e) => {
|
|
this.outputObject.action = e.target.value;
|
|
});
|
|
this.removeSuggest = new ButtonSuggest(this.app, this.removeSuggestEl);
|
|
this.removeSuggestEl.value = "true";
|
|
this.removeSuggestEl.addEventListener("change", (e) => {
|
|
this.outputObject.remove = e.target.value;
|
|
});
|
|
this.removeSuggestEl.addEventListener("blur", (e) => {
|
|
this.outputObject.remove = e.target.value;
|
|
});
|
|
this.swapSuggest = new ButtonSuggest(this.app, this.swapSuggestEl);
|
|
this.swapSuggestEl.addEventListener("change", (e) => {
|
|
this.outputObject.swap = e.target.value;
|
|
});
|
|
this.swapSuggestEl.addEventListener("blur", (e) => {
|
|
this.outputObject.swap = e.target.value;
|
|
});
|
|
this.idSuggest = new ButtonSuggest(this.app, this.idSuggestEl);
|
|
this.idSuggestEl.addEventListener("change", (e) => {
|
|
this.outputObject.id = e.target.value;
|
|
});
|
|
this.idSuggestEl.addEventListener("blur", (e) => {
|
|
this.outputObject.id = e.target.value;
|
|
});
|
|
this.swapSuggestEl.placeholder = "[idOne, idTwo]";
|
|
}
|
|
onOpen() {
|
|
const { titleEl, contentEl } = this;
|
|
titleEl.setText("Button Maker");
|
|
titleEl.addClass("button-maker-title");
|
|
contentEl.addClass("button-maker");
|
|
const mainContainer = contentEl.createEl("div", { cls: "button-maker-container" });
|
|
mainContainer.createEl("form", { cls: "button-maker-form" }, (formEl) => {
|
|
const basicSection = formEl.createEl("div", { cls: "form-section" });
|
|
basicSection.createEl("h3", { cls: "section-title", text: "Basic Settings" });
|
|
const nameContainer = basicSection.createEl("div", { cls: "form-field" });
|
|
nameContainer.createEl("label", { cls: "field-label", text: "Button Name" });
|
|
nameContainer.createEl("div", { cls: "field-description", text: "What would you like to call this button?" });
|
|
const nameInput = nameContainer.createEl("input", {
|
|
type: "text",
|
|
cls: "field-input",
|
|
attr: { placeholder: "My Awesome Button" }
|
|
});
|
|
nameInput.addEventListener("input", (e) => {
|
|
const value = e.target.value;
|
|
this.buttonPreviewEl.setText(value);
|
|
this.outputObject.name = value;
|
|
});
|
|
window.setTimeout(() => nameInput.focus(), 10);
|
|
const typeContainer = basicSection.createEl("div", { cls: "form-field" });
|
|
typeContainer.createEl("label", { cls: "field-label", text: "Button Type" });
|
|
typeContainer.createEl("div", { cls: "field-description", text: "What type of button are you making?" });
|
|
const typeSelect = typeContainer.createEl("select", { cls: "dropdown" });
|
|
const typeOptions = [
|
|
{ value: "pre", text: "Select a Button Type" },
|
|
{ value: "command", text: "Command - Run a command prompt command" },
|
|
{ value: "link", text: "Link - Open a URL or URI" },
|
|
{ value: "template", text: "Template - Insert or create notes from templates" },
|
|
{ value: "text", text: "Text - Insert or create notes with text" },
|
|
{ value: "calculate", text: "Calculate - Run a mathematical calculation" },
|
|
{ value: "swap", text: "Swap - Create a multi-purpose Inline Button from other Buttons" },
|
|
{ value: "copy", text: "Copy - Copy text to clipboard" },
|
|
{ value: "chain", text: "Chain - Run multiple actions in sequence" }
|
|
];
|
|
typeOptions.forEach((option, index) => {
|
|
const optionEl = typeSelect.createEl("option");
|
|
optionEl.value = option.value;
|
|
optionEl.textContent = option.text;
|
|
if (index === 0) {
|
|
optionEl.selected = true;
|
|
this.outputObject.type = option.value;
|
|
}
|
|
});
|
|
const actionContainer = formEl.createEl("div", { cls: "action-container" });
|
|
typeSelect.addEventListener("change", (e) => {
|
|
const value = e.target.value;
|
|
this.outputObject.type = value;
|
|
actionContainer.empty();
|
|
if (value === "pre") {
|
|
return;
|
|
} else if (value === "chain") {
|
|
this.renderChainActions(actionContainer);
|
|
} else if (value === "link") {
|
|
this.renderLinkAction(actionContainer);
|
|
} else if (value === "command") {
|
|
this.renderCommandAction(actionContainer);
|
|
} else if (value.includes("template")) {
|
|
this.renderTemplateAction(actionContainer);
|
|
} else if (value === "text") {
|
|
this.renderTextAction(actionContainer);
|
|
} else if (value === "calculate") {
|
|
this.renderCalculateAction(actionContainer);
|
|
} else if (value === "swap") {
|
|
this.renderSwapAction(actionContainer);
|
|
} else if (value === "copy") {
|
|
this.renderCopyAction(actionContainer);
|
|
}
|
|
});
|
|
const advancedSection = formEl.createEl("div", { cls: "form-section" });
|
|
advancedSection.createEl("h3", { cls: "section-title", text: "Advanced Settings" });
|
|
const blockIdContainer = advancedSection.createEl("div", { cls: "form-field" });
|
|
blockIdContainer.createEl("label", { cls: "field-label", text: "Button Block ID" });
|
|
blockIdContainer.createEl("div", { cls: "field-description", text: "Provide a custom button-block-id" });
|
|
const blockIdInput = blockIdContainer.createEl("input", {
|
|
type: "text",
|
|
cls: "field-input",
|
|
attr: { placeholder: "buttonId" }
|
|
});
|
|
blockIdInput.addEventListener("input", (e) => {
|
|
this.outputObject.blockId = e.target.value;
|
|
});
|
|
const toggleSettings = advancedSection.createEl("div", { cls: "toggle-settings" });
|
|
const removeContainer = toggleSettings.createEl("div", { cls: "toggle-field" });
|
|
const removeToggleRow = removeContainer.createEl("div", { cls: "toggle-row" });
|
|
removeToggleRow.createEl("label", { cls: "toggle-label" });
|
|
const removeToggle = removeToggleRow.createEl("input", { type: "checkbox", cls: "toggle-input" });
|
|
removeToggleRow.createEl("span", { cls: "toggle-text", text: "Remove after click" });
|
|
removeToggleRow.createEl("div", { cls: "toggle-description", text: "Remove this button (or other buttons) after clicking?" });
|
|
removeToggle.addEventListener("change", (e) => {
|
|
const checked = e.target.checked;
|
|
if (checked) {
|
|
this.renderRemoveSettings(removeContainer);
|
|
this.outputObject.remove = "true";
|
|
} else {
|
|
this.outputObject.remove = "";
|
|
const removeSettings = removeContainer.querySelector(".remove-settings");
|
|
if (removeSettings)
|
|
removeSettings.remove();
|
|
}
|
|
});
|
|
const replaceContainer = toggleSettings.createEl("div", { cls: "toggle-field" });
|
|
const replaceToggleRow = replaceContainer.createEl("div", { cls: "toggle-row" });
|
|
replaceToggleRow.createEl("label", { cls: "toggle-label" });
|
|
const replaceToggle = replaceToggleRow.createEl("input", { type: "checkbox", cls: "toggle-input" });
|
|
replaceToggleRow.createEl("span", { cls: "toggle-text", text: "Replace content" });
|
|
replaceToggleRow.createEl("div", { cls: "toggle-description", text: "Replace lines in the note after clicking?" });
|
|
replaceToggle.addEventListener("change", (e) => {
|
|
const checked = e.target.checked;
|
|
if (checked) {
|
|
this.renderReplaceSettings(replaceContainer);
|
|
} else {
|
|
const replaceSettings = replaceContainer.querySelector(".replace-settings");
|
|
if (replaceSettings)
|
|
replaceSettings.remove();
|
|
}
|
|
});
|
|
const inheritContainer = toggleSettings.createEl("div", { cls: "toggle-field" });
|
|
const inheritToggleRow = inheritContainer.createEl("div", { cls: "toggle-row" });
|
|
inheritToggleRow.createEl("label", { cls: "toggle-label" });
|
|
const inheritToggle = inheritToggleRow.createEl("input", { type: "checkbox", cls: "toggle-input" });
|
|
inheritToggleRow.createEl("span", { cls: "toggle-text", text: "Inherit from other button" });
|
|
inheritToggleRow.createEl("div", { cls: "toggle-description", text: "Inherit args by adding an existing button block-id?" });
|
|
inheritToggle.addEventListener("change", (e) => {
|
|
const checked = e.target.checked;
|
|
if (checked) {
|
|
this.renderInheritSettings(inheritContainer);
|
|
} else {
|
|
this.outputObject.id = "";
|
|
const inheritSettings = inheritContainer.querySelector(".inherit-settings");
|
|
if (inheritSettings)
|
|
inheritSettings.remove();
|
|
}
|
|
});
|
|
const templaterContainer = toggleSettings.createEl("div", { cls: "toggle-field" });
|
|
const templaterToggleRow = templaterContainer.createEl("div", { cls: "toggle-row" });
|
|
templaterToggleRow.createEl("label", { cls: "toggle-label" });
|
|
const templaterToggle = templaterToggleRow.createEl("input", { type: "checkbox", cls: "toggle-input" });
|
|
templaterToggleRow.createEl("span", { cls: "toggle-text", text: "Enable Templater" });
|
|
templaterToggleRow.createEl("div", { cls: "toggle-description", text: "Convert templater commands inside your button on each click?" });
|
|
templaterToggle.addEventListener("change", (e) => {
|
|
this.outputObject.templater = e.target.checked;
|
|
});
|
|
const stylingSection = formEl.createEl("div", { cls: "form-section" });
|
|
stylingSection.createEl("h3", { cls: "section-title", text: "Styling" });
|
|
const classContainer = stylingSection.createEl("div", { cls: "form-field" });
|
|
classContainer.createEl("label", { cls: "field-label", text: "Custom Class" });
|
|
classContainer.createEl("div", { cls: "field-description", text: "Add a custom class for button styling" });
|
|
const classInput = classContainer.createEl("input", {
|
|
type: "text",
|
|
cls: "field-input"
|
|
});
|
|
classInput.addEventListener("input", (e) => {
|
|
const value = e.target.value;
|
|
this.buttonPreviewEl.setAttribute("class", value);
|
|
this.outputObject.class = value;
|
|
if (value === "") {
|
|
this.buttonPreviewEl.setAttribute("class", "button-default");
|
|
}
|
|
});
|
|
const colorContainer = stylingSection.createEl("div", { cls: "form-field" });
|
|
colorContainer.createEl("label", { cls: "field-label", text: "Color" });
|
|
colorContainer.createEl("div", { cls: "field-description", text: "What color would you like your button to be?" });
|
|
const colorSelect = colorContainer.createEl("select", { cls: "dropdown" });
|
|
const colorOptions = [
|
|
{ value: "default", text: "Default Color" },
|
|
{ value: "blue", text: "Blue" },
|
|
{ value: "red", text: "Red" },
|
|
{ value: "green", text: "Green" },
|
|
{ value: "yellow", text: "Yellow" },
|
|
{ value: "purple", text: "Purple" },
|
|
{ value: "custom", text: "Custom" }
|
|
];
|
|
colorOptions.forEach((option) => {
|
|
const optionEl = colorSelect.createEl("option");
|
|
optionEl.value = option.value;
|
|
optionEl.textContent = option.text;
|
|
if (option.value === "default") {
|
|
optionEl.selected = true;
|
|
}
|
|
});
|
|
colorSelect.addEventListener("change", (e) => {
|
|
const value = e.target.value;
|
|
if (value === "custom") {
|
|
this.renderCustomColorSettings(colorContainer);
|
|
} else {
|
|
this.outputObject.color = value;
|
|
this.updateButtonPreview();
|
|
}
|
|
});
|
|
const buttonContainer = formEl.createEl("div", { cls: "form-actions" });
|
|
const cancelBtn = buttonContainer.createEl("button", {
|
|
type: "button",
|
|
cls: "btn btn-secondary",
|
|
text: "Cancel"
|
|
});
|
|
cancelBtn.addEventListener("click", () => this.close());
|
|
buttonContainer.createEl("button", {
|
|
type: "submit",
|
|
cls: "btn btn-primary",
|
|
text: "Insert Button"
|
|
});
|
|
formEl.addEventListener("submit", (e) => {
|
|
e.preventDefault();
|
|
insertButton(this.app, this.outputObject);
|
|
this.close();
|
|
});
|
|
});
|
|
const previewSection = mainContainer.createEl("div", { cls: "preview-section" });
|
|
previewSection.createEl("h3", { cls: "section-title", text: "Button Preview" });
|
|
const previewContainer = previewSection.createEl("div", { cls: "preview-container" });
|
|
this.previewComponent = new import_obsidian18.Component();
|
|
this.buttonPreviewEl = createButton({
|
|
app: this.app,
|
|
el: previewContainer,
|
|
args: { name: "My Awesome Button" },
|
|
component: this.previewComponent
|
|
});
|
|
}
|
|
renderChainActions(container) {
|
|
if (!Array.isArray(this.outputObject.actions)) {
|
|
this.outputObject.actions = [];
|
|
}
|
|
const actionsHeader = container.createEl("div", { cls: "actions-header" });
|
|
actionsHeader.createEl("h4", { text: "Chain Actions" });
|
|
actionsHeader.createEl("p", { text: "Add actions to be executed in sequence" });
|
|
const actionsList = container.createEl("div", { cls: "actions-list" });
|
|
const renderActions = () => {
|
|
actionsList.empty();
|
|
this.outputObject.actions.forEach((act, idx) => {
|
|
const actionCard = actionsList.createEl("div", { cls: "action-card" });
|
|
const actionHeader = actionCard.createEl("div", { cls: "action-header" });
|
|
actionHeader.createEl("span", { cls: "action-number", text: `Action ${idx + 1}` });
|
|
const removeBtn = actionHeader.createEl("button", {
|
|
type: "button",
|
|
cls: "btn-remove",
|
|
text: "\xD7"
|
|
});
|
|
removeBtn.addEventListener("click", (e) => {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
this.outputObject.actions.splice(idx, 1);
|
|
renderActions();
|
|
});
|
|
const typeSelect = actionCard.createEl("select", { cls: "dropdown" });
|
|
const typeOptions = [
|
|
{ value: "command", text: "Command" },
|
|
{ value: "append text", text: "Append Text" },
|
|
{ value: "prepend text", text: "Prepend Text" },
|
|
{ value: "line text", text: "Line Text" },
|
|
{ value: "note text", text: "Note Text" },
|
|
{ value: "append template", text: "Append Template" },
|
|
{ value: "prepend template", text: "Prepend Template" },
|
|
{ value: "line template", text: "Line Template" },
|
|
{ value: "note template", text: "Note Template" },
|
|
{ value: "link", text: "Link" },
|
|
{ value: "calculate", text: "Calculate" },
|
|
{ value: "copy", text: "Copy" }
|
|
];
|
|
typeOptions.forEach((opt) => {
|
|
const option = typeSelect.createEl("option");
|
|
option.value = opt.value;
|
|
option.textContent = opt.text;
|
|
if (act.type === opt.value)
|
|
option.selected = true;
|
|
});
|
|
const actionInputContainer = actionCard.createEl("div", { cls: "action-input-container" });
|
|
this.renderActionInput(actionInputContainer, idx, act.type);
|
|
typeSelect.addEventListener("change", () => {
|
|
this.outputObject.actions[idx].type = typeSelect.value;
|
|
actionInputContainer.empty();
|
|
this.renderActionInput(actionInputContainer, idx, typeSelect.value);
|
|
});
|
|
});
|
|
};
|
|
const addActionBtn = container.createEl("button", {
|
|
type: "button",
|
|
cls: "btn btn-add-action",
|
|
text: "+ Add Action"
|
|
});
|
|
addActionBtn.addEventListener("click", (e) => {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
this.outputObject.actions.push({ type: "command", action: "" });
|
|
renderActions();
|
|
});
|
|
renderActions();
|
|
}
|
|
renderLinkAction(container) {
|
|
const field = container.createEl("div", { cls: "form-field" });
|
|
field.createEl("label", { cls: "field-label", text: "Link" });
|
|
field.createEl("div", { cls: "field-description", text: "Enter a link to open" });
|
|
const input = field.createEl("input", {
|
|
type: "text",
|
|
cls: "field-input",
|
|
attr: { placeholder: "https://obsidian.md" }
|
|
});
|
|
input.addEventListener("input", (e) => {
|
|
this.outputObject.action = e.target.value;
|
|
});
|
|
}
|
|
renderCommandAction(container) {
|
|
const field = container.createEl("div", { cls: "form-field" });
|
|
field.createEl("label", { cls: "field-label", text: "Command" });
|
|
field.createEl("div", { cls: "field-description", text: "Select a command to run" });
|
|
const commandTypeSelect = field.createEl("select", { cls: "dropdown" });
|
|
const defaultOption = commandTypeSelect.createEl("option", { value: "command", text: "Default" });
|
|
defaultOption.selected = true;
|
|
commandTypeSelect.createEl("option", { value: "prepend command", text: "Prepend" });
|
|
commandTypeSelect.createEl("option", { value: "append command", text: "Append" });
|
|
const commandInput = field.createEl("input", {
|
|
type: "text",
|
|
cls: "field-input"
|
|
});
|
|
commandInput.replaceWith(this.commandSuggestEl);
|
|
commandTypeSelect.addEventListener("change", (e) => {
|
|
this.outputObject.type = e.target.value;
|
|
});
|
|
}
|
|
renderTemplateAction(container) {
|
|
const field = container.createEl("div", { cls: "form-field" });
|
|
field.createEl("label", { cls: "field-label", text: "Template" });
|
|
field.createEl("div", { cls: "field-description", text: "Select a template note and what should happen" });
|
|
const templateTypeSelect = field.createEl("select", { cls: "dropdown" });
|
|
const templateDefaultOption = templateTypeSelect.createEl("option", { value: "template", text: "Do this..." });
|
|
templateDefaultOption.selected = true;
|
|
templateTypeSelect.createEl("option", { value: "prepend template", text: "Prepend" });
|
|
templateTypeSelect.createEl("option", { value: "append template", text: "Append" });
|
|
templateTypeSelect.createEl("option", { value: "line template", text: "Line" });
|
|
templateTypeSelect.createEl("option", { value: "cursor template", text: "Cursor" });
|
|
templateTypeSelect.createEl("option", { value: "note template", text: "Note" });
|
|
const templateInput = field.createEl("input", {
|
|
type: "text",
|
|
cls: "field-input"
|
|
});
|
|
templateInput.replaceWith(this.fileSuggestEl);
|
|
templateTypeSelect.addEventListener("change", (e) => {
|
|
const value = e.target.value;
|
|
if (value && value !== "template") {
|
|
this.outputObject.type = value;
|
|
}
|
|
if (value === "line template") {
|
|
this.renderLineNumberField(container);
|
|
} else if (value === "note template") {
|
|
this.renderNoteTemplateFields(container);
|
|
}
|
|
});
|
|
}
|
|
renderTextAction(container) {
|
|
const field = container.createEl("div", { cls: "form-field" });
|
|
field.createEl("label", { cls: "field-label", text: "Text" });
|
|
field.createEl("div", { cls: "field-description", text: "Enter the text content" });
|
|
const textTypeSelect = field.createEl("select", { cls: "dropdown" });
|
|
const textDefaultOption = textTypeSelect.createEl("option", { value: "text", text: "Do this..." });
|
|
textDefaultOption.selected = true;
|
|
textTypeSelect.createEl("option", { value: "append text", text: "Append" });
|
|
textTypeSelect.createEl("option", { value: "prepend text", text: "Prepend" });
|
|
textTypeSelect.createEl("option", { value: "line text", text: "Line" });
|
|
textTypeSelect.createEl("option", { value: "cursor text", text: "Cursor" });
|
|
textTypeSelect.createEl("option", { value: "note text", text: "Note" });
|
|
const textArea = field.createEl("textarea", {
|
|
cls: "field-textarea",
|
|
attr: { placeholder: "Enter your text content here..." }
|
|
});
|
|
textArea.addEventListener("input", (e) => {
|
|
this.outputObject.action = e.target.value;
|
|
});
|
|
textTypeSelect.addEventListener("change", (e) => {
|
|
const value = e.target.value;
|
|
if (value && value !== "text") {
|
|
this.outputObject.type = value;
|
|
}
|
|
if (value === "line text") {
|
|
this.renderLineNumberField(container);
|
|
} else if (value === "note text") {
|
|
this.renderNoteTextFields(container);
|
|
}
|
|
});
|
|
}
|
|
renderCalculateAction(container) {
|
|
const field = container.createEl("div", { cls: "form-field" });
|
|
field.createEl("label", { cls: "field-label", text: "Calculate" });
|
|
field.createEl("div", { cls: "field-description", text: "Enter a calculation, you can reference a line number with $LineNumber" });
|
|
const input = field.createEl("input", {
|
|
type: "text",
|
|
cls: "field-input",
|
|
attr: { placeholder: "2+$10" }
|
|
});
|
|
input.addEventListener("input", (e) => {
|
|
this.outputObject.action = e.target.value;
|
|
});
|
|
}
|
|
renderSwapAction(container) {
|
|
this.outputObject.type = "";
|
|
const field = container.createEl("div", { cls: "form-field" });
|
|
field.createEl("label", { cls: "field-label", text: "Swap" });
|
|
field.createEl("div", { cls: "field-description", text: "Choose buttons to be included in the Inline Swap Button" });
|
|
const input = field.createEl("input", {
|
|
type: "text",
|
|
cls: "field-input"
|
|
});
|
|
input.replaceWith(this.swapSuggestEl);
|
|
}
|
|
renderCopyAction(container) {
|
|
const field = container.createEl("div", { cls: "form-field" });
|
|
field.createEl("label", { cls: "field-label", text: "Text" });
|
|
field.createEl("div", { cls: "field-description", text: "Text to copy for clipboard" });
|
|
const textarea = field.createEl("textarea", {
|
|
cls: "field-textarea",
|
|
attr: {
|
|
placeholder: "Text to copy\nSupports multiple lines",
|
|
rows: "5"
|
|
}
|
|
});
|
|
textarea.addEventListener("input", (e) => {
|
|
this.outputObject.action = e.target.value;
|
|
});
|
|
}
|
|
renderRemoveSettings(container) {
|
|
const removeSettings = container.createEl("div", { cls: "remove-settings" });
|
|
const field = removeSettings.createEl("div", { cls: "form-field" });
|
|
field.createEl("label", { cls: "field-label", text: "Select Remove" });
|
|
field.createEl("div", { cls: "field-description", text: "Use true to remove this button, or supply an [array] of button block-ids" });
|
|
const input = field.createEl("input", {
|
|
type: "text",
|
|
cls: "field-input"
|
|
});
|
|
input.replaceWith(this.removeSuggestEl);
|
|
}
|
|
renderReplaceSettings(container) {
|
|
const replaceSettings = container.createEl("div", { cls: "replace-settings" });
|
|
const field = replaceSettings.createEl("div", { cls: "form-field" });
|
|
field.createEl("label", { cls: "field-label", text: "Select Lines" });
|
|
field.createEl("div", { cls: "field-description", text: "Supply an array of [startingLine, endingLine] to be replaced" });
|
|
const input = field.createEl("input", {
|
|
type: "text",
|
|
cls: "field-input",
|
|
attr: { value: "[]" }
|
|
});
|
|
input.addEventListener("input", (e) => {
|
|
this.outputObject.replace = e.target.value;
|
|
});
|
|
}
|
|
renderInheritSettings(container) {
|
|
const inheritSettings = container.createEl("div", { cls: "inherit-settings" });
|
|
const field = inheritSettings.createEl("div", { cls: "form-field" });
|
|
field.createEl("label", { cls: "field-label", text: "Button ID" });
|
|
field.createEl("div", { cls: "field-description", text: "Inherit from other buttons by adding their button block-id" });
|
|
const input = field.createEl("input", {
|
|
type: "text",
|
|
cls: "field-input"
|
|
});
|
|
input.replaceWith(this.idSuggestEl);
|
|
}
|
|
renderCustomColorSettings(container) {
|
|
this.outputObject.color = "";
|
|
const customColorContainer = container.createEl("div", { cls: "custom-color-container" });
|
|
const bgField = customColorContainer.createEl("div", { cls: "form-field" });
|
|
bgField.createEl("label", { cls: "field-label", text: "Background Color" });
|
|
const bgInput = bgField.createEl("input", {
|
|
type: "text",
|
|
cls: "field-input",
|
|
attr: { placeholder: "#FFFFFF" }
|
|
});
|
|
bgInput.addEventListener("input", (e) => {
|
|
const value = e.target.value;
|
|
this.buttonPreviewEl.style.background = value;
|
|
this.outputObject.customColor = value;
|
|
});
|
|
const textField = customColorContainer.createEl("div", { cls: "form-field" });
|
|
textField.createEl("label", { cls: "field-label", text: "Text Color" });
|
|
const textInput = textField.createEl("input", {
|
|
type: "text",
|
|
cls: "field-input",
|
|
attr: { placeholder: "#000000" }
|
|
});
|
|
textInput.addEventListener("input", (e) => {
|
|
const value = e.target.value;
|
|
this.buttonPreviewEl.style.color = value;
|
|
this.outputObject.customTextColor = value;
|
|
});
|
|
}
|
|
updateButtonPreview() {
|
|
if (this.outputObject.color && this.outputObject.color !== "default") {
|
|
this.buttonPreviewEl.setAttribute("class", `button-default ${this.outputObject.color}`);
|
|
this.buttonPreviewEl.removeAttribute("style");
|
|
} else {
|
|
this.buttonPreviewEl.setAttribute("class", "button-default");
|
|
this.buttonPreviewEl.removeAttribute("style");
|
|
}
|
|
}
|
|
renderActionInput(container, actionIndex, actionType) {
|
|
if (actionType === "command") {
|
|
const commandInput = createEl("input", { type: "text" });
|
|
new CommandSuggest(this.app, commandInput);
|
|
commandInput.setAttribute("class", "action-input");
|
|
commandInput.setAttribute("placeholder", "Select a command...");
|
|
const currentValue = this.outputObject.actions[actionIndex]?.action || "";
|
|
commandInput.value = currentValue;
|
|
container.appendChild(commandInput);
|
|
commandInput.addEventListener("change", (e) => {
|
|
this.outputObject.actions[actionIndex].action = e.target.value;
|
|
});
|
|
commandInput.addEventListener("blur", (e) => {
|
|
this.outputObject.actions[actionIndex].action = e.target.value;
|
|
});
|
|
} else if (actionType.includes("template")) {
|
|
const templateInput = createEl("input", { type: "text" });
|
|
new TemplateSuggest(this.app, templateInput);
|
|
templateInput.setAttribute("class", "action-input");
|
|
templateInput.setAttribute("placeholder", "Select a template...");
|
|
const currentValue = this.outputObject.actions[actionIndex]?.action || "";
|
|
templateInput.value = currentValue;
|
|
container.appendChild(templateInput);
|
|
templateInput.addEventListener("change", (e) => {
|
|
this.outputObject.actions[actionIndex].action = e.target.value;
|
|
});
|
|
templateInput.addEventListener("blur", (e) => {
|
|
this.outputObject.actions[actionIndex].action = e.target.value;
|
|
});
|
|
} else {
|
|
const input = container.createEl("input", {
|
|
type: "text",
|
|
cls: "action-input",
|
|
attr: { placeholder: "Enter action..." }
|
|
});
|
|
const currentValue = this.outputObject.actions[actionIndex]?.action || "";
|
|
input.value = currentValue;
|
|
input.addEventListener("input", (e) => {
|
|
this.outputObject.actions[actionIndex].action = e.target.value;
|
|
});
|
|
input.addEventListener("blur", (e) => {
|
|
this.outputObject.actions[actionIndex].action = e.target.value;
|
|
});
|
|
}
|
|
}
|
|
renderLineNumberField(container) {
|
|
const field = container.createEl("div", { cls: "form-field" });
|
|
field.createEl("label", { cls: "field-label", text: "Line Number" });
|
|
field.createEl("div", { cls: "field-description", text: "At which line should the content be inserted?" });
|
|
const input = field.createEl("input", {
|
|
type: "text",
|
|
cls: "field-input",
|
|
attr: { placeholder: "69" }
|
|
});
|
|
input.addEventListener("input", (e) => {
|
|
const value = e.target.value;
|
|
if (this.outputObject.type.includes("template")) {
|
|
this.outputObject.type = `line(${value}) template`;
|
|
} else if (this.outputObject.type.includes("text")) {
|
|
this.outputObject.type = `line(${value}) text`;
|
|
}
|
|
});
|
|
}
|
|
renderNoteTemplateFields(container) {
|
|
const promptField = container.createEl("div", { cls: "form-field" });
|
|
promptField.createEl("label", { cls: "field-label", text: "Prompt" });
|
|
promptField.createEl("div", { cls: "field-description", text: "Should you be prompted to enter a name for the file on creation?" });
|
|
const promptToggle = promptField.createEl("input", { type: "checkbox", cls: "toggle-input" });
|
|
promptToggle.addEventListener("change", (e) => {
|
|
this.outputObject.prompt = e.target.checked;
|
|
});
|
|
const nameField = container.createEl("div", { cls: "form-field" });
|
|
nameField.createEl("label", { cls: "field-label", text: "Note Name" });
|
|
nameField.createEl("div", { cls: "field-description", text: "What should the new note be named? Note: if prompt is on, this will be the default name" });
|
|
const nameInput = nameField.createEl("input", {
|
|
type: "text",
|
|
cls: "field-input",
|
|
attr: { placeholder: "My New Note" }
|
|
});
|
|
nameInput.addEventListener("input", (e) => {
|
|
this.outputObject.noteTitle = e.target.value;
|
|
});
|
|
const openMethodField = container.createEl("div", { cls: "form-field" });
|
|
openMethodField.createEl("label", { cls: "field-label", text: "Opening Method" });
|
|
openMethodField.createEl("div", { cls: "field-description", text: "How should the new note be opened?" });
|
|
const openMethodSelect = openMethodField.createEl("select", { cls: "dropdown" });
|
|
const openMethods = [
|
|
{ value: "tab", text: "New Tab" },
|
|
{ value: "vsplit", text: "Vertical Split" },
|
|
{ value: "hsplit", text: "Horizontal Split" },
|
|
{ value: "same", text: "Same Window" },
|
|
{ value: "false", text: "Don't Open" }
|
|
];
|
|
openMethods.forEach((method, index) => {
|
|
const option = openMethodSelect.createEl("option");
|
|
option.value = method.value;
|
|
option.textContent = method.text;
|
|
if (index === 0) {
|
|
option.selected = true;
|
|
this.outputObject.openMethod = method.value;
|
|
}
|
|
});
|
|
openMethodSelect.addEventListener("change", (e) => {
|
|
this.outputObject.openMethod = e.target.value;
|
|
});
|
|
const folderField = container.createEl("div", { cls: "form-field" });
|
|
folderField.createEl("label", { cls: "field-label", text: "Default Folder" });
|
|
folderField.createEl("div", { cls: "field-description", text: "Enter a folder path to place the note in. Defaults to root" });
|
|
const folderInput = folderField.createEl("input", {
|
|
type: "text",
|
|
cls: "field-input",
|
|
attr: { placeholder: "My Folder" }
|
|
});
|
|
folderInput.addEventListener("input", (e) => {
|
|
this.outputObject.folder = e.target.value;
|
|
});
|
|
}
|
|
renderNoteTextFields(container) {
|
|
const promptField = container.createEl("div", { cls: "form-field" });
|
|
promptField.createEl("label", { cls: "field-label", text: "Prompt" });
|
|
promptField.createEl("div", { cls: "field-description", text: "Should you be prompted to enter a name for the file on creation?" });
|
|
const promptToggle = promptField.createEl("input", { type: "checkbox", cls: "toggle-input" });
|
|
promptToggle.addEventListener("change", (e) => {
|
|
this.outputObject.prompt = e.target.checked;
|
|
});
|
|
const nameField = container.createEl("div", { cls: "form-field" });
|
|
nameField.createEl("label", { cls: "field-label", text: "Note Name" });
|
|
nameField.createEl("div", { cls: "field-description", text: "What should the new note be named? Note: if prompt is on, this will be the default name" });
|
|
const nameInput = nameField.createEl("input", {
|
|
type: "text",
|
|
cls: "field-input",
|
|
attr: { placeholder: "My New Note" }
|
|
});
|
|
nameInput.addEventListener("input", (e) => {
|
|
this.outputObject.noteTitle = e.target.value;
|
|
});
|
|
const openMethodField = container.createEl("div", { cls: "form-field" });
|
|
openMethodField.createEl("label", { cls: "field-label", text: "Opening Method" });
|
|
openMethodField.createEl("div", { cls: "field-description", text: "How should the new note be opened?" });
|
|
const openMethodSelect = openMethodField.createEl("select", { cls: "dropdown" });
|
|
const openMethods = [
|
|
{ value: "tab", text: "New Tab" },
|
|
{ value: "vsplit", text: "Vertical Split" },
|
|
{ value: "hsplit", text: "Horizontal Split" },
|
|
{ value: "same", text: "Same Window" },
|
|
{ value: "false", text: "Don't Open" }
|
|
];
|
|
openMethods.forEach((method, index) => {
|
|
const option = openMethodSelect.createEl("option");
|
|
option.value = method.value;
|
|
option.textContent = method.text;
|
|
if (index === 0) {
|
|
option.selected = true;
|
|
this.outputObject.openMethod = method.value;
|
|
}
|
|
});
|
|
openMethodSelect.addEventListener("change", (e) => {
|
|
this.outputObject.openMethod = e.target.value;
|
|
});
|
|
const folderField = container.createEl("div", { cls: "form-field" });
|
|
folderField.createEl("label", { cls: "field-label", text: "Default Folder" });
|
|
folderField.createEl("div", { cls: "field-description", text: "Enter a folder path to place the note in. Defaults to root" });
|
|
const folderInput = folderField.createEl("input", {
|
|
type: "text",
|
|
cls: "field-input",
|
|
attr: { placeholder: "My Folder" }
|
|
});
|
|
folderInput.addEventListener("input", (e) => {
|
|
this.outputObject.folder = e.target.value;
|
|
});
|
|
}
|
|
onClose() {
|
|
const { contentEl } = this;
|
|
if (this.previewComponent) {
|
|
this.previewComponent.unload();
|
|
this.previewComponent = null;
|
|
}
|
|
contentEl.empty();
|
|
}
|
|
};
|
|
var InlineButtonModal = class extends import_obsidian18.Modal {
|
|
constructor(app) {
|
|
super(app);
|
|
__publicField(this, "buttonSuggestEl", createEl("input", { type: "text" }));
|
|
__publicField(this, "buttonSuggest");
|
|
this.buttonSuggest = new ButtonSuggest(this.app, this.buttonSuggestEl);
|
|
this.buttonSuggestEl.setAttribute("style", "width: 100%; height: 40px");
|
|
}
|
|
onOpen() {
|
|
const { titleEl, contentEl } = this;
|
|
titleEl.setText("Insert Inline Button");
|
|
contentEl.createEl("form", {}, (formEl) => {
|
|
formEl.appendChild(this.buttonSuggestEl);
|
|
formEl.addEventListener("submit", (e) => {
|
|
e.preventDefault();
|
|
insertInlineButton(this.app, this.buttonSuggestEl.value);
|
|
this.close();
|
|
});
|
|
});
|
|
}
|
|
onClose() {
|
|
const { contentEl } = this;
|
|
contentEl.empty();
|
|
}
|
|
};
|
|
|
|
// src/livePreview.ts
|
|
var import_obsidian19 = __toModule(require("obsidian"));
|
|
var import_view = __toModule(require("@codemirror/view"));
|
|
var import_language = __toModule(require("@codemirror/language"));
|
|
function selectionAndRangeOverlap(selection, rangeFrom, rangeTo) {
|
|
for (const range of selection.ranges) {
|
|
if (range.from <= rangeTo && range.to >= rangeFrom) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function inlineButtons(view, app) {
|
|
const regex = new RegExp(".*?_?inline-code_?.*");
|
|
const selection = view.state.selection;
|
|
const buttons = [];
|
|
for (const { from, to } of view.visibleRanges) {
|
|
(0, import_language.syntaxTree)(view.state).iterate({
|
|
from,
|
|
to,
|
|
enter: ({ node }) => {
|
|
const content = view.state.doc.sliceString(node.from, node.to);
|
|
if (selectionAndRangeOverlap(selection, node.from - 1, node.to + 1)) {
|
|
return;
|
|
}
|
|
if (node.type.name.includes("formatting"))
|
|
return;
|
|
if (regex.test(node.type.name)) {
|
|
const matches = content.match(/button-([\s\S]*)/);
|
|
const id = matches && matches[1] ? matches[1] : "";
|
|
if (id) {
|
|
const line = view.state.doc.lineAt(node.to).number;
|
|
const el = createEl("button");
|
|
el.addClass("button-default");
|
|
const deco = import_view.Decoration.replace({
|
|
widget: new ButtonWidget(el, id, app, line),
|
|
block: false
|
|
});
|
|
buttons.push(deco.range(node.from, node.to));
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
return import_view.Decoration.set(buttons);
|
|
}
|
|
function buttonPlugin(app) {
|
|
return import_view.ViewPlugin.fromClass(class {
|
|
constructor(view) {
|
|
__publicField(this, "decorations");
|
|
this.decorations = inlineButtons(view, app);
|
|
}
|
|
update(update) {
|
|
this.decorations = inlineButtons(update.view, app);
|
|
}
|
|
}, {
|
|
decorations: (v) => v.decorations
|
|
});
|
|
}
|
|
var ButtonWidget = class extends import_view.WidgetType {
|
|
constructor(el, id, app, line) {
|
|
super();
|
|
this.el = el;
|
|
this.id = id;
|
|
this.app = app;
|
|
this.line = line;
|
|
__publicField(this, "component");
|
|
this.component = new import_obsidian19.Component();
|
|
}
|
|
eq(other) {
|
|
return other.id === this.id;
|
|
}
|
|
destroy() {
|
|
this.component.unload();
|
|
}
|
|
toDOM() {
|
|
this.el.innerText = "Loading...";
|
|
this.el.addClass("button-default");
|
|
this.loadButtonData();
|
|
return this.el;
|
|
}
|
|
async loadButtonData() {
|
|
try {
|
|
const args = await getButtonById(this.app, this.id);
|
|
if (args) {
|
|
const name = args.name;
|
|
const color = args.color;
|
|
this.el.innerHTML = "";
|
|
import_obsidian19.MarkdownRenderer.render(this.app, name, this.el, this.app.workspace.getActiveFile()?.path || "", this.component);
|
|
let numberOfLines = args.name.split("\n").length;
|
|
let paddingTop = "auto";
|
|
let paddingBottom = "auto";
|
|
let alignment = args.align?.split(" ") || ["center", "middle"];
|
|
if (args.height) {
|
|
if (alignment.includes("top")) {
|
|
alignment = alignment.filter((a) => a !== "top");
|
|
paddingBottom = parseFloat(args.height) - 1.2 * numberOfLines + "em";
|
|
} else if (alignment.includes("bottom")) {
|
|
alignment = alignment.filter((a) => a !== "bottom");
|
|
paddingTop = parseFloat(args.height) - 1.2 * numberOfLines + "em";
|
|
} else {
|
|
alignment = alignment.filter((a) => a !== "middle");
|
|
paddingTop = (parseFloat(args.height) - 1.2 * numberOfLines) / 2 + "em";
|
|
paddingBottom = (parseFloat(args.height) - 1.2 * numberOfLines) / 2 + "em";
|
|
}
|
|
}
|
|
if (args.width) {
|
|
args.width += "em";
|
|
} else {
|
|
args.width = "auto";
|
|
}
|
|
this.el.innerHTML = `<div style='width: ${args.width};padding-top: ${paddingTop};padding-bottom: ${paddingBottom};text-align: ${alignment[0] || "center"};line-height: 1.2em;'>${this.el.innerHTML.slice(14, -4)}</div>`;
|
|
const classNames = args.class ? args.class.split(" ") : [];
|
|
if (classNames.length > 0) {
|
|
this.el.removeClass("button-default");
|
|
classNames.forEach((className) => {
|
|
this.el.addClass(className);
|
|
});
|
|
}
|
|
if (color) {
|
|
this.el.addClass(color);
|
|
}
|
|
this.el.onclick = async () => {
|
|
await this.handleButtonClick(args);
|
|
};
|
|
} else {
|
|
this.el.innerText = "button not found. check button ID";
|
|
this.el.removeClass("button-default");
|
|
this.el.addClass("button-error");
|
|
}
|
|
} catch (error) {
|
|
console.log(error);
|
|
this.el.innerText = "Error loading button";
|
|
this.el.removeClass("button-default");
|
|
this.el.addClass("button-error");
|
|
}
|
|
}
|
|
async handleButtonClick(args) {
|
|
const activeView = this.app.workspace.getActiveViewOfType(import_obsidian19.MarkdownView);
|
|
const activeFile = activeView?.file || this.app.workspace.getActiveFile();
|
|
if (!activeFile) {
|
|
new import_obsidian19.Notice("No active file found. Buttons can only be used with files.");
|
|
return;
|
|
}
|
|
let processedAction = args.action;
|
|
let processedType = args.type;
|
|
let processedFolder = args.folder;
|
|
if (args.templater) {
|
|
try {
|
|
const runTemplater = await templater_default(this.app, activeFile, activeFile);
|
|
if (runTemplater) {
|
|
if (args.action && args.action.includes("<%")) {
|
|
processedAction = await runTemplater(args.action);
|
|
}
|
|
if (args.type && args.type.includes("<%")) {
|
|
processedType = await runTemplater(args.type);
|
|
}
|
|
if (args.folder && args.folder.includes("<%")) {
|
|
processedFolder = await runTemplater(args.folder);
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.error("Error processing templater in button:", error);
|
|
new import_obsidian19.Notice("Error processing templater in button. Check console for details.", 2e3);
|
|
}
|
|
}
|
|
const processedArgs = { ...args, action: processedAction, type: processedType, folder: processedFolder };
|
|
const buttonStart = await getInlineButtonPosition(this.app, this.id);
|
|
let position = await getInlineButtonPosition(this.app, this.id);
|
|
if (args.replace) {
|
|
await replace(this.app, processedArgs, position);
|
|
}
|
|
if (processedArgs.type && processedArgs.type.includes("command")) {
|
|
command(this.app, processedArgs, buttonStart);
|
|
}
|
|
if (processedArgs.type === "copy") {
|
|
copy(processedArgs);
|
|
}
|
|
if (processedArgs.type === "link") {
|
|
link(processedArgs);
|
|
}
|
|
if (processedArgs.type && processedArgs.type.includes("template")) {
|
|
position = await getInlineButtonPosition(this.app, this.id);
|
|
await template(this.app, processedArgs, position);
|
|
}
|
|
if (processedArgs.type === "calculate") {
|
|
await calculate(this.app, processedArgs, position);
|
|
}
|
|
if (processedArgs.type && processedArgs.type.includes("text")) {
|
|
position = await getInlineButtonPosition(this.app, this.id);
|
|
await text(this.app, processedArgs, position);
|
|
}
|
|
if (args.swap) {
|
|
await swap(this.app, args.swap, this.id, true, activeFile, buttonStart);
|
|
}
|
|
if (args.remove) {
|
|
position = await getInlineButtonPosition(this.app, this.id);
|
|
await remove(this.app, processedArgs, position);
|
|
}
|
|
if (processedArgs.type === "chain") {
|
|
await chain(this.app, processedArgs, position, true, this.id, activeFile);
|
|
return;
|
|
}
|
|
}
|
|
};
|
|
var livePreview_default = buttonPlugin;
|
|
|
|
// src/index.ts
|
|
var ButtonsPlugin = class extends import_obsidian20.Plugin {
|
|
constructor() {
|
|
super(...arguments);
|
|
__publicField(this, "buttonEvents");
|
|
__publicField(this, "closedFile");
|
|
__publicField(this, "buttonEdit");
|
|
__publicField(this, "createButton");
|
|
__publicField(this, "storeEvents", new import_obsidian20.Events());
|
|
__publicField(this, "indexCount", 0);
|
|
__publicField(this, "storeEventsRef");
|
|
}
|
|
async addButtonInEdit(_app) {
|
|
}
|
|
async onload() {
|
|
this.app.workspace.onLayoutReady(async () => {
|
|
});
|
|
this.registerEditorExtension(livePreview_default(this.app));
|
|
this.buttonEvents = buttonEventListener(this.app, addButtonToStore);
|
|
this.closedFile = openFileListener(this.app, this.storeEvents, initializeButtonStore);
|
|
this.createButton = createButton;
|
|
this.storeEventsRef = this.storeEvents.on("index-complete", () => {
|
|
this.indexCount++;
|
|
});
|
|
initializeButtonStore(this.app, this.storeEvents);
|
|
this.buttonEdit = openFileListener(this.app, this.storeEvents, this.addButtonInEdit.bind(this));
|
|
this.addCommand({
|
|
id: "button-maker",
|
|
name: "Button Maker",
|
|
callback: () => new ButtonModal(this.app).open()
|
|
});
|
|
this.addCommand({
|
|
id: "inline-button",
|
|
name: "Insert Inline Button",
|
|
callback: () => new InlineButtonModal(this.app).open()
|
|
});
|
|
const assignedBlocks = new Set();
|
|
this.registerMarkdownCodeBlockProcessor("button", async (source, el, ctx) => {
|
|
const file = this.app.vault.getFiles().find((f) => f.path === ctx.sourcePath);
|
|
addButtonToStore(this.app, file);
|
|
let args = createArgumentObject(source);
|
|
const storeArgs = await getButtonFromStore(this.app, args);
|
|
args = storeArgs ? storeArgs.args : args;
|
|
let id = storeArgs && storeArgs.id;
|
|
if (!id && file) {
|
|
try {
|
|
const store = getStore(this.app.isMobile);
|
|
const content = await this.app.vault.cachedRead(file);
|
|
const contentArray = content.split("\n");
|
|
const candidates = (store || []).filter((item) => item.path === file.path && item.id?.startsWith("button-"));
|
|
for (const item of candidates) {
|
|
const blockInner = contentArray.slice(item.position.start.line + 1, item.position.end.line).join("\n");
|
|
if (blockInner.trim() === source.trim()) {
|
|
const key = `${item.path}:${item.position.start.line}:${item.position.end.line}`;
|
|
if (!assignedBlocks.has(key)) {
|
|
id = item.id.split("button-")[1];
|
|
assignedBlocks.add(key);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
} catch (_) {
|
|
}
|
|
}
|
|
if (Boolean(args["hidden"]) !== true) {
|
|
const component = new import_obsidian20.Component();
|
|
createButton({ app: this.app, el, args, inline: false, id, component });
|
|
}
|
|
});
|
|
this.registerMarkdownPostProcessor(async (el, ctx) => {
|
|
const codeblocks = el.querySelectorAll("code");
|
|
for (let index = 0; index < codeblocks.length; index++) {
|
|
const codeblock = codeblocks.item(index);
|
|
const text2 = codeblock.innerText.trim();
|
|
if (text2.startsWith("button")) {
|
|
const id = text2.split("button-")[1].trim();
|
|
if (this.indexCount < 2) {
|
|
this.storeEventsRef = this.storeEvents.on("index-complete", async () => {
|
|
this.indexCount++;
|
|
const args = await getButtonById(this.app, id);
|
|
if (args) {
|
|
ctx.addChild(new InlineButton(codeblock, this.app, args, id));
|
|
}
|
|
});
|
|
} else {
|
|
const args = await getButtonById(this.app, id);
|
|
if (args) {
|
|
ctx.addChild(new InlineButton(codeblock, this.app, args, id));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
onunload() {
|
|
this.app.metadataCache.offref(this.buttonEvents);
|
|
this.app.workspace.offref(this.closedFile);
|
|
this.app.workspace.offref(this.buttonEdit);
|
|
this.storeEvents.offref(this.storeEventsRef);
|
|
}
|
|
};
|
|
var InlineButton = class extends import_obsidian20.MarkdownRenderChild {
|
|
constructor(el, app, args, id) {
|
|
super(el);
|
|
this.el = el;
|
|
this.app = app;
|
|
this.args = args;
|
|
this.id = id;
|
|
}
|
|
async onload() {
|
|
const button = createButton({
|
|
app: this.app,
|
|
el: this.el,
|
|
args: this.args,
|
|
inline: true,
|
|
id: this.id,
|
|
component: this
|
|
});
|
|
this.el.replaceWith(button);
|
|
}
|
|
};
|
|
|
|
/* nosourcemap */ |