mirror of
https://github.com/siyuan-note/siyuan.git
synced 2026-01-05 00:08:49 +01:00
This commit is contained in:
parent
c4c3d880a1
commit
807aabfe7a
2 changed files with 122 additions and 76 deletions
|
|
@ -566,49 +566,54 @@ export class Gutter {
|
|||
}).element);
|
||||
}
|
||||
}
|
||||
const copyMenu: IMenu[] = [{
|
||||
label: window.siyuan.languages.copy,
|
||||
accelerator: "⌘C",
|
||||
click() {
|
||||
if (isNotEditBlock(selectsElement[0])) {
|
||||
let html = "";
|
||||
selectsElement.forEach(item => {
|
||||
html += removeEmbed(item);
|
||||
});
|
||||
writeText(protyle.lute.BlockDOM2StdMd(html).trimEnd());
|
||||
} else {
|
||||
focusByRange(getEditorRange(selectsElement[0]));
|
||||
document.execCommand("copy");
|
||||
}
|
||||
}
|
||||
}, {
|
||||
label: window.siyuan.languages.copyPlainText,
|
||||
accelerator: window.siyuan.config.keymap.editor.general.copyPlainText.custom,
|
||||
click() {
|
||||
let html = "";
|
||||
selectsElement.forEach(item => {
|
||||
item.querySelectorAll("[spellcheck]").forEach(editItem => {
|
||||
const cloneNode = editItem.cloneNode(true) as HTMLElement;
|
||||
cloneNode.querySelectorAll('[data-type="backslash"]').forEach(slashItem => {
|
||||
slashItem.firstElementChild.remove();
|
||||
});
|
||||
html += cloneNode.textContent + "\n";
|
||||
});
|
||||
});
|
||||
copyPlainText(html.trimEnd());
|
||||
}
|
||||
}, {
|
||||
label: window.siyuan.languages.duplicate,
|
||||
accelerator: window.siyuan.config.keymap.editor.general.duplicate.custom,
|
||||
disabled: protyle.disabled,
|
||||
click() {
|
||||
duplicateBlock(selectsElement, protyle);
|
||||
}
|
||||
}]
|
||||
const copyTextRefMenu = this.genCopyTextRef(selectsElement)
|
||||
if (copyTextRefMenu) {
|
||||
copyMenu.splice(2, 0, copyTextRefMenu);
|
||||
}
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
label: window.siyuan.languages.copy,
|
||||
icon: "iconCopy",
|
||||
type: "submenu",
|
||||
submenu: [{
|
||||
label: window.siyuan.languages.copy,
|
||||
accelerator: "⌘C",
|
||||
click() {
|
||||
if (isNotEditBlock(selectsElement[0])) {
|
||||
let html = "";
|
||||
selectsElement.forEach(item => {
|
||||
html += removeEmbed(item);
|
||||
});
|
||||
writeText(protyle.lute.BlockDOM2StdMd(html).trimEnd());
|
||||
} else {
|
||||
focusByRange(getEditorRange(selectsElement[0]));
|
||||
document.execCommand("copy");
|
||||
}
|
||||
}
|
||||
}, {
|
||||
label: window.siyuan.languages.copyPlainText,
|
||||
accelerator: window.siyuan.config.keymap.editor.general.copyPlainText.custom,
|
||||
click() {
|
||||
let html = "";
|
||||
selectsElement.forEach(item => {
|
||||
item.querySelectorAll("[spellcheck]").forEach(editItem => {
|
||||
const cloneNode = editItem.cloneNode(true) as HTMLElement;
|
||||
cloneNode.querySelectorAll('[data-type="backslash"]').forEach(slashItem => {
|
||||
slashItem.firstElementChild.remove();
|
||||
});
|
||||
html += cloneNode.textContent + "\n";
|
||||
});
|
||||
});
|
||||
copyPlainText(html.trimEnd());
|
||||
}
|
||||
}, {
|
||||
label: window.siyuan.languages.duplicate,
|
||||
accelerator: window.siyuan.config.keymap.editor.general.duplicate.custom,
|
||||
disabled: protyle.disabled,
|
||||
click() {
|
||||
duplicateBlock(selectsElement, protyle);
|
||||
}
|
||||
}]
|
||||
submenu: copyMenu,
|
||||
}).element);
|
||||
if (protyle.disabled) {
|
||||
return;
|
||||
|
|
@ -948,43 +953,48 @@ export class Gutter {
|
|||
submenu: turnIntoSubmenu
|
||||
}).element);
|
||||
}
|
||||
const copyMenu = (copySubMenu(id, true, nodeElement) as IMenu[]).concat([{
|
||||
label: window.siyuan.languages.copy,
|
||||
accelerator: "⌘C",
|
||||
click() {
|
||||
if (isNotEditBlock(nodeElement)) {
|
||||
writeText(protyle.lute.BlockDOM2StdMd(removeEmbed(nodeElement)).trimEnd());
|
||||
} else {
|
||||
focusByRange(getEditorRange(nodeElement));
|
||||
document.execCommand("copy");
|
||||
}
|
||||
}
|
||||
}, {
|
||||
label: window.siyuan.languages.copyPlainText,
|
||||
accelerator: window.siyuan.config.keymap.editor.general.copyPlainText.custom,
|
||||
click() {
|
||||
let text = "";
|
||||
nodeElement.querySelectorAll("[spellcheck]").forEach(item => {
|
||||
const cloneNode = item.cloneNode(true) as HTMLElement;
|
||||
cloneNode.querySelectorAll('[data-type="backslash"]').forEach(slashItem => {
|
||||
slashItem.firstElementChild.remove();
|
||||
});
|
||||
text += cloneNode.textContent + "\n";
|
||||
});
|
||||
copyPlainText(text.trimEnd());
|
||||
}
|
||||
}, {
|
||||
label: window.siyuan.languages.duplicate,
|
||||
accelerator: window.siyuan.config.keymap.editor.general.duplicate.custom,
|
||||
disabled: protyle.disabled,
|
||||
click() {
|
||||
duplicateBlock([nodeElement], protyle);
|
||||
}
|
||||
}])
|
||||
const copyTextRefMenu = this.genCopyTextRef([nodeElement])
|
||||
if (copyTextRefMenu) {
|
||||
copyMenu.splice(copyMenu.length - 1, 0, copyTextRefMenu);
|
||||
}
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
label: window.siyuan.languages.copy,
|
||||
icon: "iconCopy",
|
||||
type: "submenu",
|
||||
submenu: (copySubMenu(id, true, nodeElement) as IMenu[]).concat([{
|
||||
label: window.siyuan.languages.copy,
|
||||
accelerator: "⌘C",
|
||||
click() {
|
||||
if (isNotEditBlock(nodeElement)) {
|
||||
writeText(protyle.lute.BlockDOM2StdMd(removeEmbed(nodeElement)).trimEnd());
|
||||
} else {
|
||||
focusByRange(getEditorRange(nodeElement));
|
||||
document.execCommand("copy");
|
||||
}
|
||||
}
|
||||
}, {
|
||||
label: window.siyuan.languages.copyPlainText,
|
||||
accelerator: window.siyuan.config.keymap.editor.general.copyPlainText.custom,
|
||||
click() {
|
||||
let text = "";
|
||||
nodeElement.querySelectorAll("[spellcheck]").forEach(item => {
|
||||
const cloneNode = item.cloneNode(true) as HTMLElement;
|
||||
cloneNode.querySelectorAll('[data-type="backslash"]').forEach(slashItem => {
|
||||
slashItem.firstElementChild.remove();
|
||||
});
|
||||
text += cloneNode.textContent + "\n";
|
||||
});
|
||||
copyPlainText(text.trimEnd());
|
||||
}
|
||||
}, {
|
||||
label: window.siyuan.languages.duplicate,
|
||||
accelerator: window.siyuan.config.keymap.editor.general.duplicate.custom,
|
||||
disabled: protyle.disabled,
|
||||
click() {
|
||||
duplicateBlock([nodeElement], protyle);
|
||||
}
|
||||
}])
|
||||
submenu: copyMenu
|
||||
}).element);
|
||||
if (!protyle.disabled) {
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
|
|
@ -1431,7 +1441,7 @@ export class Gutter {
|
|||
updateHTML = `${window.siyuan.languages.modifiedAt} ${dayjs(updateHTML).format("YYYY-MM-DD HH:mm:ss")}<br>`;
|
||||
}
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
iconHTML:Constants.ZWSP,
|
||||
iconHTML: Constants.ZWSP,
|
||||
type: "readonly",
|
||||
label: `${updateHTML}${window.siyuan.languages.createdAt} ${dayjs(id.substr(0, 14)).format("YYYY-MM-DD HH:mm:ss")}`,
|
||||
}).element);
|
||||
|
|
@ -1718,6 +1728,21 @@ export class Gutter {
|
|||
}]);
|
||||
}
|
||||
|
||||
private genCopyTextRef(selectsElement: Element[]): false | IMenu {
|
||||
if (isNotEditBlock(selectsElement[0])) {
|
||||
return false
|
||||
}
|
||||
return {
|
||||
label: `${window.siyuan.languages.copy} ${window.siyuan.languages.text} *`,
|
||||
click() {
|
||||
// 用于标识复制文本 *
|
||||
selectsElement[0].setAttribute("data-reftext", "true")
|
||||
focusByRange(getEditorRange(selectsElement[0]));
|
||||
document.execCommand("copy");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public render(protyle: IProtyle, element: Element, wysiwyg: HTMLElement) {
|
||||
// https://github.com/siyuan-note/siyuan/issues/4659
|
||||
const titleElement = wysiwyg.parentElement.querySelector(".protyle-title__input");
|
||||
|
|
|
|||
|
|
@ -214,14 +214,35 @@ export class WYSIWYG {
|
|||
let html = "";
|
||||
let textPlain = "";
|
||||
if (selectElements.length > 0) {
|
||||
const isRefText = selectElements[0].getAttribute("data-reftext") === "true"
|
||||
if (selectElements[0].getAttribute("data-type") === "NodeListItem" &&
|
||||
selectElements[0].parentElement.classList.contains("list") && // 反链复制列表项 https://github.com/siyuan-note/siyuan/issues/6555
|
||||
selectElements[0].parentElement.childElementCount - 1 === selectElements.length) {
|
||||
html = selectElements[0].parentElement.outerHTML;
|
||||
if (isRefText) {
|
||||
const cloneElement = selectElements[0].parentElement.cloneNode(true) as HTMLElement
|
||||
const cloneEditElement = getContenteditableElement(cloneElement)
|
||||
if (cloneEditElement) {
|
||||
cloneEditElement.insertAdjacentHTML("beforeend", ` <span data-type="block-ref" data-subtype="s" data-id="${cloneElement.getAttribute("data-node-id")}">*</span>`)
|
||||
}
|
||||
html = cloneElement.outerHTML;
|
||||
selectElements[0].removeAttribute("data-reftext")
|
||||
} else {
|
||||
html = selectElements[0].parentElement.outerHTML;
|
||||
}
|
||||
} else {
|
||||
selectElements.forEach(item => {
|
||||
selectElements.forEach((item, index) => {
|
||||
const topElement = getTopAloneElement(item);
|
||||
html += removeEmbed(topElement);
|
||||
if (isRefText && index === 0) {
|
||||
const cloneElement = topElement.cloneNode(true) as HTMLElement
|
||||
const cloneEditElement = getContenteditableElement(cloneElement)
|
||||
if (cloneEditElement) {
|
||||
cloneEditElement.insertAdjacentHTML("beforeend", ` <span data-type="block-ref" data-subtype="s" data-id="${topElement.getAttribute("data-node-id")}">*</span>`)
|
||||
}
|
||||
html += removeEmbed(cloneElement);
|
||||
selectElements[0].removeAttribute("data-reftext")
|
||||
} else {
|
||||
html += removeEmbed(topElement);
|
||||
}
|
||||
});
|
||||
}
|
||||
} else {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue