diff --git a/app/src/plugin/index.ts b/app/src/plugin/index.ts index dad5a52b1..0721db474 100644 --- a/app/src/plugin/index.ts +++ b/app/src/plugin/index.ts @@ -17,6 +17,12 @@ export class Plugin { public eventBus: EventBus; public data: any = {}; public name: string; + public protyleSlash: { + filter: string[], + html: string, + id: string, + callback: (protyle: import("../protyle").Protyle) => void + }[] = []; // TODO public customBlockRenders: { [key: string]: { diff --git a/app/src/protyle/hint/extend.ts b/app/src/protyle/hint/extend.ts index b05b69d1f..0e86d5278 100644 --- a/app/src/protyle/hint/extend.ts +++ b/app/src/protyle/hint/extend.ts @@ -46,13 +46,11 @@ export const hintSlash = (key: string, protyle: IProtyle) => { filter: ["ai chat"], value: Constants.ZWSP + 5, html: '
AI Chat
', - }, - // { - // filter: ["属性视图", "shuxingshitu", "sxst", "attribute view"], - // value: '
', - // html: `
${window.siyuan.languages.attributeView}
`, - // }, - { + }/*,{ + filter: ["属性视图", "shuxingshitu", "sxst", "attribute view"], + value: '
', + html: `
${window.siyuan.languages.attributeView}
`, + }*/, { filter: ["文档", "子文档", "wendang", "wd", "ziwendang", "zwd", "xjwd"], value: Constants.ZWSP + 4, html: `
${window.siyuan.languages.newFile}${updateHotkeyTip(window.siyuan.config.keymap.general.newFile.custom)}
`, @@ -249,6 +247,24 @@ export const hintSlash = (key: string, protyle: IProtyle) => { value: `style${Constants.ZWSP}`, html: `
A
${window.siyuan.languages.clearFontStyle}
`, }]; + allList.push({ + value: "", + html: "separator", + }); + let hasPlugin = false; + protyle.app.plugins.forEach((plugin) => { + plugin.protyleSlash.forEach(slash => { + allList.push({ + filter: slash.filter, + value: `plugin${Constants.ZWSP}${plugin.name}${Constants.ZWSP}${slash.id}`, + html: slash.html + }); + hasPlugin = true; + }); + }); + if (!hasPlugin) { + allList.pop(); + } if (key === "") { return allList; } @@ -309,7 +325,7 @@ export const hintRef = (key: string, protyle: IProtyle, isQuick = false): IHintD id: nodeElement ? nodeElement.getAttribute("data-node-id") : protyle.block.parentID, beforeLen: Math.floor((Math.max(protyle.element.clientWidth / 2, 320) - 58) / 28.8), rootID: protyle.block.rootID, - isSquareBrackets: ["[[", "【【"].includes(protyle.hint.splitChar) + isSquareBrackets: ["[[", "【【"].includes(protyle.hint.splitChar) }, (response) => { const dataList: IHintData[] = []; if (response.data.newDoc) { @@ -322,8 +338,8 @@ export const hintRef = (key: string, protyle: IProtyle, isQuick = false): IHintD } response.data.blocks.forEach((item: IBlock) => { let iconHTML; - if (item.type === "NodeDocument" && item.ial.icon){ - iconHTML = unicode2Emoji(item.ial.icon, "b3-list-item__graphic popover__block", true); + if (item.type === "NodeDocument" && item.ial.icon) { + iconHTML = unicode2Emoji(item.ial.icon, "b3-list-item__graphic popover__block", true); iconHTML = iconHTML.replace('popover__block"', `popover__block" data-id="${item.id}"`); } else { iconHTML = ``; @@ -386,8 +402,8 @@ export const hintEmbed = (key: string, protyle: IProtyle): IHintData[] => { const dataList: IHintData[] = []; response.data.blocks.forEach((item: IBlock) => { let iconHTML; - if (item.type === "NodeDocument" && item.ial.icon){ - iconHTML = unicode2Emoji(item.ial.icon, "b3-list-item__graphic popover__block", true); + if (item.type === "NodeDocument" && item.ial.icon) { + iconHTML = unicode2Emoji(item.ial.icon, "b3-list-item__graphic popover__block", true); iconHTML = iconHTML.replace('popover__block"', `popover__block" data-id="${item.id}"`); } else { iconHTML = ``; @@ -514,7 +530,7 @@ export const hintMoveBlock = (pathString: string, sourceElements: Element[], pro }); } else if (protyle.block.showAll && parentElement.classList.contains("protyle-wysiwyg") && parentElement.childElementCount === 0) { setTimeout(() => { - zoomOut({protyle, id: protyle.block.parent2ID, focusId:protyle.block.parent2ID}); + zoomOut({protyle, id: protyle.block.parent2ID, focusId: protyle.block.parent2ID}); }, Constants.TIMEOUT_INPUT * 2 + 100); } else if (parentElement.classList.contains("protyle-wysiwyg") && parentElement.innerHTML === "" && !hasClosestByClassName(parentElement, "block__edit", true) && diff --git a/app/src/protyle/hint/index.ts b/app/src/protyle/hint/index.ts index c3f5098b1..1c439b1ee 100644 --- a/app/src/protyle/hint/index.ts +++ b/app/src/protyle/hint/index.ts @@ -619,6 +619,20 @@ ${unicode2Emoji(emoji.unicode)}`; nodeElement.setAttribute("style", value.split(Constants.ZWSP)[1] || ""); updateTransaction(protyle, id, nodeElement.outerHTML, html); return; + } else if (value.startsWith("plugin")) { + protyle.app.plugins.find((plugin) => { + const ids = value.split(Constants.ZWSP) + if (ids[1] === plugin.name) { + plugin.protyleSlash.find((slash) => { + if (slash.id === ids[2]){ + slash.callback(protyle.getInstance()); + return true; + } + }) + return true; + } + }) + return; } else { range.deleteContents(); if (value !== "![]()") { diff --git a/app/src/protyle/index.ts b/app/src/protyle/index.ts index da228970a..660161f65 100644 --- a/app/src/protyle/index.ts +++ b/app/src/protyle/index.ts @@ -46,6 +46,7 @@ export class Protyle { const mergedOptions = getOptions.merge(); this.protyle = { + getInstance: () => this, app, transactionTime: new Date().getTime(), id: genUUID(), diff --git a/app/src/types/protyle.d.ts b/app/src/types/protyle.d.ts index 3888c5796..a0c8e989c 100644 --- a/app/src/types/protyle.d.ts +++ b/app/src/types/protyle.d.ts @@ -407,6 +407,7 @@ interface IOptions { } interface IProtyle { + getInstance: () => import("../protyle").Protyle, app: import("../index").App, transactionTime: number, id: string,