import {getAllModels} from "../layout/getAll"; import {setInlineStyle} from "../util/assets"; import {fetchPost} from "../util/fetch"; import {confirmDialog} from "../dialog/confirmDialog"; import {setPadding} from "../protyle/ui/initUI"; import {reloadProtyle} from "../protyle/util/reload"; import {updateHotkeyTip} from "../protyle/util/compatibility"; export const editor = { element: undefined as Element, setReadonly: (readOnly?: boolean) => { if (typeof readOnly === "undefined") { readOnly = document.querySelector("#barReadonly").getAttribute("aria-label") === `${window.siyuan.languages.use} ${window.siyuan.languages.editReadonly} ${updateHotkeyTip(window.siyuan.config.keymap.general.editMode.custom)}`; } window.siyuan.config.editor.readOnly = readOnly; fetchPost("/api/setting/setEditor", window.siyuan.config.editor); }, genHTML: () => { let fontFamilyHTML = ""; fontFamilyHTML = ''; return ` ${window.siyuan.languages.fullWidth} ${window.siyuan.languages.fullWidthTip} ${window.siyuan.languages.justify} ${window.siyuan.languages.justifyTip} ${window.siyuan.languages.rtl} ${window.siyuan.languages.rtlTip} ${window.siyuan.languages.editReadonly} ${window.siyuan.languages.editReadonlyTip} ${window.siyuan.languages.md12} ${window.siyuan.languages.md16} ${window.siyuan.languages.md7} ${window.siyuan.languages.md8} ${window.siyuan.languages.embedBlockBreadcrumb} ${window.siyuan.languages.embedBlockBreadcrumbTip} ${window.siyuan.languages.floatWindowMode} ${window.siyuan.languages.floatWindowModeTip.replace("${hotkey}", updateHotkeyTip("⌘"))} ${window.siyuan.languages.outlineOutdent} ${window.siyuan.languages.outlineOutdentTip} ${window.siyuan.languages.spellcheck} ${window.siyuan.languages.spellcheckTip} ${window.siyuan.languages.onlySearchForDoc} ${window.siyuan.languages.onlySearchForDocTip} ${window.siyuan.languages.md31} ${window.siyuan.languages.md32} ${window.siyuan.languages.md2} ${window.siyuan.languages.md3} ${window.siyuan.languages.md27} ${window.siyuan.languages.md28} ${window.siyuan.languages.md33} ${window.siyuan.languages.md34} ${window.siyuan.languages.md9} ${window.siyuan.languages.md36} ${window.siyuan.languages.md35} ${window.siyuan.languages.md36} ${window.siyuan.languages.md41} ${window.siyuan.languages.md39} ${window.siyuan.languages.md40} ${window.siyuan.languages.dynamicLoadBlocks} ${window.siyuan.languages.dynamicLoadBlocksTip} ${window.siyuan.languages.md37} ${window.siyuan.languages.md38} ${window.siyuan.languages.backlinkExpand} ${window.siyuan.languages.backlinkExpandTip} ${window.siyuan.languages.backmentionExpand} ${window.siyuan.languages.backmentionExpandTip} ${window.siyuan.languages.generateHistory} ${window.siyuan.languages.generateHistoryInterval} ${window.siyuan.languages.historyRetentionDays} ${window.siyuan.languages.clearHistory} ${window.siyuan.languages.historyRetentionDaysTip} ${window.siyuan.languages.font} ${window.siyuan.languages.font1} ${fontFamilyHTML} ${window.siyuan.languages.fontSizeScrollZoom} ${window.siyuan.languages.fontSizeScrollZoomTip.replace("Ctrl", updateHotkeyTip("⌘"))} ${window.siyuan.languages.fontSize} ${window.siyuan.languages.fontSizeTip} ${window.siyuan.languages.md29} ${window.siyuan.languages.md30} ${window.siyuan.languages.katexMacros} ${window.siyuan.languages.katexMacrosTip} ${window.siyuan.config.editor.katexMacros} `; }, bindEvent: () => { const fontFamilyElement = editor.element.querySelector("#fontFamily") as HTMLSelectElement; if (fontFamilyElement.tagName === "SELECT") { let fontFamilyHTML = `${window.siyuan.languages.default}`; fetchPost("/api/system/getSysFonts", {}, (response) => { response.data.forEach((item: string) => { fontFamilyHTML += `${item}`; }); fontFamilyElement.innerHTML = fontFamilyHTML; }); } editor.element.querySelector("#clearHistory").addEventListener("click", () => { confirmDialog(window.siyuan.languages.clearHistory, window.siyuan.languages.confirmClearHistory, () => { fetchPost("/api/history/clearWorkspaceHistory", {}); }); }); const setEditor = () => { let dynamicLoadBlocks = parseInt((editor.element.querySelector("#dynamicLoadBlocks") as HTMLInputElement).value); if (48 > dynamicLoadBlocks) { dynamicLoadBlocks = 48; (editor.element.querySelector("#dynamicLoadBlocks") as HTMLInputElement).value = "48"; } if (1024 < dynamicLoadBlocks) { dynamicLoadBlocks = 1024; (editor.element.querySelector("#dynamicLoadBlocks") as HTMLInputElement).value = "1024"; } fetchPost("/api/setting/setEditor", { fullWidth: (editor.element.querySelector("#fullWidth") as HTMLInputElement).checked, justify: (editor.element.querySelector("#justify") as HTMLInputElement).checked, rtl: (editor.element.querySelector("#rtl") as HTMLInputElement).checked, readOnly: (editor.element.querySelector("#readOnly") as HTMLInputElement).checked, displayBookmarkIcon: (editor.element.querySelector("#displayBookmarkIcon") as HTMLInputElement).checked, displayNetImgMark: (editor.element.querySelector("#displayNetImgMark") as HTMLInputElement).checked, codeSyntaxHighlightLineNum: (editor.element.querySelector("#codeSyntaxHighlightLineNum") as HTMLInputElement).checked, embedBlockBreadcrumb: (editor.element.querySelector("#embedBlockBreadcrumb") as HTMLInputElement).checked, listLogicalOutdent: (editor.element.querySelector("#listLogicalOutdent") as HTMLInputElement).checked, spellcheck: (editor.element.querySelector("#spellcheck") as HTMLInputElement).checked, onlySearchForDoc: (editor.element.querySelector("#onlySearchForDoc") as HTMLInputElement).checked, floatWindowMode: (editor.element.querySelector("#floatWindowMode") as HTMLInputElement).checked ? 0 : 1, plantUMLServePath: (editor.element.querySelector("#plantUMLServePath") as HTMLInputElement).value, katexMacros: (editor.element.querySelector("#katexMacros") as HTMLTextAreaElement).value, codeLineWrap: (editor.element.querySelector("#codeLineWrap") as HTMLInputElement).checked, virtualBlockRef: (editor.element.querySelector("#virtualBlockRef") as HTMLInputElement).checked, virtualBlockRefInclude: (editor.element.querySelector("#virtualBlockRefInclude") as HTMLInputElement).value, virtualBlockRefExclude: (editor.element.querySelector("#virtualBlockRefExclude") as HTMLInputElement).value, blockRefDynamicAnchorTextMaxLen: parseInt((editor.element.querySelector("#blockRefDynamicAnchorTextMaxLen") as HTMLInputElement).value), backlinkExpandCount: parseInt((editor.element.querySelector("#backlinkExpandCount") as HTMLInputElement).value), backmentionExpandCount: parseInt((editor.element.querySelector("#backmentionExpandCount") as HTMLInputElement).value), dynamicLoadBlocks: dynamicLoadBlocks, codeLigatures: (editor.element.querySelector("#codeLigatures") as HTMLInputElement).checked, codeTabSpaces: parseInt((editor.element.querySelector("#codeTabSpaces") as HTMLInputElement).value), fontSize: parseInt((editor.element.querySelector("#fontSize") as HTMLInputElement).value), fontSizeScrollZoom: (editor.element.querySelector("#fontSizeScrollZoom") as HTMLInputElement).checked, generateHistoryInterval: parseInt((editor.element.querySelector("#generateHistoryInterval") as HTMLInputElement).value), historyRetentionDays: parseInt((editor.element.querySelector("#historyRetentionDays") as HTMLInputElement).value), fontFamily: fontFamilyElement.value, emoji: window.siyuan.config.editor.emoji }, response => { editor.onSetEditor(response.data); }); }; editor.element.querySelectorAll("input.b3-switch, select.b3-select, input.b3-slider").forEach((item) => { item.addEventListener("change", () => { setEditor(); }); }); editor.element.querySelectorAll("textarea.b3-text-field, input.b3-text-field, input.b3-slider").forEach((item) => { item.addEventListener("blur", () => { setEditor(); }); }); editor.element.querySelectorAll("input.b3-slider").forEach((item) => { item.addEventListener("input", (event) => { const target = event.target as HTMLInputElement; target.parentElement.setAttribute("aria-label", target.value); }); }); }, onSetEditor: (editorData: IEditor) => { if (editorData.readOnly !== window.siyuan.config.editor.readOnly) { editor.setReadonly(editorData.readOnly); } window.siyuan.config.editor = editorData; getAllModels().editor.forEach((item) => { reloadProtyle(item.editor.protyle, false); setPadding(item.editor.protyle); if (window.siyuan.config.editor.fullWidth) { item.editor.protyle.contentElement.setAttribute("data-fullwidth", "true"); } else { item.editor.protyle.contentElement.removeAttribute("data-fullwidth"); } }); setInlineStyle(); } };