mirror of
https://github.com/siyuan-note/siyuan.git
synced 2026-02-24 16:04:06 +01:00
Improve right-click menu paste (#15286)
* 🎨 Improve right-click menu paste * 🎨 Improve right-click menu paste
This commit is contained in:
parent
62d560e7a8
commit
280f97ee81
3 changed files with 51 additions and 6 deletions
|
|
@ -2,6 +2,22 @@ import {focusByRange} from "./selection";
|
|||
import {fetchPost} from "../../util/fetch";
|
||||
import {Constants} from "../../constants";
|
||||
|
||||
export const encodeBase64 = (text: string): string => {
|
||||
const encoder = new TextEncoder();
|
||||
const bytes = encoder.encode(text);
|
||||
const binaryString = String.fromCharCode(...bytes);
|
||||
const base64 = btoa(binaryString);
|
||||
return base64;
|
||||
};
|
||||
|
||||
export const decodeBase64 = (base64: string): string => {
|
||||
const decoder = new TextDecoder();
|
||||
const binaryString = atob(base64);
|
||||
const bytes = Uint8Array.from(binaryString, char => char.charCodeAt(0));
|
||||
const text = decoder.decode(bytes);
|
||||
return text;
|
||||
};
|
||||
|
||||
export const openByMobile = (uri: string) => {
|
||||
if (!uri) {
|
||||
return;
|
||||
|
|
@ -58,14 +74,27 @@ export const readClipboard = async () => {
|
|||
const text: {
|
||||
textHTML?: string,
|
||||
textPlain?: string,
|
||||
siyuanHTML?: string,
|
||||
files?: File[],
|
||||
} = {textPlain: "", textHTML: ""};
|
||||
} = {textPlain: "", textHTML: "", siyuanHTML: ""};
|
||||
try {
|
||||
const clipboardContents = await navigator.clipboard.read();
|
||||
for (const item of clipboardContents) {
|
||||
if (item.types.includes("text/html")) {
|
||||
const blob = await item.getType("text/html");
|
||||
text.textHTML = await blob.text();
|
||||
|
||||
// 从 text/html 中的注释节点提取 text/siyuan 数据
|
||||
const siyuanMatch = text.textHTML.match(/<!--siyuan-data:([^>]+)-->/);
|
||||
if (siyuanMatch) {
|
||||
try {
|
||||
text.siyuanHTML = decodeBase64(siyuanMatch[1]);
|
||||
// 移除注释节点,保持原有的 text/html 内容
|
||||
text.textHTML = text.textHTML.replace(/<!--siyuan-data:[^>]+-->/, "");
|
||||
} catch (e) {
|
||||
console.log("Failed to decode siyuan data from HTML comment:", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (item.types.includes("text/plain")) {
|
||||
const blob = await item.getType("text/plain");
|
||||
|
|
|
|||
|
|
@ -248,6 +248,7 @@ const readLocalFile = async (protyle: IProtyle, localFiles: string[]) => {
|
|||
export const paste = async (protyle: IProtyle, event: (ClipboardEvent | DragEvent | {
|
||||
textHTML?: string,
|
||||
textPlain?: string,
|
||||
siyuanHTML?: string,
|
||||
files?: File[],
|
||||
}) & {
|
||||
target: HTMLElement
|
||||
|
|
@ -275,6 +276,7 @@ export const paste = async (protyle: IProtyle, event: (ClipboardEvent | DragEven
|
|||
} else {
|
||||
textHTML = event.textHTML;
|
||||
textPlain = event.textPlain;
|
||||
siyuanHTML = event.siyuanHTML;
|
||||
files = event.files;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue