Explorar o código

Improve event bus `open-siyuan-url-plugin` (#9256)

* :art: Improve plugin event bus `open-siyuan-url-plugin`

* :bug: Avoid plug-in names with the same prefix

* Update onGetConfig.ts
Yingyi / 颖逸 hai 1 ano
pai
achega
11786381cf
Modificáronse 2 ficheiros con 43 adicións e 23 borrados
  1. 35 23
      app/src/boot/onGetConfig.ts
  2. 8 0
      app/src/util/functions.ts

+ 35 - 23
app/src/boot/onGetConfig.ts

@@ -15,7 +15,7 @@ import {renderSnippet} from "../config/util/snippets";
 import {openFile, openFileById} from "../editor/util";
 import {focusByRange} from "../protyle/util/selection";
 import {exitSiYuan} from "../dialog/processSystem";
-import {getSearch, isWindow} from "../util/functions";
+import {getSearch, isWindow, trimPrefix} from "../util/functions";
 import {initStatus} from "../layout/status";
 import {showMessage} from "../dialog/message";
 import {replaceLocalPath} from "../editor/rename";
@@ -247,39 +247,51 @@ export const initWindow = async (app: App) => {
     });
     if (!isWindow()) {
         ipcRenderer.on(Constants.SIYUAN_OPEN_URL, (event, url) => {
-            if (url.startsWith("siyuan://plugins/")) {
-                const pluginId = url.replace("siyuan://plugins/", "").split("?")[0];
-                if (!pluginId) {
+            try {
+                var urlObj = new URL(url);
+                if (urlObj.protocol !== "siyuan:") {
                     return;
                 }
-                app.plugins.find(plugin => {
-                    if (pluginId.startsWith(plugin.name)) {
+            } catch (error) {
+                return;
+            }
+            if (urlObj.pathname.startsWith("//plugins/")) {
+                const pluginPathname = trimPrefix(urlObj.pathname, "//plugins/");
+                if (!pluginPathname) {
+                    return;
+                }
+                const pluginId = pluginPathname.split("/")[0];
+                app.plugins.forEach(plugin => {
+                    if (pluginPathname.startsWith(plugin.name)) {
                         // siyuan://plugins/plugin-name/foo?bar=baz
                         plugin.eventBus.emit("open-siyuan-url-plugin", {url});
-                        // siyuan://plugins/plugin-samplecustom_tab?title=自定义页签&icon=iconFace&data={"text": "This is the custom plugin tab I opened via protocol."}
-                        let data = getSearch("data", url);
-                        try {
-                            data = JSON.parse(data || "{}");
-                        } catch (e) {
-                            console.log("Error open plugin tab with protocol:", e);
+
+                        // https://github.com/siyuan-note/siyuan/pull/9256
+                        if (pluginId !== plugin.name) {
+                            // siyuan://plugins/plugin-samplecustom_tab?title=自定义页签&icon=iconFace&data={"text": "This is the custom plugin tab I opened via protocol."}
+                            let data = urlObj.searchParams.get("data");
+                            try {
+                                data = JSON.parse(data || "{}");
+                            } catch (e) {
+                                console.log("Error open plugin tab with protocol:", e);
+                            }
+                            openFile({
+                                app,
+                                custom: {
+                                    title: urlObj.searchParams.get("title"),
+                                    icon: urlObj.searchParams.get("icon"),
+                                    data,
+                                    id: pluginPathname
+                                },
+                            });
                         }
-                        openFile({
-                            app,
-                            custom: {
-                                title: getSearch("title", url),
-                                icon: getSearch("icon", url),
-                                data,
-                                id: pluginId
-                            },
-                        });
-                        return true;
                     }
                 });
                 return;
             }
             if (isSYProtocol(url)) {
                 const id = getIdFromSYProtocol(url);
-                const focus = getSearch("focus", url) === "1";
+                const focus = urlObj.searchParams.get("focus") === "1";
                 fetchPost("/api/block/checkBlockExist", {id}, existResponse => {
                     if (existResponse.data) {
                         openFileById({

+ 8 - 0
app/src/util/functions.ts

@@ -90,3 +90,11 @@ export const objEquals = (a: any, b: any): boolean => {
     if (keys.length !== Object.keys(b).length) return false;
     return keys.every(k => objEquals(a[k], b[k]));
 };
+
+export const trimPrefix = (str: string, prefix: string) => {
+    return str.startsWith(prefix) ? str.slice(prefix.length) : str;
+}
+
+export const trimSuffix = (str: string, suffix: string) => {
+    return str.endsWith(suffix) ? str.slice(0, -suffix.length) : str;
+}