diff --git a/public/libs/plugin-publisher-bridge/index.js b/public/libs/plugin-publisher-bridge/index.js new file mode 100644 index 00000000..d0e79395 --- /dev/null +++ b/public/libs/plugin-publisher-bridge/index.js @@ -0,0 +1,3039 @@ +var at = Object.defineProperty; +var st = (e, r, t) => r in e ? at(e, r, { enumerable: !0, configurable: !0, writable: !0, value: t }) : e[r] = t; +var be = (e, r, t) => (st(e, typeof r != "symbol" ? r + "" : r, t), t); +var lt = Object.defineProperty, ct = (e, r, t) => r in e ? lt(e, r, { enumerable: !0, configurable: !0, writable: !0, value: t }) : e[r] = t, fe = (e, r, t) => (ct(e, typeof r != "symbol" ? r + "" : r, t), t), ut = Object.defineProperty, ht = (e, r, t) => r in e ? ut(e, r, { enumerable: !0, configurable: !0, writable: !0, value: t }) : e[r] = t, N = (e, r, t) => (ht(e, typeof r != "symbol" ? r + "" : r, t), t); +const Y = class { + /** + * 检测是否运行在Chrome插件中 + */ + static isInChromeExtension() { + return Y.isInBrowser ? window.location.href.indexOf("chrome-extension://") > -1 : !1; + } +}; +let R = Y; +N(R, "isNode", typeof process < "u"), /** +* 是否在浏览器环境 +*/ +N(R, "isInBrowser", typeof window < "u"), /** +* 浏览器路径分隔符 +*/ +N(R, "BrowserSeperator", "/"), /** +* 是否是Electron环境 +*/ +N(R, "isElectron", () => !Y.isInBrowser || !window.navigator || !window.navigator.userAgent ? !1 : /Electron/.test(window.navigator.userAgent)), /** +* 是否有Node环境,目前包括 Electron 和 Node +*/ +N(R, "hasNodeEnv", () => Y.isElectron() || Y.isNode), /** +* 获取url参数 +* +* @param sParam - 参数 +*/ +N(R, "getQueryString", (e) => { + if (!Y.isInBrowser) + return ""; + const r = window.location.search.substring(1).split("&"); + for (let t = 0; t < r.length; t++) { + const i = r[t].split("="); + if (i[0] === e) + return i[1]; + } + return ""; +}), /** +* 替换 URL 的参数 +* 思路: +* 1. 使用了 URLSearchParams 对象来解析和构建 URL 查询参数。 +* +* 2. 在处理包含 hash 片段的 URL 时使用了 split 函数将 URL 分成两部分:基本 URL 和 hash 片段。 +* +* 3. 然后,再次使用 split 函数将基本 URL 分成两部分:路径和查询参数。 +* +* 4. 将查询参数转换为 URLSearchParams 对象,然后设置指定的参数名和值。 +* +* 5. 最后,使用 toString 函数将查询参数转换为字符串,并将其与路径组合成新的基本 URL。如果 URL 包含 hash 片段,则将其添加到新的基本 URL 中。 +* +* @param url - 链接地址 +* @param paramName - 参数名 +* @param paramValue - 参数值 +*/ +N(R, "replaceUrlParam", (e, r, t) => { + t == null && (t = ""); + const i = new RegExp("\\b(" + r + "=).*?(&|#|$)"); + if (e.search(i) >= 0) + return e.replace(i, "$1" + t + "$2"); + const [n, o] = e.split("#"), [s, c] = n.split("?"), l = new URLSearchParams(c); + l.set(r, t); + const u = l.toString(), a = s + (u ? "?" + u : ""); + return o ? a + "#" + o : a; +}), /** +* 设置url参数 +* +* @param urlstring - url +* @param key - key +* @param value - value +*/ +N(R, "setUrlParameter", (e, r, t) => { + if (e.includes(r)) + return Y.replaceUrlParam(e, r, t); + const i = e.split("#"); + let n = i[0]; + const o = i[1]; + return n.includes("?") ? n += `&${r}=${t}` : n += `?${r}=${t}`, o && (n += "#" + o), n; +}), /** +* 重新加载指定tab +* +* @param tabname - tabname +* @param t - 延迟时间 +*/ +N(R, "reloadTabPage", (e, r = 200) => { + setTimeout(function() { + if (Y.isInBrowser) { + const t = window.location.href; + window.location.href = Y.setUrlParameter(t, "tab", e); + } + }, r); +}), /** +* 刷新当前tab页面 +*/ +N(R, "reloadPage", () => { + setTimeout(function() { + Y.isInBrowser && window.location.reload(); + }, 200); +}), /** +* 刷新当前tab页面 +* +* @param msg - 消息提示 +* @param cb - 回调 +*/ +N(R, "reloadPageWithMessageCallback", (e, r) => { + r && r(e), setTimeout(function() { + Y.isInBrowser && window.location.reload(); + }, 200); +}); +var A = /* @__PURE__ */ ((e) => (e.BasePathType_Appearance = "Appearance", e.BasePathType_Data = "Data", e.BasePathType_Themes = "Themes", e.BasePathType_ZhiTheme = "ZhiTheme", e.BasePathType_None = "None", e))(A || {}); +const j = class { + /** + * 检测是否运行在思源打开的浏览器中 + */ + static isInSiyuanBrowser() { + return R.isInBrowser ? typeof window.siyuan < "u" && typeof window.Lute < "u" : !1; + } + /** + * 思源笔记 window 对象 + */ + static siyuanWindow() { + let r; + return this.isInSiyuanWidget() ? r = parent.window : this.isInSiyuanNewWin() || this.isInSiyuanBrowser() || typeof window < "u" ? r = window : r = void 0, r; + } + // ========================= + // require end + // ========================= + // ========================= + // import start + // ========================= + /** + * 引入json + * + * @param jsPath - js相对路径全路径 + * @param type - 类型 + */ + static async importJs(r, t) { + let i = r; + switch (t) { + case A.BasePathType_Appearance: + i = this.browserJoinPath(this.siyuanAppearanceRelativePath(), r); + break; + case A.BasePathType_Data: + i = this.browserJoinPath(this.siyuanDataRelativePath(), r); + break; + case A.BasePathType_Themes: + i = this.browserJoinPath(this.siyuanThemeRelativePath(), r); + break; + case A.BasePathType_ZhiTheme: + i = this.browserJoinPath(this.zhiThemeRelativePath(), r); + break; + default: + throw new Error("type must be provided"); + } + const { default: n } = await import( + /* @vite-ignore */ + i + ); + return n; + } + /** + * 引入json + * + * @param jsonPath - json相对路径全路径 + * @param type - 类型 + */ + // public static async importJson(jsonPath: string, type: BasePathTypeEnum) { + // let fullJsonPath = jsonPath + // switch (type) { + // case BasePathTypeEnum.BasePathType_Appearance: + // fullJsonPath = this.browserJoinPath(this.siyuanAppearanceRelativePath(), jsonPath) + // break + // case BasePathTypeEnum.BasePathType_Data: + // fullJsonPath = this.browserJoinPath(this.siyuanDataRelativePath(), jsonPath) + // break + // case BasePathTypeEnum.BasePathType_Themes: + // fullJsonPath = this.browserJoinPath(this.siyuanThemeRelativePath(), jsonPath) + // break + // case BasePathTypeEnum.BasePathType_ZhiTheme: + // fullJsonPath = this.browserJoinPath(this.zhiThemeRelativePath(), jsonPath) + // break + // default: + // throw new Error("type must be provided") + // } + // + // const { default: data } = await import(/* @vite-ignore */ fullJsonPath, { assert: { type: "json" } }) + // return data + // } + /** + * 引入 json - 以 data 为基本路径 + * + * @param jsonPath - 相对于 data 的相对路径 + */ + // public static async importDataJson(jsonPath: string) { + // return await this.importJson(jsonPath, BasePathTypeEnum.BasePathType_Data) + // } + /** + * 引入 json - 以 appearance 为基本路径 + * + * @param jsonPath - 相对于 appearance 的相对路径 + */ + // public static async importAppearanceJson(jsonPath: string) { + // return await this.importJson(jsonPath, BasePathTypeEnum.BasePathType_Appearance) + // } + /** + * 引入 json - 以 themes 为基本路径 + * + * @param jsonPath - 相对于 themes 的相对路径 + */ + // public static async importThemesJson(jsonPath: string) { + // return await this.importJson(jsonPath, BasePathTypeEnum.BasePathType_Themes) + // } + /** + * 引入 zhi 主题的 json - 以 zhi 主题 的根路径为基本路径 + * + * @param jsonPath - 相对于 zhi 主题根路径的相对路径 + */ + // public static async importZhiThemeJson(jsonPath: string) { + // return await this.importJson(jsonPath, BasePathTypeEnum.BasePathType_ZhiTheme) + // } + /** + * 引入 zhi 主题的 js - 以 zhi 主题 的根路径为基本路径 + * + * @param jsPath - 相对于 zhi 主题根路径的相对路径 + */ + static async importZhiThemeJs(r) { + return await this.importJs(r, A.BasePathType_ZhiTheme); + } + // ========================= + // import start + // ========================= + /** + * 路径拼接 + * + * @param paths - 路径数组 + */ + static joinPath(...r) { + if (R.hasNodeEnv()) { + const t = this.requireLib("path"); + if (t) + return t.join(...r); + } + return this.browserJoinPath(...r); + } + static browserJoinPath(...r) { + return r.join(R.BrowserSeperator); + } + /** + * 思源笔记 conf 目录 + */ + static siyuanConfPath() { + const r = this.siyuanWindow(); + if (!r) + throw new Error("Not in siyuan env"); + return r.siyuan.config.system.confDir; + } + /** + * 思源笔记 data 目录 + */ + static siyuanDataPath() { + const r = this.siyuanWindow(); + if (!r) + throw new Error("Not in siyuan env"); + return r.siyuan.config.system.dataDir; + } + /** + * 思源笔记 data 目录-相对路径 + */ + static siyuanDataRelativePath() { + if (!this.siyuanWindow()) + throw new Error("Not in siyuan env"); + return ""; + } + /** + * 思源笔记 appearance 目录 + */ + static siyuanAppearancePath() { + return this.joinPath(this.siyuanConfPath(), "appearance"); + } + /** + * 思源笔记 appearance 目录-相对路径 + */ + static siyuanAppearanceRelativePath() { + if (!this.siyuanWindow()) + throw new Error("Not in siyuan env"); + return this.browserJoinPath("", "appearance"); + } + /** + * 思源笔记 themes 目录-绝对路径 + * + * 注意: 如果是非 electron 和 Node 环境,这里返回的是浏览器的路径,不是物理路径 + * 如果使用物理路径,请调用 siyuanAppearancePath 或者 siyuanDataPath + * + * @author terwer + * @since 0.1.0 + */ + static siyuanThemePath() { + if (R.hasNodeEnv()) + return this.joinPath(this.siyuanAppearancePath(), "themes"); + { + const r = this.siyuanWindow(); + if (!r) + throw new Error("Not in siyuan env"); + return this.joinPath(r.location.origin, "appearance", "themes"); + } + } + /** + * 思源笔记 themes 目录-相对路径 + */ + static siyuanThemeRelativePath() { + if (!this.siyuanWindow()) + throw new Error("Not in siyuan env"); + return this.browserJoinPath("", "appearance", "themes"); + } + /** + * zhi 主题目录 - 绝对路径 + */ + static zhiThemePath() { + return this.joinPath(this.siyuanThemePath(), "zhi"); + } + /** + * zhi 主题目录 - 相对路径 + */ + static zhiThemeRelativePath() { + return this.browserJoinPath(this.siyuanThemeRelativePath(), "zhi"); + } +}; +let re = j; +N(re, "isInSiyuanWidget", () => R.isInBrowser ? window.frameElement != null && window.frameElement.parentElement != null && window.frameElement.parentElement.parentElement != null && window.frameElement.parentElement.parentElement.getAttribute("data-node-id") !== "" : !1), /** +* 思源笔记新窗口 +* +* @deprecated window.terwer 判断方式已废弃,建议以后打开新窗口注入 window.siyuanNewWin ,这样语义会更容易理解 +* @author terwer +* @version 0.1.0 +* @since 0.0.1 +*/ +N(re, "isInSiyuanNewWin", () => !R.isInBrowser || !R.isElectron() ? !1 : typeof window.terwer < "u" || typeof window.siyuanNewWin < "u"), // ========================= +// require start +// ========================= +/** + * 引入依赖 + * + * @param libpath - 依赖全路径 + * @param abs - 可选,是否使用觉得路径,默认是 true , 启用之后 type参数无效 + * @param type - 可选,以谁的基本路径为准 + */ +N(re, "requireLib", (e, r = !0, t = A.BasePathType_None) => { + if (!R.hasNodeEnv()) + throw new Error("require ony works on node env"); + let i = e; + if (!r) + switch (t) { + case A.BasePathType_Appearance: + i = j.joinPath(j.siyuanAppearancePath(), e); + break; + case A.BasePathType_Data: + i = j.joinPath(j.siyuanDataPath(), e); + break; + case A.BasePathType_Themes: + i = j.joinPath(j.siyuanAppearancePath(), "themes", e); + break; + case A.BasePathType_ZhiTheme: + i = j.joinPath(j.siyuanAppearancePath(), "themes", "zhi", e); + break; + default: + throw new Error("type must be provided when not use absolute path"); + } + const n = j.siyuanWindow(); + if (!n) + return require(i); + if (typeof n.require < "u") + return n.require(i); +}), /** +* 引入依赖,以 data 的基本路径为准 +* +* @param libpath - 相对于 appearance 的相对路径 +*/ +N(re, "requireAppearanceLib", (e) => j.requireLib(e, !1, A.BasePathType_Appearance)), /** +* 引入依赖,以 data 的基本路径为准 +* +* @param libpath - 相对于 data 的相对路径 +*/ +N(re, "requireDataLib", (e) => j.requireLib(e, !1, A.BasePathType_Data)), /** +* 引入依赖,以 theme 的基本路径为准 +* +* @param libpath - 相对于 theme 的相对路径 +*/ +N(re, "requireThemesLib", (e) => j.requireLib(e, !1, A.BasePathType_Themes)), /** +* 引入依赖,以 ZhiTheme 的基本路径为准 +* +* @param libpath - 相对于 ZhiTheme 的相对路径 +*/ +N(re, "requireZhiThemeLib", (e) => j.requireLib(e, !1, A.BasePathType_ZhiTheme)); +var gt = Object.defineProperty, pt = (e, r, t) => r in e ? gt(e, r, { enumerable: !0, configurable: !0, writable: !0, value: t }) : e[r] = t, ue = (e, r, t) => (pt(e, typeof r != "symbol" ? r + "" : r, t), t); +let ie = class { +}; +ue(ie, "NODE_ENV_KEY", "NODE_ENV"), /** +* 开发环境 +*/ +ue(ie, "NODE_ENV_DEVELOPMENT", "development"), /** +* 生产环境 +*/ +ue(ie, "NODE_ENV_PRODUCTION", "production"), /** +* 测试环境 +*/ +ue(ie, "NODE_ENV_TEST", "test"), /** +* 是否处于调试模式 +*/ +ue(ie, "VITE_DEBUG_MODE_KEY", "VITE_DEBUG_MODE"); +let yt = class { + /** + * 环境初始化 + * + * @param envMeta - 需要传入 {"BASE_URL":"/","MODE":"production","DEV":false,"PROD":true,"SSR":false} 。特别提醒:此参数是静态元数据,取决于最终使用的项目。因此仅仅在最终使用的地方显示传递此值,中间项目请保持参数传递 + * @see {@link https://vitejs.dev/guide/env-and-mode.html#production-replacement} + */ + constructor(r) { + ue(this, "envMeta"), this.envMeta = r; + } + /** + * 是否是开发阶段调试 + */ + isNodeDev() { + return this.getEnv(ie.NODE_ENV_KEY) === ie.NODE_ENV_DEVELOPMENT; + } + /** + * 是否是调试阶段 + */ + isDev() { + return this.isNodeDev() || this.getBooleanEnv(ie.VITE_DEBUG_MODE_KEY); + } + /** + * 获取环境变量,key不存在返回undefined + * @param key - key + */ + getEnv(r) { + let t; + try { + this.envMeta[r] && (t = this.envMeta[r]); + } catch { + } + return t; + } + /** + * 获取String类型的环境变量,key不存在直接返回空值 + * @param key - key + */ + getStringEnv(r) { + return this.getEnv(r) ?? ""; + } + /** + * 获取Boolean类型的环境变量,key不存在返回false + * @param key - key + */ + getBooleanEnv(r) { + let t = !1; + return this.getEnv(r) && (t = this.getStringEnv(r).toLowerCase() === "true"), t; + } + /** + * 获取环境变量,如果未定义或者为空值,用指定的默认值代替 + * + * @param key - key + * @param defaultValue - 默认值 + * @since 0.1.0 + * @author terwer + */ + getEnvOrDefault(r, t) { + const i = this.getStringEnv(r); + return i.trim().length == 0 ? t : i; + } +}; +var dt = Object.defineProperty, wt = (e, r, t) => r in e ? dt(e, r, { enumerable: !0, configurable: !0, writable: !0, value: t }) : e[r] = t, ge = (e, r, t) => (wt(e, typeof r != "symbol" ? r + "" : r, t), t); +class ve { +} +ge(ve, "LOG_LEVEL_KEY", "VITE_LOG_LEVEL"), ge(ve, "LOG_PREFIX_KEY", "VITE_LOG_PREFIX"); +var X = /* @__PURE__ */ ((e) => (e.LOG_LEVEL_TRACE = "TRACE", e.LOG_LEVEL_DEBUG = "DEBUG", e.LOG_LEVEL_INFO = "INFO", e.LOG_LEVEL_WARN = "WARN", e.LOG_LEVEL_ERROR = "ERROR", e))(X || {}), Fe = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {}; +function _e(e) { + return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e; +} +var Ve = { exports: {} }; +(function(e) { + (function(r, t) { + e.exports ? e.exports = t() : r.log = t(); + })(Fe, function() { + var r = function() { + }, t = "undefined", i = typeof window !== t && typeof window.navigator !== t && /Trident\/|MSIE /.test(window.navigator.userAgent), n = [ + "trace", + "debug", + "info", + "warn", + "error" + ]; + function o(h, f) { + var E = h[f]; + if (typeof E.bind == "function") + return E.bind(h); + try { + return Function.prototype.bind.call(E, h); + } catch { + return function() { + return Function.prototype.apply.apply(E, [h, arguments]); + }; + } + } + function s() { + console.log && (console.log.apply ? console.log.apply(console, arguments) : Function.prototype.apply.apply(console.log, [console, arguments])), console.trace && console.trace(); + } + function c(h) { + return h === "debug" && (h = "log"), typeof console === t ? !1 : h === "trace" && i ? s : console[h] !== void 0 ? o(console, h) : console.log !== void 0 ? o(console, "log") : r; + } + function l(h, f) { + for (var E = 0; E < n.length; E++) { + var p = n[E]; + this[p] = E < h ? r : this.methodFactory(p, h, f); + } + this.log = this.debug; + } + function u(h, f, E) { + return function() { + typeof console !== t && (l.call(this, f, E), this[h].apply(this, arguments)); + }; + } + function a(h, f, E) { + return c(h) || u.apply(this, arguments); + } + function y(h, f, E) { + var p = this, ee; + f = f ?? "WARN"; + var d = "loglevel"; + typeof h == "string" ? d += ":" + h : typeof h == "symbol" && (d = void 0); + function ae(g) { + var P = (n[g] || "silent").toUpperCase(); + if (!(typeof window === t || !d)) { + try { + window.localStorage[d] = P; + return; + } catch { + } + try { + window.document.cookie = encodeURIComponent(d) + "=" + P + ";"; + } catch { + } + } + } + function te() { + var g; + if (!(typeof window === t || !d)) { + try { + g = window.localStorage[d]; + } catch { + } + if (typeof g === t) + try { + var P = window.document.cookie, x = P.indexOf( + encodeURIComponent(d) + "=" + ); + x !== -1 && (g = /^([^;]+)/.exec(P.slice(x))[1]); + } catch { + } + return p.levels[g] === void 0 && (g = void 0), g; + } + } + function se() { + if (!(typeof window === t || !d)) { + try { + window.localStorage.removeItem(d); + return; + } catch { + } + try { + window.document.cookie = encodeURIComponent(d) + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC"; + } catch { + } + } + } + p.name = h, p.levels = { + TRACE: 0, + DEBUG: 1, + INFO: 2, + WARN: 3, + ERROR: 4, + SILENT: 5 + }, p.methodFactory = E || a, p.getLevel = function() { + return ee; + }, p.setLevel = function(g, P) { + if (typeof g == "string" && p.levels[g.toUpperCase()] !== void 0 && (g = p.levels[g.toUpperCase()]), typeof g == "number" && g >= 0 && g <= p.levels.SILENT) { + if (ee = g, P !== !1 && ae(g), l.call(p, g, h), typeof console === t && g < p.levels.SILENT) + return "No console available for logging"; + } else + throw "log.setLevel() called with invalid level: " + g; + }, p.setDefaultLevel = function(g) { + f = g, te() || p.setLevel(g, !1); + }, p.resetLevel = function() { + p.setLevel(f, !1), se(); + }, p.enableAll = function(g) { + p.setLevel(p.levels.TRACE, g); + }, p.disableAll = function(g) { + p.setLevel(p.levels.SILENT, g); + }; + var B = te(); + B == null && (B = f), p.setLevel(B, !1); + } + var m = new y(), v = {}; + m.getLogger = function(h) { + if (typeof h != "symbol" && typeof h != "string" || h === "") + throw new TypeError("You must supply a name when creating a logger."); + var f = v[h]; + return f || (f = v[h] = new y( + h, + m.getLevel(), + m.methodFactory + )), f; + }; + var z = typeof window !== t ? window.log : void 0; + return m.noConflict = function() { + return typeof window !== t && window.log === m && (window.log = z), m; + }, m.getLoggers = function() { + return v; + }, m.default = m, m; + }); +})(Ve); +var bt = Ve.exports; +const me = /* @__PURE__ */ _e(bt); +var Ue = { exports: {} }; +(function(e) { + (function(r, t) { + e.exports ? e.exports = t() : r.prefix = t(r); + })(Fe, function(r) { + var t = function(a) { + for (var y = 1, m = arguments.length, v; y < m; y++) + for (v in arguments[y]) + Object.prototype.hasOwnProperty.call(arguments[y], v) && (a[v] = arguments[y][v]); + return a; + }, i = { + template: "[%t] %l:", + levelFormatter: function(a) { + return a.toUpperCase(); + }, + nameFormatter: function(a) { + return a || "root"; + }, + timestampFormatter: function(a) { + return a.toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1"); + }, + format: void 0 + }, n, o = {}, s = function(a) { + if (!a || !a.getLogger) + throw new TypeError("Argument is not a root logger"); + n = a; + }, c = function(a, y) { + if (!a || !a.setLevel) + throw new TypeError("Argument is not a logger"); + var m = a.methodFactory, v = a.name || "", z = o[v] || o[""] || i; + function h(f, E, p) { + var ee = m(f, E, p), d = o[p] || o[""], ae = d.template.indexOf("%t") !== -1, te = d.template.indexOf("%l") !== -1, se = d.template.indexOf("%n") !== -1; + return function() { + for (var B = "", g = arguments.length, P = Array(g), x = 0; x < g; x++) + P[x] = arguments[x]; + if (v || !o[p]) { + var ye = d.timestampFormatter(/* @__PURE__ */ new Date()), de = d.levelFormatter(f), we = d.nameFormatter(p); + d.format ? B += d.format(de, we, ye) : (B += d.template, ae && (B = B.replace(/%t/, ye)), te && (B = B.replace(/%l/, de)), se && (B = B.replace(/%n/, we))), P.length && typeof P[0] == "string" ? P[0] = B + " " + P[0] : P.unshift(B); + } + ee.apply(void 0, P); + }; + } + return o[v] || (a.methodFactory = h), y = y || {}, y.template && (y.format = void 0), o[v] = t({}, z, y), a.setLevel(a.getLevel()), n || a.warn( + "It is necessary to call the function reg() of loglevel-plugin-prefix before calling apply. From the next release, it will throw an error. See more: https://github.com/kutuluk/loglevel-plugin-prefix/blob/master/README.md" + ), a; + }, l = { + reg: s, + apply: c + }, u; + return r && (u = r.prefix, l.noConflict = function() { + return r.prefix === l && (r.prefix = u), l; + }), l; + }); +})(Ue); +var ft = Ue.exports; +const De = /* @__PURE__ */ _e(ft); +function mt() { + const e = Error.prepareStackTrace; + Error.prepareStackTrace = (t, i) => i; + const r = new Error().stack.slice(1); + return Error.prepareStackTrace = e, r; +} +let Ie = class Me { + /** + * 解析日志级别为枚举 + * + * @param enumObj - 枚举对象 + * @param value - 配置的值 + */ + static stringToEnumValue(r, t) { + return r[Object.keys(r).filter((i) => r[i].toString() === t)[0]]; + } + /** + * 获取配置的日志级别 + */ + static getEnvLevel(r) { + if (!r) + return; + const t = r.getEnvOrDefault(ve.LOG_LEVEL_KEY, X.LOG_LEVEL_INFO), i = Me.stringToEnumValue(X, t.toUpperCase()); + return i || console.warn( + "[zhi-log] LOG_LEVEL is invalid in you .env file.It must be either debug, info, warn or error, fallback to default info level" + ), i; + } + /** + * 获取默认日志 + */ + static getEnvLogger(r) { + return r ? r.getEnv(ve.LOG_PREFIX_KEY) : void 0; + } +}; +var Oe = { exports: {} }, Se = { exports: {} }, xe; +function Et() { + return xe || (xe = 1, function(e) { + const r = typeof process < "u" && process.env.TERM_PROGRAM === "Hyper", t = typeof process < "u" && process.platform === "win32", i = typeof process < "u" && process.platform === "linux", n = { + ballotDisabled: "☒", + ballotOff: "☐", + ballotOn: "☑", + bullet: "•", + bulletWhite: "◦", + fullBlock: "█", + heart: "❤", + identicalTo: "≡", + line: "─", + mark: "※", + middot: "·", + minus: "-", + multiplication: "×", + obelus: "÷", + pencilDownRight: "✎", + pencilRight: "✏", + pencilUpRight: "✐", + percent: "%", + pilcrow2: "❡", + pilcrow: "¶", + plusMinus: "±", + question: "?", + section: "§", + starsOff: "☆", + starsOn: "★", + upDownArrow: "↕" + }, o = Object.assign({}, n, { + check: "√", + cross: "×", + ellipsisLarge: "...", + ellipsis: "...", + info: "i", + questionSmall: "?", + pointer: ">", + pointerSmall: "»", + radioOff: "( )", + radioOn: "(*)", + warning: "‼" + }), s = Object.assign({}, n, { + ballotCross: "✘", + check: "✔", + cross: "✖", + ellipsisLarge: "⋯", + ellipsis: "…", + info: "ℹ", + questionFull: "?", + questionSmall: "﹖", + pointer: i ? "▸" : "❯", + pointerSmall: i ? "‣" : "›", + radioOff: "◯", + radioOn: "◉", + warning: "⚠" + }); + e.exports = t && !r ? o : s, Reflect.defineProperty(e.exports, "common", { enumerable: !1, value: n }), Reflect.defineProperty(e.exports, "windows", { enumerable: !1, value: o }), Reflect.defineProperty(e.exports, "other", { enumerable: !1, value: s }); + }(Se)), Se.exports; +} +const vt = (e) => e !== null && typeof e == "object" && !Array.isArray(e), Pt = /[\u001b\u009b][[\]#;?()]*(?:(?:(?:[^\W_]*;?[^\W_]*)\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g, Lt = () => typeof process < "u" ? process.env.FORCE_COLOR !== "0" : !1, Je = () => { + const e = { + enabled: Lt(), + visible: !0, + styles: {}, + keys: {} + }, r = (o) => { + let s = o.open = `\x1B[${o.codes[0]}m`, c = o.close = `\x1B[${o.codes[1]}m`, l = o.regex = new RegExp(`\\u001b\\[${o.codes[1]}m`, "g"); + return o.wrap = (u, a) => { + u.includes(c) && (u = u.replace(l, c + s)); + let y = s + u + c; + return a ? y.replace(/\r*\n/g, `${c}$&${s}`) : y; + }, o; + }, t = (o, s, c) => typeof o == "function" ? o(s) : o.wrap(s, c), i = (o, s) => { + if (o === "" || o == null) + return ""; + if (e.enabled === !1) + return o; + if (e.visible === !1) + return ""; + let c = "" + o, l = c.includes(` +`), u = s.length; + for (u > 0 && s.includes("unstyle") && (s = [.../* @__PURE__ */ new Set(["unstyle", ...s])].reverse()); u-- > 0; ) + c = t(e.styles[s[u]], c, l); + return c; + }, n = (o, s, c) => { + e.styles[o] = r({ name: o, codes: s }), (e.keys[c] || (e.keys[c] = [])).push(o), Reflect.defineProperty(e, o, { + configurable: !0, + enumerable: !0, + set(l) { + e.alias(o, l); + }, + get() { + let l = (u) => i(u, l.stack); + return Reflect.setPrototypeOf(l, e), l.stack = this.stack ? this.stack.concat(o) : [o], l; + } + }); + }; + return n("reset", [0, 0], "modifier"), n("bold", [1, 22], "modifier"), n("dim", [2, 22], "modifier"), n("italic", [3, 23], "modifier"), n("underline", [4, 24], "modifier"), n("inverse", [7, 27], "modifier"), n("hidden", [8, 28], "modifier"), n("strikethrough", [9, 29], "modifier"), n("black", [30, 39], "color"), n("red", [31, 39], "color"), n("green", [32, 39], "color"), n("yellow", [33, 39], "color"), n("blue", [34, 39], "color"), n("magenta", [35, 39], "color"), n("cyan", [36, 39], "color"), n("white", [37, 39], "color"), n("gray", [90, 39], "color"), n("grey", [90, 39], "color"), n("bgBlack", [40, 49], "bg"), n("bgRed", [41, 49], "bg"), n("bgGreen", [42, 49], "bg"), n("bgYellow", [43, 49], "bg"), n("bgBlue", [44, 49], "bg"), n("bgMagenta", [45, 49], "bg"), n("bgCyan", [46, 49], "bg"), n("bgWhite", [47, 49], "bg"), n("blackBright", [90, 39], "bright"), n("redBright", [91, 39], "bright"), n("greenBright", [92, 39], "bright"), n("yellowBright", [93, 39], "bright"), n("blueBright", [94, 39], "bright"), n("magentaBright", [95, 39], "bright"), n("cyanBright", [96, 39], "bright"), n("whiteBright", [97, 39], "bright"), n("bgBlackBright", [100, 49], "bgBright"), n("bgRedBright", [101, 49], "bgBright"), n("bgGreenBright", [102, 49], "bgBright"), n("bgYellowBright", [103, 49], "bgBright"), n("bgBlueBright", [104, 49], "bgBright"), n("bgMagentaBright", [105, 49], "bgBright"), n("bgCyanBright", [106, 49], "bgBright"), n("bgWhiteBright", [107, 49], "bgBright"), e.ansiRegex = Pt, e.hasColor = e.hasAnsi = (o) => (e.ansiRegex.lastIndex = 0, typeof o == "string" && o !== "" && e.ansiRegex.test(o)), e.alias = (o, s) => { + let c = typeof s == "string" ? e[s] : s; + if (typeof c != "function") + throw new TypeError("Expected alias to be the name of an existing color (string) or a function"); + c.stack || (Reflect.defineProperty(c, "name", { value: o }), e.styles[o] = c, c.stack = [o]), Reflect.defineProperty(e, o, { + configurable: !0, + enumerable: !0, + set(l) { + e.alias(o, l); + }, + get() { + let l = (u) => i(u, l.stack); + return Reflect.setPrototypeOf(l, e), l.stack = this.stack ? this.stack.concat(c.stack) : c.stack, l; + } + }); + }, e.theme = (o) => { + if (!vt(o)) + throw new TypeError("Expected theme to be an object"); + for (let s of Object.keys(o)) + e.alias(s, o[s]); + return e; + }, e.alias("unstyle", (o) => typeof o == "string" && o !== "" ? (e.ansiRegex.lastIndex = 0, o.replace(e.ansiRegex, "")) : ""), e.alias("noop", (o) => o), e.none = e.clear = e.noop, e.stripColor = e.unstyle, e.symbols = Et(), e.define = n, e; +}; +Oe.exports = Je(); +Oe.exports.create = Je; +var Tt = Oe.exports; +const V = /* @__PURE__ */ _e(Tt); +let Te, ze, Ye, Ze, He = !0; +typeof process < "u" && ({ FORCE_COLOR: Te, NODE_DISABLE_COLORS: ze, NO_COLOR: Ye, TERM: Ze } = process.env || {}, He = process.stdout && process.stdout.isTTY); +const w = { + enabled: !ze && Ye == null && Ze !== "dumb" && (Te != null && Te !== "0" || He), + // modifiers + reset: _(0, 0), + bold: _(1, 22), + dim: _(2, 22), + italic: _(3, 23), + underline: _(4, 24), + inverse: _(7, 27), + hidden: _(8, 28), + strikethrough: _(9, 29), + // colors + black: _(30, 39), + red: _(31, 39), + green: _(32, 39), + yellow: _(33, 39), + blue: _(34, 39), + magenta: _(35, 39), + cyan: _(36, 39), + white: _(37, 39), + gray: _(90, 39), + grey: _(90, 39), + // background colors + bgBlack: _(40, 49), + bgRed: _(41, 49), + bgGreen: _(42, 49), + bgYellow: _(43, 49), + bgBlue: _(44, 49), + bgMagenta: _(45, 49), + bgCyan: _(46, 49), + bgWhite: _(47, 49) +}; +function Ae(e, r) { + let t = 0, i, n = "", o = ""; + for (; t < e.length; t++) + i = e[t], n += i.open, o += i.close, ~r.indexOf(i.close) && (r = r.replace(i.rgx, i.close + i.open)); + return n + r + o; +} +function Bt(e, r) { + let t = { has: e, keys: r }; + return t.reset = w.reset.bind(t), t.bold = w.bold.bind(t), t.dim = w.dim.bind(t), t.italic = w.italic.bind(t), t.underline = w.underline.bind(t), t.inverse = w.inverse.bind(t), t.hidden = w.hidden.bind(t), t.strikethrough = w.strikethrough.bind(t), t.black = w.black.bind(t), t.red = w.red.bind(t), t.green = w.green.bind(t), t.yellow = w.yellow.bind(t), t.blue = w.blue.bind(t), t.magenta = w.magenta.bind(t), t.cyan = w.cyan.bind(t), t.white = w.white.bind(t), t.gray = w.gray.bind(t), t.grey = w.grey.bind(t), t.bgBlack = w.bgBlack.bind(t), t.bgRed = w.bgRed.bind(t), t.bgGreen = w.bgGreen.bind(t), t.bgYellow = w.bgYellow.bind(t), t.bgBlue = w.bgBlue.bind(t), t.bgMagenta = w.bgMagenta.bind(t), t.bgCyan = w.bgCyan.bind(t), t.bgWhite = w.bgWhite.bind(t), t; +} +function _(e, r) { + let t = { + open: `\x1B[${e}m`, + close: `\x1B[${r}m`, + rgx: new RegExp(`\\x1b\\[${r}m`, "g") + }; + return function(i) { + return this !== void 0 && this.has !== void 0 ? (~this.has.indexOf(e) || (this.has.push(e), this.keys.push(t)), i === void 0 ? this : w.enabled ? Ae(this.keys, i + "") : i + "") : i === void 0 ? Bt([e], [t]) : w.enabled ? Ae([t], i + "") : i + ""; + }; +} +var _t = Object.defineProperty, Ot = (e, r, t) => r in e ? _t(e, r, { enumerable: !0, configurable: !0, writable: !0, value: t }) : e[r] = t, D = (e, r, t) => (Ot(e, typeof r != "symbol" ? r + "" : r, t), t); +const Z = class { + /** + * 检测是否运行在Chrome插件中 + */ + static isInChromeExtension() { + return Z.isInBrowser ? window.location.href.indexOf("chrome-extension://") > -1 : !1; + } +}; +let L = Z; +D(L, "isNode", typeof process < "u"), /** +* 是否在浏览器环境 +*/ +D(L, "isInBrowser", typeof window < "u"), /** +* 浏览器路径分隔符 +*/ +D(L, "BrowserSeperator", "/"), /** +* 是否是Electron环境 +*/ +D(L, "isElectron", () => !Z.isInBrowser || !window.navigator || !window.navigator.userAgent ? !1 : /Electron/.test(window.navigator.userAgent)), /** +* 是否有Node环境,目前包括 Electron 和 Node +*/ +D(L, "hasNodeEnv", () => Z.isElectron() || Z.isNode), /** +* 获取url参数 +* +* @param sParam - 参数 +*/ +D(L, "getQueryString", (e) => { + if (!Z.isInBrowser) + return ""; + const r = window.location.search.substring(1).split("&"); + for (let t = 0; t < r.length; t++) { + const i = r[t].split("="); + if (i[0] === e) + return i[1]; + } + return ""; +}), /** +* 替换 URL 的参数 +* 思路: +* 1. 使用了 URLSearchParams 对象来解析和构建 URL 查询参数。 +* +* 2. 在处理包含 hash 片段的 URL 时使用了 split 函数将 URL 分成两部分:基本 URL 和 hash 片段。 +* +* 3. 然后,再次使用 split 函数将基本 URL 分成两部分:路径和查询参数。 +* +* 4. 将查询参数转换为 URLSearchParams 对象,然后设置指定的参数名和值。 +* +* 5. 最后,使用 toString 函数将查询参数转换为字符串,并将其与路径组合成新的基本 URL。如果 URL 包含 hash 片段,则将其添加到新的基本 URL 中。 +* +* @param url - 链接地址 +* @param paramName - 参数名 +* @param paramValue - 参数值 +*/ +D(L, "replaceUrlParam", (e, r, t) => { + t == null && (t = ""); + const i = new RegExp("\\b(" + r + "=).*?(&|#|$)"); + if (e.search(i) >= 0) + return e.replace(i, "$1" + t + "$2"); + const [n, o] = e.split("#"), [s, c] = n.split("?"), l = new URLSearchParams(c); + l.set(r, t); + const u = l.toString(), a = s + (u ? "?" + u : ""); + return o ? a + "#" + o : a; +}), /** +* 设置url参数 +* +* @param urlstring - url +* @param key - key +* @param value - value +*/ +D(L, "setUrlParameter", (e, r, t) => { + if (e.includes(r)) + return Z.replaceUrlParam(e, r, t); + const i = e.split("#"); + let n = i[0]; + const o = i[1]; + return n.includes("?") ? n += `&${r}=${t}` : n += `?${r}=${t}`, o && (n += "#" + o), n; +}), /** +* 重新加载指定tab +* +* @param tabname - tabname +* @param t - 延迟时间 +*/ +D(L, "reloadTabPage", (e, r = 200) => { + setTimeout(function() { + if (Z.isInBrowser) { + const t = window.location.href; + window.location.href = Z.setUrlParameter(t, "tab", e); + } + }, r); +}), /** +* 刷新当前tab页面 +*/ +D(L, "reloadPage", () => { + setTimeout(function() { + Z.isInBrowser && window.location.reload(); + }, 200); +}), /** +* 刷新当前tab页面 +* +* @param msg - 消息提示 +* @param cb - 回调 +*/ +D(L, "reloadPageWithMessageCallback", (e, r) => { + r && r(e), setTimeout(function() { + Z.isInBrowser && window.location.reload(); + }, 200); +}); +var C = /* @__PURE__ */ ((e) => (e.BasePathType_Appearance = "Appearance", e.BasePathType_Data = "Data", e.BasePathType_Themes = "Themes", e.BasePathType_ZhiTheme = "ZhiTheme", e.BasePathType_None = "None", e))(C || {}); +const q = class { + /** + * 检测是否运行在思源打开的浏览器中 + */ + static isInSiyuanBrowser() { + return L.isInBrowser ? typeof window.siyuan < "u" && typeof window.Lute < "u" : !1; + } + /** + * 思源笔记 window 对象 + */ + static siyuanWindow() { + let r; + return this.isInSiyuanWidget() ? r = parent.window : this.isInSiyuanNewWin() || this.isInSiyuanBrowser() || typeof window < "u" ? r = window : r = void 0, r; + } + // ========================= + // require end + // ========================= + // ========================= + // import start + // ========================= + /** + * 引入json + * + * @param jsPath - js相对路径全路径 + * @param type - 类型 + */ + static async importJs(r, t) { + let i = r; + switch (t) { + case C.BasePathType_Appearance: + i = this.browserJoinPath(this.siyuanAppearanceRelativePath(), r); + break; + case C.BasePathType_Data: + i = this.browserJoinPath(this.siyuanDataRelativePath(), r); + break; + case C.BasePathType_Themes: + i = this.browserJoinPath(this.siyuanThemeRelativePath(), r); + break; + case C.BasePathType_ZhiTheme: + i = this.browserJoinPath(this.zhiThemeRelativePath(), r); + break; + default: + throw new Error("type must be provided"); + } + const { default: n } = await import( + /* @vite-ignore */ + i + ); + return n; + } + /** + * 引入json + * + * @param jsonPath - json相对路径全路径 + * @param type - 类型 + */ + // public static async importJson(jsonPath: string, type: BasePathTypeEnum) { + // let fullJsonPath = jsonPath + // switch (type) { + // case BasePathTypeEnum.BasePathType_Appearance: + // fullJsonPath = this.browserJoinPath(this.siyuanAppearanceRelativePath(), jsonPath) + // break + // case BasePathTypeEnum.BasePathType_Data: + // fullJsonPath = this.browserJoinPath(this.siyuanDataRelativePath(), jsonPath) + // break + // case BasePathTypeEnum.BasePathType_Themes: + // fullJsonPath = this.browserJoinPath(this.siyuanThemeRelativePath(), jsonPath) + // break + // case BasePathTypeEnum.BasePathType_ZhiTheme: + // fullJsonPath = this.browserJoinPath(this.zhiThemeRelativePath(), jsonPath) + // break + // default: + // throw new Error("type must be provided") + // } + // + // const { default: data } = await import(/* @vite-ignore */ fullJsonPath, { assert: { type: "json" } }) + // return data + // } + /** + * 引入 json - 以 data 为基本路径 + * + * @param jsonPath - 相对于 data 的相对路径 + */ + // public static async importDataJson(jsonPath: string) { + // return await this.importJson(jsonPath, BasePathTypeEnum.BasePathType_Data) + // } + /** + * 引入 json - 以 appearance 为基本路径 + * + * @param jsonPath - 相对于 appearance 的相对路径 + */ + // public static async importAppearanceJson(jsonPath: string) { + // return await this.importJson(jsonPath, BasePathTypeEnum.BasePathType_Appearance) + // } + /** + * 引入 json - 以 themes 为基本路径 + * + * @param jsonPath - 相对于 themes 的相对路径 + */ + // public static async importThemesJson(jsonPath: string) { + // return await this.importJson(jsonPath, BasePathTypeEnum.BasePathType_Themes) + // } + /** + * 引入 zhi 主题的 json - 以 zhi 主题 的根路径为基本路径 + * + * @param jsonPath - 相对于 zhi 主题根路径的相对路径 + */ + // public static async importZhiThemeJson(jsonPath: string) { + // return await this.importJson(jsonPath, BasePathTypeEnum.BasePathType_ZhiTheme) + // } + /** + * 引入 zhi 主题的 js - 以 zhi 主题 的根路径为基本路径 + * + * @param jsPath - 相对于 zhi 主题根路径的相对路径 + */ + static async importZhiThemeJs(r) { + return await this.importJs(r, C.BasePathType_ZhiTheme); + } + // ========================= + // import start + // ========================= + /** + * 路径拼接 + * + * @param paths - 路径数组 + */ + static joinPath(...r) { + if (L.hasNodeEnv()) { + const t = this.requireLib("path"); + if (t) + return t.join(...r); + } + return this.browserJoinPath(...r); + } + static browserJoinPath(...r) { + return r.join(L.BrowserSeperator); + } + /** + * 思源笔记 conf 目录 + */ + static siyuanConfPath() { + const r = this.siyuanWindow(); + if (!r) + throw new Error("Not in siyuan env"); + return r.siyuan.config.system.confDir; + } + /** + * 思源笔记 data 目录 + */ + static siyuanDataPath() { + const r = this.siyuanWindow(); + if (!r) + throw new Error("Not in siyuan env"); + return r.siyuan.config.system.dataDir; + } + /** + * 思源笔记 data 目录-相对路径 + */ + static siyuanDataRelativePath() { + if (!this.siyuanWindow()) + throw new Error("Not in siyuan env"); + return ""; + } + /** + * 思源笔记 appearance 目录 + */ + static siyuanAppearancePath() { + return this.joinPath(this.siyuanConfPath(), "appearance"); + } + /** + * 思源笔记 appearance 目录-相对路径 + */ + static siyuanAppearanceRelativePath() { + if (!this.siyuanWindow()) + throw new Error("Not in siyuan env"); + return this.browserJoinPath("", "appearance"); + } + /** + * 思源笔记 themes 目录-绝对路径 + * + * 注意: 如果是非 electron 和 Node 环境,这里返回的是浏览器的路径,不是物理路径 + * 如果使用物理路径,请调用 siyuanAppearancePath 或者 siyuanDataPath + * + * @author terwer + * @since 0.1.0 + */ + static siyuanThemePath() { + if (L.hasNodeEnv()) + return this.joinPath(this.siyuanAppearancePath(), "themes"); + { + const r = this.siyuanWindow(); + if (!r) + throw new Error("Not in siyuan env"); + return this.joinPath(r.location.origin, "appearance", "themes"); + } + } + /** + * 思源笔记 themes 目录-相对路径 + */ + static siyuanThemeRelativePath() { + if (!this.siyuanWindow()) + throw new Error("Not in siyuan env"); + return this.browserJoinPath("", "appearance", "themes"); + } + /** + * zhi 主题目录 - 绝对路径 + */ + static zhiThemePath() { + return this.joinPath(this.siyuanThemePath(), "zhi"); + } + /** + * zhi 主题目录 - 相对路径 + */ + static zhiThemeRelativePath() { + return this.browserJoinPath(this.siyuanThemeRelativePath(), "zhi"); + } +}; +let le = q; +D(le, "isInSiyuanWidget", () => L.isInBrowser ? window.frameElement != null && window.frameElement.parentElement != null && window.frameElement.parentElement.parentElement != null && window.frameElement.parentElement.parentElement.getAttribute("data-node-id") !== "" : !1), /** +* 思源笔记新窗口 +* +* @deprecated window.terwer 判断方式已废弃,建议以后打开新窗口注入 window.siyuanNewWin ,这样语义会更容易理解 +* @author terwer +* @version 0.1.0 +* @since 0.0.1 +*/ +D(le, "isInSiyuanNewWin", () => !L.isInBrowser || !L.isElectron() ? !1 : typeof window.terwer < "u" || typeof window.siyuanNewWin < "u"), // ========================= +// require start +// ========================= +/** + * 引入依赖 + * + * @param libpath - 依赖全路径 + * @param abs - 可选,是否使用觉得路径,默认是 true , 启用之后 type参数无效 + * @param type - 可选,以谁的基本路径为准 + */ +D(le, "requireLib", (e, r = !0, t = C.BasePathType_None) => { + if (!L.hasNodeEnv()) + throw new Error("require ony works on node env"); + let i = e; + if (!r) + switch (t) { + case C.BasePathType_Appearance: + i = q.joinPath(q.siyuanAppearancePath(), e); + break; + case C.BasePathType_Data: + i = q.joinPath(q.siyuanDataPath(), e); + break; + case C.BasePathType_Themes: + i = q.joinPath(q.siyuanAppearancePath(), "themes", e); + break; + case C.BasePathType_ZhiTheme: + i = q.joinPath(q.siyuanAppearancePath(), "themes", "zhi", e); + break; + default: + throw new Error("type must be provided when not use absolute path"); + } + const n = q.siyuanWindow(); + if (!n) + return require(i); + if (typeof n.require < "u") + return n.require(i); +}), /** +* 引入依赖,以 data 的基本路径为准 +* +* @param libpath - 相对于 appearance 的相对路径 +*/ +D(le, "requireAppearanceLib", (e) => q.requireLib(e, !1, C.BasePathType_Appearance)), /** +* 引入依赖,以 data 的基本路径为准 +* +* @param libpath - 相对于 data 的相对路径 +*/ +D(le, "requireDataLib", (e) => q.requireLib(e, !1, C.BasePathType_Data)), /** +* 引入依赖,以 theme 的基本路径为准 +* +* @param libpath - 相对于 theme 的相对路径 +*/ +D(le, "requireThemesLib", (e) => q.requireLib(e, !1, C.BasePathType_Themes)), /** +* 引入依赖,以 ZhiTheme 的基本路径为准 +* +* @param libpath - 相对于 ZhiTheme 的相对路径 +*/ +D(le, "requireZhiThemeLib", (e) => q.requireLib(e, !1, C.BasePathType_ZhiTheme)); +const U = { + white: (e) => L.isElectron() ? V.whiteBright(e) : w.white(e), + gray: (e) => L.isElectron() ? V.gray(e) : w.gray(e), + blue: (e) => L.isElectron() ? V.blue(e) : w.blue(e), + green: (e) => L.isElectron() ? V.green(e) : w.green(e), + yellow: (e) => L.isElectron() ? V.yellow(e) : w.yellow(e), + red: (e) => L.isElectron() ? V.red(e) : w.red(e), + bgWhite: (e) => L.isElectron() ? V.bgWhiteBright(e) : w.bgWhite(e), + bgGrey: (e) => L.isElectron() ? V.bgCyanBright(e) : w.bgCyan(e), + bgBlue: (e) => L.isElectron() ? V.bgBlueBright(e) : w.bgBlue(e), + bgGreen: (e) => L.isElectron() ? V.bgGreenBright(e) : w.bgGreen(e), + bgYellow: (e) => L.isElectron() ? V.bgYellowBright(e) : w.bgYellow(e), + bgRed: (e) => L.isElectron() ? V.bgRedBright(e) : w.bgRed(e) +}; +class Rt { + constructor(r, t, i) { + ge(this, "consoleLogger", "console"), ge(this, "stackSize", 1), ge(this, "getLogger", (s) => { + let c; + if (s) + c = s; + else { + const l = this.getCallStack(), u = [], a = []; + for (let y = 0; y < l.length; y++) { + const m = l[y], v = m.getFileName() ?? "none"; + if (y > this.stackSize - 1) + break; + const z = v + "-" + m.getLineNumber() + ":" + m.getColumnNumber(); + u.push(z); + } + a.length > 0 && (c = u.join(" -> ")); + } + return (!c || c.trim().length === 0) && (c = this.consoleLogger), me.getLogger(c); + }), this.stackSize = 1; + let n; + r ? n = r : n = Ie.getEnvLevel(i), n = n ?? X.LOG_LEVEL_INFO, me.setLevel(n); + const o = (s, c, l, u) => { + const a = [], y = t ?? Ie.getEnvLogger(i) ?? "zhi"; + return a.push(U.gray("[") + u(y) + U.gray("]")), a.push(U.gray("[") + U.gray(l.toString()) + U.gray("]")), a.push(u(s.toUpperCase().toString())), a.push(u(c)), a.push(U.gray(":")), a; + }; + De.reg(me), De.apply(me, { + format(s, c, l) { + let u = []; + const a = c ?? ""; + switch (s) { + case X.LOG_LEVEL_TRACE: + u = o(s, a, l, U.gray); + break; + case X.LOG_LEVEL_DEBUG: + u = o(s, a, l, U.blue); + break; + case X.LOG_LEVEL_INFO: + u = o(s, a, l, U.green); + break; + case X.LOG_LEVEL_WARN: + u = o(s, a, l, U.yellow); + break; + case X.LOG_LEVEL_ERROR: + u = o(s, a, l, U.red); + break; + default: + u = o(X.LOG_LEVEL_INFO, a, l, U.green); + break; + } + return u.join(" "); + } + }); + } + /** + * 设置输出栈的深度,默认1 + * + * @param stackSize - 栈的深度 + */ + setStackSize(r) { + this.stackSize = r ?? 1; + } + /** + * 获取调用堆栈,若未获取到直接返回空数组 + * + * @author terwer + * @since 1.6.0 + */ + getCallStack() { + let r; + try { + r = mt(); + } catch { + r = []; + } + return r; + } +} +class kt { + /** + * 默认日志级别 + * + * @param level - 可选,未设置默认INFO + * @param sign - 可选前缀,默认zhi + * @param env - 可选环境变量实例 + */ + constructor(r, t, i) { + ge(this, "logger"), this.logger = new Rt(r, t, i); + } + /** + * 获取日志记录器 + * + * @param loggerName - 日志记录器名称 + * @param stackSize - 打印栈的深度 + * @protected + */ + getLogger(r, t) { + return this.logger.setStackSize(t), this.logger.getLogger(r); + } +} +let Ce = class extends kt { + constructor(r, t, i) { + super(r, t, i); + } + /** + * 获取默认的日志记录器 + * + * @param loggerName - 日志记录器名称 + * @param stackSize - 打印栈的深度 + */ + getLogger(r, t) { + return super.getLogger(r, t); + } +}, Nt = class Ke { + /** + * 默认日志记录器 + * + * @param stackSize - 栈的深度 + * @param env - 环境变量实例 + */ + static defaultLogger(r, t) { + return Ke.customLogFactory(void 0, void 0, r).getLogger(void 0, t); + } + /** + * 自定义日志工厂 + * + * @param level - 级别 + * @param sign - 标志 + * @param env - 环境变量 + */ + static customLogFactory(r, t, i) { + return new Ce(r, t, i); + } + /** + * 自定义日志工厂,自定义前缀 + * + * @param sign - 标志 + * @param env - 环境变量 + */ + static customSignLogFactory(r, t) { + return new Ce(void 0, r, t); + } +}; +class Dt { + constructor() { + fe(this, "logger"), fe(this, "siyuanDevice"), fe(this, "initMethods", { + /** + * 初始化 sy-post-publisher 配置文件存储,适用于【iframe挂件模式】、【新窗口模式】以及【js片段模式】 + */ + initLocalStorageMethod: (t) => { + const i = this.siyuanDevice.siyuanWindow(), n = this.siyuanDevice.siyuanDataPath(); + if (i.JsonLocalStorage) { + this.logger.debug("JsonLocalStorage loaded, ignore.", t); + return; + } + this.siyuanDevice.requireLib( + `${n}/widgets/sy-post-publisher/lib/json-localstorage/json-localstorage.js` + ).init("../../../../storage/syp/"); + }, + /** + * 初始化插槽,仅【iframe挂件模式】、【自定义js片段模式】可用 + */ + initSlotMethod: () => { + const t = this.siyuanDevice.siyuanDataPath(); + this.siyuanDevice.requireLib(`${t}/widgets/sy-post-publisher/lib/siyuan/silot.js`)(); + }, + /** + * 初始化主题适配 + * @param entryName 入口名称 + */ + initThemeAdaptor: (t) => { + const i = this.siyuanDevice.siyuanWindow(), n = this.siyuanDevice.siyuanDataPath(); + if (i.customstyle) { + this.logger.debug("customstyle loaded, ignore.", t); + return; + } + const o = this.siyuanDevice.requireLib(`${n}/widgets/sy-post-publisher/lib/siyuan/theme.js`); + setTimeout(o, 3e3); + }, + /** + * 初始化初始化发布辅助功能 + * @param entryName 入口名称 + */ + initPublishHelper: (t) => { + const i = this.siyuanDevice.siyuanWindow(), n = this.siyuanDevice.siyuanDataPath(); + if (i.syp) { + this.logger.debug("syp已挂载,忽略", t); + return; + } + this.siyuanDevice.requireLib( + `${n}/widgets/sy-post-publisher/lib/siyuan/publish-helper.js` + )(); + }, + /** + * 初始化 PicGO 配置 + * @param entryName 入口名称 + */ + initPicgoExtension: (t) => { + const i = this.siyuanDevice.siyuanWindow(), n = this.siyuanDevice.siyuanDataPath(); + if (i.SyPicgo) { + this.logger.debug("SyPicgo loaded, ignore.", t); + return; + } + const o = this.siyuanDevice.requireLib( + `${n}/widgets/sy-post-publisher/lib/picgo/syPicgo.js` + ).default, s = o.getCrossPlatformAppDataFolder(), c = `${n}/widgets/sy-post-publisher/lib/picgo/picgo.cfg.json`, l = o.joinPath(s, "sy-picgo"), u = "picgo.cfg.json", a = o.joinPath(l, u); + o.upgradeCfg(c, l, u), this.logger.debug("PicGO配置文件初始化为=>", a); + const y = o.initPicgo(a); + i.SyPicgo = y, this.logger.debug("syPicgo=>", y); + }, + /** + * 初始化 SyCmd 配置,适用于【iframe挂件模式】、【新窗口模式】以及【js片段模式】 + * @param entryName 入口名称 + */ + initCmder: (t) => { + const i = this.siyuanDevice.siyuanWindow(), n = this.siyuanDevice.siyuanDataPath(); + if (i.SyCmd) { + this.logger.debug("SyCmd已挂载,忽略", t); + return; + } + const o = this.siyuanDevice.requireLib(`${n}/widgets/sy-post-publisher/lib/cmd/syCmd.js`); + i.SyCmd = o, this.logger.debug("syCmd=>", o); + } + }), fe(this, "doInit", (t = {}) => { + const { + isInitLocalStorage: i = !1, + isInitSlot: n = !1, + isInitThemeAdaptor: o = !1, + isInitPublishHelper: s = !1, + isInitPicgoExtension: c = !1, + isInitCmder: l = !1 + } = t; + i && this.initMethods.initLocalStorageMethod("PublisherHook"), n && this.initMethods.initSlotMethod(), o && this.initMethods.initThemeAdaptor("PublisherHook"), s && this.initMethods.initPublishHelper("PublisherHook"), c && this.initMethods.initPicgoExtension("PublisherHook"), l && this.initMethods.initCmder("PublisherHook"); + }); + const r = new yt({ BASE_URL: "/", MODE: "production", DEV: !1, PROD: !0, SSR: !1 }); + this.logger = Nt.customLogFactory(X.LOG_LEVEL_INFO, "publish-hook", r).getLogger(), this.siyuanDevice = re; + } + async init() { + this.logger.info("Initiating sy-post-publisher from publish hook ..."); + try { + this.doInit({ + isInitLocalStorage: !0, + isInitSlot: !0, + isInitThemeAdaptor: !0, + isInitPublishHelper: !0, + isInitPicgoExtension: !0, + isInitCmder: !0 + }); + } catch (r) { + this.logger.warn("Failed to init sy-post-publisher,it may not work in some case.Error=>", r); + } + } +} +var It = Object.defineProperty, St = (e, r, t) => r in e ? It(e, r, { enumerable: !0, configurable: !0, writable: !0, value: t }) : e[r] = t, he = (e, r, t) => (St(e, typeof r != "symbol" ? r + "" : r, t), t); +let oe = class { +}; +he(oe, "NODE_ENV_KEY", "NODE_ENV"), /** +* 开发环境 +*/ +he(oe, "NODE_ENV_DEVELOPMENT", "development"), /** +* 生产环境 +*/ +he(oe, "NODE_ENV_PRODUCTION", "production"), /** +* 测试环境 +*/ +he(oe, "NODE_ENV_TEST", "test"), /** +* 是否处于调试模式 +*/ +he(oe, "VITE_DEBUG_MODE_KEY", "VITE_DEBUG_MODE"); +class xt { + /** + * 环境初始化 + * + * @param envMeta - 需要传入 {"BASE_URL":"/","MODE":"production","DEV":false,"PROD":true,"SSR":false} 。特别提醒:此参数是静态元数据,取决于最终使用的项目。因此仅仅在最终使用的地方显示传递此值,中间项目请保持参数传递 + * @see {@link https://vitejs.dev/guide/env-and-mode.html#production-replacement} + */ + constructor(r) { + he(this, "envMeta"), this.envMeta = r; + } + /** + * 是否是开发阶段调试 + */ + isNodeDev() { + return this.getEnv(oe.NODE_ENV_KEY) === oe.NODE_ENV_DEVELOPMENT; + } + /** + * 是否是调试阶段 + */ + isDev() { + return this.isNodeDev() || this.getBooleanEnv(oe.VITE_DEBUG_MODE_KEY); + } + /** + * 获取环境变量,key不存在返回undefined + * @param key - key + */ + getEnv(r) { + let t; + try { + this.envMeta[r] && (t = this.envMeta[r]); + } catch { + } + return t; + } + /** + * 获取String类型的环境变量,key不存在直接返回空值 + * @param key - key + */ + getStringEnv(r) { + return this.getEnv(r) ?? ""; + } + /** + * 获取Boolean类型的环境变量,key不存在返回false + * @param key - key + */ + getBooleanEnv(r) { + let t = !1; + return this.getEnv(r) && (t = this.getStringEnv(r).toLowerCase() === "true"), t; + } + /** + * 获取环境变量,如果未定义或者为空值,用指定的默认值代替 + * + * @param key - key + * @param defaultValue - 默认值 + * @since 0.1.0 + * @author terwer + */ + getEnvOrDefault(r, t) { + const i = this.getStringEnv(r); + return i.trim().length == 0 ? t : i; + } +} +var At = Object.defineProperty, Ct = (e, r, t) => r in e ? At(e, r, { enumerable: !0, configurable: !0, writable: !0, value: t }) : e[r] = t, pe = (e, r, t) => (Ct(e, typeof r != "symbol" ? r + "" : r, t), t); +class Pe { +} +pe(Pe, "LOG_LEVEL_KEY", "VITE_LOG_LEVEL"), pe(Pe, "LOG_PREFIX_KEY", "VITE_LOG_PREFIX"); +var Q = /* @__PURE__ */ ((e) => (e.LOG_LEVEL_TRACE = "TRACE", e.LOG_LEVEL_DEBUG = "DEBUG", e.LOG_LEVEL_INFO = "INFO", e.LOG_LEVEL_WARN = "WARN", e.LOG_LEVEL_ERROR = "ERROR", e))(Q || {}), Xe = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {}; +function Re(e) { + return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e; +} +var Qe = { exports: {} }; +(function(e) { + (function(r, t) { + e.exports ? e.exports = t() : r.log = t(); + })(Xe, function() { + var r = function() { + }, t = "undefined", i = typeof window !== t && typeof window.navigator !== t && /Trident\/|MSIE /.test(window.navigator.userAgent), n = [ + "trace", + "debug", + "info", + "warn", + "error" + ]; + function o(h, f) { + var E = h[f]; + if (typeof E.bind == "function") + return E.bind(h); + try { + return Function.prototype.bind.call(E, h); + } catch { + return function() { + return Function.prototype.apply.apply(E, [h, arguments]); + }; + } + } + function s() { + console.log && (console.log.apply ? console.log.apply(console, arguments) : Function.prototype.apply.apply(console.log, [console, arguments])), console.trace && console.trace(); + } + function c(h) { + return h === "debug" && (h = "log"), typeof console === t ? !1 : h === "trace" && i ? s : console[h] !== void 0 ? o(console, h) : console.log !== void 0 ? o(console, "log") : r; + } + function l(h, f) { + for (var E = 0; E < n.length; E++) { + var p = n[E]; + this[p] = E < h ? r : this.methodFactory(p, h, f); + } + this.log = this.debug; + } + function u(h, f, E) { + return function() { + typeof console !== t && (l.call(this, f, E), this[h].apply(this, arguments)); + }; + } + function a(h, f, E) { + return c(h) || u.apply(this, arguments); + } + function y(h, f, E) { + var p = this, ee; + f = f ?? "WARN"; + var d = "loglevel"; + typeof h == "string" ? d += ":" + h : typeof h == "symbol" && (d = void 0); + function ae(g) { + var P = (n[g] || "silent").toUpperCase(); + if (!(typeof window === t || !d)) { + try { + window.localStorage[d] = P; + return; + } catch { + } + try { + window.document.cookie = encodeURIComponent(d) + "=" + P + ";"; + } catch { + } + } + } + function te() { + var g; + if (!(typeof window === t || !d)) { + try { + g = window.localStorage[d]; + } catch { + } + if (typeof g === t) + try { + var P = window.document.cookie, x = P.indexOf( + encodeURIComponent(d) + "=" + ); + x !== -1 && (g = /^([^;]+)/.exec(P.slice(x))[1]); + } catch { + } + return p.levels[g] === void 0 && (g = void 0), g; + } + } + function se() { + if (!(typeof window === t || !d)) { + try { + window.localStorage.removeItem(d); + return; + } catch { + } + try { + window.document.cookie = encodeURIComponent(d) + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC"; + } catch { + } + } + } + p.name = h, p.levels = { + TRACE: 0, + DEBUG: 1, + INFO: 2, + WARN: 3, + ERROR: 4, + SILENT: 5 + }, p.methodFactory = E || a, p.getLevel = function() { + return ee; + }, p.setLevel = function(g, P) { + if (typeof g == "string" && p.levels[g.toUpperCase()] !== void 0 && (g = p.levels[g.toUpperCase()]), typeof g == "number" && g >= 0 && g <= p.levels.SILENT) { + if (ee = g, P !== !1 && ae(g), l.call(p, g, h), typeof console === t && g < p.levels.SILENT) + return "No console available for logging"; + } else + throw "log.setLevel() called with invalid level: " + g; + }, p.setDefaultLevel = function(g) { + f = g, te() || p.setLevel(g, !1); + }, p.resetLevel = function() { + p.setLevel(f, !1), se(); + }, p.enableAll = function(g) { + p.setLevel(p.levels.TRACE, g); + }, p.disableAll = function(g) { + p.setLevel(p.levels.SILENT, g); + }; + var B = te(); + B == null && (B = f), p.setLevel(B, !1); + } + var m = new y(), v = {}; + m.getLogger = function(h) { + if (typeof h != "symbol" && typeof h != "string" || h === "") + throw new TypeError("You must supply a name when creating a logger."); + var f = v[h]; + return f || (f = v[h] = new y( + h, + m.getLevel(), + m.methodFactory + )), f; + }; + var z = typeof window !== t ? window.log : void 0; + return m.noConflict = function() { + return typeof window !== t && window.log === m && (window.log = z), m; + }, m.getLoggers = function() { + return v; + }, m.default = m, m; + }); +})(Qe); +var Wt = Qe.exports; +const Ee = /* @__PURE__ */ Re(Wt); +var et = { exports: {} }; +(function(e) { + (function(r, t) { + e.exports ? e.exports = t() : r.prefix = t(r); + })(Xe, function(r) { + var t = function(a) { + for (var y = 1, m = arguments.length, v; y < m; y++) + for (v in arguments[y]) + Object.prototype.hasOwnProperty.call(arguments[y], v) && (a[v] = arguments[y][v]); + return a; + }, i = { + template: "[%t] %l:", + levelFormatter: function(a) { + return a.toUpperCase(); + }, + nameFormatter: function(a) { + return a || "root"; + }, + timestampFormatter: function(a) { + return a.toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1"); + }, + format: void 0 + }, n, o = {}, s = function(a) { + if (!a || !a.getLogger) + throw new TypeError("Argument is not a root logger"); + n = a; + }, c = function(a, y) { + if (!a || !a.setLevel) + throw new TypeError("Argument is not a logger"); + var m = a.methodFactory, v = a.name || "", z = o[v] || o[""] || i; + function h(f, E, p) { + var ee = m(f, E, p), d = o[p] || o[""], ae = d.template.indexOf("%t") !== -1, te = d.template.indexOf("%l") !== -1, se = d.template.indexOf("%n") !== -1; + return function() { + for (var B = "", g = arguments.length, P = Array(g), x = 0; x < g; x++) + P[x] = arguments[x]; + if (v || !o[p]) { + var ye = d.timestampFormatter(/* @__PURE__ */ new Date()), de = d.levelFormatter(f), we = d.nameFormatter(p); + d.format ? B += d.format(de, we, ye) : (B += d.template, ae && (B = B.replace(/%t/, ye)), te && (B = B.replace(/%l/, de)), se && (B = B.replace(/%n/, we))), P.length && typeof P[0] == "string" ? P[0] = B + " " + P[0] : P.unshift(B); + } + ee.apply(void 0, P); + }; + } + return o[v] || (a.methodFactory = h), y = y || {}, y.template && (y.format = void 0), o[v] = t({}, z, y), a.setLevel(a.getLevel()), n || a.warn( + "It is necessary to call the function reg() of loglevel-plugin-prefix before calling apply. From the next release, it will throw an error. See more: https://github.com/kutuluk/loglevel-plugin-prefix/blob/master/README.md" + ), a; + }, l = { + reg: s, + apply: c + }, u; + return r && (u = r.prefix, l.noConflict = function() { + return r.prefix === l && (r.prefix = u), l; + }), l; + }); +})(et); +var $t = et.exports; +const We = /* @__PURE__ */ Re($t); +function jt() { + const e = Error.prepareStackTrace; + Error.prepareStackTrace = (t, i) => i; + const r = new Error().stack.slice(1); + return Error.prepareStackTrace = e, r; +} +class Le { + /** + * 解析日志级别为枚举 + * + * @param enumObj - 枚举对象 + * @param value - 配置的值 + */ + static stringToEnumValue(r, t) { + return r[Object.keys(r).filter((i) => r[i].toString() === t)[0]]; + } + /** + * 获取配置的日志级别 + */ + static getEnvLevel(r) { + if (!r) + return; + const t = r.getEnvOrDefault(Pe.LOG_LEVEL_KEY, Q.LOG_LEVEL_INFO), i = Le.stringToEnumValue(Q, t.toUpperCase()); + return i || console.warn( + "[zhi-log] LOG_LEVEL is invalid in you .env file.It must be either debug, info, warn or error, fallback to default info level" + ), i; + } + /** + * 获取默认日志 + */ + static getEnvLogger(r) { + return r ? r.getEnv(Pe.LOG_PREFIX_KEY) : void 0; + } +} +var ke = { exports: {} }, $e = { exports: {} }, je; +function qt() { + return je || (je = 1, function(e) { + const r = typeof process < "u" && process.env.TERM_PROGRAM === "Hyper", t = typeof process < "u" && process.platform === "win32", i = typeof process < "u" && process.platform === "linux", n = { + ballotDisabled: "☒", + ballotOff: "☐", + ballotOn: "☑", + bullet: "•", + bulletWhite: "◦", + fullBlock: "█", + heart: "❤", + identicalTo: "≡", + line: "─", + mark: "※", + middot: "·", + minus: "-", + multiplication: "×", + obelus: "÷", + pencilDownRight: "✎", + pencilRight: "✏", + pencilUpRight: "✐", + percent: "%", + pilcrow2: "❡", + pilcrow: "¶", + plusMinus: "±", + question: "?", + section: "§", + starsOff: "☆", + starsOn: "★", + upDownArrow: "↕" + }, o = Object.assign({}, n, { + check: "√", + cross: "×", + ellipsisLarge: "...", + ellipsis: "...", + info: "i", + questionSmall: "?", + pointer: ">", + pointerSmall: "»", + radioOff: "( )", + radioOn: "(*)", + warning: "‼" + }), s = Object.assign({}, n, { + ballotCross: "✘", + check: "✔", + cross: "✖", + ellipsisLarge: "⋯", + ellipsis: "…", + info: "ℹ", + questionFull: "?", + questionSmall: "﹖", + pointer: i ? "▸" : "❯", + pointerSmall: i ? "‣" : "›", + radioOff: "◯", + radioOn: "◉", + warning: "⚠" + }); + e.exports = t && !r ? o : s, Reflect.defineProperty(e.exports, "common", { enumerable: !1, value: n }), Reflect.defineProperty(e.exports, "windows", { enumerable: !1, value: o }), Reflect.defineProperty(e.exports, "other", { enumerable: !1, value: s }); + }($e)), $e.exports; +} +const Gt = (e) => e !== null && typeof e == "object" && !Array.isArray(e), Ft = /[\u001b\u009b][[\]#;?()]*(?:(?:(?:[^\W_]*;?[^\W_]*)\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g, Vt = () => typeof process < "u" ? process.env.FORCE_COLOR !== "0" : !1, tt = () => { + const e = { + enabled: Vt(), + visible: !0, + styles: {}, + keys: {} + }, r = (o) => { + let s = o.open = `\x1B[${o.codes[0]}m`, c = o.close = `\x1B[${o.codes[1]}m`, l = o.regex = new RegExp(`\\u001b\\[${o.codes[1]}m`, "g"); + return o.wrap = (u, a) => { + u.includes(c) && (u = u.replace(l, c + s)); + let y = s + u + c; + return a ? y.replace(/\r*\n/g, `${c}$&${s}`) : y; + }, o; + }, t = (o, s, c) => typeof o == "function" ? o(s) : o.wrap(s, c), i = (o, s) => { + if (o === "" || o == null) + return ""; + if (e.enabled === !1) + return o; + if (e.visible === !1) + return ""; + let c = "" + o, l = c.includes(` +`), u = s.length; + for (u > 0 && s.includes("unstyle") && (s = [.../* @__PURE__ */ new Set(["unstyle", ...s])].reverse()); u-- > 0; ) + c = t(e.styles[s[u]], c, l); + return c; + }, n = (o, s, c) => { + e.styles[o] = r({ name: o, codes: s }), (e.keys[c] || (e.keys[c] = [])).push(o), Reflect.defineProperty(e, o, { + configurable: !0, + enumerable: !0, + set(l) { + e.alias(o, l); + }, + get() { + let l = (u) => i(u, l.stack); + return Reflect.setPrototypeOf(l, e), l.stack = this.stack ? this.stack.concat(o) : [o], l; + } + }); + }; + return n("reset", [0, 0], "modifier"), n("bold", [1, 22], "modifier"), n("dim", [2, 22], "modifier"), n("italic", [3, 23], "modifier"), n("underline", [4, 24], "modifier"), n("inverse", [7, 27], "modifier"), n("hidden", [8, 28], "modifier"), n("strikethrough", [9, 29], "modifier"), n("black", [30, 39], "color"), n("red", [31, 39], "color"), n("green", [32, 39], "color"), n("yellow", [33, 39], "color"), n("blue", [34, 39], "color"), n("magenta", [35, 39], "color"), n("cyan", [36, 39], "color"), n("white", [37, 39], "color"), n("gray", [90, 39], "color"), n("grey", [90, 39], "color"), n("bgBlack", [40, 49], "bg"), n("bgRed", [41, 49], "bg"), n("bgGreen", [42, 49], "bg"), n("bgYellow", [43, 49], "bg"), n("bgBlue", [44, 49], "bg"), n("bgMagenta", [45, 49], "bg"), n("bgCyan", [46, 49], "bg"), n("bgWhite", [47, 49], "bg"), n("blackBright", [90, 39], "bright"), n("redBright", [91, 39], "bright"), n("greenBright", [92, 39], "bright"), n("yellowBright", [93, 39], "bright"), n("blueBright", [94, 39], "bright"), n("magentaBright", [95, 39], "bright"), n("cyanBright", [96, 39], "bright"), n("whiteBright", [97, 39], "bright"), n("bgBlackBright", [100, 49], "bgBright"), n("bgRedBright", [101, 49], "bgBright"), n("bgGreenBright", [102, 49], "bgBright"), n("bgYellowBright", [103, 49], "bgBright"), n("bgBlueBright", [104, 49], "bgBright"), n("bgMagentaBright", [105, 49], "bgBright"), n("bgCyanBright", [106, 49], "bgBright"), n("bgWhiteBright", [107, 49], "bgBright"), e.ansiRegex = Ft, e.hasColor = e.hasAnsi = (o) => (e.ansiRegex.lastIndex = 0, typeof o == "string" && o !== "" && e.ansiRegex.test(o)), e.alias = (o, s) => { + let c = typeof s == "string" ? e[s] : s; + if (typeof c != "function") + throw new TypeError("Expected alias to be the name of an existing color (string) or a function"); + c.stack || (Reflect.defineProperty(c, "name", { value: o }), e.styles[o] = c, c.stack = [o]), Reflect.defineProperty(e, o, { + configurable: !0, + enumerable: !0, + set(l) { + e.alias(o, l); + }, + get() { + let l = (u) => i(u, l.stack); + return Reflect.setPrototypeOf(l, e), l.stack = this.stack ? this.stack.concat(c.stack) : c.stack, l; + } + }); + }, e.theme = (o) => { + if (!Gt(o)) + throw new TypeError("Expected theme to be an object"); + for (let s of Object.keys(o)) + e.alias(s, o[s]); + return e; + }, e.alias("unstyle", (o) => typeof o == "string" && o !== "" ? (e.ansiRegex.lastIndex = 0, o.replace(e.ansiRegex, "")) : ""), e.alias("noop", (o) => o), e.none = e.clear = e.noop, e.stripColor = e.unstyle, e.symbols = qt(), e.define = n, e; +}; +ke.exports = tt(); +ke.exports.create = tt; +var Ut = ke.exports; +const M = /* @__PURE__ */ Re(Ut); +let Be, rt, nt, it, ot = !0; +typeof process < "u" && ({ FORCE_COLOR: Be, NODE_DISABLE_COLORS: rt, NO_COLOR: nt, TERM: it } = process.env || {}, ot = process.stdout && process.stdout.isTTY); +const b = { + enabled: !rt && nt == null && it !== "dumb" && (Be != null && Be !== "0" || ot), + // modifiers + reset: O(0, 0), + bold: O(1, 22), + dim: O(2, 22), + italic: O(3, 23), + underline: O(4, 24), + inverse: O(7, 27), + hidden: O(8, 28), + strikethrough: O(9, 29), + // colors + black: O(30, 39), + red: O(31, 39), + green: O(32, 39), + yellow: O(33, 39), + blue: O(34, 39), + magenta: O(35, 39), + cyan: O(36, 39), + white: O(37, 39), + gray: O(90, 39), + grey: O(90, 39), + // background colors + bgBlack: O(40, 49), + bgRed: O(41, 49), + bgGreen: O(42, 49), + bgYellow: O(43, 49), + bgBlue: O(44, 49), + bgMagenta: O(45, 49), + bgCyan: O(46, 49), + bgWhite: O(47, 49) +}; +function qe(e, r) { + let t = 0, i, n = "", o = ""; + for (; t < e.length; t++) + i = e[t], n += i.open, o += i.close, ~r.indexOf(i.close) && (r = r.replace(i.rgx, i.close + i.open)); + return n + r + o; +} +function Mt(e, r) { + let t = { has: e, keys: r }; + return t.reset = b.reset.bind(t), t.bold = b.bold.bind(t), t.dim = b.dim.bind(t), t.italic = b.italic.bind(t), t.underline = b.underline.bind(t), t.inverse = b.inverse.bind(t), t.hidden = b.hidden.bind(t), t.strikethrough = b.strikethrough.bind(t), t.black = b.black.bind(t), t.red = b.red.bind(t), t.green = b.green.bind(t), t.yellow = b.yellow.bind(t), t.blue = b.blue.bind(t), t.magenta = b.magenta.bind(t), t.cyan = b.cyan.bind(t), t.white = b.white.bind(t), t.gray = b.gray.bind(t), t.grey = b.grey.bind(t), t.bgBlack = b.bgBlack.bind(t), t.bgRed = b.bgRed.bind(t), t.bgGreen = b.bgGreen.bind(t), t.bgYellow = b.bgYellow.bind(t), t.bgBlue = b.bgBlue.bind(t), t.bgMagenta = b.bgMagenta.bind(t), t.bgCyan = b.bgCyan.bind(t), t.bgWhite = b.bgWhite.bind(t), t; +} +function O(e, r) { + let t = { + open: `\x1B[${e}m`, + close: `\x1B[${r}m`, + rgx: new RegExp(`\\x1b\\[${r}m`, "g") + }; + return function(i) { + return this !== void 0 && this.has !== void 0 ? (~this.has.indexOf(e) || (this.has.push(e), this.keys.push(t)), i === void 0 ? this : b.enabled ? qe(this.keys, i + "") : i + "") : i === void 0 ? Mt([e], [t]) : b.enabled ? qe([t], i + "") : i + ""; + }; +} +var Jt = Object.defineProperty, zt = (e, r, t) => r in e ? Jt(e, r, { enumerable: !0, configurable: !0, writable: !0, value: t }) : e[r] = t, I = (e, r, t) => (zt(e, typeof r != "symbol" ? r + "" : r, t), t); +const H = class { + /** + * 检测是否运行在Chrome插件中 + */ + static isInChromeExtension() { + return H.isInBrowser ? window.location.href.indexOf("chrome-extension://") > -1 : !1; + } +}; +let T = H; +I(T, "isNode", typeof process < "u"), /** +* 是否在浏览器环境 +*/ +I(T, "isInBrowser", typeof window < "u"), /** +* 浏览器路径分隔符 +*/ +I(T, "BrowserSeperator", "/"), /** +* 是否是Electron环境 +*/ +I(T, "isElectron", () => !H.isInBrowser || !window.navigator || !window.navigator.userAgent ? !1 : /Electron/.test(window.navigator.userAgent)), /** +* 是否有Node环境,目前包括 Electron 和 Node +*/ +I(T, "hasNodeEnv", () => H.isElectron() || H.isNode), /** +* 获取url参数 +* +* @param sParam - 参数 +*/ +I(T, "getQueryString", (e) => { + if (!H.isInBrowser) + return ""; + const r = window.location.search.substring(1).split("&"); + for (let t = 0; t < r.length; t++) { + const i = r[t].split("="); + if (i[0] === e) + return i[1]; + } + return ""; +}), /** +* 替换 URL 的参数 +* 思路: +* 1. 使用了 URLSearchParams 对象来解析和构建 URL 查询参数。 +* +* 2. 在处理包含 hash 片段的 URL 时使用了 split 函数将 URL 分成两部分:基本 URL 和 hash 片段。 +* +* 3. 然后,再次使用 split 函数将基本 URL 分成两部分:路径和查询参数。 +* +* 4. 将查询参数转换为 URLSearchParams 对象,然后设置指定的参数名和值。 +* +* 5. 最后,使用 toString 函数将查询参数转换为字符串,并将其与路径组合成新的基本 URL。如果 URL 包含 hash 片段,则将其添加到新的基本 URL 中。 +* +* @param url - 链接地址 +* @param paramName - 参数名 +* @param paramValue - 参数值 +*/ +I(T, "replaceUrlParam", (e, r, t) => { + t == null && (t = ""); + const i = new RegExp("\\b(" + r + "=).*?(&|#|$)"); + if (e.search(i) >= 0) + return e.replace(i, "$1" + t + "$2"); + const [n, o] = e.split("#"), [s, c] = n.split("?"), l = new URLSearchParams(c); + l.set(r, t); + const u = l.toString(), a = s + (u ? "?" + u : ""); + return o ? a + "#" + o : a; +}), /** +* 设置url参数 +* +* @param urlstring - url +* @param key - key +* @param value - value +*/ +I(T, "setUrlParameter", (e, r, t) => { + if (e.includes(r)) + return H.replaceUrlParam(e, r, t); + const i = e.split("#"); + let n = i[0]; + const o = i[1]; + return n.includes("?") ? n += `&${r}=${t}` : n += `?${r}=${t}`, o && (n += "#" + o), n; +}), /** +* 重新加载指定tab +* +* @param tabname - tabname +* @param t - 延迟时间 +*/ +I(T, "reloadTabPage", (e, r = 200) => { + setTimeout(function() { + if (H.isInBrowser) { + const t = window.location.href; + window.location.href = H.setUrlParameter(t, "tab", e); + } + }, r); +}), /** +* 刷新当前tab页面 +*/ +I(T, "reloadPage", () => { + setTimeout(function() { + H.isInBrowser && window.location.reload(); + }, 200); +}), /** +* 刷新当前tab页面 +* +* @param msg - 消息提示 +* @param cb - 回调 +*/ +I(T, "reloadPageWithMessageCallback", (e, r) => { + r && r(e), setTimeout(function() { + H.isInBrowser && window.location.reload(); + }, 200); +}); +var W = /* @__PURE__ */ ((e) => (e.BasePathType_Appearance = "Appearance", e.BasePathType_Data = "Data", e.BasePathType_Themes = "Themes", e.BasePathType_ZhiTheme = "ZhiTheme", e.BasePathType_None = "None", e))(W || {}); +const G = class { + /** + * 检测是否运行在思源打开的浏览器中 + */ + static isInSiyuanBrowser() { + return T.isInBrowser ? typeof window.siyuan < "u" && typeof window.Lute < "u" : !1; + } + /** + * 思源笔记 window 对象 + */ + static siyuanWindow() { + let e; + return this.isInSiyuanWidget() ? e = parent.window : this.isInSiyuanNewWin() || this.isInSiyuanBrowser() || typeof window < "u" ? e = window : e = void 0, e; + } + // ========================= + // require end + // ========================= + // ========================= + // import start + // ========================= + /** + * 引入json + * + * @param jsPath - js相对路径全路径 + * @param type - 类型 + */ + static async importJs(e, r) { + let t = e; + switch (r) { + case W.BasePathType_Appearance: + t = this.browserJoinPath(this.siyuanAppearanceRelativePath(), e); + break; + case W.BasePathType_Data: + t = this.browserJoinPath(this.siyuanDataRelativePath(), e); + break; + case W.BasePathType_Themes: + t = this.browserJoinPath(this.siyuanThemeRelativePath(), e); + break; + case W.BasePathType_ZhiTheme: + t = this.browserJoinPath(this.zhiThemeRelativePath(), e); + break; + default: + throw new Error("type must be provided"); + } + const { default: i } = await import( + /* @vite-ignore */ + t + ); + return i; + } + /** + * 引入json + * + * @param jsonPath - json相对路径全路径 + * @param type - 类型 + */ + // public static async importJson(jsonPath: string, type: BasePathTypeEnum) { + // let fullJsonPath = jsonPath + // switch (type) { + // case BasePathTypeEnum.BasePathType_Appearance: + // fullJsonPath = this.browserJoinPath(this.siyuanAppearanceRelativePath(), jsonPath) + // break + // case BasePathTypeEnum.BasePathType_Data: + // fullJsonPath = this.browserJoinPath(this.siyuanDataRelativePath(), jsonPath) + // break + // case BasePathTypeEnum.BasePathType_Themes: + // fullJsonPath = this.browserJoinPath(this.siyuanThemeRelativePath(), jsonPath) + // break + // case BasePathTypeEnum.BasePathType_ZhiTheme: + // fullJsonPath = this.browserJoinPath(this.zhiThemeRelativePath(), jsonPath) + // break + // default: + // throw new Error("type must be provided") + // } + // + // const { default: data } = await import(/* @vite-ignore */ fullJsonPath, { assert: { type: "json" } }) + // return data + // } + /** + * 引入 json - 以 data 为基本路径 + * + * @param jsonPath - 相对于 data 的相对路径 + */ + // public static async importDataJson(jsonPath: string) { + // return await this.importJson(jsonPath, BasePathTypeEnum.BasePathType_Data) + // } + /** + * 引入 json - 以 appearance 为基本路径 + * + * @param jsonPath - 相对于 appearance 的相对路径 + */ + // public static async importAppearanceJson(jsonPath: string) { + // return await this.importJson(jsonPath, BasePathTypeEnum.BasePathType_Appearance) + // } + /** + * 引入 json - 以 themes 为基本路径 + * + * @param jsonPath - 相对于 themes 的相对路径 + */ + // public static async importThemesJson(jsonPath: string) { + // return await this.importJson(jsonPath, BasePathTypeEnum.BasePathType_Themes) + // } + /** + * 引入 zhi 主题的 json - 以 zhi 主题 的根路径为基本路径 + * + * @param jsonPath - 相对于 zhi 主题根路径的相对路径 + */ + // public static async importZhiThemeJson(jsonPath: string) { + // return await this.importJson(jsonPath, BasePathTypeEnum.BasePathType_ZhiTheme) + // } + /** + * 引入 zhi 主题的 js - 以 zhi 主题 的根路径为基本路径 + * + * @param jsPath - 相对于 zhi 主题根路径的相对路径 + */ + static async importZhiThemeJs(e) { + return await this.importJs(e, W.BasePathType_ZhiTheme); + } + // ========================= + // import start + // ========================= + /** + * 路径拼接 + * + * @param paths - 路径数组 + */ + static joinPath(...e) { + if (T.hasNodeEnv()) { + const r = this.requireLib("path"); + if (r) + return r.join(...e); + } + return this.browserJoinPath(...e); + } + static browserJoinPath(...e) { + return e.join(T.BrowserSeperator); + } + /** + * 思源笔记 conf 目录 + */ + static siyuanConfPath() { + const e = this.siyuanWindow(); + if (!e) + throw new Error("Not in siyuan env"); + return e.siyuan.config.system.confDir; + } + /** + * 思源笔记 data 目录 + */ + static siyuanDataPath() { + const e = this.siyuanWindow(); + if (!e) + throw new Error("Not in siyuan env"); + return e.siyuan.config.system.dataDir; + } + /** + * 思源笔记 data 目录-相对路径 + */ + static siyuanDataRelativePath() { + if (!this.siyuanWindow()) + throw new Error("Not in siyuan env"); + return ""; + } + /** + * 思源笔记 appearance 目录 + */ + static siyuanAppearancePath() { + return this.joinPath(this.siyuanConfPath(), "appearance"); + } + /** + * 思源笔记 appearance 目录-相对路径 + */ + static siyuanAppearanceRelativePath() { + if (!this.siyuanWindow()) + throw new Error("Not in siyuan env"); + return this.browserJoinPath("", "appearance"); + } + /** + * 思源笔记 themes 目录-绝对路径 + * + * 注意: 如果是非 electron 和 Node 环境,这里返回的是浏览器的路径,不是物理路径 + * 如果使用物理路径,请调用 siyuanAppearancePath 或者 siyuanDataPath + * + * @author terwer + * @since 0.1.0 + */ + static siyuanThemePath() { + if (T.hasNodeEnv()) + return this.joinPath(this.siyuanAppearancePath(), "themes"); + { + const e = this.siyuanWindow(); + if (!e) + throw new Error("Not in siyuan env"); + return this.joinPath(e.location.origin, "appearance", "themes"); + } + } + /** + * 思源笔记 themes 目录-相对路径 + */ + static siyuanThemeRelativePath() { + if (!this.siyuanWindow()) + throw new Error("Not in siyuan env"); + return this.browserJoinPath("", "appearance", "themes"); + } + /** + * zhi 主题目录 - 绝对路径 + */ + static zhiThemePath() { + return this.joinPath(this.siyuanThemePath(), "zhi"); + } + /** + * zhi 主题目录 - 相对路径 + */ + static zhiThemeRelativePath() { + return this.browserJoinPath(this.siyuanThemeRelativePath(), "zhi"); + } +}; +let ce = G; +I(ce, "isInSiyuanWidget", () => T.isInBrowser ? window.frameElement != null && window.frameElement.parentElement != null && window.frameElement.parentElement.parentElement != null && window.frameElement.parentElement.parentElement.getAttribute("data-node-id") !== "" : !1), /** +* 思源笔记新窗口 +* +* @deprecated window.terwer 判断方式已废弃,建议以后打开新窗口注入 window.siyuanNewWin ,这样语义会更容易理解 +* @author terwer +* @version 0.1.0 +* @since 0.0.1 +*/ +I(ce, "isInSiyuanNewWin", () => !T.isInBrowser || !T.isElectron() ? !1 : typeof window.terwer < "u" || typeof window.siyuanNewWin < "u"), // ========================= +// require start +// ========================= +/** + * 引入依赖 + * + * @param libpath - 依赖全路径 + * @param abs - 可选,是否使用觉得路径,默认是 true , 启用之后 type参数无效 + * @param type - 可选,以谁的基本路径为准 + */ +I(ce, "requireLib", (e, r = !0, t = W.BasePathType_None) => { + if (!T.hasNodeEnv()) + throw new Error("require ony works on node env"); + let i = e; + if (!r) + switch (t) { + case W.BasePathType_Appearance: + i = G.joinPath(G.siyuanAppearancePath(), e); + break; + case W.BasePathType_Data: + i = G.joinPath(G.siyuanDataPath(), e); + break; + case W.BasePathType_Themes: + i = G.joinPath(G.siyuanAppearancePath(), "themes", e); + break; + case W.BasePathType_ZhiTheme: + i = G.joinPath(G.siyuanAppearancePath(), "themes", "zhi", e); + break; + default: + throw new Error("type must be provided when not use absolute path"); + } + const n = G.siyuanWindow(); + if (!n) + return require(i); + if (typeof n.require < "u") + return n.require(i); +}), /** +* 引入依赖,以 data 的基本路径为准 +* +* @param libpath - 相对于 appearance 的相对路径 +*/ +I(ce, "requireAppearanceLib", (e) => G.requireLib(e, !1, W.BasePathType_Appearance)), /** +* 引入依赖,以 data 的基本路径为准 +* +* @param libpath - 相对于 data 的相对路径 +*/ +I(ce, "requireDataLib", (e) => G.requireLib(e, !1, W.BasePathType_Data)), /** +* 引入依赖,以 theme 的基本路径为准 +* +* @param libpath - 相对于 theme 的相对路径 +*/ +I(ce, "requireThemesLib", (e) => G.requireLib(e, !1, W.BasePathType_Themes)), /** +* 引入依赖,以 ZhiTheme 的基本路径为准 +* +* @param libpath - 相对于 ZhiTheme 的相对路径 +*/ +I(ce, "requireZhiThemeLib", (e) => G.requireLib(e, !1, W.BasePathType_ZhiTheme)); +const J = { + white: (e) => T.isElectron() ? M.whiteBright(e) : b.white(e), + gray: (e) => T.isElectron() ? M.gray(e) : b.gray(e), + blue: (e) => T.isElectron() ? M.blue(e) : b.blue(e), + green: (e) => T.isElectron() ? M.green(e) : b.green(e), + yellow: (e) => T.isElectron() ? M.yellow(e) : b.yellow(e), + red: (e) => T.isElectron() ? M.red(e) : b.red(e), + bgWhite: (e) => T.isElectron() ? M.bgWhiteBright(e) : b.bgWhite(e), + bgGrey: (e) => T.isElectron() ? M.bgCyanBright(e) : b.bgCyan(e), + bgBlue: (e) => T.isElectron() ? M.bgBlueBright(e) : b.bgBlue(e), + bgGreen: (e) => T.isElectron() ? M.bgGreenBright(e) : b.bgGreen(e), + bgYellow: (e) => T.isElectron() ? M.bgYellowBright(e) : b.bgYellow(e), + bgRed: (e) => T.isElectron() ? M.bgRedBright(e) : b.bgRed(e) +}; +class Yt { + constructor(r, t, i) { + pe(this, "consoleLogger", "console"), pe(this, "stackSize", 1), pe(this, "getLogger", (s) => { + let c; + if (s) + c = s; + else { + const l = this.getCallStack(), u = [], a = []; + for (let y = 0; y < l.length; y++) { + const m = l[y], v = m.getFileName() ?? "none"; + if (y > this.stackSize - 1) + break; + const z = v + "-" + m.getLineNumber() + ":" + m.getColumnNumber(); + u.push(z); + } + a.length > 0 && (c = u.join(" -> ")); + } + return (!c || c.trim().length === 0) && (c = this.consoleLogger), Ee.getLogger(c); + }), this.stackSize = 1; + let n; + r ? n = r : n = Le.getEnvLevel(i), n = n ?? Q.LOG_LEVEL_INFO, Ee.setLevel(n); + const o = (s, c, l, u) => { + const a = [], y = t ?? Le.getEnvLogger(i) ?? "zhi"; + return a.push(J.gray("[") + u(y) + J.gray("]")), a.push(J.gray("[") + J.gray(l.toString()) + J.gray("]")), a.push(u(s.toUpperCase().toString())), a.push(u(c)), a.push(J.gray(":")), a; + }; + We.reg(Ee), We.apply(Ee, { + format(s, c, l) { + let u = []; + const a = c ?? ""; + switch (s) { + case Q.LOG_LEVEL_TRACE: + u = o(s, a, l, J.gray); + break; + case Q.LOG_LEVEL_DEBUG: + u = o(s, a, l, J.blue); + break; + case Q.LOG_LEVEL_INFO: + u = o(s, a, l, J.green); + break; + case Q.LOG_LEVEL_WARN: + u = o(s, a, l, J.yellow); + break; + case Q.LOG_LEVEL_ERROR: + u = o(s, a, l, J.red); + break; + default: + u = o(Q.LOG_LEVEL_INFO, a, l, J.green); + break; + } + return u.join(" "); + } + }); + } + /** + * 设置输出栈的深度,默认1 + * + * @param stackSize - 栈的深度 + */ + setStackSize(r) { + this.stackSize = r ?? 1; + } + /** + * 获取调用堆栈,若未获取到直接返回空数组 + * + * @author terwer + * @since 1.6.0 + */ + getCallStack() { + let r; + try { + r = jt(); + } catch { + r = []; + } + return r; + } +} +class Zt { + /** + * 默认日志级别 + * + * @param level - 可选,未设置默认INFO + * @param sign - 可选前缀,默认zhi + * @param env - 可选环境变量实例 + */ + constructor(r, t, i) { + pe(this, "logger"), this.logger = new Yt(r, t, i); + } + /** + * 获取日志记录器 + * + * @param loggerName - 日志记录器名称 + * @param stackSize - 打印栈的深度 + * @protected + */ + getLogger(r, t) { + return this.logger.setStackSize(t), this.logger.getLogger(r); + } +} +class Ge extends Zt { + constructor(r, t, i) { + super(r, t, i); + } + /** + * 获取默认的日志记录器 + * + * @param loggerName - 日志记录器名称 + * @param stackSize - 打印栈的深度 + */ + getLogger(r, t) { + return super.getLogger(r, t); + } +} +class Ne { + /** + * 默认日志记录器 + * + * @param stackSize - 栈的深度 + * @param env - 环境变量实例 + */ + static defaultLogger(r, t) { + return Ne.customLogFactory(void 0, void 0, r).getLogger(void 0, t); + } + /** + * 自定义日志工厂 + * + * @param level - 级别 + * @param sign - 标志 + * @param env - 环境变量 + */ + static customLogFactory(r, t, i) { + return new Ge(r, t, i); + } + /** + * 自定义日志工厂,自定义前缀 + * + * @param sign - 标志 + * @param env - 环境变量 + */ + static customSignLogFactory(r, t) { + return new Ge(void 0, r, t); + } +} +var Ht = Object.defineProperty, Kt = (e, r, t) => r in e ? Ht(e, r, { enumerable: !0, configurable: !0, writable: !0, value: t }) : e[r] = t, S = (e, r, t) => (Kt(e, typeof r != "symbol" ? r + "" : r, t), t); +const K = class { + /** + * 检测是否运行在Chrome插件中 + */ + static isInChromeExtension() { + return K.isInBrowser ? window.location.href.indexOf("chrome-extension://") > -1 : !1; + } +}; +let k = K; +S(k, "isNode", typeof process < "u"), /** +* 是否在浏览器环境 +*/ +S(k, "isInBrowser", typeof window < "u"), /** +* 浏览器路径分隔符 +*/ +S(k, "BrowserSeperator", "/"), /** +* 是否是Electron环境 +*/ +S(k, "isElectron", () => !K.isInBrowser || !window.navigator || !window.navigator.userAgent ? !1 : /Electron/.test(window.navigator.userAgent)), /** +* 是否有Node环境,目前包括 Electron 和 Node +*/ +S(k, "hasNodeEnv", () => K.isElectron() || K.isNode), /** +* 获取url参数 +* +* @param sParam - 参数 +*/ +S(k, "getQueryString", (e) => { + if (!K.isInBrowser) + return ""; + const r = window.location.search.substring(1).split("&"); + for (let t = 0; t < r.length; t++) { + const i = r[t].split("="); + if (i[0] === e) + return i[1]; + } + return ""; +}), /** +* 替换 URL 的参数 +* 思路: +* 1. 使用了 URLSearchParams 对象来解析和构建 URL 查询参数。 +* +* 2. 在处理包含 hash 片段的 URL 时使用了 split 函数将 URL 分成两部分:基本 URL 和 hash 片段。 +* +* 3. 然后,再次使用 split 函数将基本 URL 分成两部分:路径和查询参数。 +* +* 4. 将查询参数转换为 URLSearchParams 对象,然后设置指定的参数名和值。 +* +* 5. 最后,使用 toString 函数将查询参数转换为字符串,并将其与路径组合成新的基本 URL。如果 URL 包含 hash 片段,则将其添加到新的基本 URL 中。 +* +* @param url - 链接地址 +* @param paramName - 参数名 +* @param paramValue - 参数值 +*/ +S(k, "replaceUrlParam", (e, r, t) => { + t == null && (t = ""); + const i = new RegExp("\\b(" + r + "=).*?(&|#|$)"); + if (e.search(i) >= 0) + return e.replace(i, "$1" + t + "$2"); + const [n, o] = e.split("#"), [s, c] = n.split("?"), l = new URLSearchParams(c); + l.set(r, t); + const u = l.toString(), a = s + (u ? "?" + u : ""); + return o ? a + "#" + o : a; +}), /** +* 设置url参数 +* +* @param urlstring - url +* @param key - key +* @param value - value +*/ +S(k, "setUrlParameter", (e, r, t) => { + if (e.includes(r)) + return K.replaceUrlParam(e, r, t); + const i = e.split("#"); + let n = i[0]; + const o = i[1]; + return n.includes("?") ? n += `&${r}=${t}` : n += `?${r}=${t}`, o && (n += "#" + o), n; +}), /** +* 重新加载指定tab +* +* @param tabname - tabname +* @param t - 延迟时间 +*/ +S(k, "reloadTabPage", (e, r = 200) => { + setTimeout(function() { + if (K.isInBrowser) { + const t = window.location.href; + window.location.href = K.setUrlParameter(t, "tab", e); + } + }, r); +}), /** +* 刷新当前tab页面 +*/ +S(k, "reloadPage", () => { + setTimeout(function() { + K.isInBrowser && window.location.reload(); + }, 200); +}), /** +* 刷新当前tab页面 +* +* @param msg - 消息提示 +* @param cb - 回调 +*/ +S(k, "reloadPageWithMessageCallback", (e, r) => { + r && r(e), setTimeout(function() { + K.isInBrowser && window.location.reload(); + }, 200); +}); +var $ = /* @__PURE__ */ ((e) => (e.BasePathType_Appearance = "Appearance", e.BasePathType_Data = "Data", e.BasePathType_Themes = "Themes", e.BasePathType_ZhiTheme = "ZhiTheme", e.BasePathType_None = "None", e))($ || {}); +const F = class { + /** + * 检测是否运行在思源打开的浏览器中 + */ + static isInSiyuanBrowser() { + return k.isInBrowser ? typeof window.siyuan < "u" && typeof window.Lute < "u" : !1; + } + /** + * 思源笔记 window 对象 + */ + static siyuanWindow() { + let e; + return this.isInSiyuanWidget() ? e = parent.window : this.isInSiyuanNewWin() || this.isInSiyuanBrowser() || typeof window < "u" ? e = window : e = void 0, e; + } + // ========================= + // require end + // ========================= + // ========================= + // import start + // ========================= + /** + * 引入json + * + * @param jsPath - js相对路径全路径 + * @param type - 类型 + */ + static async importJs(e, r) { + let t = e; + switch (r) { + case $.BasePathType_Appearance: + t = this.browserJoinPath(this.siyuanAppearanceRelativePath(), e); + break; + case $.BasePathType_Data: + t = this.browserJoinPath(this.siyuanDataRelativePath(), e); + break; + case $.BasePathType_Themes: + t = this.browserJoinPath(this.siyuanThemeRelativePath(), e); + break; + case $.BasePathType_ZhiTheme: + t = this.browserJoinPath(this.zhiThemeRelativePath(), e); + break; + default: + throw new Error("type must be provided"); + } + const { default: i } = await import( + /* @vite-ignore */ + t + ); + return i; + } + /** + * 引入json + * + * @param jsonPath - json相对路径全路径 + * @param type - 类型 + */ + // public static async importJson(jsonPath: string, type: BasePathTypeEnum) { + // let fullJsonPath = jsonPath + // switch (type) { + // case BasePathTypeEnum.BasePathType_Appearance: + // fullJsonPath = this.browserJoinPath(this.siyuanAppearanceRelativePath(), jsonPath) + // break + // case BasePathTypeEnum.BasePathType_Data: + // fullJsonPath = this.browserJoinPath(this.siyuanDataRelativePath(), jsonPath) + // break + // case BasePathTypeEnum.BasePathType_Themes: + // fullJsonPath = this.browserJoinPath(this.siyuanThemeRelativePath(), jsonPath) + // break + // case BasePathTypeEnum.BasePathType_ZhiTheme: + // fullJsonPath = this.browserJoinPath(this.zhiThemeRelativePath(), jsonPath) + // break + // default: + // throw new Error("type must be provided") + // } + // + // const { default: data } = await import(/* @vite-ignore */ fullJsonPath, { assert: { type: "json" } }) + // return data + // } + /** + * 引入 json - 以 data 为基本路径 + * + * @param jsonPath - 相对于 data 的相对路径 + */ + // public static async importDataJson(jsonPath: string) { + // return await this.importJson(jsonPath, BasePathTypeEnum.BasePathType_Data) + // } + /** + * 引入 json - 以 appearance 为基本路径 + * + * @param jsonPath - 相对于 appearance 的相对路径 + */ + // public static async importAppearanceJson(jsonPath: string) { + // return await this.importJson(jsonPath, BasePathTypeEnum.BasePathType_Appearance) + // } + /** + * 引入 json - 以 themes 为基本路径 + * + * @param jsonPath - 相对于 themes 的相对路径 + */ + // public static async importThemesJson(jsonPath: string) { + // return await this.importJson(jsonPath, BasePathTypeEnum.BasePathType_Themes) + // } + /** + * 引入 zhi 主题的 json - 以 zhi 主题 的根路径为基本路径 + * + * @param jsonPath - 相对于 zhi 主题根路径的相对路径 + */ + // public static async importZhiThemeJson(jsonPath: string) { + // return await this.importJson(jsonPath, BasePathTypeEnum.BasePathType_ZhiTheme) + // } + /** + * 引入 zhi 主题的 js - 以 zhi 主题 的根路径为基本路径 + * + * @param jsPath - 相对于 zhi 主题根路径的相对路径 + */ + static async importZhiThemeJs(e) { + return await this.importJs(e, $.BasePathType_ZhiTheme); + } + // ========================= + // import start + // ========================= + /** + * 路径拼接 + * + * @param paths - 路径数组 + */ + static joinPath(...e) { + if (k.hasNodeEnv()) { + const r = this.requireLib("path"); + if (r) + return r.join(...e); + } + return this.browserJoinPath(...e); + } + static browserJoinPath(...e) { + return e.join(k.BrowserSeperator); + } + /** + * 思源笔记 conf 目录 + */ + static siyuanConfPath() { + const e = this.siyuanWindow(); + if (!e) + throw new Error("Not in siyuan env"); + return e.siyuan.config.system.confDir; + } + /** + * 思源笔记 data 目录 + */ + static siyuanDataPath() { + const e = this.siyuanWindow(); + if (!e) + throw new Error("Not in siyuan env"); + return e.siyuan.config.system.dataDir; + } + /** + * 思源笔记 data 目录-相对路径 + */ + static siyuanDataRelativePath() { + if (!this.siyuanWindow()) + throw new Error("Not in siyuan env"); + return ""; + } + /** + * 思源笔记 appearance 目录 + */ + static siyuanAppearancePath() { + return this.joinPath(this.siyuanConfPath(), "appearance"); + } + /** + * 思源笔记 appearance 目录-相对路径 + */ + static siyuanAppearanceRelativePath() { + if (!this.siyuanWindow()) + throw new Error("Not in siyuan env"); + return this.browserJoinPath("", "appearance"); + } + /** + * 思源笔记 themes 目录-绝对路径 + * + * 注意: 如果是非 electron 和 Node 环境,这里返回的是浏览器的路径,不是物理路径 + * 如果使用物理路径,请调用 siyuanAppearancePath 或者 siyuanDataPath + * + * @author terwer + * @since 0.1.0 + */ + static siyuanThemePath() { + if (k.hasNodeEnv()) + return this.joinPath(this.siyuanAppearancePath(), "themes"); + { + const e = this.siyuanWindow(); + if (!e) + throw new Error("Not in siyuan env"); + return this.joinPath(e.location.origin, "appearance", "themes"); + } + } + /** + * 思源笔记 themes 目录-相对路径 + */ + static siyuanThemeRelativePath() { + if (!this.siyuanWindow()) + throw new Error("Not in siyuan env"); + return this.browserJoinPath("", "appearance", "themes"); + } + /** + * zhi 主题目录 - 绝对路径 + */ + static zhiThemePath() { + return this.joinPath(this.siyuanThemePath(), "zhi"); + } + /** + * zhi 主题目录 - 相对路径 + */ + static zhiThemeRelativePath() { + return this.browserJoinPath(this.siyuanThemeRelativePath(), "zhi"); + } +}; +let ne = F; +S(ne, "isInSiyuanWidget", () => k.isInBrowser ? window.frameElement != null && window.frameElement.parentElement != null && window.frameElement.parentElement.parentElement != null && window.frameElement.parentElement.parentElement.getAttribute("data-node-id") !== "" : !1), /** +* 思源笔记新窗口 +* +* @deprecated window.terwer 判断方式已废弃,建议以后打开新窗口注入 window.siyuanNewWin ,这样语义会更容易理解 +* @author terwer +* @version 0.1.0 +* @since 0.0.1 +*/ +S(ne, "isInSiyuanNewWin", () => !k.isInBrowser || !k.isElectron() ? !1 : typeof window.terwer < "u" || typeof window.siyuanNewWin < "u"), // ========================= +// require start +// ========================= +/** + * 引入依赖 + * + * @param libpath - 依赖全路径 + * @param abs - 可选,是否使用觉得路径,默认是 true , 启用之后 type参数无效 + * @param type - 可选,以谁的基本路径为准 + */ +S(ne, "requireLib", (e, r = !0, t = $.BasePathType_None) => { + if (!k.hasNodeEnv()) + throw new Error("require ony works on node env"); + let i = e; + if (!r) + switch (t) { + case $.BasePathType_Appearance: + i = F.joinPath(F.siyuanAppearancePath(), e); + break; + case $.BasePathType_Data: + i = F.joinPath(F.siyuanDataPath(), e); + break; + case $.BasePathType_Themes: + i = F.joinPath(F.siyuanAppearancePath(), "themes", e); + break; + case $.BasePathType_ZhiTheme: + i = F.joinPath(F.siyuanAppearancePath(), "themes", "zhi", e); + break; + default: + throw new Error("type must be provided when not use absolute path"); + } + const n = F.siyuanWindow(); + if (!n) + return require(i); + if (typeof n.require < "u") + return n.require(i); +}), /** +* 引入依赖,以 data 的基本路径为准 +* +* @param libpath - 相对于 appearance 的相对路径 +*/ +S(ne, "requireAppearanceLib", (e) => F.requireLib(e, !1, $.BasePathType_Appearance)), /** +* 引入依赖,以 data 的基本路径为准 +* +* @param libpath - 相对于 data 的相对路径 +*/ +S(ne, "requireDataLib", (e) => F.requireLib(e, !1, $.BasePathType_Data)), /** +* 引入依赖,以 theme 的基本路径为准 +* +* @param libpath - 相对于 theme 的相对路径 +*/ +S(ne, "requireThemesLib", (e) => F.requireLib(e, !1, $.BasePathType_Themes)), /** +* 引入依赖,以 ZhiTheme 的基本路径为准 +* +* @param libpath - 相对于 ZhiTheme 的相对路径 +*/ +S(ne, "requireZhiThemeLib", (e) => F.requireLib(e, !1, $.BasePathType_ZhiTheme)); +const Xt = "c6f0e84b0df40a0c5b9de2b5716fc33f93291f1a"; +class ar { + constructor() { + be(this, "repoHash", Xt); + be(this, "logger"); + be(this, "publishHook"); + be(this, "siyuanDevice"); + const r = new xt({ BASE_URL: "/", MODE: "production", DEV: !1, PROD: !0, SSR: !1 }); + this.logger = Ne.customLogFactory(Q.LOG_LEVEL_INFO, "publish-bridge", r).getLogger(), this.siyuanDevice = ne, this.publishHook = new Dt(); + } + async init() { + this.logger.info("Initiating sy-post-publisher from publish bridge ..."); + try { + const t = `${this.siyuanDevice.siyuanDataPath()}/widgets/sy-post-publisher`, i = this.siyuanDevice.requireLib("fs"); + this.logger.info("Widget sy-post-publisher folder=>", t), i.existsSync(t) || (this.logger.info("Widget sy-post-publisher not exist, downloading..."), await this.doDownload(), this.logger.info("Widget sy-post-publisher downloaded")), this.publishHook.doInit({ + isInitLocalStorage: !0, + // 桥接版禁用菜单插槽 + isInitSlot: !1, + isInitThemeAdaptor: !0, + isInitPublishHelper: !0, + isInitPicgoExtension: !0, + isInitCmder: !0 + }); + } catch (r) { + this.logger.error("Failed to init sy-post-publisher,it may not work in some case.Error=>", r); + } + } + async doDownload() { + this.logger.warn("Downloading sy-post-publisher from bazaar..."); + const r = "/api/bazaar/installBazaarWidget", t = { + repoURL: "https://github.com/terwer/sy-post-publisher", + packageName: "sy-post-publisher", + repoHash: this.repoHash, + mode: 0 + }, i = { + body: JSON.stringify(t), + method: "POST" + }; + if ((await (await fetch(r, i)).json()).code == 0) + this.logger.info("Download sy-post-publisher from bazaar success"); + else + throw new Error("Download sy-post-publisher error, this plugin will not work!"); + } +} +export { + ar as default +}; diff --git a/public/libs/zhi-electron/README.md b/public/libs/zhi-electron/README.md new file mode 100644 index 00000000..d306e04b --- /dev/null +++ b/public/libs/zhi-electron/README.md @@ -0,0 +1,9 @@ +# zhi-electron +a simple api for electron + +## Usage + +```js +// siyuan condole +zhiWindow.openBrowserWindow("https://www.baidu.com") +``` \ No newline at end of file diff --git a/public/libs/zhi-electron/index.js b/public/libs/zhi-electron/index.js new file mode 100644 index 00000000..e69792cb --- /dev/null +++ b/public/libs/zhi-electron/index.js @@ -0,0 +1,516 @@ +var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, { + get: (a, b) => (typeof require !== "undefined" ? require : a)[b] +}) : x)(function(x) { + if (typeof require !== "undefined") + return require.apply(this, arguments); + throw new Error('Dynamic require of "' + x + '" is not supported'); +}); + +// ../zhi-device/dist/index.js +var g = Object.defineProperty; +var P = (a, e, t) => e in a ? g(a, e, { enumerable: true, configurable: true, writable: true, value: t }) : a[e] = t; +var r = (a, e, t) => (P(a, typeof e != "symbol" ? e + "" : e, t), t); +var u = class { + /** + * 检测是否运行在Chrome插件中 + */ + static isInChromeExtension() { + return u.isInBrowser ? window.location.href.indexOf("chrome-extension://") > -1 : false; + } +}; +var i = u; +r(i, "isNode", typeof process < "u"), /** +* 是否在浏览器环境 +*/ +r(i, "isInBrowser", typeof window < "u"), /** +* 浏览器路径分隔符 +*/ +r(i, "BrowserSeperator", "/"), /** +* 是否是Electron环境 +*/ +r(i, "isElectron", () => !u.isInBrowser || !window.navigator || !window.navigator.userAgent ? false : /Electron/.test(window.navigator.userAgent)), /** +* 是否有Node环境,目前包括 Electron 和 Node +*/ +r(i, "hasNodeEnv", () => u.isElectron() || u.isNode), /** +* 获取url参数 +* +* @param sParam - 参数 +*/ +r(i, "getQueryString", (e) => { + if (!u.isInBrowser) + return ""; + const n = window.location.search.substring(1).split("&"); + for (let s = 0; s < n.length; s++) { + const c = n[s].split("="); + if (c[0] === e) + return c[1]; + } + return ""; +}), /** +* 替换 URL 的参数 +* 思路: +* 1. 使用了 URLSearchParams 对象来解析和构建 URL 查询参数。 +* +* 2. 在处理包含 hash 片段的 URL 时使用了 split 函数将 URL 分成两部分:基本 URL 和 hash 片段。 +* +* 3. 然后,再次使用 split 函数将基本 URL 分成两部分:路径和查询参数。 +* +* 4. 将查询参数转换为 URLSearchParams 对象,然后设置指定的参数名和值。 +* +* 5. 最后,使用 toString 函数将查询参数转换为字符串,并将其与路径组合成新的基本 URL。如果 URL 包含 hash 片段,则将其添加到新的基本 URL 中。 +* +* @param url - 链接地址 +* @param paramName - 参数名 +* @param paramValue - 参数值 +*/ +r(i, "replaceUrlParam", (e, t, n) => { + n == null && (n = ""); + const s = new RegExp("\\b(" + t + "=).*?(&|#|$)"); + if (e.search(s) >= 0) + return e.replace(s, "$1" + n + "$2"); + const [c, d] = e.split("#"), [y, b] = c.split("?"), l = new URLSearchParams(b); + l.set(t, n); + const m = l.toString(), f = y + (m ? "?" + m : ""); + return d ? f + "#" + d : f; +}), /** +* 设置url参数 +* +* @param urlstring - url +* @param key - key +* @param value - value +*/ +r(i, "setUrlParameter", (e, t, n) => { + if (e.includes(t)) + return u.replaceUrlParam(e, t, n); + const s = e.split("#"); + let c = s[0]; + const d = s[1]; + return c.includes("?") ? c += `&${t}=${n}` : c += `?${t}=${n}`, d && (c += "#" + d), c; +}), /** +* 重新加载指定tab +* +* @param tabname - tabname +* @param t - 延迟时间 +*/ +r(i, "reloadTabPage", (e, t = 200) => { + setTimeout(function() { + if (u.isInBrowser) { + const n = window.location.href; + window.location.href = u.setUrlParameter(n, "tab", e); + } + }, t); +}), /** +* 刷新当前tab页面 +*/ +r(i, "reloadPage", () => { + setTimeout(function() { + u.isInBrowser && window.location.reload(); + }, 200); +}), /** +* 刷新当前tab页面 +* +* @param msg - 消息提示 +* @param cb - 回调 +*/ +r(i, "reloadPageWithMessageCallback", (e, t) => { + t && t(e), setTimeout(function() { + u.isInBrowser && window.location.reload(); + }, 200); +}); +var o = /* @__PURE__ */ ((a) => (a.BasePathType_Appearance = "Appearance", a.BasePathType_Data = "Data", a.BasePathType_Themes = "Themes", a.BasePathType_ZhiTheme = "ZhiTheme", a.BasePathType_None = "None", a))(o || {}); +var h = class { + /** + * 检测是否运行在思源打开的浏览器中 + */ + static isInSiyuanBrowser() { + return i.isInBrowser ? typeof window.siyuan < "u" && typeof window.Lute < "u" : false; + } + /** + * 思源笔记 window 对象 + */ + static siyuanWindow() { + let e; + return this.isInSiyuanWidget() ? e = parent.window : this.isInSiyuanNewWin() || this.isInSiyuanBrowser() || typeof window < "u" ? e = window : e = void 0, e; + } + // ========================= + // require end + // ========================= + // ========================= + // import start + // ========================= + /** + * 引入json + * + * @param jsPath - js相对路径全路径 + * @param type - 类型 + */ + static async importJs(e, t) { + let n = e; + switch (t) { + case o.BasePathType_Appearance: + n = this.browserJoinPath(this.siyuanAppearanceRelativePath(), e); + break; + case o.BasePathType_Data: + n = this.browserJoinPath(this.siyuanDataRelativePath(), e); + break; + case o.BasePathType_Themes: + n = this.browserJoinPath(this.siyuanThemeRelativePath(), e); + break; + case o.BasePathType_ZhiTheme: + n = this.browserJoinPath(this.zhiThemeRelativePath(), e); + break; + default: + throw new Error("type must be provided"); + } + const { default: s } = await import( + /* @vite-ignore */ + n + ); + return s; + } + /** + * 引入json + * + * @param jsonPath - json相对路径全路径 + * @param type - 类型 + */ + // public static async importJson(jsonPath: string, type: BasePathTypeEnum) { + // let fullJsonPath = jsonPath + // switch (type) { + // case BasePathTypeEnum.BasePathType_Appearance: + // fullJsonPath = this.browserJoinPath(this.siyuanAppearanceRelativePath(), jsonPath) + // break + // case BasePathTypeEnum.BasePathType_Data: + // fullJsonPath = this.browserJoinPath(this.siyuanDataRelativePath(), jsonPath) + // break + // case BasePathTypeEnum.BasePathType_Themes: + // fullJsonPath = this.browserJoinPath(this.siyuanThemeRelativePath(), jsonPath) + // break + // case BasePathTypeEnum.BasePathType_ZhiTheme: + // fullJsonPath = this.browserJoinPath(this.zhiThemeRelativePath(), jsonPath) + // break + // default: + // throw new Error("type must be provided") + // } + // + // const { default: data } = await import(/* @vite-ignore */ fullJsonPath, { assert: { type: "json" } }) + // return data + // } + /** + * 引入 json - 以 data 为基本路径 + * + * @param jsonPath - 相对于 data 的相对路径 + */ + // public static async importDataJson(jsonPath: string) { + // return await this.importJson(jsonPath, BasePathTypeEnum.BasePathType_Data) + // } + /** + * 引入 json - 以 appearance 为基本路径 + * + * @param jsonPath - 相对于 appearance 的相对路径 + */ + // public static async importAppearanceJson(jsonPath: string) { + // return await this.importJson(jsonPath, BasePathTypeEnum.BasePathType_Appearance) + // } + /** + * 引入 json - 以 themes 为基本路径 + * + * @param jsonPath - 相对于 themes 的相对路径 + */ + // public static async importThemesJson(jsonPath: string) { + // return await this.importJson(jsonPath, BasePathTypeEnum.BasePathType_Themes) + // } + /** + * 引入 zhi 主题的 json - 以 zhi 主题 的根路径为基本路径 + * + * @param jsonPath - 相对于 zhi 主题根路径的相对路径 + */ + // public static async importZhiThemeJson(jsonPath: string) { + // return await this.importJson(jsonPath, BasePathTypeEnum.BasePathType_ZhiTheme) + // } + /** + * 引入 zhi 主题的 js - 以 zhi 主题 的根路径为基本路径 + * + * @param jsPath - 相对于 zhi 主题根路径的相对路径 + */ + static async importZhiThemeJs(e) { + return await this.importJs(e, o.BasePathType_ZhiTheme); + } + // ========================= + // import start + // ========================= + /** + * 路径拼接 + * + * @param paths - 路径数组 + */ + static joinPath(...e) { + if (i.hasNodeEnv()) { + const t = this.requireLib("path"); + if (t) + return t.join(...e); + } + return this.browserJoinPath(...e); + } + static browserJoinPath(...e) { + return e.join(i.BrowserSeperator); + } + /** + * 思源笔记 conf 目录 + */ + static siyuanConfPath() { + const e = this.siyuanWindow(); + if (!e) + throw new Error("Not in siyuan env"); + return e.siyuan.config.system.confDir; + } + /** + * 思源笔记 data 目录 + */ + static siyuanDataPath() { + const e = this.siyuanWindow(); + if (!e) + throw new Error("Not in siyuan env"); + return e.siyuan.config.system.dataDir; + } + /** + * 思源笔记 data 目录-相对路径 + */ + static siyuanDataRelativePath() { + if (!this.siyuanWindow()) + throw new Error("Not in siyuan env"); + return ""; + } + /** + * 思源笔记 appearance 目录 + */ + static siyuanAppearancePath() { + return this.joinPath(this.siyuanConfPath(), "appearance"); + } + /** + * 思源笔记 appearance 目录-相对路径 + */ + static siyuanAppearanceRelativePath() { + if (!this.siyuanWindow()) + throw new Error("Not in siyuan env"); + return this.browserJoinPath("", "appearance"); + } + /** + * 思源笔记 themes 目录-绝对路径 + * + * 注意: 如果是非 electron 和 Node 环境,这里返回的是浏览器的路径,不是物理路径 + * 如果使用物理路径,请调用 siyuanAppearancePath 或者 siyuanDataPath + * + * @author terwer + * @since 0.1.0 + */ + static siyuanThemePath() { + if (i.hasNodeEnv()) + return this.joinPath(this.siyuanAppearancePath(), "themes"); + { + const e = this.siyuanWindow(); + if (!e) + throw new Error("Not in siyuan env"); + return this.joinPath(e.location.origin, "appearance", "themes"); + } + } + /** + * 思源笔记 themes 目录-相对路径 + */ + static siyuanThemeRelativePath() { + if (!this.siyuanWindow()) + throw new Error("Not in siyuan env"); + return this.browserJoinPath("", "appearance", "themes"); + } + /** + * zhi 主题目录 - 绝对路径 + */ + static zhiThemePath() { + return this.joinPath(this.siyuanThemePath(), "zhi"); + } + /** + * zhi 主题目录 - 相对路径 + */ + static zhiThemeRelativePath() { + return this.browserJoinPath(this.siyuanThemeRelativePath(), "zhi"); + } +}; +var w = h; +r(w, "isInSiyuanWidget", () => i.isInBrowser ? window.frameElement != null && window.frameElement.parentElement != null && window.frameElement.parentElement.parentElement != null && window.frameElement.parentElement.parentElement.getAttribute("data-node-id") !== "" : false), /** +* 思源笔记新窗口 +* +* @deprecated window.terwer 判断方式已废弃,建议以后打开新窗口注入 window.siyuanNewWin ,这样语义会更容易理解 +* @author terwer +* @version 0.1.0 +* @since 0.0.1 +*/ +r(w, "isInSiyuanNewWin", () => !i.isInBrowser || !i.isElectron() ? false : typeof window.terwer < "u" || typeof window.siyuanNewWin < "u"), // ========================= +// require start +// ========================= +/** + * 引入依赖 + * + * @param libpath - 依赖全路径 + * @param abs - 可选,是否使用觉得路径,默认是 true , 启用之后 type参数无效 + * @param type - 可选,以谁的基本路径为准 + */ +r(w, "requireLib", (e, t = true, n = o.BasePathType_None) => { + if (!i.hasNodeEnv()) + throw new Error("require ony works on node env"); + let s = e; + if (!t) + switch (n) { + case o.BasePathType_Appearance: + s = h.joinPath(h.siyuanAppearancePath(), e); + break; + case o.BasePathType_Data: + s = h.joinPath(h.siyuanDataPath(), e); + break; + case o.BasePathType_Themes: + s = h.joinPath(h.siyuanAppearancePath(), "themes", e); + break; + case o.BasePathType_ZhiTheme: + s = h.joinPath(h.siyuanAppearancePath(), "themes", "zhi", e); + break; + default: + throw new Error("type must be provided when not use absolute path"); + } + const c = h.siyuanWindow(); + if (!c) + return __require(s); + if (typeof c.require < "u") + return c.require(s); +}), /** +* 引入依赖,以 data 的基本路径为准 +* +* @param libpath - 相对于 appearance 的相对路径 +*/ +r(w, "requireAppearanceLib", (e) => h.requireLib(e, false, o.BasePathType_Appearance)), /** +* 引入依赖,以 data 的基本路径为准 +* +* @param libpath - 相对于 data 的相对路径 +*/ +r(w, "requireDataLib", (e) => h.requireLib(e, false, o.BasePathType_Data)), /** +* 引入依赖,以 theme 的基本路径为准 +* +* @param libpath - 相对于 theme 的相对路径 +*/ +r(w, "requireThemesLib", (e) => h.requireLib(e, false, o.BasePathType_Themes)), /** +* 引入依赖,以 ZhiTheme 的基本路径为准 +* +* @param libpath - 相对于 ZhiTheme 的相对路径 +*/ +r(w, "requireZhiThemeLib", (e) => h.requireLib(e, false, o.BasePathType_ZhiTheme)); + +// src/lib/browser-window/WindowManager.ts +var WindowManager = class { + logger; + common; + init(logger, common) { + this.logger = logger; + this.common = common; + } + /** + * 打开新窗口 + * + * 示例: + * + * ``` + * ## development + * windowManager.openBrowserWindow("https://www.baidu.com", undefined, undefined, true, false) + * windowManager.openBrowserWindow("https://www.baidu.com", { "key1": "value1", "key2": "value2" }, undefined, true, false) + * + * ## production + * windowManager.openBrowserWindow("https://www.baidu.com") + * ``` + * + * @param url - url + * @param params - 参数 + * @param win - 父窗口 + * @param isDev - 是否打开开发者工具 + * @param modal - 是否模态 + */ + openBrowserWindow(url, params, win, isDev = false, modal = false) { + try { + if (this.common.strUtil.isEmptyString(url)) { + this.logger.error("Url cannot be empty"); + return; + } + if (!i.isElectron()) { + this.logger.info("BrowserWindow can ony be available in siyuan Electron environment"); + return; + } + if (params) { + Object.keys(params).forEach((key) => { + const value = params[key]; + url = i.setUrlParameter(url, key, value); + }); + } + this.logger.info(this.common.strUtil.f("Opening a new BrowserWindow from url => {0}", url)); + const mainWin = win ?? w.siyuanWindow(); + const { app, BrowserWindow, getCurrentWindow } = mainWin.require("@electron/remote"); + const remote = mainWin.require("@electron/remote").require("@electron/remote/main"); + const mainWindow = getCurrentWindow(); + const newWindow = new BrowserWindow({ + parent: mainWindow, + width: 900, + height: 750, + resizable: true, + modal, + icon: w.browserJoinPath( + w.siyuanWindow().siyuan.config.system.appDir, + "stage", + "icon-large.png" + ), + titleBarOverlay: { + color: "#cccccca5", + symbolColor: "black" + }, + webPreferences: { + nativeWindowOpen: true, + nodeIntegration: true, + webviewTag: true, + webSecurity: false, + contextIsolation: false + } + }); + newWindow.webContents.userAgent = `SiYuan/${app.getVersion()} https://b3log.org/siyuan Electron`; + remote.enable(newWindow.webContents); + if (isDev) { + newWindow.webContents.openDevTools(); + } + newWindow.loadURL(url); + } catch (e) { + this.logger.error("Open browser window failed", e); + } + } +}; +var WindowManager_default = WindowManager; + +// src/lib/browser-window/index.ts +var ZhiBrowserWindow = class { + logger; + windowManager; + constructor() { + this.windowManager = new WindowManager_default(); + } + init(logger, common) { + this.logger = logger; + this.windowManager.init(logger, common); + } + /** + * 挂载 BrowserWindow + * + * @author terwer + * @since 1.0.0 + */ + initBrowserWindow() { + w.siyuanWindow().zhiWindow = this.windowManager; + this.logger.info("zhiWindow mounted"); + } +}; +var browser_window_default = ZhiBrowserWindow; +export { + browser_window_default as ZhiBrowserWindow +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vemhpLWZyYW1ld29yay96aGkvbGlicy96aGktZGV2aWNlL2Rpc3QvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vemhpLWZyYW1ld29yay96aGkvbGlicy96aGktZWxlY3Ryb24vc3JjL2xpYi9icm93c2VyLXdpbmRvdy9XaW5kb3dNYW5hZ2VyLnRzIiwgIi4uLy4uLy4uLy4uLy4uL3poaS1mcmFtZXdvcmsvemhpL2xpYnMvemhpLWVsZWN0cm9uL3NyYy9saWIvYnJvd3Nlci13aW5kb3cvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbInZhciBnID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIFAgPSAoYSwgZSwgdCkgPT4gZSBpbiBhID8gZyhhLCBlLCB7IGVudW1lcmFibGU6ICEwLCBjb25maWd1cmFibGU6ICEwLCB3cml0YWJsZTogITAsIHZhbHVlOiB0IH0pIDogYVtlXSA9IHQ7XG52YXIgciA9IChhLCBlLCB0KSA9PiAoUChhLCB0eXBlb2YgZSAhPSBcInN5bWJvbFwiID8gZSArIFwiXCIgOiBlLCB0KSwgdCk7XG5jb25zdCB1ID0gY2xhc3Mge1xuICAvKipcbiAgICogXHU2OEMwXHU2RDRCXHU2NjJGXHU1NDI2XHU4RkQwXHU4ODRDXHU1NzI4Q2hyb21lXHU2M0QyXHU0RUY2XHU0RTJEXG4gICAqL1xuICBzdGF0aWMgaXNJbkNocm9tZUV4dGVuc2lvbigpIHtcbiAgICByZXR1cm4gdS5pc0luQnJvd3NlciA/IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoXCJjaHJvbWUtZXh0ZW5zaW9uOi8vXCIpID4gLTEgOiAhMTtcbiAgfVxufTtcbmxldCBpID0gdTtcbi8qKlxuICogXHU2NjJGXHU1NDI2XHU1NzI4XHU2RDRGXHU4OUM4XHU1NjY4XHU3M0FGXHU1ODgzXG4gKi9cbnIoaSwgXCJpc05vZGVcIiwgdHlwZW9mIHByb2Nlc3MgPCBcInVcIiksIC8qKlxuICogXHU2NjJGXHU1NDI2XHU1NzI4XHU2RDRGXHU4OUM4XHU1NjY4XHU3M0FGXHU1ODgzXG4gKi9cbnIoaSwgXCJpc0luQnJvd3NlclwiLCB0eXBlb2Ygd2luZG93IDwgXCJ1XCIpLCAvKipcbiAqIFx1NkQ0Rlx1ODlDOFx1NTY2OFx1OERFRlx1NUY4NFx1NTIwNlx1OTY5NFx1N0IyNlxuICovXG5yKGksIFwiQnJvd3NlclNlcGVyYXRvclwiLCBcIi9cIiksIC8qKlxuICogXHU2NjJGXHU1NDI2XHU2NjJGRWxlY3Ryb25cdTczQUZcdTU4ODNcbiAqL1xucihpLCBcImlzRWxlY3Ryb25cIiwgKCkgPT4gIXUuaXNJbkJyb3dzZXIgfHwgIXdpbmRvdy5uYXZpZ2F0b3IgfHwgIXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50ID8gITEgOiAvRWxlY3Ryb24vLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpKSwgLyoqXG4gKiBcdTY2MkZcdTU0MjZcdTY3MDlOb2RlXHU3M0FGXHU1ODgzXHVGRjBDXHU3NkVFXHU1MjREXHU1MzA1XHU2MkVDIEVsZWN0cm9uIFx1NTQ4QyBOb2RlXG4gKi9cbnIoaSwgXCJoYXNOb2RlRW52XCIsICgpID0+IHUuaXNFbGVjdHJvbigpIHx8IHUuaXNOb2RlKSwgLyoqXG4gKiBcdTgzQjdcdTUzRDZ1cmxcdTUzQzJcdTY1NzBcbiAqXG4gKiBAcGFyYW0gc1BhcmFtIC0gXHU1M0MyXHU2NTcwXG4gKi9cbnIoaSwgXCJnZXRRdWVyeVN0cmluZ1wiLCAoZSkgPT4ge1xuICBpZiAoIXUuaXNJbkJyb3dzZXIpXG4gICAgcmV0dXJuIFwiXCI7XG4gIGNvbnN0IG4gPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoLnN1YnN0cmluZygxKS5zcGxpdChcIiZcIik7XG4gIGZvciAobGV0IHMgPSAwOyBzIDwgbi5sZW5ndGg7IHMrKykge1xuICAgIGNvbnN0IGMgPSBuW3NdLnNwbGl0KFwiPVwiKTtcbiAgICBpZiAoY1swXSA9PT0gZSlcbiAgICAgIHJldHVybiBjWzFdO1xuICB9XG4gIHJldHVybiBcIlwiO1xufSksIC8qKlxuICogXHU2NkZGXHU2MzYyIFVSTCBcdTc2ODRcdTUzQzJcdTY1NzBcbiAqIFx1NjAxRFx1OERFRlx1RkYxQVxuICogMS4gXHU0RjdGXHU3NTI4XHU0RTg2IFVSTFNlYXJjaFBhcmFtcyBcdTVCRjlcdThDNjFcdTY3NjVcdTg5RTNcdTY3OTBcdTU0OENcdTY3ODRcdTVFRkEgVVJMIFx1NjdFNVx1OEJFMlx1NTNDMlx1NjU3MFx1MzAwMlxuICpcbiAqIDIuIFx1NTcyOFx1NTkwNFx1NzQwNlx1NTMwNVx1NTQyQiBoYXNoIFx1NzI0N1x1NkJCNVx1NzY4NCBVUkwgXHU2NUY2XHU0RjdGXHU3NTI4XHU0RTg2IHNwbGl0IFx1NTFGRFx1NjU3MFx1NUMwNiBVUkwgXHU1MjA2XHU2MjEwXHU0RTI0XHU5MEU4XHU1MjA2XHVGRjFBXHU1N0ZBXHU2NzJDIFVSTCBcdTU0OEMgaGFzaCBcdTcyNDdcdTZCQjVcdTMwMDJcbiAqXG4gKiAzLiBcdTcxMzZcdTU0MEVcdUZGMENcdTUxOERcdTZCMjFcdTRGN0ZcdTc1Mjggc3BsaXQgXHU1MUZEXHU2NTcwXHU1QzA2XHU1N0ZBXHU2NzJDIFVSTCBcdTUyMDZcdTYyMTBcdTRFMjRcdTkwRThcdTUyMDZcdUZGMUFcdThERUZcdTVGODRcdTU0OENcdTY3RTVcdThCRTJcdTUzQzJcdTY1NzBcdTMwMDJcbiAqXG4gKiA0LiBcdTVDMDZcdTY3RTVcdThCRTJcdTUzQzJcdTY1NzBcdThGNkNcdTYzNjJcdTRFM0EgVVJMU2VhcmNoUGFyYW1zIFx1NUJGOVx1OEM2MVx1RkYwQ1x1NzEzNlx1NTQwRVx1OEJCRVx1N0Y2RVx1NjMwN1x1NUI5QVx1NzY4NFx1NTNDMlx1NjU3MFx1NTQwRFx1NTQ4Q1x1NTAzQ1x1MzAwMlxuICpcbiAqIDUuIFx1NjcwMFx1NTQwRVx1RkYwQ1x1NEY3Rlx1NzUyOCB0b1N0cmluZyBcdTUxRkRcdTY1NzBcdTVDMDZcdTY3RTVcdThCRTJcdTUzQzJcdTY1NzBcdThGNkNcdTYzNjJcdTRFM0FcdTVCNTdcdTdCMjZcdTRFMzJcdUZGMENcdTVFNzZcdTVDMDZcdTUxNzZcdTRFMEVcdThERUZcdTVGODRcdTdFQzRcdTU0MDhcdTYyMTBcdTY1QjBcdTc2ODRcdTU3RkFcdTY3MkMgVVJMXHUzMDAyXHU1OTgyXHU2NzlDIFVSTCBcdTUzMDVcdTU0MkIgaGFzaCBcdTcyNDdcdTZCQjVcdUZGMENcdTUyMTlcdTVDMDZcdTUxNzZcdTZERkJcdTUyQTBcdTUyMzBcdTY1QjBcdTc2ODRcdTU3RkFcdTY3MkMgVVJMIFx1NEUyRFx1MzAwMlxuICpcbiAqIEBwYXJhbSB1cmwgLSBcdTk0RkVcdTYzQTVcdTU3MzBcdTU3NDBcbiAqIEBwYXJhbSBwYXJhbU5hbWUgLSBcdTUzQzJcdTY1NzBcdTU0MERcbiAqIEBwYXJhbSBwYXJhbVZhbHVlIC0gXHU1M0MyXHU2NTcwXHU1MDNDXG4gKi9cbnIoaSwgXCJyZXBsYWNlVXJsUGFyYW1cIiwgKGUsIHQsIG4pID0+IHtcbiAgbiA9PSBudWxsICYmIChuID0gXCJcIik7XG4gIGNvbnN0IHMgPSBuZXcgUmVnRXhwKFwiXFxcXGIoXCIgKyB0ICsgXCI9KS4qPygmfCN8JClcIik7XG4gIGlmIChlLnNlYXJjaChzKSA+PSAwKVxuICAgIHJldHVybiBlLnJlcGxhY2UocywgXCIkMVwiICsgbiArIFwiJDJcIik7XG4gIGNvbnN0IFtjLCBkXSA9IGUuc3BsaXQoXCIjXCIpLCBbeSwgYl0gPSBjLnNwbGl0KFwiP1wiKSwgbCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoYik7XG4gIGwuc2V0KHQsIG4pO1xuICBjb25zdCBtID0gbC50b1N0cmluZygpLCBmID0geSArIChtID8gXCI/XCIgKyBtIDogXCJcIik7XG4gIHJldHVybiBkID8gZiArIFwiI1wiICsgZCA6IGY7XG59KSwgLyoqXG4gKiBcdThCQkVcdTdGNkV1cmxcdTUzQzJcdTY1NzBcbiAqXG4gKiBAcGFyYW0gdXJsc3RyaW5nIC0gdXJsXG4gKiBAcGFyYW0ga2V5IC0ga2V5XG4gKiBAcGFyYW0gdmFsdWUgLSB2YWx1ZVxuICovXG5yKGksIFwic2V0VXJsUGFyYW1ldGVyXCIsIChlLCB0LCBuKSA9PiB7XG4gIGlmIChlLmluY2x1ZGVzKHQpKVxuICAgIHJldHVybiB1LnJlcGxhY2VVcmxQYXJhbShlLCB0LCBuKTtcbiAgY29uc3QgcyA9IGUuc3BsaXQoXCIjXCIpO1xuICBsZXQgYyA9IHNbMF07XG4gIGNvbnN0IGQgPSBzWzFdO1xuICByZXR1cm4gYy5pbmNsdWRlcyhcIj9cIikgPyBjICs9IGAmJHt0fT0ke259YCA6IGMgKz0gYD8ke3R9PSR7bn1gLCBkICYmIChjICs9IFwiI1wiICsgZCksIGM7XG59KSwgLyoqXG4gKiBcdTkxQ0RcdTY1QjBcdTUyQTBcdThGN0RcdTYzMDdcdTVCOUF0YWJcbiAqXG4gKiBAcGFyYW0gdGFibmFtZSAtIHRhYm5hbWVcbiAqIEBwYXJhbSB0IC0gXHU1RUY2XHU4RkRGXHU2NUY2XHU5NUY0XG4gKi9cbnIoaSwgXCJyZWxvYWRUYWJQYWdlXCIsIChlLCB0ID0gMjAwKSA9PiB7XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgaWYgKHUuaXNJbkJyb3dzZXIpIHtcbiAgICAgIGNvbnN0IG4gPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdS5zZXRVcmxQYXJhbWV0ZXIobiwgXCJ0YWJcIiwgZSk7XG4gICAgfVxuICB9LCB0KTtcbn0pLCAvKipcbiAqIFx1NTIzN1x1NjVCMFx1NUY1M1x1NTI0RHRhYlx1OTg3NVx1OTc2MlxuICovXG5yKGksIFwicmVsb2FkUGFnZVwiLCAoKSA9PiB7XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgdS5pc0luQnJvd3NlciAmJiB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gIH0sIDIwMCk7XG59KSwgLyoqXG4gKiBcdTUyMzdcdTY1QjBcdTVGNTNcdTUyNER0YWJcdTk4NzVcdTk3NjJcbiAqXG4gKiBAcGFyYW0gbXNnIC0gXHU2RDg4XHU2MDZGXHU2M0QwXHU3OTNBXG4gKiBAcGFyYW0gY2IgLSBcdTU2REVcdThDMDNcbiAqL1xucihpLCBcInJlbG9hZFBhZ2VXaXRoTWVzc2FnZUNhbGxiYWNrXCIsIChlLCB0KSA9PiB7XG4gIHQgJiYgdChlKSwgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICB1LmlzSW5Ccm93c2VyICYmIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgfSwgMjAwKTtcbn0pO1xudmFyIG8gPSAvKiBAX19QVVJFX18gKi8gKChhKSA9PiAoYS5CYXNlUGF0aFR5cGVfQXBwZWFyYW5jZSA9IFwiQXBwZWFyYW5jZVwiLCBhLkJhc2VQYXRoVHlwZV9EYXRhID0gXCJEYXRhXCIsIGEuQmFzZVBhdGhUeXBlX1RoZW1lcyA9IFwiVGhlbWVzXCIsIGEuQmFzZVBhdGhUeXBlX1poaVRoZW1lID0gXCJaaGlUaGVtZVwiLCBhLkJhc2VQYXRoVHlwZV9Ob25lID0gXCJOb25lXCIsIGEpKShvIHx8IHt9KTtcbmNvbnN0IGggPSBjbGFzcyB7XG4gIC8qKlxuICAgKiBcdTY4QzBcdTZENEJcdTY2MkZcdTU0MjZcdThGRDBcdTg4NENcdTU3MjhcdTYwMURcdTZFOTBcdTYyNTNcdTVGMDBcdTc2ODRcdTZENEZcdTg5QzhcdTU2NjhcdTRFMkRcbiAgICovXG4gIHN0YXRpYyBpc0luU2l5dWFuQnJvd3NlcigpIHtcbiAgICByZXR1cm4gaS5pc0luQnJvd3NlciA/IHR5cGVvZiB3aW5kb3cuc2l5dWFuIDwgXCJ1XCIgJiYgdHlwZW9mIHdpbmRvdy5MdXRlIDwgXCJ1XCIgOiAhMTtcbiAgfVxuICAvKipcbiAgICogXHU2MDFEXHU2RTkwXHU3QjE0XHU4QkIwIHdpbmRvdyBcdTVCRjlcdThDNjFcbiAgICovXG4gIHN0YXRpYyBzaXl1YW5XaW5kb3coKSB7XG4gICAgbGV0IGU7XG4gICAgcmV0dXJuIHRoaXMuaXNJblNpeXVhbldpZGdldCgpID8gZSA9IHBhcmVudC53aW5kb3cgOiB0aGlzLmlzSW5TaXl1YW5OZXdXaW4oKSB8fCB0aGlzLmlzSW5TaXl1YW5Ccm93c2VyKCkgfHwgdHlwZW9mIHdpbmRvdyA8IFwidVwiID8gZSA9IHdpbmRvdyA6IGUgPSB2b2lkIDAsIGU7XG4gIH1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyByZXF1aXJlIGVuZFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gaW1wb3J0IHN0YXJ0XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqXG4gICAqIFx1NUYxNVx1NTE2NWpzb25cbiAgICpcbiAgICogQHBhcmFtIGpzUGF0aCAtIGpzXHU3NkY4XHU1QkY5XHU4REVGXHU1Rjg0XHU1MTY4XHU4REVGXHU1Rjg0XG4gICAqIEBwYXJhbSB0eXBlIC0gXHU3QzdCXHU1NzhCXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgaW1wb3J0SnMoZSwgdCkge1xuICAgIGxldCBuID0gZTtcbiAgICBzd2l0Y2ggKHQpIHtcbiAgICAgIGNhc2Ugby5CYXNlUGF0aFR5cGVfQXBwZWFyYW5jZTpcbiAgICAgICAgbiA9IHRoaXMuYnJvd3NlckpvaW5QYXRoKHRoaXMuc2l5dWFuQXBwZWFyYW5jZVJlbGF0aXZlUGF0aCgpLCBlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG8uQmFzZVBhdGhUeXBlX0RhdGE6XG4gICAgICAgIG4gPSB0aGlzLmJyb3dzZXJKb2luUGF0aCh0aGlzLnNpeXVhbkRhdGFSZWxhdGl2ZVBhdGgoKSwgZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBvLkJhc2VQYXRoVHlwZV9UaGVtZXM6XG4gICAgICAgIG4gPSB0aGlzLmJyb3dzZXJKb2luUGF0aCh0aGlzLnNpeXVhblRoZW1lUmVsYXRpdmVQYXRoKCksIGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugby5CYXNlUGF0aFR5cGVfWmhpVGhlbWU6XG4gICAgICAgIG4gPSB0aGlzLmJyb3dzZXJKb2luUGF0aCh0aGlzLnpoaVRoZW1lUmVsYXRpdmVQYXRoKCksIGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInR5cGUgbXVzdCBiZSBwcm92aWRlZFwiKTtcbiAgICB9XG4gICAgY29uc3QgeyBkZWZhdWx0OiBzIH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgICAvKiBAdml0ZS1pZ25vcmUgKi9cbiAgICAgIG5cbiAgICApO1xuICAgIHJldHVybiBzO1xuICB9XG4gIC8qKlxuICAgKiBcdTVGMTVcdTUxNjVqc29uXG4gICAqXG4gICAqIEBwYXJhbSBqc29uUGF0aCAtIGpzb25cdTc2RjhcdTVCRjlcdThERUZcdTVGODRcdTUxNjhcdThERUZcdTVGODRcbiAgICogQHBhcmFtIHR5cGUgLSBcdTdDN0JcdTU3OEJcbiAgICovXG4gIC8vIHB1YmxpYyBzdGF0aWMgYXN5bmMgaW1wb3J0SnNvbihqc29uUGF0aDogc3RyaW5nLCB0eXBlOiBCYXNlUGF0aFR5cGVFbnVtKSB7XG4gIC8vICAgbGV0IGZ1bGxKc29uUGF0aCA9IGpzb25QYXRoXG4gIC8vICAgc3dpdGNoICh0eXBlKSB7XG4gIC8vICAgICBjYXNlIEJhc2VQYXRoVHlwZUVudW0uQmFzZVBhdGhUeXBlX0FwcGVhcmFuY2U6XG4gIC8vICAgICAgIGZ1bGxKc29uUGF0aCA9IHRoaXMuYnJvd3NlckpvaW5QYXRoKHRoaXMuc2l5dWFuQXBwZWFyYW5jZVJlbGF0aXZlUGF0aCgpLCBqc29uUGF0aClcbiAgLy8gICAgICAgYnJlYWtcbiAgLy8gICAgIGNhc2UgQmFzZVBhdGhUeXBlRW51bS5CYXNlUGF0aFR5cGVfRGF0YTpcbiAgLy8gICAgICAgZnVsbEpzb25QYXRoID0gdGhpcy5icm93c2VySm9pblBhdGgodGhpcy5zaXl1YW5EYXRhUmVsYXRpdmVQYXRoKCksIGpzb25QYXRoKVxuICAvLyAgICAgICBicmVha1xuICAvLyAgICAgY2FzZSBCYXNlUGF0aFR5cGVFbnVtLkJhc2VQYXRoVHlwZV9UaGVtZXM6XG4gIC8vICAgICAgIGZ1bGxKc29uUGF0aCA9IHRoaXMuYnJvd3NlckpvaW5QYXRoKHRoaXMuc2l5dWFuVGhlbWVSZWxhdGl2ZVBhdGgoKSwganNvblBhdGgpXG4gIC8vICAgICAgIGJyZWFrXG4gIC8vICAgICBjYXNlIEJhc2VQYXRoVHlwZUVudW0uQmFzZVBhdGhUeXBlX1poaVRoZW1lOlxuICAvLyAgICAgICBmdWxsSnNvblBhdGggPSB0aGlzLmJyb3dzZXJKb2luUGF0aCh0aGlzLnpoaVRoZW1lUmVsYXRpdmVQYXRoKCksIGpzb25QYXRoKVxuICAvLyAgICAgICBicmVha1xuICAvLyAgICAgZGVmYXVsdDpcbiAgLy8gICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHlwZSBtdXN0IGJlIHByb3ZpZGVkXCIpXG4gIC8vICAgfVxuICAvL1xuICAvLyAgIGNvbnN0IHsgZGVmYXVsdDogZGF0YSB9ID0gYXdhaXQgaW1wb3J0KC8qIEB2aXRlLWlnbm9yZSAqLyBmdWxsSnNvblBhdGgsIHsgYXNzZXJ0OiB7IHR5cGU6IFwianNvblwiIH0gfSlcbiAgLy8gICByZXR1cm4gZGF0YVxuICAvLyB9XG4gIC8qKlxuICAgKiBcdTVGMTVcdTUxNjUganNvbiAtIFx1NEVFNSBkYXRhIFx1NEUzQVx1NTdGQVx1NjcyQ1x1OERFRlx1NUY4NFxuICAgKlxuICAgKiBAcGFyYW0ganNvblBhdGggLSBcdTc2RjhcdTVCRjlcdTRFOEUgZGF0YSBcdTc2ODRcdTc2RjhcdTVCRjlcdThERUZcdTVGODRcbiAgICovXG4gIC8vIHB1YmxpYyBzdGF0aWMgYXN5bmMgaW1wb3J0RGF0YUpzb24oanNvblBhdGg6IHN0cmluZykge1xuICAvLyAgIHJldHVybiBhd2FpdCB0aGlzLmltcG9ydEpzb24oanNvblBhdGgsIEJhc2VQYXRoVHlwZUVudW0uQmFzZVBhdGhUeXBlX0RhdGEpXG4gIC8vIH1cbiAgLyoqXG4gICAqIFx1NUYxNVx1NTE2NSBqc29uIC0gXHU0RUU1IGFwcGVhcmFuY2UgXHU0RTNBXHU1N0ZBXHU2NzJDXHU4REVGXHU1Rjg0XG4gICAqXG4gICAqIEBwYXJhbSBqc29uUGF0aCAtIFx1NzZGOFx1NUJGOVx1NEU4RSBhcHBlYXJhbmNlIFx1NzY4NFx1NzZGOFx1NUJGOVx1OERFRlx1NUY4NFxuICAgKi9cbiAgLy8gcHVibGljIHN0YXRpYyBhc3luYyBpbXBvcnRBcHBlYXJhbmNlSnNvbihqc29uUGF0aDogc3RyaW5nKSB7XG4gIC8vICAgcmV0dXJuIGF3YWl0IHRoaXMuaW1wb3J0SnNvbihqc29uUGF0aCwgQmFzZVBhdGhUeXBlRW51bS5CYXNlUGF0aFR5cGVfQXBwZWFyYW5jZSlcbiAgLy8gfVxuICAvKipcbiAgICogXHU1RjE1XHU1MTY1IGpzb24gLSBcdTRFRTUgdGhlbWVzIFx1NEUzQVx1NTdGQVx1NjcyQ1x1OERFRlx1NUY4NFxuICAgKlxuICAgKiBAcGFyYW0ganNvblBhdGggLSBcdTc2RjhcdTVCRjlcdTRFOEUgdGhlbWVzIFx1NzY4NFx1NzZGOFx1NUJGOVx1OERFRlx1NUY4NFxuICAgKi9cbiAgLy8gcHVibGljIHN0YXRpYyBhc3luYyBpbXBvcnRUaGVtZXNKc29uKGpzb25QYXRoOiBzdHJpbmcpIHtcbiAgLy8gICByZXR1cm4gYXdhaXQgdGhpcy5pbXBvcnRKc29uKGpzb25QYXRoLCBCYXNlUGF0aFR5cGVFbnVtLkJhc2VQYXRoVHlwZV9UaGVtZXMpXG4gIC8vIH1cbiAgLyoqXG4gICAqIFx1NUYxNVx1NTE2NSB6aGkgXHU0RTNCXHU5ODk4XHU3Njg0IGpzb24gLSBcdTRFRTUgemhpIFx1NEUzQlx1OTg5OCBcdTc2ODRcdTY4MzlcdThERUZcdTVGODRcdTRFM0FcdTU3RkFcdTY3MkNcdThERUZcdTVGODRcbiAgICpcbiAgICogQHBhcmFtIGpzb25QYXRoIC0gXHU3NkY4XHU1QkY5XHU0RThFIHpoaSBcdTRFM0JcdTk4OThcdTY4MzlcdThERUZcdTVGODRcdTc2ODRcdTc2RjhcdTVCRjlcdThERUZcdTVGODRcbiAgICovXG4gIC8vIHB1YmxpYyBzdGF0aWMgYXN5bmMgaW1wb3J0WmhpVGhlbWVKc29uKGpzb25QYXRoOiBzdHJpbmcpIHtcbiAgLy8gICByZXR1cm4gYXdhaXQgdGhpcy5pbXBvcnRKc29uKGpzb25QYXRoLCBCYXNlUGF0aFR5cGVFbnVtLkJhc2VQYXRoVHlwZV9aaGlUaGVtZSlcbiAgLy8gfVxuICAvKipcbiAgICogXHU1RjE1XHU1MTY1IHpoaSBcdTRFM0JcdTk4OThcdTc2ODQganMgLSBcdTRFRTUgemhpIFx1NEUzQlx1OTg5OCBcdTc2ODRcdTY4MzlcdThERUZcdTVGODRcdTRFM0FcdTU3RkFcdTY3MkNcdThERUZcdTVGODRcbiAgICpcbiAgICogQHBhcmFtIGpzUGF0aCAtIFx1NzZGOFx1NUJGOVx1NEU4RSB6aGkgXHU0RTNCXHU5ODk4XHU2ODM5XHU4REVGXHU1Rjg0XHU3Njg0XHU3NkY4XHU1QkY5XHU4REVGXHU1Rjg0XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgaW1wb3J0WmhpVGhlbWVKcyhlKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaW1wb3J0SnMoZSwgby5CYXNlUGF0aFR5cGVfWmhpVGhlbWUpO1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gaW1wb3J0IHN0YXJ0XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqXG4gICAqIFx1OERFRlx1NUY4NFx1NjJGQ1x1NjNBNVxuICAgKlxuICAgKiBAcGFyYW0gcGF0aHMgLSBcdThERUZcdTVGODRcdTY1NzBcdTdFQzRcbiAgICovXG4gIHN0YXRpYyBqb2luUGF0aCguLi5lKSB7XG4gICAgaWYgKGkuaGFzTm9kZUVudigpKSB7XG4gICAgICBjb25zdCB0ID0gdGhpcy5yZXF1aXJlTGliKFwicGF0aFwiKTtcbiAgICAgIGlmICh0KVxuICAgICAgICByZXR1cm4gdC5qb2luKC4uLmUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5icm93c2VySm9pblBhdGgoLi4uZSk7XG4gIH1cbiAgc3RhdGljIGJyb3dzZXJKb2luUGF0aCguLi5lKSB7XG4gICAgcmV0dXJuIGUuam9pbihpLkJyb3dzZXJTZXBlcmF0b3IpO1xuICB9XG4gIC8qKlxuICAgKiBcdTYwMURcdTZFOTBcdTdCMTRcdThCQjAgY29uZiBcdTc2RUVcdTVGNTVcbiAgICovXG4gIHN0YXRpYyBzaXl1YW5Db25mUGF0aCgpIHtcbiAgICBjb25zdCBlID0gdGhpcy5zaXl1YW5XaW5kb3coKTtcbiAgICBpZiAoIWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW4gc2l5dWFuIGVudlwiKTtcbiAgICByZXR1cm4gZS5zaXl1YW4uY29uZmlnLnN5c3RlbS5jb25mRGlyO1xuICB9XG4gIC8qKlxuICAgKiBcdTYwMURcdTZFOTBcdTdCMTRcdThCQjAgZGF0YSBcdTc2RUVcdTVGNTVcbiAgICovXG4gIHN0YXRpYyBzaXl1YW5EYXRhUGF0aCgpIHtcbiAgICBjb25zdCBlID0gdGhpcy5zaXl1YW5XaW5kb3coKTtcbiAgICBpZiAoIWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW4gc2l5dWFuIGVudlwiKTtcbiAgICByZXR1cm4gZS5zaXl1YW4uY29uZmlnLnN5c3RlbS5kYXRhRGlyO1xuICB9XG4gIC8qKlxuICAgKiBcdTYwMURcdTZFOTBcdTdCMTRcdThCQjAgZGF0YSBcdTc2RUVcdTVGNTUtXHU3NkY4XHU1QkY5XHU4REVGXHU1Rjg0XG4gICAqL1xuICBzdGF0aWMgc2l5dWFuRGF0YVJlbGF0aXZlUGF0aCgpIHtcbiAgICBpZiAoIXRoaXMuc2l5dWFuV2luZG93KCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW4gc2l5dWFuIGVudlwiKTtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICAvKipcbiAgICogXHU2MDFEXHU2RTkwXHU3QjE0XHU4QkIwIGFwcGVhcmFuY2UgXHU3NkVFXHU1RjU1XG4gICAqL1xuICBzdGF0aWMgc2l5dWFuQXBwZWFyYW5jZVBhdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuam9pblBhdGgodGhpcy5zaXl1YW5Db25mUGF0aCgpLCBcImFwcGVhcmFuY2VcIik7XG4gIH1cbiAgLyoqXG4gICAqIFx1NjAxRFx1NkU5MFx1N0IxNFx1OEJCMCBhcHBlYXJhbmNlIFx1NzZFRVx1NUY1NS1cdTc2RjhcdTVCRjlcdThERUZcdTVGODRcbiAgICovXG4gIHN0YXRpYyBzaXl1YW5BcHBlYXJhbmNlUmVsYXRpdmVQYXRoKCkge1xuICAgIGlmICghdGhpcy5zaXl1YW5XaW5kb3coKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbiBzaXl1YW4gZW52XCIpO1xuICAgIHJldHVybiB0aGlzLmJyb3dzZXJKb2luUGF0aChcIlwiLCBcImFwcGVhcmFuY2VcIik7XG4gIH1cbiAgLyoqXG4gICAqIFx1NjAxRFx1NkU5MFx1N0IxNFx1OEJCMCB0aGVtZXMgXHU3NkVFXHU1RjU1LVx1N0VERFx1NUJGOVx1OERFRlx1NUY4NFxuICAgKlxuICAgKiBcdTZDRThcdTYxMEY6IFx1NTk4Mlx1Njc5Q1x1NjYyRlx1OTc1RSBlbGVjdHJvbiBcdTU0OEMgTm9kZSBcdTczQUZcdTU4ODNcdUZGMENcdThGRDlcdTkxQ0NcdThGRDRcdTU2REVcdTc2ODRcdTY2MkZcdTZENEZcdTg5QzhcdTU2NjhcdTc2ODRcdThERUZcdTVGODRcdUZGMENcdTRFMERcdTY2MkZcdTcyNjlcdTc0MDZcdThERUZcdTVGODRcbiAgICogXHU1OTgyXHU2NzlDXHU0RjdGXHU3NTI4XHU3MjY5XHU3NDA2XHU4REVGXHU1Rjg0XHVGRjBDXHU4QkY3XHU4QzAzXHU3NTI4IHNpeXVhbkFwcGVhcmFuY2VQYXRoIFx1NjIxNlx1ODAwNSBzaXl1YW5EYXRhUGF0aFxuICAgKlxuICAgKiBAYXV0aG9yIHRlcndlclxuICAgKiBAc2luY2UgMC4xLjBcbiAgICovXG4gIHN0YXRpYyBzaXl1YW5UaGVtZVBhdGgoKSB7XG4gICAgaWYgKGkuaGFzTm9kZUVudigpKVxuICAgICAgcmV0dXJuIHRoaXMuam9pblBhdGgodGhpcy5zaXl1YW5BcHBlYXJhbmNlUGF0aCgpLCBcInRoZW1lc1wiKTtcbiAgICB7XG4gICAgICBjb25zdCBlID0gdGhpcy5zaXl1YW5XaW5kb3coKTtcbiAgICAgIGlmICghZSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGluIHNpeXVhbiBlbnZcIik7XG4gICAgICByZXR1cm4gdGhpcy5qb2luUGF0aChlLmxvY2F0aW9uLm9yaWdpbiwgXCJhcHBlYXJhbmNlXCIsIFwidGhlbWVzXCIpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogXHU2MDFEXHU2RTkwXHU3QjE0XHU4QkIwIHRoZW1lcyBcdTc2RUVcdTVGNTUtXHU3NkY4XHU1QkY5XHU4REVGXHU1Rjg0XG4gICAqL1xuICBzdGF0aWMgc2l5dWFuVGhlbWVSZWxhdGl2ZVBhdGgoKSB7XG4gICAgaWYgKCF0aGlzLnNpeXVhbldpbmRvdygpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGluIHNpeXVhbiBlbnZcIik7XG4gICAgcmV0dXJuIHRoaXMuYnJvd3NlckpvaW5QYXRoKFwiXCIsIFwiYXBwZWFyYW5jZVwiLCBcInRoZW1lc1wiKTtcbiAgfVxuICAvKipcbiAgICogemhpIFx1NEUzQlx1OTg5OFx1NzZFRVx1NUY1NSAtIFx1N0VERFx1NUJGOVx1OERFRlx1NUY4NFxuICAgKi9cbiAgc3RhdGljIHpoaVRoZW1lUGF0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5qb2luUGF0aCh0aGlzLnNpeXVhblRoZW1lUGF0aCgpLCBcInpoaVwiKTtcbiAgfVxuICAvKipcbiAgICogemhpIFx1NEUzQlx1OTg5OFx1NzZFRVx1NUY1NSAtIFx1NzZGOFx1NUJGOVx1OERFRlx1NUY4NFxuICAgKi9cbiAgc3RhdGljIHpoaVRoZW1lUmVsYXRpdmVQYXRoKCkge1xuICAgIHJldHVybiB0aGlzLmJyb3dzZXJKb2luUGF0aCh0aGlzLnNpeXVhblRoZW1lUmVsYXRpdmVQYXRoKCksIFwiemhpXCIpO1xuICB9XG59O1xubGV0IHcgPSBoO1xuLyoqXG4gKiBcdTYwMURcdTZFOTBcdTdCMTRcdThCQjBpZnJhbWVcdTYzMDJcdTRFRjZcdTczQUZcdTU4ODNcbiAqL1xucih3LCBcImlzSW5TaXl1YW5XaWRnZXRcIiwgKCkgPT4gaS5pc0luQnJvd3NlciA/IHdpbmRvdy5mcmFtZUVsZW1lbnQgIT0gbnVsbCAmJiB3aW5kb3cuZnJhbWVFbGVtZW50LnBhcmVudEVsZW1lbnQgIT0gbnVsbCAmJiB3aW5kb3cuZnJhbWVFbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudCAhPSBudWxsICYmIHdpbmRvdy5mcmFtZUVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtbm9kZS1pZFwiKSAhPT0gXCJcIiA6ICExKSwgLyoqXG4gKiBcdTYwMURcdTZFOTBcdTdCMTRcdThCQjBcdTY1QjBcdTdBOTdcdTUzRTNcbiAqXG4gKiBAZGVwcmVjYXRlZCB3aW5kb3cudGVyd2VyIFx1NTIyNFx1NjVBRFx1NjVCOVx1NUYwRlx1NURGMlx1NUU5Rlx1NUYwM1x1RkYwQ1x1NUVGQVx1OEJBRVx1NEVFNVx1NTQwRVx1NjI1M1x1NUYwMFx1NjVCMFx1N0E5N1x1NTNFM1x1NkNFOFx1NTE2NSB3aW5kb3cuc2l5dWFuTmV3V2luIFx1RkYwQ1x1OEZEOVx1NjgzN1x1OEJFRFx1NEU0OVx1NEYxQVx1NjZGNFx1NUJCOVx1NjYxM1x1NzQwNlx1ODlFM1xuICogQGF1dGhvciB0ZXJ3ZXJcbiAqIEB2ZXJzaW9uIDAuMS4wXG4gKiBAc2luY2UgMC4wLjFcbiAqL1xucih3LCBcImlzSW5TaXl1YW5OZXdXaW5cIiwgKCkgPT4gIWkuaXNJbkJyb3dzZXIgfHwgIWkuaXNFbGVjdHJvbigpID8gITEgOiB0eXBlb2Ygd2luZG93LnRlcndlciA8IFwidVwiIHx8IHR5cGVvZiB3aW5kb3cuc2l5dWFuTmV3V2luIDwgXCJ1XCIpLCAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyByZXF1aXJlIHN0YXJ0XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09XG4vKipcbiAqIFx1NUYxNVx1NTE2NVx1NEY5RFx1OEQ1NlxuICpcbiAqIEBwYXJhbSBsaWJwYXRoIC0gXHU0RjlEXHU4RDU2XHU1MTY4XHU4REVGXHU1Rjg0XG4gKiBAcGFyYW0gYWJzIC0gXHU1M0VGXHU5MDA5XHVGRjBDXHU2NjJGXHU1NDI2XHU0RjdGXHU3NTI4XHU4OUM5XHU1Rjk3XHU4REVGXHU1Rjg0XHVGRjBDXHU5RUQ4XHU4QkE0XHU2NjJGIHRydWUgXHVGRjBDIFx1NTQyRlx1NzUyOFx1NEU0Qlx1NTQwRSB0eXBlXHU1M0MyXHU2NTcwXHU2NUUwXHU2NTQ4XG4gKiBAcGFyYW0gdHlwZSAtIFx1NTNFRlx1OTAwOVx1RkYwQ1x1NEVFNVx1OEMwMVx1NzY4NFx1NTdGQVx1NjcyQ1x1OERFRlx1NUY4NFx1NEUzQVx1NTFDNlxuICovXG5yKHcsIFwicmVxdWlyZUxpYlwiLCAoZSwgdCA9ICEwLCBuID0gby5CYXNlUGF0aFR5cGVfTm9uZSkgPT4ge1xuICBpZiAoIWkuaGFzTm9kZUVudigpKVxuICAgIHRocm93IG5ldyBFcnJvcihcInJlcXVpcmUgb255IHdvcmtzIG9uIG5vZGUgZW52XCIpO1xuICBsZXQgcyA9IGU7XG4gIGlmICghdClcbiAgICBzd2l0Y2ggKG4pIHtcbiAgICAgIGNhc2Ugby5CYXNlUGF0aFR5cGVfQXBwZWFyYW5jZTpcbiAgICAgICAgcyA9IGguam9pblBhdGgoaC5zaXl1YW5BcHBlYXJhbmNlUGF0aCgpLCBlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG8uQmFzZVBhdGhUeXBlX0RhdGE6XG4gICAgICAgIHMgPSBoLmpvaW5QYXRoKGguc2l5dWFuRGF0YVBhdGgoKSwgZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBvLkJhc2VQYXRoVHlwZV9UaGVtZXM6XG4gICAgICAgIHMgPSBoLmpvaW5QYXRoKGguc2l5dWFuQXBwZWFyYW5jZVBhdGgoKSwgXCJ0aGVtZXNcIiwgZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBvLkJhc2VQYXRoVHlwZV9aaGlUaGVtZTpcbiAgICAgICAgcyA9IGguam9pblBhdGgoaC5zaXl1YW5BcHBlYXJhbmNlUGF0aCgpLCBcInRoZW1lc1wiLCBcInpoaVwiLCBlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0eXBlIG11c3QgYmUgcHJvdmlkZWQgd2hlbiBub3QgdXNlIGFic29sdXRlIHBhdGhcIik7XG4gICAgfVxuICBjb25zdCBjID0gaC5zaXl1YW5XaW5kb3coKTtcbiAgaWYgKCFjKVxuICAgIHJldHVybiByZXF1aXJlKHMpO1xuICBpZiAodHlwZW9mIGMucmVxdWlyZSA8IFwidVwiKVxuICAgIHJldHVybiBjLnJlcXVpcmUocyk7XG59KSwgLyoqXG4gKiBcdTVGMTVcdTUxNjVcdTRGOURcdThENTZcdUZGMENcdTRFRTUgZGF0YSBcdTc2ODRcdTU3RkFcdTY3MkNcdThERUZcdTVGODRcdTRFM0FcdTUxQzZcbiAqXG4gKiBAcGFyYW0gbGlicGF0aCAtIFx1NzZGOFx1NUJGOVx1NEU4RSBhcHBlYXJhbmNlIFx1NzY4NFx1NzZGOFx1NUJGOVx1OERFRlx1NUY4NFxuICovXG5yKHcsIFwicmVxdWlyZUFwcGVhcmFuY2VMaWJcIiwgKGUpID0+IGgucmVxdWlyZUxpYihlLCAhMSwgby5CYXNlUGF0aFR5cGVfQXBwZWFyYW5jZSkpLCAvKipcbiAqIFx1NUYxNVx1NTE2NVx1NEY5RFx1OEQ1Nlx1RkYwQ1x1NEVFNSBkYXRhIFx1NzY4NFx1NTdGQVx1NjcyQ1x1OERFRlx1NUY4NFx1NEUzQVx1NTFDNlxuICpcbiAqIEBwYXJhbSBsaWJwYXRoIC0gXHU3NkY4XHU1QkY5XHU0RThFIGRhdGEgXHU3Njg0XHU3NkY4XHU1QkY5XHU4REVGXHU1Rjg0XG4gKi9cbnIodywgXCJyZXF1aXJlRGF0YUxpYlwiLCAoZSkgPT4gaC5yZXF1aXJlTGliKGUsICExLCBvLkJhc2VQYXRoVHlwZV9EYXRhKSksIC8qKlxuICogXHU1RjE1XHU1MTY1XHU0RjlEXHU4RDU2XHVGRjBDXHU0RUU1IHRoZW1lIFx1NzY4NFx1NTdGQVx1NjcyQ1x1OERFRlx1NUY4NFx1NEUzQVx1NTFDNlxuICpcbiAqIEBwYXJhbSBsaWJwYXRoIC0gXHU3NkY4XHU1QkY5XHU0RThFIHRoZW1lIFx1NzY4NFx1NzZGOFx1NUJGOVx1OERFRlx1NUY4NFxuICovXG5yKHcsIFwicmVxdWlyZVRoZW1lc0xpYlwiLCAoZSkgPT4gaC5yZXF1aXJlTGliKGUsICExLCBvLkJhc2VQYXRoVHlwZV9UaGVtZXMpKSwgLyoqXG4gKiBcdTVGMTVcdTUxNjVcdTRGOURcdThENTZcdUZGMENcdTRFRTUgWmhpVGhlbWUgXHU3Njg0XHU1N0ZBXHU2NzJDXHU4REVGXHU1Rjg0XHU0RTNBXHU1MUM2XG4gKlxuICogQHBhcmFtIGxpYnBhdGggLSBcdTc2RjhcdTVCRjlcdTRFOEUgWmhpVGhlbWUgXHU3Njg0XHU3NkY4XHU1QkY5XHU4REVGXHU1Rjg0XG4gKi9cbnIodywgXCJyZXF1aXJlWmhpVGhlbWVMaWJcIiwgKGUpID0+IGgucmVxdWlyZUxpYihlLCAhMSwgby5CYXNlUGF0aFR5cGVfWmhpVGhlbWUpKTtcbnZhciBwID0gLyogQF9fUFVSRV9fICovICgoYSkgPT4gKGEuRGV2aWNlVHlwZV9Nb2JpbGVfRGV2aWNlID0gXCJNb2JpbGVcIiwgYS5EZXZpY2VUeXBlX1NpeXVhbl9XaWRnZXQgPSBcIlNpeXVhbl9XaWRnZXRcIiwgYS5EZXZpY2VUeXBlX1NpeXVhbl9OZXdXaW4gPSBcIlNpeXVhbl9OZXdXaW5kb3dcIiwgYS5EZXZpY2VUeXBlX1NpeXVhbl9NYWluV2luID0gXCJTaXl1YW5fTWFpbldpbmRvd1wiLCBhLkRldmljZVR5cGVfU2l5dWFuX0Jyb3dzZXIgPSBcIlNpeXVhbl9Ccm93c2VyXCIsIGEuRGV2aWNlVHlwZV9DaHJvbWVfRXh0ZW5zaW9uID0gXCJDaHJvbWVfRXh0ZW5zaW9uXCIsIGEuRGV2aWNlVHlwZV9DaHJvbWVfQnJvd3NlciA9IFwiQ2hyb21lX0Jyb3dzZXJcIiwgYS5EZXZpY2VUeXBlX05vZGUgPSBcIk5vZGVcIiwgYSkpKHAgfHwge30pO1xuY2xhc3MgdiB7XG4gIC8qKlxuICAgKiBcdTgzQjdcdTUzRDZcdTVGNTNcdTUyNERcdThCQkVcdTU5MDdcbiAgICovXG4gIHN0YXRpYyBnZXREZXZpY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGV0ZWN0TW9iaWxlRGV2aWNlKCkgPyBwLkRldmljZVR5cGVfTW9iaWxlX0RldmljZSA6IHcuaXNJblNpeXVhbldpZGdldCgpID8gcC5EZXZpY2VUeXBlX1NpeXVhbl9XaWRnZXQgOiB3LmlzSW5TaXl1YW5OZXdXaW4oKSA/IHAuRGV2aWNlVHlwZV9TaXl1YW5fTmV3V2luIDogaS5pc0VsZWN0cm9uKCkgPyBwLkRldmljZVR5cGVfU2l5dWFuX01haW5XaW4gOiB3LmlzSW5TaXl1YW5Ccm93c2VyKCkgPyBwLkRldmljZVR5cGVfU2l5dWFuX0Jyb3dzZXIgOiBpLmlzSW5DaHJvbWVFeHRlbnNpb24oKSA/IHAuRGV2aWNlVHlwZV9DaHJvbWVfRXh0ZW5zaW9uIDogaS5pc05vZGUgPyBwLkRldmljZVR5cGVfTm9kZSA6IHAuRGV2aWNlVHlwZV9DaHJvbWVfQnJvd3NlcjtcbiAgfVxuICAvKipcbiAgICogXHU2OEMwXHU2RDRCXHU3OUZCXHU1MkE4XHU3QUVGXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzdGF0aWMgZGV0ZWN0TW9iaWxlRGV2aWNlKCkge1xuICAgIGxldCBlID0gITE7XG4gICAgcmV0dXJuIGkuaXNJbkJyb3dzZXIgJiYgZnVuY3Rpb24odCkge1xuICAgICAgKC8oYW5kcm9pZHxiYlxcZCt8bWVlZ28pLittb2JpbGV8YXZhbnRnb3xiYWRhXFwvfGJsYWNrYmVycnl8YmxhemVyfGNvbXBhbHxlbGFpbmV8ZmVubmVjfGhpcHRvcHxpZW1vYmlsZXxpcChob25lfG9kKXxpcmlzfGtpbmRsZXxsZ2UgfG1hZW1vfG1pZHB8bW1wfG1vYmlsZS4rZmlyZWZveHxuZXRmcm9udHxvcGVyYSBtKG9ifGluKWl8cGFsbSggb3MpP3xwaG9uZXxwKGl4aXxyZSlcXC98cGx1Y2tlcnxwb2NrZXR8cHNwfHNlcmllcyg0fDYpMHxzeW1iaWFufHRyZW98dXBcXC4oYnJvd3NlcnxsaW5rKXx2b2RhZm9uZXx3YXB8d2luZG93cyBjZXx4ZGF8eGlpbm8vaS50ZXN0KFxuICAgICAgICB0XG4gICAgICApIHx8IC8xMjA3fDYzMTB8NjU5MHwzZ3NvfDR0aHB8NTBbMS02XWl8Nzcwc3w4MDJzfGEgd2F8YWJhY3xhYyhlcnxvb3xzLSl8YWkoa298cm4pfGFsKGF2fGNhfGNvKXxhbW9pfGFuKGV4fG55fHl3KXxhcHR1fGFyKGNofGdvKXxhcyh0ZXx1cyl8YXR0d3xhdShkaXwtbXxyIHxzICl8YXZhbnxiZShja3xsbHxucSl8YmkobGJ8cmQpfGJsKGFjfGF6KXxicihlfHYpd3xidW1ifGJ3LShufHUpfGM1NVxcL3xjYXBpfGNjd2F8Y2RtLXxjZWxsfGNodG18Y2xkY3xjbWQtfGNvKG1wfG5kKXxjcmF3fGRhKGl0fGxsfG5nKXxkYnRlfGRjLXN8ZGV2aXxkaWNhfGRtb2J8ZG8oY3xwKW98ZHMoMTJ8LWQpfGVsKDQ5fGFpKXxlbShsMnx1bCl8ZXIoaWN8azApfGVzbDh8ZXooWzQtN10wfG9zfHdhfHplKXxmZXRjfGZseSgtfF8pfGcxIHV8ZzU2MHxnZW5lfGdmLTV8Zy1tb3xnbyhcXC53fG9kKXxncihhZHx1bil8aGFpZXxoY2l0fGhkLShtfHB8dCl8aGVpLXxoaShwdHx0YSl8aHAoIGl8aXApfGhzLWN8aHQoYygtfCB8X3xhfGd8cHxzfHQpfHRwKXxodShhd3x0Yyl8aS0oMjB8Z298bWEpfGkyMzB8aWFjKCB8LXxcXC8pfGlicm98aWRlYXxpZzAxfGlrb218aW0xa3xpbm5vfGlwYXF8aXJpc3xqYSh0fHYpYXxqYnJvfGplbXV8amlnc3xrZGRpfGtlaml8a2d0KCB8XFwvKXxrbG9ufGtwdCB8a3djLXxreW8oY3xrKXxsZShub3x4aSl8bGcoIGd8XFwvKGt8bHx1KXw1MHw1NHwtW2Etd10pfGxpYnd8bHlueHxtMS13fG0zZ2F8bTUwXFwvfG1hKHRlfHVpfHhvKXxtYygwMXwyMXxjYSl8bS1jcnxtZShyY3xyaSl8bWkobzh8b2F8dHMpfG1tZWZ8bW8oMDF8MDJ8Yml8ZGV8ZG98dCgtfCB8b3x2KXx6eil8bXQoNTB8cDF8diApfG13YnB8bXl3YXxuMTBbMC0yXXxuMjBbMi0zXXxuMzAoMHwyKXxuNTAoMHwyfDUpfG43KDAoMHwxKXwxMCl8bmUoKGN8bSktfG9ufHRmfHdmfHdnfHd0KXxub2soNnxpKXxuenBofG8yaW18b3AodGl8d3YpfG9yYW58b3dnMXxwODAwfHBhbihhfGR8dCl8cGR4Z3xwZygxM3wtKFsxLThdfGMpKXxwaGlsfHBpcmV8cGwoYXl8dWMpfHBuLTJ8cG8oY2t8cnR8c2UpfHByb3h8cHNpb3xwdC1nfHFhLWF8cWMoMDd8MTJ8MjF8MzJ8NjB8LVsyLTddfGktKXxxdGVrfHIzODB8cjYwMHxyYWtzfHJpbTl8cm8odmV8em8pfHM1NVxcL3xzYShnZXxtYXxtbXxtc3xueXx2YSl8c2MoMDF8aC18b298cC0pfHNka1xcL3xzZShjKC18MHwxKXw0N3xtY3xuZHxyaSl8c2doLXxzaGFyfHNpZSgtfG0pfHNrLTB8c2woNDV8aWQpfHNtKGFsfGFyfGIzfGl0fHQ1KXxzbyhmdHxueSl8c3AoMDF8aC18di18diApfHN5KDAxfG1iKXx0MigxOHw1MCl8dDYoMDB8MTB8MTgpfHRhKGd0fGxrKXx0Y2wtfHRkZy18dGVsKGl8bSl8dGltLXx0LW1vfHRvKHBsfHNoKXx0cyg3MHxtLXxtM3xtNSl8dHgtOXx1cChcXC5ifGcxfHNpKXx1dHN0fHY0MDB8djc1MHx2ZXJpfHZpKHJnfHRlKXx2ayg0MHw1WzAtM118LXYpfHZtNDB8dm9kYXx2dWxjfHZ4KDUyfDUzfDYwfDYxfDcwfDgwfDgxfDgzfDg1fDk4KXx3M2MoLXwgKXx3ZWJjfHdoaXR8d2koZyB8bmN8bncpfHdtbGJ8d29udXx4NzAwfHlhcy18eW91cnx6ZXRvfHp0ZS0vaS50ZXN0KFxuICAgICAgICB0LnN1YnN0cigwLCA0KVxuICAgICAgKSkgJiYgKGUgPSAhMCk7XG4gICAgfShuYXZpZ2F0b3IudXNlckFnZW50IHx8IG5hdmlnYXRvci52ZW5kb3IgfHwgd2luZG93Lm9wZXJhKSwgZTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgbyBhcyBCYXNlUGF0aFR5cGVFbnVtLFxuICBpIGFzIEJyb3dzZXJVdGlsLFxuICB2IGFzIERldmljZURldGVjdGlvbixcbiAgcCBhcyBEZXZpY2VUeXBlRW51bSxcbiAgdyBhcyBTaXl1YW5EZXZpY2Vcbn07XG4iLCAiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMywgVGVyd2VyIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi5cbiAqXG4gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdFxuICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXNcbiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGVyd2VyIGRlc2lnbmF0ZXMgdGhpc1xuICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlIFwiQ2xhc3NwYXRoXCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkXG4gKiBieSBUZXJ3ZXIgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS5cbiAqXG4gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVRcbiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvclxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdFxuICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uXG4gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sXG4gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuXG4gKlxuICogUGxlYXNlIGNvbnRhY3QgVGVyd2VyLCBTaGVuemhlbiwgR3Vhbmdkb25nLCBDaGluYSwgeW91d2VpY3NAMTYzLmNvbVxuICogb3IgdmlzaXQgd3d3LnRlcndlci5zcGFjZSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55XG4gKiBxdWVzdGlvbnMuXG4gKi9cblxuaW1wb3J0IHsgQnJvd3NlclV0aWwsIFNpeXVhbkRldmljZSB9IGZyb20gXCJ6aGktZGV2aWNlXCJcblxuLyoqXG4gKiBcdTdBOTdcdTUzRTNcdTdCQTFcdTc0MDZcdTU2NjhcbiAqXG4gKiBAYXV0aG9yIHRlcndlclxuICogQHZlcnNpb24gMS4wLjBcbiAqIEBzaW5jZSAxLjAuMFxuICovXG5jbGFzcyBXaW5kb3dNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBsb2dnZXI6IGFueVxuICBwcml2YXRlIGNvbW1vbjogYW55XG5cbiAgaW5pdChsb2dnZXI6IGFueSwgY29tbW9uOiBhbnkpIHtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlclxuICAgIHRoaXMuY29tbW9uID0gY29tbW9uXG4gIH1cblxuICAvKipcbiAgICogXHU2MjUzXHU1RjAwXHU2NUIwXHU3QTk3XHU1M0UzXG4gICAqXG4gICAqIFx1NzkzQVx1NEY4Qlx1RkYxQVxuICAgKlxuICAgKiBgYGBcbiAgICogIyMgZGV2ZWxvcG1lbnRcbiAgICogd2luZG93TWFuYWdlci5vcGVuQnJvd3NlcldpbmRvdyhcImh0dHBzOi8vd3d3LmJhaWR1LmNvbVwiLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdHJ1ZSwgZmFsc2UpXG4gICAqIHdpbmRvd01hbmFnZXIub3BlbkJyb3dzZXJXaW5kb3coXCJodHRwczovL3d3dy5iYWlkdS5jb21cIiwgeyBcImtleTFcIjogXCJ2YWx1ZTFcIiwgXCJrZXkyXCI6IFwidmFsdWUyXCIgfSwgdW5kZWZpbmVkLCB0cnVlLCBmYWxzZSlcbiAgICpcbiAgICogIyMgcHJvZHVjdGlvblxuICAgKiB3aW5kb3dNYW5hZ2VyLm9wZW5Ccm93c2VyV2luZG93KFwiaHR0cHM6Ly93d3cuYmFpZHUuY29tXCIpXG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gdXJsIC0gdXJsXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBcdTUzQzJcdTY1NzBcbiAgICogQHBhcmFtIHdpbiAtIFx1NzIzNlx1N0E5N1x1NTNFM1xuICAgKiBAcGFyYW0gaXNEZXYgLSBcdTY2MkZcdTU0MjZcdTYyNTNcdTVGMDBcdTVGMDBcdTUzRDFcdTgwMDVcdTVERTVcdTUxNzdcbiAgICogQHBhcmFtIG1vZGFsIC0gXHU2NjJGXHU1NDI2XHU2QTIxXHU2MDAxXG4gICAqL1xuICBwdWJsaWMgb3BlbkJyb3dzZXJXaW5kb3codXJsOiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIHdpbj86IGFueSwgaXNEZXYgPSBmYWxzZSwgbW9kYWwgPSBmYWxzZSkge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5jb21tb24uc3RyVXRpbC5pc0VtcHR5U3RyaW5nKHVybCkpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXCJVcmwgY2Fubm90IGJlIGVtcHR5XCIpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoIUJyb3dzZXJVdGlsLmlzRWxlY3Ryb24oKSkge1xuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFwiQnJvd3NlcldpbmRvdyBjYW4gb255IGJlIGF2YWlsYWJsZSBpbiBzaXl1YW4gRWxlY3Ryb24gZW52aXJvbm1lbnRcIilcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgT2JqZWN0LmtleXMocGFyYW1zKS5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyYW1zW2tleV1cbiAgICAgICAgICB1cmwgPSBCcm93c2VyVXRpbC5zZXRVcmxQYXJhbWV0ZXIodXJsLCBrZXksIHZhbHVlKVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKHRoaXMuY29tbW9uLnN0clV0aWwuZihcIk9wZW5pbmcgYSBuZXcgQnJvd3NlcldpbmRvdyBmcm9tIHVybCA9PiB7MH1cIiwgdXJsKSlcblxuICAgICAgY29uc3QgbWFpbldpbiA9IHdpbiA/PyBTaXl1YW5EZXZpY2Uuc2l5dWFuV2luZG93KClcbiAgICAgIGNvbnN0IHsgYXBwLCBCcm93c2VyV2luZG93LCBnZXRDdXJyZW50V2luZG93IH0gPSBtYWluV2luLnJlcXVpcmUoXCJAZWxlY3Ryb24vcmVtb3RlXCIpXG4gICAgICBjb25zdCByZW1vdGUgPSBtYWluV2luLnJlcXVpcmUoXCJAZWxlY3Ryb24vcmVtb3RlXCIpLnJlcXVpcmUoXCJAZWxlY3Ryb24vcmVtb3RlL21haW5cIilcbiAgICAgIGNvbnN0IG1haW5XaW5kb3cgPSBnZXRDdXJyZW50V2luZG93KClcbiAgICAgIGNvbnN0IG5ld1dpbmRvdyA9IG5ldyBCcm93c2VyV2luZG93KHtcbiAgICAgICAgcGFyZW50OiBtYWluV2luZG93LFxuICAgICAgICB3aWR0aDogOTAwLFxuICAgICAgICBoZWlnaHQ6IDc1MCxcbiAgICAgICAgcmVzaXphYmxlOiB0cnVlLFxuICAgICAgICBtb2RhbDogbW9kYWwsXG4gICAgICAgIGljb246IFNpeXVhbkRldmljZS5icm93c2VySm9pblBhdGgoXG4gICAgICAgICAgU2l5dWFuRGV2aWNlLnNpeXVhbldpbmRvdygpLnNpeXVhbi5jb25maWcuc3lzdGVtLmFwcERpcixcbiAgICAgICAgICBcInN0YWdlXCIsXG4gICAgICAgICAgXCJpY29uLWxhcmdlLnBuZ1wiXG4gICAgICAgICksXG4gICAgICAgIHRpdGxlQmFyT3ZlcmxheToge1xuICAgICAgICAgIGNvbG9yOiBcIiNjY2NjY2NhNVwiLFxuICAgICAgICAgIHN5bWJvbENvbG9yOiBcImJsYWNrXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHdlYlByZWZlcmVuY2VzOiB7XG4gICAgICAgICAgbmF0aXZlV2luZG93T3BlbjogdHJ1ZSxcbiAgICAgICAgICBub2RlSW50ZWdyYXRpb246IHRydWUsXG4gICAgICAgICAgd2Vidmlld1RhZzogdHJ1ZSxcbiAgICAgICAgICB3ZWJTZWN1cml0eTogZmFsc2UsXG4gICAgICAgICAgY29udGV4dElzb2xhdGlvbjogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9KVxuXG4gICAgICBuZXdXaW5kb3cud2ViQ29udGVudHMudXNlckFnZW50ID0gYFNpWXVhbi8ke2FwcC5nZXRWZXJzaW9uKCl9IGh0dHBzOi8vYjNsb2cub3JnL3NpeXVhbiBFbGVjdHJvbmBcbiAgICAgIC8vIFx1NTE0MVx1OEJCOFxuICAgICAgcmVtb3RlLmVuYWJsZShuZXdXaW5kb3cud2ViQ29udGVudHMpXG4gICAgICBpZiAoaXNEZXYpIHtcbiAgICAgICAgbmV3V2luZG93LndlYkNvbnRlbnRzLm9wZW5EZXZUb29scygpXG4gICAgICB9XG4gICAgICBuZXdXaW5kb3cubG9hZFVSTCh1cmwpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXCJPcGVuIGJyb3dzZXIgd2luZG93IGZhaWxlZFwiLCBlKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBXaW5kb3dNYW5hZ2VyXG4iLCAiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMywgVGVyd2VyIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi5cbiAqXG4gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdFxuICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXNcbiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGVyd2VyIGRlc2lnbmF0ZXMgdGhpc1xuICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlIFwiQ2xhc3NwYXRoXCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkXG4gKiBieSBUZXJ3ZXIgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS5cbiAqXG4gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVRcbiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvclxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdFxuICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uXG4gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sXG4gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuXG4gKlxuICogUGxlYXNlIGNvbnRhY3QgVGVyd2VyLCBTaGVuemhlbiwgR3Vhbmdkb25nLCBDaGluYSwgeW91d2VpY3NAMTYzLmNvbVxuICogb3IgdmlzaXQgd3d3LnRlcndlci5zcGFjZSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55XG4gKiBxdWVzdGlvbnMuXG4gKi9cblxuaW1wb3J0IFdpbmRvd01hbmFnZXIgZnJvbSBcIi4vV2luZG93TWFuYWdlclwiXG5pbXBvcnQgeyBTaXl1YW5EZXZpY2UgfSBmcm9tIFwiemhpLWRldmljZVwiXG5cbi8qKlxuICogXHU4RkQ5XHU5MUNDXHU3RURGXHU0RTAwXHU2MzAyXHU4RjdEXHU0RTAwXHU0RTJBXHU2NUI5XHU2Q0Q1XHVGRjBDXHU1M0VGXHU0RUU1XHU2MjUzXHU1RjAwIEVsZWN0cm9uIFx1NzY4NCBCcm93c2VyV2luZG93XG4gKlxuICogQGF1dGhvciB0ZXJ3ZXJcbiAqIEB2ZXJzaW9uIDEuMC4wXG4gKiBAc2luY2UgMS4wLjBcbiAqL1xuY2xhc3MgWmhpQnJvd3NlcldpbmRvdyB7XG4gIHByaXZhdGUgbG9nZ2VyOiBhbnlcblxuICBwcml2YXRlIHJlYWRvbmx5IHdpbmRvd01hbmFnZXJcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLndpbmRvd01hbmFnZXIgPSBuZXcgV2luZG93TWFuYWdlcigpXG4gIH1cblxuICBpbml0KGxvZ2dlcjogYW55LCBjb21tb246IGFueSkge1xuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyXG4gICAgdGhpcy53aW5kb3dNYW5hZ2VyLmluaXQobG9nZ2VyLCBjb21tb24pXG4gIH1cblxuICAvKipcbiAgICogXHU2MzAyXHU4RjdEIEJyb3dzZXJXaW5kb3dcbiAgICpcbiAgICogQGF1dGhvciB0ZXJ3ZXJcbiAgICogQHNpbmNlIDEuMC4wXG4gICAqL1xuICBwdWJsaWMgaW5pdEJyb3dzZXJXaW5kb3coKSB7XG4gICAgU2l5dWFuRGV2aWNlLnNpeXVhbldpbmRvdygpLnpoaVdpbmRvdyA9IHRoaXMud2luZG93TWFuYWdlclxuICAgIHRoaXMubG9nZ2VyLmluZm8oXCJ6aGlXaW5kb3cgbW91bnRlZFwiKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFpoaUJyb3dzZXJXaW5kb3dcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7OztBQUFBLElBQUksSUFBSSxPQUFPO0FBQ2YsSUFBSSxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sS0FBSyxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsWUFBWSxNQUFJLGNBQWMsTUFBSSxVQUFVLE1BQUksT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSTtBQUM3RyxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsT0FBTyxFQUFFLEdBQUcsT0FBTyxLQUFLLFdBQVcsSUFBSSxLQUFLLEdBQUcsQ0FBQyxHQUFHO0FBQ2xFLElBQU0sSUFBSSxNQUFNO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJZCxPQUFPLHNCQUFzQjtBQUMzQixXQUFPLEVBQUUsY0FBYyxPQUFPLFNBQVMsS0FBSyxRQUFRLHFCQUFxQixJQUFJLEtBQUs7QUFBQSxFQUNwRjtBQUNGO0FBQ0EsSUFBSSxJQUFJO0FBSVIsRUFBRSxHQUFHLFVBQVUsT0FBTyxVQUFVLEdBQUc7QUFBQTtBQUFBO0FBR25DLEVBQUUsR0FBRyxlQUFlLE9BQU8sU0FBUyxHQUFHO0FBQUE7QUFBQTtBQUd2QyxFQUFFLEdBQUcsb0JBQW9CLEdBQUc7QUFBQTtBQUFBO0FBRzVCLEVBQUUsR0FBRyxjQUFjLE1BQU0sQ0FBQyxFQUFFLGVBQWUsQ0FBQyxPQUFPLGFBQWEsQ0FBQyxPQUFPLFVBQVUsWUFBWSxRQUFLLFdBQVcsS0FBSyxPQUFPLFVBQVUsU0FBUyxDQUFDO0FBQUE7QUFBQTtBQUc5SSxFQUFFLEdBQUcsY0FBYyxNQUFNLEVBQUUsV0FBVyxLQUFLLEVBQUUsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBS25ELEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNO0FBQzVCLE1BQUksQ0FBQyxFQUFFO0FBQ0wsV0FBTztBQUNULFFBQU0sSUFBSSxPQUFPLFNBQVMsT0FBTyxV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 diff --git a/src/constants.ts b/src/constants.ts index 5a1d45fd..629f81da 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,5 +1,6 @@ export const moduleBase = "/plugins/siyuan-publisher" export const pluginDataPath = "/data/storage/petal/siyuan-publisher" +export const isDev = process.env.DEV_MODE === "true" /** * 常量 diff --git a/src/index.ts b/src/index.ts index ffeb3e1f..10a73737 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,7 +6,7 @@ import iconPublish from "~/src/utils/svg" import { Utils } from "~/src/utils/utils" import HtmlUtils from "~/src/utils/htmlUtils" import PageUtil from "~/src/utils/pageUtil" -import { Page } from "~/src/constants" +import { isDev, Page } from "~/src/constants" export default class PublisherPlugin extends Plugin { public fs @@ -41,6 +41,7 @@ export default class PublisherPlugin extends Plugin { SiyuanConstants SiyuanConfig SiYuanApiAdaptor + SiyuanKernelApi } public zhiPublisherSdk: { PublishSdk @@ -51,6 +52,7 @@ export default class PublisherPlugin extends Plugin { public logger // private common public blogApi + public kernelApi // lifecycle async onload() { @@ -89,6 +91,10 @@ export default class PublisherPlugin extends Plugin { this.initMenu(topBarElement.getBoundingClientRect()) }, }) + //添加右键菜单 + topBarElement.addEventListener("contextmenu", () => { + this.showSettingDialog(this.i18n.setting, Page.Setting) + }) } private async initMenu(rect: DOMRect) { @@ -171,7 +177,11 @@ export default class PublisherPlugin extends Plugin { iconHTML: iconPublish.iconPicture, label: this.i18n.picbed, click: () => { - this.showPicbedDialog() + // 使用插件版图床 + // this.showPicbedDialog() + + // 使用挂件版图床 + this.showWidgetPublisherWindow("picgo") }, }) @@ -216,10 +226,10 @@ export default class PublisherPlugin extends Plugin { label: this.i18n.copyPageId, click: async () => { await HtmlUtils.copyToClipboard(pageId) - // this.zhiSiyuanApi.kernelApi.pushMsg({ - // msg: `当前文档ID已复制=>${pageId}`, - // timeout: 3000, - // }) + this.kernelApi.pushMsg({ + msg: `当前文档ID已复制=>${pageId}`, + timeout: 3000, + }) this.logger.info("当前文档ID已复制", pageId) }, }) @@ -247,7 +257,9 @@ export default class PublisherPlugin extends Plugin { new Dialog({ title: `${settingTitle} - ${this.i18n.publisher}`, content: `
`, - width: isMobile() ? "92vw" : "520px", + // width: isMobile() ? "92vw" : "520px", + width: isMobile() ? "92vw" : "900px", + // height: "750px", }) // setting @@ -275,4 +287,71 @@ export default class PublisherPlugin extends Plugin { // setting PageUtil.createApp(Page.Picbed) } + + // widget functions + private showWidgetPublisherDialog(publisherIndex: string) { + const contentHtml = ` + ` + + new Dialog({ + title: this.i18n.siyuanBlog, + transparent: false, + content: contentHtml, + width: "90%", + height: "750px", + } as any) + } + + private showWidgetPublisherWindow(type?: "blog" | "detail" | "picgo") { + const win = window as any + const deviceType = this.zhiDevice.DeviceDetection.getDevice() + this.logger.info(`you are from ${deviceType}`) + + let pageId: string | undefined = PageUtil.getPageId() + if (pageId == "") { + pageId = undefined + } + this.logger.debug("pageId=>", pageId) + + if (deviceType == this.zhiDevice.DeviceTypeEnum.DeviceType_Siyuan_MainWin) { + this.importDep("./libs/plugin-publisher-bridge/index.js").then((bridge) => { + const publisherBridge = new bridge.default() + publisherBridge.init().then(() => { + let pageUrl + switch (type) { + case "blog": + // 博客首页 + pageUrl = "blog/index.html" + break + case "detail": + // 详情 + pageUrl = "detail/index.html" + break + case "picgo": + pageUrl = "picgo/index.html" + break + default: + // 发布首页 + pageUrl = "index.html" + break + } + if (!pageId && pageUrl === "index.html") { + pageUrl = "blog/index.html" + } + + win.syp.renderPublishHelper(pageId, pageUrl, win, isDev) + this.logger.debug("publisherHook inited") + }) + }) + } else { + const publisherIndex = `/widgets/sy-post-publisher/index.html` + this.showWidgetPublisherDialog(publisherIndex) + } + } } diff --git a/src/loader.ts b/src/loader.ts index d85647e0..e44cb897 100644 --- a/src/loader.ts +++ b/src/loader.ts @@ -54,6 +54,7 @@ export const initLibs = async (pluginInstance: PublisherPlugin) => { SiyuanConstants: zhiSiyuanApi["SiyuanConstants"], SiyuanConfig: zhiSiyuanApi["SiyuanConfig"], SiYuanApiAdaptor: zhiSiyuanApi["SiYuanApiAdaptor"], + SiyuanKernelApi: zhiSiyuanApi["SiyuanKernelApi"] } // zhi-publisher-sdk diff --git a/src/tools.ts b/src/tools.ts index f2a174b5..77842556 100644 --- a/src/tools.ts +++ b/src/tools.ts @@ -11,6 +11,9 @@ export const initTools = async (appInstance: PublisherPlugin) => { appInstance.logger = Utils.zhiLog(appInstance, "publisher-index") // this.common = Utils.zhiCommon(appInstance) + // kernelApi + appInstance.kernelApi = Utils.kernelApi(appInstance) + // blogApi appInstance.blogApi = Utils.blogApi(appInstance) } diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 636065ee..f34408d6 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -9,6 +9,8 @@ import PublisherPlugin from "~/src" */ export class Utils { private static env + private static kApi + private static bApi /** * 通用环境变量 @@ -46,20 +48,31 @@ export class Utils { return pluginInstance.zhiCommon.ZhiUtil.zhiCommon() } + public static kernelApi(appInstance: PublisherPlugin) { + if (!this.kApi) { + const cfg = new appInstance.zhiSiyuanApi.SiyuanConfig("", "") + this.kApi = new appInstance.zhiSiyuanApi.SiyuanKernelApi(cfg) + this.kApi.init(appInstance) + } + return this.kApi + } public static blogApi(appInstance: PublisherPlugin, blogType?: any, blogCfg?: any) { - const publishSdk = appInstance.zhiPublisherSdk.PublishSdk - publishSdk.init({ - appInstance: appInstance, - Env: appInstance.zhiEnv.Env, - BlogConstants: appInstance.zhiBlogApi.BlogConstants, - BlogTypeEnum: appInstance.zhiBlogApi.BlogTypeEnum, - SiyuanConstants: appInstance.zhiSiyuanApi.SiyuanConstants, - SiyuanConfig: appInstance.zhiSiyuanApi.SiyuanConfig, - SiYuanApiAdaptor: appInstance.zhiSiyuanApi.SiYuanApiAdaptor, - BlogApi: appInstance.zhiBlogApi.BlogApi, - }) - const type = blogType ?? appInstance.zhiBlogApi.BlogTypeEnum.BlogTypeEnum_Siyuan - const cfg = blogCfg ?? new appInstance.zhiSiyuanApi.SiyuanConfig("", "") - return publishSdk.blogApi(type, cfg) + if (!this.bApi) { + const publishSdk = appInstance.zhiPublisherSdk.PublishSdk + publishSdk.init({ + appInstance: appInstance, + Env: appInstance.zhiEnv.Env, + BlogConstants: appInstance.zhiBlogApi.BlogConstants, + BlogTypeEnum: appInstance.zhiBlogApi.BlogTypeEnum, + SiyuanConstants: appInstance.zhiSiyuanApi.SiyuanConstants, + SiyuanConfig: appInstance.zhiSiyuanApi.SiyuanConfig, + SiYuanApiAdaptor: appInstance.zhiSiyuanApi.SiYuanApiAdaptor, + BlogApi: appInstance.zhiBlogApi.BlogApi, + }) + const type = blogType ?? appInstance.zhiBlogApi.BlogTypeEnum.BlogTypeEnum_Siyuan + const cfg = blogCfg ?? new appInstance.zhiSiyuanApi.SiyuanConfig("", "") + this.bApi = publishSdk.blogApi(type, cfg) + } + return this.bApi } } diff --git a/tsconfig.json b/tsconfig.json index 25558c38..30bf2b9d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -17,10 +17,11 @@ "isolatedModules": true, "noEmit": true, "jsx": "preserve", + /* Linting */ "strict": false, - "noUnusedLocals": true, - "noUnusedParameters": true, + "noUnusedLocals": false, + "noUnusedParameters": false, "noFallthroughCasesInSwitch": true, /* Svelte */