import type cMenuToolbarPlugin from "src/plugin/main"; import { App, Notice, Command, requireApiVersion, MarkdownView, ButtonComponent, WorkspaceParent, WorkspaceWindow } from "obsidian"; import { WorkspaceExt, WorkspaceItemExt, WorkspaceParentExt } from 'src/util/obsidian-ext'; import { setBottomValue } from "src/util/statusBarConstants"; import { backcolorpicker, colorpicker } from "src/util/util"; import { t } from "src/translations/helper"; import { cMenuToolbarSettings } from "src/settings/settingsData"; window.ISMORE = false; window.isBgC = false; window.isCTxt = false; window.isText = false; let activeDocument: Document; export function getRootSplits(): WorkspaceParentExt[] { const rootSplits: WorkspaceParentExt[] = []; // push the main window's root split to the list rootSplits.push(app.workspace.rootSplit as WorkspaceParent as WorkspaceParentExt) // @ts-ignore floatingSplit is undocumented const floatingSplit = app.workspace.floatingSplit as WorkspaceParentExt; floatingSplit?.children.forEach((child: WorkspaceParentExt) => { // if this is a window, push it to the list if (child instanceof WorkspaceWindow) { rootSplits.push(child); } }); return rootSplits; } export function selfDestruct() { const rootSplits = getRootSplits(); const clearToolbar = (leaf: HTMLElement) => { let cMenuToolbarModalBar = leaf.querySelector( "#cMenuToolbarModalBar" ); let cMenuToolbarPopoverBar = leaf.querySelector( "#cMenuToolbarPopoverBar" ); if (cMenuToolbarModalBar) { if (cMenuToolbarModalBar.firstChild) { cMenuToolbarModalBar.removeChild(cMenuToolbarModalBar.firstChild); } cMenuToolbarModalBar.remove(); } if (cMenuToolbarPopoverBar) { if (cMenuToolbarPopoverBar.firstChild) { cMenuToolbarPopoverBar.removeChild(cMenuToolbarPopoverBar.firstChild); } cMenuToolbarPopoverBar.remove(); } } if (rootSplits) rootSplits.forEach((rootSplit: WorkspaceParentExt) => { if (rootSplit?.containerEl) clearToolbar(rootSplit?.containerEl) }); } export const getcoords = (editor: any) => { const cursorFrom = editor.getCursor("head"); let coords; if (editor.cursorCoords) coords = editor.cursorCoords(true, "window"); else if (editor.coordsAtPos) { const offset = editor.posToOffset(cursorFrom); coords = editor.cm.coordsAtPos?.(offset) ?? editor.coordsAtPos(offset); } else return; return coords; }; export function getModestate(app: { workspace: { getActiveViewOfType: (arg0: typeof MarkdownView) => any }; }) { const activePane = app.workspace.getActiveViewOfType(MarkdownView); if (activePane) { let currentmode = activePane?.getMode(); if (currentmode === "empty") { return false; } if (currentmode == "preview") { return false; } if (currentmode == "source") { return true; } } } export function checksvg(htmlStr: string) { let reg = /<[^>]+>/g; return reg.test(htmlStr); } export function CreateDiv(selector: string) { let div = createEl("div"); div.addClass(selector); return div; } export function tabCell(app: App, plugin: cMenuToolbarPlugin, el: string) { requireApiVersion("0.15.0") ? activeDocument = activeWindow.document : activeDocument = window.document; let tab = activeDocument.getElementById(el); // @ts-ignore let rows = tab.rows; let rlen = rows.length; for (let i = 1; i < rlen; i++) { //遍历所有行 let cells = rows[i].cells; //得到这一行的所有单元格 for (let j = 0; j < cells.length; j++) { //给每一个单元格添加click事件 cells[j].onclick = function () { let backcolor = this.style.backgroundColor; if (backcolor != "") { backcolor = colorHex(backcolor); if (el == "x-color-picker-table") { plugin.settings.cMenuFontColor = backcolor; Setfontcolor(app, backcolor); activeDocument.getElementById("change-font-color-icon").style.fill = plugin.settings.cMenuFontColor; } else if (el == "x-backgroundcolor-picker-table") { plugin.settings.cMenuBackgroundColor = backcolor; Setbackgroundcolor(app, backcolor); activeDocument.getElementById( "change-background-color-icon" ).style.fill = plugin.settings.cMenuBackgroundColor; } plugin.saveSettings(); } }; } } } export function Setfontcolor(app: App, color: string) { //from https://github.com/obsidian-canzi/Enhanced-editing const activeLeaf = app.workspace.getActiveViewOfType(MarkdownView); if (activeLeaf) { const view = activeLeaf; const editor = view.editor; let selectText = editor.getSelection(); if (selectText == null || "") { return; } let _html0 = /\]*\>[^\<\>]+\<\/font\>/g; let _html1 = /^\]*\>([^\<\>]+)\<\/font\>$/; let _html2 = '$1'; let _html3 = /\]*font\>/g; //是否只包含一侧的<> if (_html3.test(selectText)) { return; } else if (_html0.test(selectText)) { if (_html1.test(selectText)) { selectText = selectText.replace(_html1, _html2); } else { selectText = selectText.replace( /\]*?\>|\<\/font\>/g, "" ); } } else { selectText = selectText.replace(/^(.+)$/gm, _html2); } editor.replaceSelection(selectText); editor.exec("goRight"); // @ts-ignore app.commands.executeCommandById("editor:focus"); } } export function Setbackgroundcolor(app: App, color: string) { //from https://github.com/obsidian-canzi/Enhanced-editing const activeLeaf = app.workspace.getActiveViewOfType(MarkdownView); if (activeLeaf) { const view = activeLeaf; const editor = view.editor; let selectText = editor.getSelection(); if (selectText == null || selectText == "") { return; } let _html0 = /\]+:[0-9a-zA-Z#]+[\"'][^\<\>]*\>[^\<\>]+\<\/span\>/g; let _html1 = /^\]+:[0-9a-zA-Z#]+[\"'][^\<\>]*\>([^\<\>]+)\<\/span\>$/; let _html2 = '$1'; let _html3 = /\]*span\>/g; //是否只包含一侧的<> if (_html3.test(selectText)) { return; } else if (_html0.test(selectText)) { if (_html1.test(selectText)) { selectText = selectText.replace(_html1, _html2); } else { selectText = selectText.replace( /\]+:[0-9a-zA-Z#]+[\"'][^\<\>]*\>|\<\/span\>/g, "" ); } } else { selectText = selectText.replace(/^(.+)$/gm, _html2); } editor.replaceSelection(selectText); editor.exec("goRight"); //@ts-ignore app.commands.executeCommandById("editor:focus"); } } export const colorHex = function (color: string) { let that = color; let reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/; if (/^(rgb|RGB)/.test(that)) { let aColor = that.replace(/(?:\(|\)|rgb|RGB)*/g, "").split(","); let strHex = "#"; for (let i = 0; i < aColor.length; i++) { let hex = Number(aColor[i]).toString(16); if (hex === "0") { hex += hex; } strHex += hex; } if (strHex.length !== 7) { strHex = that; } return strHex; } else if (reg.test(that)) { let aNum = that.replace(/#/, "").split(""); if (aNum.length === 6) { return that; } else if (aNum.length === 3) { let numHex = "#"; for (let i = 0; i < aNum.length; i += 1) { numHex += aNum[i] + aNum[i]; } console.log(numHex); return numHex; } } else { return that; } }; export function CreateMoreMenu(selector: HTMLDivElement) { // let issubmenu= activeDocument.getElementById("cMenuToolbarModalBar").querySelector('.'+selector); // let barHeight = activeDocument.getElementById("cMenuToolbarModalBar").offsetHeight; requireApiVersion("0.15.0") ? activeDocument = activeWindow.document : activeDocument = window.document; if (!window.ISMORE) return; let cMoreMenu = selector.createEl("span"); cMoreMenu.addClass("more-menu"); let morebutton = new ButtonComponent(cMoreMenu); morebutton .setClass("cMenuToolbarCommandItem") .setTooltip(t("More")) .onClick(() => { if ( activeDocument.getElementById("cMenuToolbarPopoverBar").style.visibility == "hidden" ) { activeDocument.getElementById("cMenuToolbarPopoverBar").style.visibility = "visible"; activeDocument.getElementById("cMenuToolbarPopoverBar").style.height = "32px"; } else { activeDocument.getElementById("cMenuToolbarPopoverBar").style.visibility = "hidden"; activeDocument.getElementById("cMenuToolbarPopoverBar").style.height = "0"; } }); morebutton.buttonEl.innerHTML = ``; window.ISMORE = false; return cMoreMenu; } export function QuiteFormatBrushes() { //from https://github.com/obsidian-canzi/Enhanced-editing //关闭所有格式刷变量 if (window.newNotice) window.newNotice.hide(); window.isBgC = false; //多彩背景刷 window.isCTxt = false; //多彩文字刷 window.isText = false; } export function SetHeader(_str: string) { //from https://github.com/obsidian-canzi/Enhanced-editing const activeLeaf = app.workspace.getActiveViewOfType(MarkdownView); if (activeLeaf) { const view = activeLeaf; const editor = view.editor; let linetext = editor.getLine(editor.getCursor().line); let newstr, linend = ""; if (_str == "") { //若为标题,转为普通文本 newstr = linetext.replace(/^(\>*(\[[!\w]+\])?\s*)#+\s/, "$1"); } else { //列表、引用,先转为普通文本,再转为标题 newstr = linetext.replace(/^\s*(#*|\>|\-|\d+\.)\s*/m, ""); newstr = _str + " " + newstr; } if (newstr != "") { linend = editor.getRange(editor.getCursor(), { line: editor.getCursor().line, ch: linetext.length }); } else { linend = editor.getRange(editor.getCursor(), { line: editor.getCursor().line, ch: 0 }); }; editor.setLine(editor.getCursor().line, newstr); editor.setCursor({ line: editor.getCursor().line, ch: Number(newstr.length - linend.length) }); }; } export function FormatEraser() { const activeLeaf = app.workspace.getActiveViewOfType(MarkdownView); if (activeLeaf) { const view = activeLeaf; const editor = view.editor let linend; let selstart = editor.getRange({ line: editor.getCursor().line, ch: 0 }, editor.getCursor()); let linetext = editor.getLine(editor.getCursor().line); if (linetext != "") { linend = editor.getRange(editor.getCursor(), { line: editor.getCursor().line, ch: linetext.length }); } else { linend = editor.getRange(editor.getCursor(), { line: editor.getCursor().line, ch: 0 }); }; let selectText = editor.getSelection(); if (selectText == null || selectText == "") { QuiteFormatBrushes(); window.isText = true; if (window.newNotice) { if (window.newNotice.noticeEl.innerText != t("Clear formatting brush ON!\nClick the mouse middle or right key to close the formatting-brush")) window.newNotice = new Notice(t("Clear formatting brush ON!\nClick the mouse middle or right key to close the formatting-brush"), 0); } else window.newNotice = new Notice(t("Clear formatting brush ON!\nClick the mouse middle or right key to close the formatting-brush"), 0); //new obsidian.Notice("请先划选部分文本,再执行命令!"); let reg1 = /(~~|%%|\*==|==|\*\*?|\<[^\<\>]*?\>|!?\[\[*|`|_|!?\[)([^!#=\[\]\<\>\`_\*~\(\)]*)$/; let reg2 = /^([^!=\[\]\<\>\`_\*~\(\)]*)(~~|%%|==\*|==|\*\*?|\<[^\<\>]*\>|\]\]|`|_|\]\([^\(\)\[\]]*\))/; if (selstart.match(reg1) != null && linend.match(reg2) != null) { selstart = selstart.replace(reg1, "$2"); linend = linend.replace(reg2, "$1"); //笔记全文.replaceRange(selstart+linend, {line:当前行号,ch:0},{line:当前行号,ch:当前行文本.length}); editor.setLine(editor.getCursor().line, selstart + linend); editor.setCursor({ line: editor.getCursor().line, ch: Number(selstart.length) }); } } else { let mdText = /(^#+\s|(?<=^|\s*)#|^\>|^\- \[( |x)\]|^\+ |\<[^\<\>]+?\>|^1\. |^\s*\- |^\-+$|^\*+$|==\*|\*==|==\*\*|\*\*==|==\*\*\*|\*\*\*==)/mg; selectText = selectText.replace(mdText, ""); selectText = selectText.replace(/^[ ]+|[ ]+$/mg, ""); selectText = selectText.replace(/\!?\[\[([^\[\]\|]*\|)*([^\(\)\[\]]+)\]\]/g, "$2"); selectText = selectText.replace(/\!?\[+([^\[\]\(\)]+)\]+\(([^\(\)]+)\)/g, "$1"); selectText = selectText.replace(/`([^`]+)`/g, "$1"); selectText = selectText.replace(/_([^_]+)_/g, "$1"); selectText = selectText.replace(/==([^=]+)==/g, "$1"); selectText = selectText.replace(/\*\*?([^\*]+)\*\*?/g, "$1"); selectText = selectText.replace(/~~([^~]+)~~/g, "$1"); selectText = selectText.replace(/(\r*\n)+/mg, "\r\n"); editor.replaceSelection(selectText); //@ts-ignore app.commands.executeCommandById("editor:focus"); } }; } export const followingbar = (settings: cMenuToolbarSettings) => { let isource = getModestate(app); let cMenuToolbarModalBar = activeDocument.getElementById( "cMenuToolbarModalBar" ); //console.log(activeLeaf.getViewState().state.mode) if (isource) { const activeLeaf = app.workspace.getActiveViewOfType(MarkdownView); const view = activeLeaf; const editor = view.editor; if (cMenuToolbarModalBar) { let selection = editor.somethingSelected(); let cMenuToolbarRows = settings.cMenuNumRows; selection ? (cMenuToolbarModalBar.style.visibility = "visible") : (cMenuToolbarModalBar.style.visibility = "hidden"); let ElementCount = cMenuToolbarModalBar.childElementCount; if (ElementCount) { ElementCount == cMenuToolbarRows ? (cMenuToolbarModalBar.addClass("cMenuToolbarGrid"), cMenuToolbarModalBar.removeClass("cMenuToolbarFlex")) : (cMenuToolbarModalBar.addClass("cMenuToolbarFlex"), cMenuToolbarModalBar.removeClass("cMenuToolbarGrid")) } else { ElementCount = 0; } let cmheight = Math.ceil(ElementCount / cMenuToolbarRows); cMenuToolbarModalBar.style.height = 40 * cmheight + "px"; if (settings.aestheticStyle == "tiny") { cMenuToolbarModalBar.style.height = 25 * cmheight + "px"; } let rleftwidth = activeDocument.getElementsByClassName("side-dock-ribbon mod-left")[0] ?.clientWidth ?? 0; let leftwidth = activeDocument.getElementsByClassName("mod-left-split")[0] ?.clientWidth ?? 0; let barwidth = activeDocument.getElementById( "cMenuToolbarModalBar" ).offsetWidth; let barHeight = activeDocument.getElementById( "cMenuToolbarModalBar" ).offsetHeight; let bodywidth = activeDocument.body.offsetWidth; let coords = getcoords(editor); let cursor_head = editor.getCursor("head").ch let cursor_from = editor.getCursor("from").ch let toppx = 0; /*添加判断边界 */ let leftpx = coords.left - leftwidth - rleftwidth + 20; if (coords.left + barwidth + 15 > bodywidth) leftpx = coords.left - leftwidth - rleftwidth - barwidth / 1.3 - 60; cursor_head == cursor_from ? toppx = coords.top - barHeight - 30 : (toppx = coords.top, leftpx = leftpx - 40); if (leftpx < 0) leftpx = 0; cMenuToolbarModalBar.style.visibility == "visible" ? (cMenuToolbarModalBar.style.left = leftpx + "px", cMenuToolbarModalBar.style.top = toppx + "px") : true; } } else cMenuToolbarModalBar.style.visibility = "hidden" } export function cMenuToolbarPopover( app: App, plugin: cMenuToolbarPlugin ): void { let settings = plugin.settings; requireApiVersion("0.15.0") ? activeDocument = activeWindow.document : activeDocument = window.document; function createMenu() { const generateMenu = () => { let btnwidth = 0; let cMenuToolbar = createEl("div"); if (cMenuToolbar) { if (settings.positionStyle == "top") { cMenuToolbar.setAttribute( "style", `position: relative; grid-template-columns: repeat(auto-fit, minmax(28px, 1fr));` ); } else { cMenuToolbar.setAttribute( "style", `left: calc(50% - calc(${cMenuToolbar.offsetWidth }px / 2)); bottom: ${settings.cMenuBottomValue }em; grid-template-columns: ${"1fr ".repeat(settings.cMenuNumRows)}` ); } } cMenuToolbar.setAttribute("id", "cMenuToolbarModalBar"); //二级弹出菜单 let PopoverMenu = createEl("div"); PopoverMenu.addClass("cMenuToolbarpopover"); PopoverMenu.addClass("cMenuToolbarTinyAesthetic"); PopoverMenu.setAttribute("id", "cMenuToolbarPopoverBar"); PopoverMenu.style.visibility = "hidden"; PopoverMenu.style.height = "0"; if (settings.aestheticStyle == "default") { cMenuToolbar.addClass("cMenuToolbarDefaultAesthetic"); cMenuToolbar.removeClass("cMenuToolbarTinyAesthetic"); cMenuToolbar.removeClass("cMenuToolbarGlassAesthetic"); } else if (settings.aestheticStyle == "tiny") { cMenuToolbar.addClass("cMenuToolbarTinyAesthetic"); cMenuToolbar.removeClass("cMenuToolbarDefaultAesthetic"); cMenuToolbar.removeClass("cMenuToolbarGlassAesthetic"); } else { cMenuToolbar.addClass("cMenuToolbarGlassAesthetic"); cMenuToolbar.removeClass("cMenuToolbarTinyAesthetic"); cMenuToolbar.removeClass("cMenuToolbarDefaultAesthetic"); } if (settings.positionStyle == "following") { cMenuToolbar.style.visibility = "hidden"; } let leafwidth = 99999; if (settings.positionStyle == "top") { let currentleaf = activeDocument.body?.querySelector( ".workspace-leaf.mod-active" ); if (!activeDocument.getElementById("cMenuToolbarPopoverBar")) currentleaf ?.querySelector(".markdown-source-view") .insertAdjacentElement("afterbegin", PopoverMenu); currentleaf ?.querySelector(".markdown-source-view") .insertAdjacentElement("afterbegin", cMenuToolbar); leafwidth = currentleaf.querySelector( ".markdown-source-view" ).offsetWidth; } else if (settings.appendMethod == "body") { activeDocument.body.appendChild(cMenuToolbar); } else if (settings.appendMethod == "workspace") { activeDocument.body ?.querySelector(".mod-vertical.mod-root") .insertAdjacentElement("afterbegin", cMenuToolbar); } let cMenuToolbarPopoverBar = activeDocument.getElementById( "cMenuToolbarPopoverBar" ); settings.menuCommands.forEach((item, index) => { if ("SubmenuCommands" in item) { let _btn: any; if (btnwidth >= leafwidth - 26 * 4 && leafwidth > 100) { //说明已经溢出 window.ISMORE = true; //需要添加更多按钮 _btn = new ButtonComponent(cMenuToolbarPopoverBar); } else _btn = new ButtonComponent(cMenuToolbar); _btn.setClass("cMenuToolbarCommandsubItem" + index); checksvg(item.icon) ? (_btn.buttonEl.innerHTML = item.icon) : _btn.setIcon(item.icon); let __btnwidth; if (_btn.buttonEl.offsetWidth > 100) __btnwidth = 26; else { if (_btn.buttonEl.offsetWidth < 26) __btnwidth = 26; else __btnwidth = _btn.buttonEl.offsetWidth; } btnwidth += __btnwidth + 2; let submenu = CreateDiv("subitem"); if (submenu) { item.SubmenuCommands.forEach( (subitem: { name: string; id: any; icon: string }) => { let sub_btn = new ButtonComponent(submenu) .setTooltip(subitem.name) .setClass("menu-item") .onClick(() => { //@ts-ignore app.commands.executeCommandById(subitem.id); if (settings.cMenuVisibility == false) cMenuToolbar.style.visibility = "hidden"; else { if (settings.positionStyle == "following") { cMenuToolbar.style.visibility = "hidden"; } else cMenuToolbar.style.visibility = "visible"; } }); checksvg(subitem.icon) ? (sub_btn.buttonEl.innerHTML = subitem.icon) : sub_btn.setIcon(subitem.icon); _btn.buttonEl.insertAdjacentElement("afterbegin", submenu); } ); } } else { if (item.id == "obsidian-editing-toolbar:change-font-color") { let button2 = new ButtonComponent(cMenuToolbar); button2 .setClass("cMenuToolbarCommandsubItem-font-color") .setTooltip(t("Font Colors")) .onClick(() => { //@ts-ignore app.commands.executeCommandById(item.id); if (settings.cMenuVisibility == false) cMenuToolbar.style.visibility = "hidden"; else { if (settings.positionStyle == "following") { cMenuToolbar.style.visibility = "hidden"; } else cMenuToolbar.style.visibility = "visible"; } }); checksvg(item.icon) ? (button2.buttonEl.innerHTML = item.icon) : button2.setIcon(item.icon); btnwidth += 26; // let Selection = createDiv("triangle-icon"); let submenu2 = createEl("div"); submenu2.addClass("subitem"); if (submenu2) { submenu2.innerHTML = colorpicker; button2.buttonEl.insertAdjacentElement("afterbegin", submenu2); if (settings.cMenuFontColor) activeDocument.getElementById( "change-font-color-icon" ).style.fill = settings.cMenuFontColor; tabCell(app, plugin, "x-color-picker-table"); let el = submenu2.querySelector( ".x-color-picker-wrapper" ) as HTMLElement; let button3 = new ButtonComponent(el); button3 .setIcon("remix-Brush2Line") .setTooltip(t("Format Brush")) .onClick(() => { QuiteFormatBrushes(); window.isCTxt = true; window.newNotice = new Notice( t("Font-Color formatting brush ON!"), 0 ); }); } } else if (item.id == "obsidian-editing-toolbar:change-background-color") { let button2 = new ButtonComponent(cMenuToolbar); button2 .setClass("cMenuToolbarCommandsubItem-font-color") .setTooltip(t("Background color")) .onClick(() => { //@ts-ignore app.commands.executeCommandById(item.id); if (settings.cMenuVisibility == false) cMenuToolbar.style.visibility = "hidden"; else { if (settings.positionStyle == "following") { cMenuToolbar.style.visibility = "hidden"; } else cMenuToolbar.style.visibility = "visible"; } }); checksvg(item.icon) ? (button2.buttonEl.innerHTML = item.icon) : button2.setIcon(item.icon); btnwidth += 26; // let Selection = CreateDiv("triangle-icon"); let submenu2 = createEl("div"); submenu2.addClass("subitem"); // console.log(btnwidth,item.name) if (submenu2) { submenu2.innerHTML = backcolorpicker; button2.buttonEl.insertAdjacentElement("afterbegin", submenu2); if (plugin.settings.cMenuBackgroundColor) activeDocument.getElementById( "change-background-color-icon" ).style.fill = plugin.settings.cMenuBackgroundColor; tabCell(app, plugin, "x-backgroundcolor-picker-table"); let el = submenu2.querySelector( ".x-color-picker-wrapper" ) as HTMLElement; let button3 = new ButtonComponent(el); button3 .setIcon("remix-Brush2Line") .setTooltip(t("Format Brush")) .onClick(() => { QuiteFormatBrushes(); window.isBgC = true; window.newNotice = new Notice( t("Background-color formatting brush ON!"), 0 ); }); } } else { let button; if (btnwidth >= leafwidth - 26 * 4 && leafwidth > 100) { //说明已经溢出 window.ISMORE = true; //需要添加更多按钮 button = new ButtonComponent(cMenuToolbarPopoverBar); } else button = new ButtonComponent(cMenuToolbar); button.setTooltip(item.name).onClick(() => { //@ts-ignore app.commands.executeCommandById(item.id); if (settings.cMenuVisibility == false) cMenuToolbar.style.visibility = "hidden"; else { if (settings.positionStyle == "following") { cMenuToolbar.style.visibility = "hidden"; } else cMenuToolbar.style.visibility = "visible"; } }); button.setClass("cMenuToolbarCommandItem"); if (item.id == "cMenuToolbar-Divider-Line") button.setClass("cMenuToolbar-Divider-Line"); checksvg(item.icon) ? (button.buttonEl.innerHTML = item.icon) : button.setIcon(item.icon); let __btnwidth2; if (button.buttonEl.offsetWidth > 100) __btnwidth2 = 26; else { if (button.buttonEl.offsetWidth < 26) __btnwidth2 = 26; else __btnwidth2 = button.buttonEl.offsetWidth; } btnwidth += __btnwidth2; } } }); CreateMoreMenu(cMenuToolbar); if (Math.abs(plugin.settings.cMenuWidth - Number(btnwidth)) > 30) { plugin.settings.cMenuWidth = Number(btnwidth); setTimeout(() => { plugin.saveSettings(); }, 100); } }; let Markdown = app.workspace.getActiveViewOfType(MarkdownView); if (Markdown) { let currentnode = activeDocument.getElementById("cMenuToolbarModalBar"); if (settings.positionStyle == "top") { if (!getModestate(app)) return; let activeleaf = activeDocument.body.querySelector( ".workspace-leaf.mod-active" ); if (activeleaf) if (currentnode) { if (!activeleaf.querySelector("#cMenuToolbarModalBar")) { selfDestruct(); } else { return; } } } else { if (currentnode) return; } generateMenu(); let cMenuToolbarModalBar = activeDocument.getElementById( "cMenuToolbarModalBar" ); setBottomValue(settings); settings.cMenuVisibility == false ? (cMenuToolbarModalBar.style.visibility = "hidden") : settings.positionStyle == "following" ? (cMenuToolbarModalBar?.style.visibility = "hidden") : (cMenuToolbarModalBar?.style.visibility = "visible"); } else { selfDestruct(); } } createMenu(); }