vditor
Version:
♏ 易于使用的 Markdown 编辑器,为适配不同的应用场景而生
74 lines (66 loc) • 3.63 kB
text/typescript
import {Constants} from "../constants";
import {processHeading} from "../ir/process";
import {processHeading as processHeadingSV} from "../sv/process";
import {getEventName, updateHotkeyTip} from "../util/compatibility";
import {afterRenderEvent} from "../wysiwyg/afterRenderEvent";
import {removeHeading, setHeading} from "../wysiwyg/setHeading";
import {MenuItem} from "./MenuItem";
import {hidePanel} from "./setToolbar";
export class Headings extends MenuItem {
public element: HTMLElement;
constructor(vditor: IVditor, menuItem: IMenuItem) {
super(vditor, menuItem);
const panelElement = document.createElement("div");
panelElement.className = "vditor-hint vditor-panel--arrow";
panelElement.innerHTML = `<button data-tag="h1" data-value="# ">${window.VditorI18n.heading1} ${updateHotkeyTip("<⌥⌘1>")}</button>
<button data-tag="h2" data-value="## ">${window.VditorI18n.heading2} <${updateHotkeyTip("⌥⌘2")}></button>
<button data-tag="h3" data-value="### ">${window.VditorI18n.heading3} <${updateHotkeyTip("⌥⌘3")}></button>
<button data-tag="h4" data-value="#### ">${window.VditorI18n.heading4} <${updateHotkeyTip("⌥⌘4")}></button>
<button data-tag="h5" data-value="##### ">${window.VditorI18n.heading5} <${updateHotkeyTip("⌥⌘5")}></button>
<button data-tag="h6" data-value="###### ">${window.VditorI18n.heading6} <${updateHotkeyTip("⌥⌘6")}></button>`;
this.element.appendChild(panelElement);
this._bindEvent(vditor, panelElement);
}
public _bindEvent(vditor: IVditor, panelElement: HTMLElement) {
const actionBtn = this.element.children[0] as HTMLElement;
actionBtn.addEventListener(getEventName(), (event) => {
event.preventDefault();
// https://github.com/Vanessa219/vditor/issues/1391
clearTimeout(vditor.wysiwyg.afterRenderTimeoutId);
clearTimeout(vditor.ir.processTimeoutId);
clearTimeout(vditor.sv.processTimeoutId);
if (actionBtn.classList.contains(Constants.CLASS_MENU_DISABLED)) {
return;
}
actionBtn.blur();
if (actionBtn.classList.contains("vditor-menu--current")) {
if (vditor.currentMode === "wysiwyg") {
removeHeading(vditor);
afterRenderEvent(vditor);
} else if (vditor.currentMode === "ir") {
processHeading(vditor, "");
}
actionBtn.classList.remove("vditor-menu--current");
} else {
hidePanel(vditor, ["subToolbar"]);
panelElement.style.display = "block";
}
});
for (let i = 0; i < 6; i++) {
panelElement.children.item(i).addEventListener(getEventName(), (event: Event) => {
event.preventDefault();
if (vditor.currentMode === "wysiwyg") {
setHeading(vditor, (event.target as HTMLElement).getAttribute("data-tag"));
afterRenderEvent(vditor);
actionBtn.classList.add("vditor-menu--current");
} else if (vditor.currentMode === "ir") {
processHeading(vditor, (event.target as HTMLElement).getAttribute("data-value"));
actionBtn.classList.add("vditor-menu--current");
} else {
processHeadingSV(vditor, (event.target as HTMLElement).getAttribute("data-value"));
}
panelElement.style.display = "none";
});
}
}
}