/* THIS IS A GENERATED/BUNDLED FILE BY ESBUILD if you want to view the source, please visit the github repository of this plugin */ var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // main.ts var main_exports = {}; __export(main_exports, { default: () => TableEnhancer2 }); module.exports = __toCommonJS(main_exports); var import_obsidian9 = require("obsidian"); // src/global.ts var import_obsidian = require("obsidian"); var editingCellClassName = "editing-cell"; var hoveredCellClassName = "hovered-cell"; function getCaretPosition(editableElem) { let caretPos = 0, sel, range; sel = activeWindow.getSelection(); if (sel && sel.rangeCount) { range = sel.getRangeAt(0); if (range.commonAncestorContainer.parentNode == editableElem) { caretPos = range.endOffset; } } return caretPos; } function setCaretPosition(editableElem, newPos) { let caretPos = 0, sel, range = activeDocument.createRange(); sel = activeWindow.getSelection(); if (sel && sel.rangeCount) { range.setStart(editableElem.childNodes[0], newPos); range.collapse(true); sel.removeAllRanges(); sel.addRange(range); } return caretPos; } function getCellText(table, i, j) { let result = null; try { result = table.cells[i][j]; } catch (err) { result = null; console.error("Cannot get cell i=", i, ", j=", j, " from table=", table); } return result; } function getCellInfo(cellEl, plugin, tableEl, editorView) { if (!tableEl) tableEl = getTableOfCell(cellEl); if (!tableEl) { console.error("Cannot get table element of cell ", cellEl); return; } if (!editorView) { const markdownView = plugin.app.workspace.getActiveViewOfType(import_obsidian.MarkdownView); const editor = markdownView == null ? void 0 : markdownView.editor; editorView = editor == null ? void 0 : editor.cm; } const tablePos = editorView.posAtDOM(tableEl); const tableLine = editorView.state.doc.lineAt(tablePos).number - 1; const trEl = cellEl.closest("tr"); const i = trEl.rowIndex; const j = cellEl.cellIndex; return { tableLine, i, j }; } function getTableOfCell(cellEl) { if (!cellEl) return; let parent = cellEl.parentNode; while (parent) { if (parent instanceof HTMLTableElement) break; parent = parent.parentNode; } if (parent) return parent; } function getCellEl(tablePos, i, j, plugin) { var _a; const markdownView = plugin.app.workspace.getActiveViewOfType(import_obsidian.MarkdownView); const editor = markdownView == null ? void 0 : markdownView.editor; const editorView = editor == null ? void 0 : editor.cm; const { node, offset } = editorView.domAtPos(tablePos); const el = node.childNodes[offset]; if (!(el instanceof HTMLElement)) return null; const tables = el.getElementsByTagName("table"); if (tables.length > 1) { console.error("More than 1 tables were found"); return null; } const table = tables[0]; return (_a = table == null ? void 0 : table.rows[i]) == null ? void 0 : _a.cells[j]; } function withEditingCell(callback) { const cellEl = activeDocument.querySelector("." + editingCellClassName); if (!(cellEl instanceof HTMLTableCellElement)) return null; return callback(cellEl); } // src/tableEditor.ts var import_obsidian2 = require("obsidian"); // src/editorUtils.ts var getLineStartPos = (line) => ({ line, ch: 0 }); var getLineEndPos = (line, editor) => ({ line, ch: editor.getLine(line).length }); var deleteLines = (editor, from, to) => { if (to === editor.lastLine() + 1) { return replaceRangeWithoutScroll(editor, "", getLineEndPos(from - 1, editor), getLineEndPos(to, editor)); } else { return replaceRangeWithoutScroll(editor, "", getLineStartPos(from), getLineStartPos(to)); } }; var deleteLine = (editor, line) => { return deleteLines(editor, line, line + 1); }; var getLeadingWhitespace = (lineContent) => { const indentation = lineContent.match(/^\s+/); return indentation ? indentation[0] : ""; }; var insertLineBelow = (editor, line) => { const endOfCurrentLine = getLineEndPos(line, editor); const indentation = getLeadingWhitespace(editor.getLine(line)); return replaceRangeWithoutScroll(editor, "\n" + indentation, endOfCurrentLine); }; var zf = (e, t) => { if (t.line < 0) return 0; const n = t.line + 1; if (n > e.lines) return e.length; const i = e.line(n); return isFinite(t.ch) ? t.ch < 0 ? i.from + Math.max(0, i.length + t.ch) : i.from + t.ch : i.to; }; var replaceRangeWithoutScroll = (editor, replacement, from, to) => { const cm = editor.cm; const state = cm.state.doc; const from2 = zf(state, from); const to2 = to ? zf(state, to) : from2; return { changes: { from: from2, to: to2, insert: replacement }, scrollIntoView: false, sequential: false }; }; var setLineWithoutScroll = (editor, n, text) => { const cm = editor.cm; const state = cm.state.doc; const from = zf(state, { line: n, ch: 0 }); const to = zf(state, { line: n, ch: editor.getLine(n).length }); return { changes: { from, to, insert: text }, scrollIntoView: false, sequential: false }; }; function withoutScrollAndFocus(editorView, callback) { const contentDom = editorView.contentDOM; const scrollDom = editorView.scrollDOM; const x = scrollDom.scrollLeft; const y = scrollDom.scrollTop; scrollDom.addEventListener("scroll", (e) => { e.stopImmediatePropagation(); e.preventDefault(); scrollDom.scrollTo(x, y); }, { once: true, capture: true }); callback(); contentDom.blur(); } // src/tableEditor.ts var TableEditor = class { constructor(plugin) { this.plugin = plugin; } getTable(tableLine) { const markdownView = this.plugin.app.workspace.getActiveViewOfType(import_obsidian2.MarkdownView); if (markdownView instanceof import_obsidian2.MarkdownView && markdownView.editor) { const editor = markdownView.editor; const lineCount = editor.lineCount(); const cells = []; let match; let notStandard = false; let formatLine = editor.getLine(tableLine + 1); const formatRowRegex = /^\s*(\|)?(?:\s*:?\s*?-+\s*:?\s*\|?){2,}/; match = formatRowRegex.exec(formatLine); if (!match) { for (let i2 = 1; ; i2++) { const down = tableLine + 1 + i2; const up = tableLine + 1 - i2; if (up >= lineCount && down < 0) break; if (down >= 0) { match = formatRowRegex.exec(editor.getLine(down)); if (match) { tableLine = down - 1; break; } } if (up < lineCount) { match = formatRowRegex.exec(editor.getLine(up)); if (match) { tableLine = down - 1; break; } } } if (!match) return null; } formatLine = editor.getLine(tableLine + 1); if (!match[1]) { formatLine = `| ${formatLine} |`; editor.setLine(tableLine + 1, formatLine); notStandard = true; } const parsedFormatLine = formatLine.split(/(? { editorView.dispatch(setLineWithoutScroll(editor, rowLineNumber, newLine)); }); } async insertColRight(table, colIndex, col) { if (!table) return; const markdownView = this.plugin.app.workspace.getActiveViewOfType(import_obsidian2.MarkdownView); const editor = markdownView == null ? void 0 : markdownView.editor; const editorView = editor == null ? void 0 : editor.cm; if (!editor || !editorView) { console.error("Cannot get editor"); return; } const textAlignment = this.plugin.settings.defaultAlignmentWhenInsertNewCol == "left" ? ":--" : this.plugin.settings.defaultAlignmentWhenInsertNewCol == "center" ? ":-:" : this.plugin.settings.defaultAlignmentWhenInsertNewCol == "right" ? "--:" : this.plugin.settings.defaultAlignmentWhenInsertNewCol == "follow" ? table.formatLine[colIndex] : null; table.formatLine.splice(colIndex + 1, 0, textAlignment); table.cells.forEach((row, idx) => { const newCell = col ? col[idx] : " "; row.splice(colIndex + 1, 0, newCell); }); const transactionSpecs = []; transactionSpecs.push(setLineWithoutScroll(editor, table.fromLine + 1, TableEditor.rowCells2rowString(table.formatLine))); for (let i = 0; i < table.cells.length; i++) { const lineNumber = TableEditor.getLineNumber(table, i); transactionSpecs.push(setLineWithoutScroll(editor, lineNumber, TableEditor.rowCells2rowString(table.cells[i]))); } withoutScrollAndFocus(editorView, () => { editorView.dispatch(...transactionSpecs); }); } async insertRowBelow(table, rowIndex, row) { if (!table) return; const markdownView = this.plugin.app.workspace.getActiveViewOfType(import_obsidian2.MarkdownView); const editor = markdownView == null ? void 0 : markdownView.editor; const editorView = editor == null ? void 0 : editor.cm; if (!editor || !editorView) { console.error("Cannot get editor"); return; } if (!row) { row = []; let i = table.formatLine.length; while (i--) { row.push(" "); } } if (rowIndex == 0) { const rowLineNumber = table.fromLine + 1; withoutScrollAndFocus(editorView, () => { editorView.dispatch(insertLineBelow(editor, rowLineNumber)); editorView.dispatch(setLineWithoutScroll(editor, rowLineNumber + 1, TableEditor.rowCells2rowString(row))); }); } else { const rowLineNumber = TableEditor.getLineNumber(table, rowIndex); withoutScrollAndFocus(editorView, () => { editorView.dispatch(insertLineBelow(editor, rowLineNumber)); editorView.dispatch(setLineWithoutScroll(editor, rowLineNumber + 1, TableEditor.rowCells2rowString(row))); }); } } async setColAligned(table, colIndex, aligned) { if (!table) return; const markdownView = this.plugin.app.workspace.getActiveViewOfType(import_obsidian2.MarkdownView); const editor = markdownView == null ? void 0 : markdownView.editor; const editorView = editor == null ? void 0 : editor.cm; if (!editor || !editorView) { console.error("Cannot get editor"); return; } table.formatLine[colIndex] = aligned == "left" ? ":--" : aligned == "right" ? "--:" : aligned == "center" ? ":-:" : null; withoutScrollAndFocus(editorView, () => { editorView.dispatch(setLineWithoutScroll(editor, table.fromLine + 1, TableEditor.rowCells2rowString(table.formatLine))); }); } async swapCols(table, colIndex1, colIndex2) { if (!table) return; const markdownView = this.plugin.app.workspace.getActiveViewOfType(import_obsidian2.MarkdownView); const editor = markdownView == null ? void 0 : markdownView.editor; const editorView = editor == null ? void 0 : editor.cm; if (!editor || !editorView) { console.error("Cannot get editor"); return; } const colNum = table.cells[0].length; if (colIndex1 < 0 || colIndex2 < 0 || colIndex1 >= colNum || colIndex2 >= colNum) { console.error("Move out of range"); return; } const transactionSpecs = []; [table.formatLine[colIndex1], table.formatLine[colIndex2]] = [table.formatLine[colIndex2], table.formatLine[colIndex1]]; transactionSpecs.push(setLineWithoutScroll(editor, table.fromLine + 1, TableEditor.rowCells2rowString(table.formatLine))); for (let i = 0; i < table.cells.length; i++) { const lineNumber = TableEditor.getLineNumber(table, i); [table.cells[i][colIndex1], table.cells[i][colIndex2]] = [table.cells[i][colIndex2], table.cells[i][colIndex1]]; transactionSpecs.push(setLineWithoutScroll(editor, lineNumber, TableEditor.rowCells2rowString(table.cells[i]))); } withoutScrollAndFocus(editorView, () => { editorView.dispatch(...transactionSpecs); }); } async swapRows(table, rowIndex1, rowIndex2) { if (!table) return; const markdownView = this.plugin.app.workspace.getActiveViewOfType(import_obsidian2.MarkdownView); const editor = markdownView == null ? void 0 : markdownView.editor; const editorView = editor == null ? void 0 : editor.cm; if (!editor || !editorView) { console.error("Cannot get editor"); return; } const rowNum = table.cells.length; if (rowIndex1 < 1 || rowIndex2 < 1 || rowIndex1 >= rowNum || rowIndex2 >= rowNum) { console.error("Move out of range"); return; } const transactionSpecs = []; [table.cells[rowIndex1], table.cells[rowIndex2]] = [table.cells[rowIndex2], table.cells[rowIndex1]]; const lineNumber1 = TableEditor.getLineNumber(table, rowIndex1); const row1String = TableEditor.rowCells2rowString(table.cells[rowIndex1]); transactionSpecs.push(setLineWithoutScroll(editor, lineNumber1, row1String)); const lineNumber2 = TableEditor.getLineNumber(table, rowIndex2); const row2String = TableEditor.rowCells2rowString(table.cells[rowIndex2]); transactionSpecs.push(setLineWithoutScroll(editor, lineNumber2, row2String)); withoutScrollAndFocus(editorView, () => { editorView.dispatch(...transactionSpecs); }); } async deleteRow(table, rowIndex) { if (!table) return; const markdownView = this.plugin.app.workspace.getActiveViewOfType(import_obsidian2.MarkdownView); const editor = markdownView == null ? void 0 : markdownView.editor; const editorView = editor == null ? void 0 : editor.cm; if (!editor || !editorView) { console.error("Cannot get editor"); return; } if (rowIndex == 0) { return; } const rowLineNumber = TableEditor.getLineNumber(table, rowIndex); withoutScrollAndFocus(editorView, () => { editorView.dispatch(deleteLine(editor, rowLineNumber)); }); } async deleteCol(table, colIndex) { if (!table) return; table.formatLine.splice(colIndex, 1); for (const row of table.cells) row.splice(colIndex, 1); const markdownView = this.plugin.app.workspace.getActiveViewOfType(import_obsidian2.MarkdownView); const editor = markdownView == null ? void 0 : markdownView.editor; const editorView = editor == null ? void 0 : editor.cm; if (!editor || !editorView) { console.error("Cannot get editor"); return; } if (table.formatLine.length == 1) { editorView.dispatch(deleteLines(editor, table.fromLine, table.toLine)); } else { const transactionSpecs = []; transactionSpecs.push(setLineWithoutScroll(editor, table.fromLine + 1, TableEditor.rowCells2rowString(table.formatLine))); for (let i = 0; i < table.cells.length; i++) { const lineNumber = TableEditor.getLineNumber(table, i); transactionSpecs.push(setLineWithoutScroll(editor, lineNumber, TableEditor.rowCells2rowString(table.cells[i]))); } withoutScrollAndFocus(editorView, () => { editorView.dispatch(...transactionSpecs); }); } } async sortByCol(table, colIndex, order) { if (!table) return; const markdownView = this.plugin.app.workspace.getActiveViewOfType(import_obsidian2.MarkdownView); const editor = markdownView == null ? void 0 : markdownView.editor; const editorView = editor == null ? void 0 : editor.cm; if (!editor || !editorView) { console.error("Cannot get editor"); return; } const sortedBody = table.cells.slice(1).sort((row1, row2) => { const cell1 = row1[colIndex].toUpperCase(); const cell2 = row2[colIndex].toUpperCase(); if (!order || order == "aes") return cell1 < cell2 ? -1 : cell1 > cell2 ? 1 : 0; else return cell1 < cell2 ? 1 : cell1 > cell2 ? -1 : 0; }); const bodyString = sortedBody.map(TableEditor.rowCells2rowString).join("\n"); editor.replaceRange(bodyString, { line: table.fromLine + 2, ch: 0 }, { line: table.toLine, ch: 0 }); } async createEmptyTable(i, j, fill) { if (j < 1 || i < 1) { console.error("Cannot create an empty table"); return; } const markdownView = this.plugin.app.workspace.getActiveViewOfType(import_obsidian2.MarkdownView); const editor = markdownView == null ? void 0 : markdownView.editor; const editorView = editor == null ? void 0 : editor.cm; if (!editor || !editorView) { console.error("Cannot get editor"); return; } const cursor = editor.getCursor(); const cursorLine = editor.getLine(cursor.line); const bodyString = "|" + " |".repeat(j); const formatString = this.plugin.settings.defaultAlignmentForTableGenerator == "left" ? "|" + ":--|".repeat(j) : this.plugin.settings.defaultAlignmentForTableGenerator == "center" ? "|" + ":-:|".repeat(j) : this.plugin.settings.defaultAlignmentForTableGenerator == "right" ? "|" + "--:|".repeat(j) : null; const tableArr = [ cursorLine, "\n", bodyString, "\n", formatString, "\n" ]; while (i--) tableArr.push(bodyString, "\n"); editor.setLine(cursor.line, tableArr.join("")); } static rowCells2rowString(cells) { const result = ["|"]; try { for (const cell of cells) { result.push(cell.length == 0 ? " " : cell); result.push("|"); } } catch (err) { console.error(err); console.error(cells); throw err; } return result.join(""); } }; // src/icon.ts var insertBelowIcon = ` `; var deleteIcon = ` `; var insertRightIcon = ` `; var moveRightIcon = ` `; var moveLeftIcon = ` `; var cloneIcon = ` `; var upwardIcon = ` `; var downIcon = ` `; var insertColRight = ` `; var insertRowBelow = ` `; var cloneRow = ` `; var cloneCol = ` `; var delRow = ` `; var delCol = ` `; // src/toolBar.ts var import_obsidian3 = require("obsidian"); var ToolBar = class { constructor(plugin) { this.plugin = plugin; this.rowOpBarEl = createDiv({ cls: "ob-table-enhancer-row-bar" }); this.colOpBarEl = createDiv({ cls: "ob-table-enhancer-col-bar" }); this.rowOpBarEl.createDiv({ cls: "ob-table-enhancer-row-bar-button" }, (el) => { el.innerHTML = upwardIcon; el.onclick = async () => { if (this.cell.i == 1) { new import_obsidian3.Notice("Current column is already the top row."); return; } const table = await plugin.tableEditor.getTable(this.cell.tableLine); if (!table) { console.error("Cannot get table."); return; } await this.plugin.tableEditor.swapRows(table, this.cell.i, this.cell.i - 1); }; }); this.rowOpBarEl.createDiv({ cls: "ob-table-enhancer-row-bar-button" }, (el) => { el.innerHTML = downIcon; el.onclick = async () => { const table = await plugin.tableEditor.getTable(this.cell.tableLine); if (!table) { console.error("Cannot get table."); return; } const rowNum = table.cells.length; if (this.cell.i == rowNum - 1) { new import_obsidian3.Notice("Current column is already the bottom row."); return; } await this.plugin.tableEditor.swapRows(table, this.cell.i, this.cell.i + 1); }; }); this.rowOpBarEl.createDiv({ cls: "ob-table-enhancer-row-bar-button" }, (el) => { el.innerHTML = insertBelowIcon; el.onclick = async () => { const table = await plugin.tableEditor.getTable(this.cell.tableLine); if (!table) { console.error("Cannot get table."); return; } await this.plugin.tableEditor.insertRowBelow(table, this.cell.i); }; }); this.colOpBarEl.createDiv({ cls: "ob-table-enhancer-col-bar-button" }, (el) => { el.innerHTML = moveLeftIcon; el.onclick = async () => { if (this.cell.j == 0) { new import_obsidian3.Notice("Current column is already the leftmost column."); return; } const table = await plugin.tableEditor.getTable(this.cell.tableLine); if (!table) { console.error("Cannot get table."); return; } await plugin.tableEditor.swapCols(table, this.cell.j, this.cell.j - 1); }; }); this.colOpBarEl.createDiv({ cls: "ob-table-enhancer-col-bar-button" }, (el) => { el.innerHTML = insertRightIcon; el.onclick = async () => { const table = await plugin.tableEditor.getTable(this.cell.tableLine); if (!table) { console.error("Cannot get table."); return; } await this.plugin.tableEditor.insertColRight(table, this.cell.j); }; }); this.rowOpBarEl.createDiv({ cls: "ob-table-enhancer-row-bar-button" }, (el) => { el.innerHTML = deleteIcon; el.onclick = async () => { if (this.cell.i == 0) { new import_obsidian3.Notice("You can't delete the header of a table."); return; } const table = await plugin.tableEditor.getTable(this.cell.tableLine); if (!table) { console.error("Cannot get table."); return; } await this.plugin.tableEditor.deleteRow(table, this.cell.i); }; }); this.colOpBarEl.createDiv({ cls: "ob-table-enhancer-col-bar-button" }, (el) => { el.innerHTML = deleteIcon; el.onclick = async () => { const table = await plugin.tableEditor.getTable(this.cell.tableLine); if (!table) { console.error("Cannot get table."); return; } await this.plugin.tableEditor.deleteCol(table, this.cell.j); }; }); this.colOpBarEl.createDiv({ cls: "ob-table-enhancer-col-bar-button" }, (el) => { el.innerHTML = moveRightIcon; el.onclick = async () => { const table = await plugin.tableEditor.getTable(this.cell.tableLine); if (!table) { console.error("Cannot get table."); return; } const colNum = table.formatLine.length; if (this.cell.j == colNum - 1) { new import_obsidian3.Notice("Current column is already the rightmost column."); return; } await this.plugin.tableEditor.swapCols(table, this.cell.j, this.cell.j + 1); }; }); this.colOpBarEl.createDiv({ cls: "ob-table-enhancer-col-bar-button" }, (el) => { el.innerHTML = cloneIcon; el.onclick = async () => { const table = await plugin.tableEditor.getTable(this.cell.tableLine); if (!table) { console.error("Cannot get table."); return; } const col = table.cells.map((row) => row[this.cell.j]); await this.plugin.tableEditor.insertColRight(table, this.cell.j, col); }; }); this.rowOpBarEl.createDiv({ cls: "ob-table-enhancer-row-bar-button" }, (el) => { el.innerHTML = cloneIcon; el.onclick = async () => { const table = await plugin.tableEditor.getTable(this.cell.tableLine); if (!table) { console.error("Cannot get table."); return; } await this.plugin.tableEditor.insertRowBelow(table, this.cell.i, table.cells[this.cell.i]); }; }); plugin.registerDomEvent(activeDocument, "scroll", (e) => { this.colOpBarEl.style.opacity = "0"; this.rowOpBarEl.style.opacity = "0"; this.activeOpBars = []; }, true); if (activeDocument) { activeDocument.body.appendChild(this.rowOpBarEl); activeDocument.body.appendChild(this.colOpBarEl); } } tryShowFor(cellEl) { if (this.plugin.isInReadingView()) return; if (this.hideTimeout) clearTimeout(this.hideTimeout); this.cell = getCellInfo(cellEl, this.plugin); if (this.cell.j == 0) { this.activeOpBars.push(this.rowOpBarEl); this.rowOpBarEl.style.opacity = "1"; this.colOpBarEl.style.zIndex = "99"; const cellRect = cellEl.getBoundingClientRect(); const toolBarRect = this.rowOpBarEl.getBoundingClientRect(); this.rowOpBarEl.style.top = `${cellRect.top}px`; this.rowOpBarEl.style.left = `${cellRect.left - toolBarRect.width}px`; this.rowOpBarEl.style.height = `${cellRect.height}px`; } if (this.cell.i == 0) { this.activeOpBars.push(this.colOpBarEl); this.colOpBarEl.style.opacity = "1"; this.colOpBarEl.style.zIndex = "99"; const cellRect = cellEl.getBoundingClientRect(); const toolBarRect = this.colOpBarEl.getBoundingClientRect(); this.colOpBarEl.style.top = `${cellRect.top - toolBarRect.height}px`; this.colOpBarEl.style.left = `${cellRect.left}px`; this.colOpBarEl.style.width = `${cellRect.width}px`; } } tryHide(timeout) { this.hideTimeout = setTimeout(() => { this.colOpBarEl.style.opacity = "0"; this.rowOpBarEl.style.opacity = "0"; this.colOpBarEl.style.zIndex = "-1"; this.rowOpBarEl.style.zIndex = "-1"; this.activeOpBars = []; }, timeout); const stopHideTimeout = (e) => { clearTimeout(this.hideTimeout); this.activeOpBars.forEach((toolBarEl) => { toolBarEl.onmouseout = (e2) => { if (e2.relatedTarget instanceof Node && toolBarEl.contains(e2.relatedTarget)) return; this.tryHide(500); }; }); }; this.activeOpBars.forEach((toolbar) => { toolbar.onmouseenter = stopHideTimeout; }); } onUnload() { this.colOpBarEl.remove(); this.rowOpBarEl.remove(); } }; // src/buttonPanel.ts var import_obsidian4 = require("obsidian"); var addButtons = (menu, plugin, { tableLine, i, j }) => { const oldOnLoad = menu.onload; menu.onload = () => { oldOnLoad.call(menu); const menuDom = menu.dom; const containerEl = createDiv({ cls: ["ob-table-enhancer", "button-menu"] }); new import_obsidian4.ButtonComponent(containerEl).setTooltip("Insert row below").setClass("clickable-icon").onClick(async () => { await plugin.doneEdit(); const table = plugin.tableEditor.getTable(tableLine); if (!table) { console.error("cannot locate table when trying to insert row below "); return; } await plugin.tableEditor.insertRowBelow(table, i); }).then((button) => button.buttonEl.innerHTML = insertRowBelow); new import_obsidian4.ButtonComponent(containerEl).setTooltip("Insert column right").setClass("clickable-icon").onClick(async () => { await plugin.doneEdit(); const table = plugin.tableEditor.getTable(tableLine); if (!table) { console.error("cannot locate table when trying to insert column below "); return; } await plugin.tableEditor.insertColRight(table, j); }).then((button) => button.buttonEl.innerHTML = insertColRight); new import_obsidian4.ButtonComponent(containerEl).setTooltip("Clone row").setClass("clickable-icon").onClick(async () => { await plugin.doneEdit(); const table = plugin.tableEditor.getTable(tableLine); if (!table) { console.error("cannot locate table when trying to copy row below "); return; } await plugin.tableEditor.insertRowBelow(table, i, table.cells[i]); }).then((button) => button.buttonEl.innerHTML = cloneRow); new import_obsidian4.ButtonComponent(containerEl).setTooltip("Clone column").setClass("clickable-icon").onClick(async () => { await plugin.doneEdit(); const table = plugin.tableEditor.getTable(tableLine); if (!table) { console.error("cannot locate table when trying to copy row below "); return; } const col = table.cells.map((row) => row[j]); await plugin.tableEditor.insertColRight(table, j, col); }).then((button) => button.buttonEl.innerHTML = cloneCol); new import_obsidian4.ButtonComponent(containerEl).setTooltip("Delete row").setClass("clickable-icon").onClick(async () => { await plugin.doneEdit(); const table = plugin.tableEditor.getTable(tableLine); if (!table) { console.error("cannot locate table when trying to copy row below "); return; } await plugin.tableEditor.deleteRow(table, i); }).then((button) => button.buttonEl.innerHTML = delRow); new import_obsidian4.ButtonComponent(containerEl).setTooltip("Wider").setIcon("chevrons-left-right").setClass("clickable-icon").onClick(async (e) => { await plugin.doneEdit(); const table = plugin.tableEditor.getTable(tableLine); if (!table) { console.error("cannot locate table when trying sort table "); return; } e.stopPropagation(); e.preventDefault(); const oldContent = table.cells[0][j]; await plugin.tableEditor.updateCell(table, 0, j, oldContent + "\u2007"); }); new import_obsidian4.ButtonComponent(containerEl).setTooltip("Delete column").setClass("clickable-icon").onClick(async () => { await plugin.doneEdit(); const table = plugin.tableEditor.getTable(tableLine); if (!table) { console.error("cannot locate table when trying to copy row below "); return; } await plugin.tableEditor.deleteCol(table, j); }).then((button) => button.buttonEl.innerHTML = delCol); new import_obsidian4.ButtonComponent(containerEl).setTooltip("Move column left").setIcon("chevron-left").setClass("clickable-icon").onClick(async () => { await plugin.doneEdit(); const table = plugin.tableEditor.getTable(tableLine); if (!table) { console.error("cannot locate table when trying to copy row below "); return; } if (j == 0) { new import_obsidian4.Notice("Current column is already the leftmost column."); return; } await plugin.tableEditor.swapCols(table, j, j - 1); }); new import_obsidian4.ButtonComponent(containerEl).setTooltip("Move column right").setIcon("chevron-right").setClass("clickable-icon").onClick(async () => { await plugin.doneEdit(); const table = plugin.tableEditor.getTable(tableLine); if (!table) { console.error("cannot locate table when trying to copy row below "); return; } const colNum = table.formatLine.length; if (j == colNum - 1) { new import_obsidian4.Notice("Current column is already the rightmost column."); return; } await plugin.tableEditor.swapCols(table, j, j + 1); }); new import_obsidian4.ButtonComponent(containerEl).setTooltip("Move row upward").setIcon("chevron-up").setClass("clickable-icon").onClick(async () => { await plugin.doneEdit(); const table = plugin.tableEditor.getTable(tableLine); if (!table) { console.error("cannot locate table when trying to copy row below "); return; } if (i == 1) { new import_obsidian4.Notice("Current column is already the top row."); return; } await plugin.tableEditor.swapRows(table, i, i - 1); }); new import_obsidian4.ButtonComponent(containerEl).setTooltip("Move row down").setIcon("chevron-down").setClass("clickable-icon").onClick(async () => { await plugin.doneEdit(); const table = plugin.tableEditor.getTable(tableLine); if (!table) { console.error("cannot locate table when trying to copy row below "); return; } const rowNum = table.cells.length; if (i == rowNum - 1) { new import_obsidian4.Notice("Current column is already the bottom row."); return; } await plugin.tableEditor.swapRows(table, i, i + 1); }); new import_obsidian4.ButtonComponent(containerEl).setTooltip("Narrower").setIcon("chevrons-right-left").setClass("clickable-icon").onClick(async (e) => { await plugin.doneEdit(); const table = plugin.tableEditor.getTable(tableLine); if (!table) { console.error("cannot locate table when trying sort table "); return; } e.stopPropagation(); e.preventDefault(); const newContent = table.cells[0][j].replace(/ $/, ""); await plugin.tableEditor.updateCell(table, 0, j, newContent); }); const setColAlign = (aligned) => async () => { await plugin.doneEdit(); const table = plugin.tableEditor.getTable(tableLine); if (!table) { console.error("cannot locate table when trying to copy row below "); return; } await plugin.tableEditor.setColAligned(table, j, aligned); }; new import_obsidian4.ButtonComponent(containerEl).setTooltip("Center align").setIcon("align-center").setClass("clickable-icon").onClick(setColAlign("center")); new import_obsidian4.ButtonComponent(containerEl).setTooltip("Left align").setIcon("align-left").setClass("clickable-icon").onClick(setColAlign("left")); new import_obsidian4.ButtonComponent(containerEl).setTooltip("Right align").setIcon("align-right").setClass("clickable-icon").onClick(setColAlign("right")); new import_obsidian4.ButtonComponent(containerEl).setTooltip("Sort ascending").setIcon("sort-asc").setClass("clickable-icon").onClick(async () => { await plugin.doneEdit(); const table = plugin.tableEditor.getTable(tableLine); if (!table) { console.error("cannot locate table when trying sort table "); return; } await plugin.tableEditor.sortByCol(table, j, "aes"); }); new import_obsidian4.ButtonComponent(containerEl).setTooltip("Sort descending").setIcon("sort-desc").setClass("clickable-icon").onClick(async () => { await plugin.doneEdit(); const table = plugin.tableEditor.getTable(tableLine); if (!table) { console.error("cannot locate table when trying sort table "); return; } await plugin.tableEditor.sortByCol(table, j, "desc"); }); new import_obsidian4.ButtonComponent(containerEl).setTooltip("Reset Column Width").setIcon("undo-2").setClass("clickable-icon").onClick(async (e) => { await plugin.doneEdit(); const table = plugin.tableEditor.getTable(tableLine); if (!table) { console.error("cannot locate table when trying sort table "); return; } e.stopPropagation(); e.preventDefault(); const newContent = table.cells[0][j].trimRight(); await plugin.tableEditor.updateCell(table, 0, j, newContent); }); const dividerEl = createDiv({ cls: "menu-separator" }); menuDom.prepend(dividerEl); menuDom.prepend(containerEl); }; }; // src/tableGenerator.ts var import_obsidian5 = require("obsidian"); var addTableGenerator = (menu, plugin, editor) => { menu.addItem((menuItem) => { menuItem.setTitle("Create new table"); menuItem.setIcon("table"); menuItem.onClick(async (e) => { var _a, _b, _c; const cursor = editor.getCursor("from"); const editor2 = editor; let coord; if (editor2.coordsAtPos) { const offset = editor.posToOffset(cursor); coord = (_c = (_b = (_a = editor2.cm).coordsAtPos) == null ? void 0 : _b.call(_a, offset)) != null ? _c : editor2.coordsAtPos(offset); } else { console.error("Cannot get cursor coordinate"); return; } const tableGenerator = new TableGenerator(plugin); tableGenerator.showAtPosition({ x: coord.left, y: coord.bottom }); }); }); }; var TableGenerator = class extends import_obsidian5.Menu { constructor(plugin) { super(); this.plugin = plugin; this.addItem((item) => item.setDisabled(true)); } onload() { super.onload(); const menuDom = this.dom; const frag = activeDocument.createDocumentFragment(); const containerEl = frag.createDiv({ cls: "table-generator-container" }); const counter = frag.createDiv({ cls: ["table-generator-counter", "menu-item"] }); for (let i = 0; i < 7; i++) { for (let j = 0; j < 7; j++) { const gridEl = createDiv({ cls: "table-generator-grid" }); gridEl.setAttr("i", i); gridEl.setAttr("j", j); gridEl.addEventListener("click", async () => { await this.plugin.tableEditor.createEmptyTable(i + 1, j + 1); }); gridEl.addEventListener("mouseenter", async () => { containerEl.querySelectorAll(".table-generator-grid").forEach((gridEl2) => { const i2 = parseInt(gridEl2.getAttr("i")); const j2 = parseInt(gridEl2.getAttr("j")); if (i2 > i || j2 > j) gridEl2.removeClass("select"); else gridEl2.addClass("select"); }); counter.innerText = `${i + 1} rows ${j + 1} columns`; }); containerEl.append(gridEl); } } menuDom.append(frag); } }; // src/settings.ts var import_obsidian6 = require("obsidian"); var DEFAULT_SETTINGS = { enableButtonPanel: true, enableTableGenerator: true, enableFloatingToolbar: false, adjustTableCellHeight: true, removeEditBlockButton: false, defaultAlignmentForTableGenerator: "left", defaultAlignmentWhenInsertNewCol: "follow", enableColumnWidthAdjust: true }; var TableEnhancer2SettingTab = class extends import_obsidian6.PluginSettingTab { constructor(app2, plugin) { super(app2, plugin); this.plugin = plugin; } display() { this.containerEl.empty(); this.containerEl.createEl("h2", { text: "Table Enhancer Settings" }); new import_obsidian6.Setting(this.containerEl).setName("Enable button panel").addToggle((c) => c.setValue(this.plugin.settings.enableButtonPanel).onChange(async (val) => { this.plugin.settings.enableButtonPanel = val; await this.plugin.saveSettings(); })); new import_obsidian6.Setting(this.containerEl).setName("Enable table generator").addToggle((c) => c.setValue(this.plugin.settings.enableTableGenerator).onChange(async (val) => { this.plugin.settings.enableTableGenerator = val; await this.plugin.saveSettings(); })); new import_obsidian6.Setting(this.containerEl).setName("Enable floating panel").addToggle((c) => c.setValue(this.plugin.settings.enableFloatingToolbar).onChange(async (val) => { this.plugin.settings.enableFloatingToolbar = val; await this.plugin.saveSettings(); })); new import_obsidian6.Setting(this.containerEl).setName("Adjust height of cells").setDesc("The default height of an empty cell is very short. Activate this to increase the cell height and make it easier to click.").addToggle((c) => c.setValue(this.plugin.settings.adjustTableCellHeight).onChange(async (val) => { var _a, _b; if (val) (_a = activeDocument == null ? void 0 : activeDocument.body) == null ? void 0 : _a.addClass("table-height-adjust"); else (_b = activeDocument == null ? void 0 : activeDocument.body) == null ? void 0 : _b.removeClass("table-height-adjust"); this.plugin.settings.adjustTableCellHeight = val; await this.plugin.saveSettings(); })); new import_obsidian6.Setting(this.containerEl).setName("Default alignment for new created table").setDesc("Choose if you want to align the text in a cell to the right, left or in the middle.").addDropdown((d) => d.addOption("left", "left").addOption("center", "center").addOption("right", "right").setValue(this.plugin.settings.defaultAlignmentForTableGenerator).onChange(async (val) => { this.plugin.settings.defaultAlignmentForTableGenerator = val; await this.plugin.saveSettings(); })); new import_obsidian6.Setting(this.containerEl).setName("Default alignment for new inserted column").setDesc("Choose if you want to align the text in a cell to the right, left, in the middle, or follow other columns.").addDropdown((d) => d.addOption("left", "left").addOption("center", "center").addOption("right", "right").addOption("follow", "follow").setValue(this.plugin.settings.defaultAlignmentWhenInsertNewCol).onChange(async (val) => { this.plugin.settings.defaultAlignmentWhenInsertNewCol = val; await this.plugin.saveSettings(); })); } }; // src/tableHoverPostProcessor.ts function getTableHoverPostProcessor(plugin) { return (el) => { var _a; const tables = el.getElementsByTagName("table"); for (let i = 0; i < tables.length; i++) { const table = tables[i]; const headers = table.rows[0].cells; for (let i2 = 0; i2 < headers.length; i2++) { const headerCell = headers[i2]; const oldHtml = headerCell.innerHTML; const spaceCnt = (_a = oldHtml.match(/ +$/)) == null ? void 0 : _a[0].length; if (spaceCnt) { headerCell.innerHTML = oldHtml.slice(0, -spaceCnt); headerCell.style.width = String(5 + spaceCnt * 2) + "%"; } } for (let i2 = 0; i2 < table.rows.length; i2++) { const row = table.rows[i2]; for (let j = 0; j < row.cells.length; j++) { const cell = row.cells[j]; cell.addEventListener("mouseenter", () => { cell.addClass(hoveredCellClassName); }); cell.addEventListener("mouseleave", () => { cell.removeClass(hoveredCellClassName); }); } } } }; } // src/mousedownHandler.ts var import_obsidian7 = require("obsidian"); function isClickable(node) { if (node instanceof HTMLElement) { if (node.tagName == "A") return true; } return false; } function getEditableNode(node) { if (!(node instanceof HTMLElement)) return null; if (node instanceof HTMLTableCellElement) return node; if (isClickable(node)) return null; let parent = node.parentNode; while (parent) { if (parent instanceof HTMLTableCellElement) break; parent = parent.parentNode; } if (!parent) return null; return parent; } function getClickHandler(plugin) { return async (e) => { if (plugin.isInReadingView()) return; const markdownView = plugin.app.workspace.getActiveViewOfType(import_obsidian7.MarkdownView); const editor = markdownView == null ? void 0 : markdownView.editor; const editorView = editor == null ? void 0 : editor.cm; const cellEl = getEditableNode(e.targetNode); if (!cellEl) return; let tableEl = cellEl.parentNode; while (tableEl) { if (tableEl instanceof HTMLTableElement) break; tableEl = tableEl.parentNode; } if (!tableEl) { console.error("Cannot get table element of cell ", cellEl); return; } if (!(editorView == null ? void 0 : editorView.contentDOM.contains(tableEl))) return; if (tableEl.classList.length > 0) return; e.stopImmediatePropagation(); e.preventDefault(); const { tableLine, i, j } = getCellInfo(cellEl, plugin, tableEl); if (cellEl.isContentEditable) { return; } const tablePos = editorView.posAtDOM(tableEl); const editingCell = activeDocument.querySelector("." + editingCellClassName); if (editingCell instanceof HTMLTableCellElement) { await plugin.doneEdit(editingCell); } setTimeout(() => { const newCellEl = getCellEl(tablePos, i, j, plugin); if (!(newCellEl instanceof HTMLTableCellElement)) { console.error("Cannot relocate table cell"); return; } plugin.setCellEditing(newCellEl, tableLine, i, j); }, 50); }; } function getMousedownHandler(plugin) { return async (e) => { const markdownView = plugin.app.workspace.getActiveViewOfType(import_obsidian7.MarkdownView); const editor = markdownView == null ? void 0 : markdownView.editor; const tableEl = getTableOfCell(e.targetNode); if (!tableEl) { const editingCell = activeDocument.querySelector("." + editingCellClassName); if (editingCell instanceof HTMLTableCellElement) { await plugin.doneEdit(editingCell); editor == null ? void 0 : editor.focus(); } return; } }; } // src/keydownHandler.ts var import_obsidian8 = require("obsidian"); function getKeydownHandler(plugin) { return async (e) => { const markdownView = plugin.app.workspace.getActiveViewOfType(import_obsidian8.MarkdownView); if (!markdownView) return; const editor = markdownView.editor; const editorView = editor == null ? void 0 : editor.cm; if (!editor.hasFocus()) { if (!e.repeat && e.ctrlKey && e.key == "z") { e.stopPropagation(); e.preventDefault(); editor.undo(); editor.blur(); return; } else if (!e.repeat && e.ctrlKey && e.key == "Z") { e.stopPropagation(); e.preventDefault(); editor.redo(); editor.blur(); return; } } const cellEl = activeDocument.querySelector("." + editingCellClassName); if (!(cellEl instanceof HTMLTableCellElement)) return; if (!e.repeat && e.key == "Enter" && e.shiftKey) { e.stopPropagation(); e.preventDefault(); const prevCaretPos = getCaretPosition(cellEl); const text1 = cellEl.innerText.slice(0, prevCaretPos); const text2 = cellEl.innerText.slice(prevCaretPos + 1); cellEl.innerText = [text1, "
", text2].join(""); setCaretPosition(cellEl, prevCaretPos + 6); return; } if (!e.repeat && (e.key == "Enter" || e.key == "Escape")) { e.stopPropagation(); e.preventDefault(); await plugin.doneEdit(cellEl); return; } let tableEl = cellEl.parentNode; while (tableEl) { if (tableEl instanceof HTMLTableElement) break; tableEl = tableEl.parentNode; } if (!tableEl) { console.error("Cannot find table of cell", cellEl); return; } if (e.key == "ArrowLeft") { const caretPos = getCaretPosition(cellEl); const { tableLine, i, j } = getCellInfo(cellEl, plugin, tableEl); if (cellEl.innerText.length == 0 || caretPos == 0) { e.preventDefault(); const tablePos = editorView.posAtDOM(tableEl); await plugin.doneEdit(cellEl); setTimeout(() => { const newCellEl = getCellEl(tablePos, i, j - 1, plugin); if (newCellEl instanceof HTMLTableCellElement) { plugin.setCellEditing(newCellEl, tableLine, i, j - 1); } }, 50); } e.stopPropagation(); return; } if (e.key == "ArrowRight") { const caretPos = getCaretPosition(cellEl); const { tableLine, i, j } = getCellInfo(cellEl, plugin, tableEl); if (caretPos >= cellEl.innerText.length) { e.preventDefault(); const tablePos = editorView.posAtDOM(tableEl); await plugin.doneEdit(cellEl); setTimeout(() => { const newCellEl = getCellEl(tablePos, i, j + 1, plugin); if (newCellEl instanceof HTMLTableCellElement) { plugin.setCellEditing(newCellEl, tableLine, i, j + 1); } }, 50); } e.stopPropagation(); return; } if (e.key == "ArrowUp") { e.stopPropagation(); e.preventDefault(); const { tableLine, i, j } = getCellInfo(cellEl, plugin, tableEl); const tablePos = editorView.posAtDOM(tableEl); await plugin.doneEdit(cellEl); setTimeout(() => { const newCellEl = getCellEl(tablePos, i - 1, j, plugin); if (newCellEl instanceof HTMLTableCellElement) { plugin.setCellEditing(newCellEl, tableLine, i - 1, j); } }, 50); return; } if (e.key == "ArrowDown") { e.stopPropagation(); e.preventDefault(); const { tableLine, i, j } = getCellInfo(cellEl, plugin, tableEl); const tablePos = editorView.posAtDOM(tableEl); await plugin.doneEdit(cellEl); setTimeout(() => { const newCellEl = getCellEl(tablePos, i + 1, j, plugin); if (newCellEl instanceof HTMLTableCellElement) { plugin.setCellEditing(newCellEl, tableLine, i + 1, j); } }, 50); return; } if (!e.repeat && e.ctrlKey && e.key == "a") { e.stopPropagation(); e.preventDefault(); const selection = activeWindow.getSelection(); const range = activeDocument.createRange(); range.selectNodeContents(cellEl); selection == null ? void 0 : selection.removeAllRanges(); selection == null ? void 0 : selection.addRange(range); return; } if (e.shiftKey && e.key == "Tab") { e.stopPropagation(); e.preventDefault(); const { tableLine, i, j } = getCellInfo(cellEl, plugin, tableEl); const rowNum = tableEl.rows.length; const colNum = tableEl.rows[0].cells.length; const tablePos = editorView.posAtDOM(tableEl); let nextI, nextJ; if (i == 0 && j == 0) { nextI = rowNum - 1; nextJ = colNum - 1; } else if (j == 0) { nextI = i - 1; nextJ = colNum - 1; } else { nextI = i; nextJ = j - 1; } await plugin.doneEdit(cellEl); setTimeout(() => { const newCellEl = getCellEl(tablePos, nextI, nextJ, plugin); if (newCellEl instanceof HTMLTableCellElement) { plugin.setCellEditing(newCellEl, tableLine, nextI, nextJ); } }, 50); return; } if (e.key == "Tab") { e.stopPropagation(); e.preventDefault(); const { tableLine, i, j } = getCellInfo(cellEl, plugin, tableEl); const rowNum = tableEl.rows.length; const colNum = tableEl.rows[0].cells.length; const tablePos = editorView.posAtDOM(tableEl); let nextI, nextJ; if (i == rowNum - 1 && j == colNum - 1) { nextI = 0; nextJ = 0; } else if (j == colNum - 1) { nextI = i + 1; nextJ = 0; } else { nextI = i; nextJ = j + 1; } await plugin.doneEdit(cellEl); setTimeout(() => { const newCellEl = getCellEl(tablePos, nextI, nextJ, plugin); if (newCellEl instanceof HTMLTableCellElement) { plugin.setCellEditing(newCellEl, tableLine, nextI, nextJ); } }, 50); return; } }; } // node_modules/monkey-around/mjs/index.js function around(obj, factories) { const removers = Object.keys(factories).map((key) => around1(obj, key, factories[key])); return removers.length === 1 ? removers[0] : function() { removers.forEach((r) => r()); }; } function around1(obj, method, createWrapper) { const original = obj[method], hadOwn = obj.hasOwnProperty(method); let current = createWrapper(original); if (original) Object.setPrototypeOf(current, original); Object.setPrototypeOf(wrapper, current); obj[method] = wrapper; return remove; function wrapper(...args) { if (current === original && obj[method] === wrapper) remove(); return current.apply(this, args); } function remove() { if (obj[method] === wrapper) { if (hadOwn) obj[method] = original; else delete obj[method]; } if (current === original) return; current = original; Object.setPrototypeOf(wrapper, original || Function); } } // src/commands.ts var getCommands = (plugin) => { return { "editor:toggle-bold": () => withEditingCell((cellEl) => { const selection = activeWindow.getSelection(); if (!selection) return; let selectionStart, selectionEnd; if (selection.anchorOffset < selection.focusOffset) { selectionStart = selection.anchorOffset; selectionEnd = selection.focusOffset; } else { selectionStart = selection.focusOffset; selectionEnd = selection.anchorOffset; } const prevText = cellEl.innerText.slice(0, selectionStart); const selectText = cellEl.innerText.slice(selectionStart, selectionEnd); const succText = cellEl.innerText.slice(selectionEnd); cellEl.innerText = [prevText, "**", selectText, "**", succText].join(""); setCaretPosition(cellEl, selectionEnd + 4); return true; }), "editor:toggle-italics": () => withEditingCell((cellEl) => { const selection = activeWindow.getSelection(); if (!selection) return; let selectionStart, selectionEnd; if (selection.anchorOffset < selection.focusOffset) { selectionStart = selection.anchorOffset; selectionEnd = selection.focusOffset; } else { selectionStart = selection.focusOffset; selectionEnd = selection.anchorOffset; } const prevText = cellEl.innerText.slice(0, selectionStart); const selectText = cellEl.innerText.slice(selectionStart, selectionEnd); const succText = cellEl.innerText.slice(selectionEnd); cellEl.innerText = [prevText, "*", selectText, "*", succText].join(""); setCaretPosition(cellEl, selectionEnd + 2); return true; }), "editor:toggle-blockquote": () => withEditingCell((cellEl) => { const selection = activeWindow.getSelection(); if (!selection) return; let selectionStart, selectionEnd; if (selection.anchorOffset < selection.focusOffset) { selectionStart = selection.anchorOffset; selectionEnd = selection.focusOffset; } else { selectionStart = selection.focusOffset; selectionEnd = selection.anchorOffset; } const prevText = cellEl.innerText.slice(0, selectionStart); const selectText = cellEl.innerText.slice(selectionStart, selectionEnd); const succText = cellEl.innerText.slice(selectionEnd); cellEl.innerText = ["> ", prevText, selectText, succText].join(""); setCaretPosition(cellEl, selectionEnd + 2); return true; }), "editor:toggle-bullet-list": () => withEditingCell((cellEl) => { return true; }), "editor:toggle-checklist-status": () => withEditingCell((cellEl) => { return true; }), "editor:toggle-code": () => withEditingCell((cellEl) => { const selection = activeWindow.getSelection(); if (!selection) return; let selectionStart, selectionEnd; if (selection.anchorOffset < selection.focusOffset) { selectionStart = selection.anchorOffset; selectionEnd = selection.focusOffset; } else { selectionStart = selection.focusOffset; selectionEnd = selection.anchorOffset; } const prevText = cellEl.innerText.slice(0, selectionStart); const selectText = cellEl.innerText.slice(selectionStart, selectionEnd); const succText = cellEl.innerText.slice(selectionEnd); cellEl.innerText = [prevText, "`", selectText, "`", succText].join(""); setCaretPosition(cellEl, selectionEnd + 2); return true; }), "editor:toggle-highlight": () => withEditingCell((cellEl) => { const selection = activeWindow.getSelection(); if (!selection) return; let selectionStart, selectionEnd; if (selection.anchorOffset < selection.focusOffset) { selectionStart = selection.anchorOffset; selectionEnd = selection.focusOffset; } else { selectionStart = selection.focusOffset; selectionEnd = selection.anchorOffset; } const prevText = cellEl.innerText.slice(0, selectionStart); const selectText = cellEl.innerText.slice(selectionStart, selectionEnd); const succText = cellEl.innerText.slice(selectionEnd); cellEl.innerText = [prevText, "==", selectText, "==", succText].join(""); setCaretPosition(cellEl, selectionEnd + 4); return true; }), "editor:toggle-numbered-list": () => withEditingCell((cellEl) => { return null; }), "editor:toggle-strikethrough": () => withEditingCell((cellEl) => { const selection = activeWindow.getSelection(); if (!selection) return; let selectionStart, selectionEnd; if (selection.anchorOffset < selection.focusOffset) { selectionStart = selection.anchorOffset; selectionEnd = selection.focusOffset; } else { selectionStart = selection.focusOffset; selectionEnd = selection.anchorOffset; } const prevText = cellEl.innerText.slice(0, selectionStart); const selectText = cellEl.innerText.slice(selectionStart, selectionEnd); const succText = cellEl.innerText.slice(selectionEnd); cellEl.innerText = [prevText, "~~", selectText, "~~", succText].join(""); setCaretPosition(cellEl, selectionEnd + 4); return true; }) }; }; // main.ts var TableEnhancer2 = class extends import_obsidian9.Plugin { async onload() { this.tableEditor = new TableEditor(this); await this.loadSettings(); this.addSettingTab(new TableEnhancer2SettingTab(this.app, this)); if (this.settings.enableFloatingToolbar) this.toolBar = new ToolBar(this); const tableHoverPostProcessor = getTableHoverPostProcessor(this); this.registerMarkdownPostProcessor(tableHoverPostProcessor); this.app.workspace.onLayoutReady(() => { const markdownView = app.workspace.getActiveViewOfType(import_obsidian9.MarkdownView); const editor = markdownView == null ? void 0 : markdownView.editor; const editorView = editor == null ? void 0 : editor.cm; if (this.settings.adjustTableCellHeight) activeDocument.body.addClass("table-height-adjust"); const mousedownHandler = getMousedownHandler(this); this.registerDomEvent(window, "mousedown", mousedownHandler, true); const clickHandler = getClickHandler(this); this.registerDomEvent(window, "click", clickHandler, true); const keydownHandler = getKeydownHandler(this); this.registerDomEvent(window, "keydown", keydownHandler, true); this.register(around(app.commands, { executeCommand(next) { return function(command) { const commands = getCommands(this); const callback = commands[command.id]; if (callback == null ? void 0 : callback.call(this)) { return; } return next.call(this, command); }; } })); }); this.registerEvent(this.app.workspace.on("editor-menu", (menu, editor) => { menu.setUseNativeMenu(false); const hoveredCell = activeDocument.querySelector("." + hoveredCellClassName); if (!(hoveredCell instanceof HTMLTableCellElement)) { if (this.settings.enableTableGenerator) addTableGenerator(menu, this, editor); return; } const cellInfo = getCellInfo(hoveredCell, this); if (this.settings.enableButtonPanel) addButtons(menu, this, cellInfo); })); } setCellEditing(cellEl, tableLine, i, j) { const table = this.tableEditor.getTable(tableLine); if (!table) { console.error("Cannot get table of cell ", cellEl); return; } const text = getCellText(table, i, j); if (text == null) return; cellEl.addClass(editingCellClassName); cellEl.focus(); cellEl.contentEditable = "true"; if (text == "") { cellEl.innerText = " "; setCaretPosition(cellEl, 0); } else { cellEl.innerText = text; setCaretPosition(cellEl, text.length); } } async doneEdit(cellEl) { if (!cellEl) { const el = activeDocument.querySelector("." + editingCellClassName); if (el instanceof HTMLTableCellElement) cellEl = el; else return; } cellEl.setAttr("contenteditable", false); cellEl.removeClass(editingCellClassName); const { tableLine, i, j } = getCellInfo(cellEl, this); const table = this.tableEditor.getTable(tableLine); if (!table) { console.error("Cannot get table when trying to done edit"); return; } await this.tableEditor.updateCell(table, i, j, cellEl.innerText); } isInReadingView() { const markdownView = this.app.workspace.getActiveViewOfType(import_obsidian9.MarkdownView); return markdownView instanceof import_obsidian9.MarkdownView && markdownView.getMode() == "preview"; } async loadSettings() { this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); } async saveSettings() { await this.saveData(this.settings); } onunload() { } };