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}
`,
@@ -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,