vditor
Version:
♏ 易于使用的 Markdown 编辑器,为适配不同的应用场景而生
100 lines (87 loc) • 4.08 kB
text/typescript
import {getMarkdown} from "../markdown/getMarkdown";
import {accessLocalStorage} from "../util/compatibility";
export const replaceSelection = (vditor: IVditor, text: string, selectionMode: SelectionMode = "end") => {
const element = vditor.sv.element;
element.setRangeText(text, element.selectionStart, element.selectionEnd, selectionMode);
element.focus();
};
export const processPaste = (vditor: IVditor, text: string) => {
replaceSelection(vditor, text);
};
export const processAfterRender = (vditor: IVditor, options = {
enableAddUndoStack: true,
enableHint: false,
enableInput: true,
}) => {
vditor.preview.render(vditor);
const text = getMarkdown(vditor);
if (typeof vditor.options.input === "function" && options.enableInput) {
vditor.options.input(text);
}
if (vditor.options.counter.enable) {
vditor.counter.render(vditor, text);
}
if (vditor.options.cache.enable && accessLocalStorage()) {
localStorage.setItem(vditor.options.cache.id, text);
if (vditor.options.cache.after) {
vditor.options.cache.after(text);
}
}
if (vditor.devtools) {
vditor.devtools.renderEchart(vditor);
}
clearTimeout(vditor.sv.processTimeoutId);
vditor.sv.processTimeoutId = window.setTimeout(() => {
if (options.enableAddUndoStack && !vditor.sv.composingLock) {
vditor.undo.addToUndoStack(vditor);
}
}, vditor.options.undoDelay);
};
export const processHeading = (vditor: IVditor, value: string) => {
const element = vditor.sv.element;
const lineStart = element.value.lastIndexOf("\n", element.selectionStart - 1) + 1;
const lineEndIndex = element.value.indexOf("\n", element.selectionEnd);
const lineEnd = lineEndIndex === -1 ? element.value.length : lineEndIndex;
const selectedLines = element.value.substring(lineStart, lineEnd);
const heading = value ? value + selectedLines.replace(/^#{1,6}\s+/, "") : selectedLines.replace(/^#{1,6}\s+/, "");
element.setRangeText(heading, lineStart, lineEnd, "select");
element.focus();
processAfterRender(vditor);
};
export const processToolbar = (vditor: IVditor, actionBtn: Element, prefix: string, suffix: string) => {
const element = vditor.sv.element;
const commandName = actionBtn.getAttribute("data-type");
const start = element.selectionStart;
const end = element.selectionEnd;
const selectedText = element.value.substring(start, end);
let text = "";
let selectionStart = start + prefix.length;
let selectionEnd = selectionStart + selectedText.length;
if (commandName === "check" || commandName === "list" || commandName === "ordered-list" ||
commandName === "quote") {
const lineStart = element.value.lastIndexOf("\n", start - 1) + 1;
const lineEndIndex = element.value.indexOf("\n", end);
const lineEnd = lineEndIndex === -1 ? element.value.length : lineEndIndex;
const lines = element.value.substring(lineStart, lineEnd);
text = lines.split("\n").map((line) => prefix + line).join("\n");
element.setRangeText(text, lineStart, lineEnd, "select");
} else if (commandName === "line") {
text = `${start === 0 ? "" : "\n\n"}${prefix}\n`;
element.setRangeText(text, start, end, "end");
} else if (commandName === "code") {
text = `${prefix}\n${selectedText}${suffix}`;
element.setRangeText(text, start, end, "end");
selectionStart = start + prefix.length + 1;
selectionEnd = selectionStart + selectedText.length;
element.setSelectionRange(selectionStart, selectionEnd);
} else if (commandName === "table") {
text = `${start === 0 ? "" : "\n\n"}${prefix}${suffix}`;
element.setRangeText(text, start, end, "end");
} else {
text = `${prefix}${selectedText}${suffix}`;
element.setRangeText(text, start, end, "end");
element.setSelectionRange(selectionStart, selectionEnd);
}
element.focus();
processAfterRender(vditor);
};