This commit is contained in:
Vanessa 2023-06-23 16:27:54 +08:00
parent 904735a2eb
commit dfc0a35c05
5 changed files with 51 additions and 13 deletions

View file

@ -17,6 +17,12 @@ export class Plugin {
public eventBus: EventBus; public eventBus: EventBus;
public data: any = {}; public data: any = {};
public name: string; public name: string;
public protyleSlash: {
filter: string[],
html: string,
id: string,
callback: (protyle: import("../protyle").Protyle) => void
}[] = [];
// TODO // TODO
public customBlockRenders: { public customBlockRenders: {
[key: string]: { [key: string]: {

View file

@ -46,13 +46,11 @@ export const hintSlash = (key: string, protyle: IProtyle) => {
filter: ["ai chat"], filter: ["ai chat"],
value: Constants.ZWSP + 5, value: Constants.ZWSP + 5,
html: '<div class="b3-list-item__first"><svg class="b3-list-item__graphic"><use xlink:href="#iconSparkles"></use></svg><span class="b3-list-item__text">AI Chat</span></div>', html: '<div class="b3-list-item__first"><svg class="b3-list-item__graphic"><use xlink:href="#iconSparkles"></use></svg><span class="b3-list-item__text">AI Chat</span></div>',
}, }/*,{
// { filter: ["属性视图", "shuxingshitu", "sxst", "attribute view"],
// filter: ["属性视图", "shuxingshitu", "sxst", "attribute view"], value: '<div data-type="NodeAttributeView" data-av-type="table"></div>',
// value: '<div data-type="NodeAttributeView" data-av-type="table"></div>', html: `<div class="b3-list-item__first"><svg class="b3-list-item__graphic"><use xlink:href="#iconDatabase"></use></svg><span class="b3-list-item__text">${window.siyuan.languages.attributeView}</span></div>`,
// html: `<div class="b3-list-item__first"><svg class="b3-list-item__graphic"><use xlink:href="#iconDatabase"></use></svg><span class="b3-list-item__text">${window.siyuan.languages.attributeView}</span></div>`, }*/, {
// },
{
filter: ["文档", "子文档", "wendang", "wd", "ziwendang", "zwd", "xjwd"], filter: ["文档", "子文档", "wendang", "wd", "ziwendang", "zwd", "xjwd"],
value: Constants.ZWSP + 4, value: Constants.ZWSP + 4,
html: `<div class="b3-list-item__first"><svg class="b3-list-item__graphic"><use xlink:href="#iconFile"></use></svg><span class="b3-list-item__text">${window.siyuan.languages.newFile}</span><span class="b3-menu__accelerator">${updateHotkeyTip(window.siyuan.config.keymap.general.newFile.custom)}</span></div>`, html: `<div class="b3-list-item__first"><svg class="b3-list-item__graphic"><use xlink:href="#iconFile"></use></svg><span class="b3-list-item__text">${window.siyuan.languages.newFile}</span><span class="b3-menu__accelerator">${updateHotkeyTip(window.siyuan.config.keymap.general.newFile.custom)}</span></div>`,
@ -249,6 +247,24 @@ export const hintSlash = (key: string, protyle: IProtyle) => {
value: `style${Constants.ZWSP}`, value: `style${Constants.ZWSP}`,
html: `<div class="b3-list-item__first"><div class="color__square">A</div><span class="b3-list-item__text">${window.siyuan.languages.clearFontStyle}</span></div>`, html: `<div class="b3-list-item__first"><div class="color__square">A</div><span class="b3-list-item__text">${window.siyuan.languages.clearFontStyle}</span></div>`,
}]; }];
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 === "") { if (key === "") {
return allList; 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, id: nodeElement ? nodeElement.getAttribute("data-node-id") : protyle.block.parentID,
beforeLen: Math.floor((Math.max(protyle.element.clientWidth / 2, 320) - 58) / 28.8), beforeLen: Math.floor((Math.max(protyle.element.clientWidth / 2, 320) - 58) / 28.8),
rootID: protyle.block.rootID, rootID: protyle.block.rootID,
isSquareBrackets: ["[[", "【【"].includes(protyle.hint.splitChar) isSquareBrackets: ["[[", "【【"].includes(protyle.hint.splitChar)
}, (response) => { }, (response) => {
const dataList: IHintData[] = []; const dataList: IHintData[] = [];
if (response.data.newDoc) { if (response.data.newDoc) {
@ -322,8 +338,8 @@ export const hintRef = (key: string, protyle: IProtyle, isQuick = false): IHintD
} }
response.data.blocks.forEach((item: IBlock) => { response.data.blocks.forEach((item: IBlock) => {
let iconHTML; let iconHTML;
if (item.type === "NodeDocument" && item.ial.icon){ if (item.type === "NodeDocument" && item.ial.icon) {
iconHTML = unicode2Emoji(item.ial.icon, "b3-list-item__graphic popover__block", true); iconHTML = unicode2Emoji(item.ial.icon, "b3-list-item__graphic popover__block", true);
iconHTML = iconHTML.replace('popover__block"', `popover__block" data-id="${item.id}"`); iconHTML = iconHTML.replace('popover__block"', `popover__block" data-id="${item.id}"`);
} else { } else {
iconHTML = `<svg class="b3-list-item__graphic popover__block" data-id="${item.id}"><use xlink:href="#${getIconByType(item.type)}"></use></svg>`; iconHTML = `<svg class="b3-list-item__graphic popover__block" data-id="${item.id}"><use xlink:href="#${getIconByType(item.type)}"></use></svg>`;
@ -386,8 +402,8 @@ export const hintEmbed = (key: string, protyle: IProtyle): IHintData[] => {
const dataList: IHintData[] = []; const dataList: IHintData[] = [];
response.data.blocks.forEach((item: IBlock) => { response.data.blocks.forEach((item: IBlock) => {
let iconHTML; let iconHTML;
if (item.type === "NodeDocument" && item.ial.icon){ if (item.type === "NodeDocument" && item.ial.icon) {
iconHTML = unicode2Emoji(item.ial.icon, "b3-list-item__graphic popover__block", true); iconHTML = unicode2Emoji(item.ial.icon, "b3-list-item__graphic popover__block", true);
iconHTML = iconHTML.replace('popover__block"', `popover__block" data-id="${item.id}"`); iconHTML = iconHTML.replace('popover__block"', `popover__block" data-id="${item.id}"`);
} else { } else {
iconHTML = `<svg class="b3-list-item__graphic popover__block" data-id="${item.id}"><use xlink:href="#${getIconByType(item.type)}"></use></svg>`; iconHTML = `<svg class="b3-list-item__graphic popover__block" data-id="${item.id}"><use xlink:href="#${getIconByType(item.type)}"></use></svg>`;
@ -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) { } else if (protyle.block.showAll && parentElement.classList.contains("protyle-wysiwyg") && parentElement.childElementCount === 0) {
setTimeout(() => { 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); }, Constants.TIMEOUT_INPUT * 2 + 100);
} else if (parentElement.classList.contains("protyle-wysiwyg") && parentElement.innerHTML === "" && } else if (parentElement.classList.contains("protyle-wysiwyg") && parentElement.innerHTML === "" &&
!hasClosestByClassName(parentElement, "block__edit", true) && !hasClosestByClassName(parentElement, "block__edit", true) &&

View file

@ -619,6 +619,20 @@ ${unicode2Emoji(emoji.unicode)}</button>`;
nodeElement.setAttribute("style", value.split(Constants.ZWSP)[1] || ""); nodeElement.setAttribute("style", value.split(Constants.ZWSP)[1] || "");
updateTransaction(protyle, id, nodeElement.outerHTML, html); updateTransaction(protyle, id, nodeElement.outerHTML, html);
return; 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 { } else {
range.deleteContents(); range.deleteContents();
if (value !== "![]()") { if (value !== "![]()") {

View file

@ -46,6 +46,7 @@ export class Protyle {
const mergedOptions = getOptions.merge(); const mergedOptions = getOptions.merge();
this.protyle = { this.protyle = {
getInstance: () => this,
app, app,
transactionTime: new Date().getTime(), transactionTime: new Date().getTime(),
id: genUUID(), id: genUUID(),

View file

@ -407,6 +407,7 @@ interface IOptions {
} }
interface IProtyle { interface IProtyle {
getInstance: () => import("../protyle").Protyle,
app: import("../index").App, app: import("../index").App,
transactionTime: number, transactionTime: number,
id: string, id: string,