import * as CodeMirror from "codemirror"; import { Addon } from "../core"; import { cm_t } from "../core/type"; import "codemirror/mode/markdown/markdown"; import "codemirror/addon/runmode/runmode"; /************************************************************************************ * Addon Options ************************************************************************************/ export interface TableEditorOptions extends Addon.AddonOptions { enabled: boolean; } export declare const defaultOption: TableEditorOptions; export declare const suggestedOption: Partial; export type OptionValueType = Partial | boolean; declare global { namespace HyperMD { interface EditorConfiguration { /** * Options for TableAlign. * * You may also provide a boolean to toggle it. */ qikmdTable?: OptionValueType; } } } export declare const defaultTableEditorOptions: TableEditorOptions; /************************************************************************************ * TableWidgetData Interface ************************************************************************************/ interface TableWidgetData { start: number; end: number; widget: CodeMirror.LineWidget; containerEl: HTMLElement; rows: TableCell[][]; alignments: string[]; markdown: string; hasHeader: boolean; } /************************************************************************************ * TableCell Class ************************************************************************************/ declare class TableCell { table: TableEditor; row: number; col: number; text: string; padStart: number; padEnd: number; dirty: boolean; start: number; end: number; el: HTMLElement; contentEl: HTMLElement; constructor(table: TableEditor, row: number, col: number, text?: string, padStart?: number, padEnd?: number); setTextDir(): void; init(cellEl: HTMLElement, start: number, end: number, alignment?: string): void; attachEvents(): void; private insertLineBreak; private insertBreakTag; /** * Render Markdown with token visibility control. * Doesn't convert to raw text on focus; tokens are always hidden unless focused. */ enableInlineMarkdown(): void; /** * Re-renders the cell's content while preserving the caret position. * this commented code works but caret position is not properly managed */ private enableInlineMarkdownWithCaretPreservation; private isCellCurrentlyFocused; /** * Find which `.md-segment` (if any) currently contains the user’s caret, * then apply `.show-token` to it. Remove `.show-token` from all others. */ private updateActiveSegmentClass; private hideAllTokens; getTextWithPadding(): string; getAbsoluteOffsets(): { start: number; end: number; textStart: number; textEnd: number; }; } /************************************************************************************ * TableEditor Class ************************************************************************************/ declare class TableEditor implements Addon.Addon, TableEditorOptions { cmInstance: cm_t; cm: cm_t; enabled: boolean; widgets: TableWidgetData[]; styleEl: HTMLStyleElement; private static instances; manualSelectionSet: boolean; constructor(cmInstance: cm_t); handleOptionChange(cm: cm_t, option: string): void; private _procLine; static getInstance(cm: cm_t): TableEditor; private handleCursorActivity; private handleKeyDown; private handleKeyUp; private handleClick; getContainerEl(): HTMLElement; getContainerDir(): string; getIdentifier(): string; setEnabled(enabled: boolean): void; private updateCellsEditability; scanTables: { (): void; stop(): void; }; computeAlignments(tableData: string[][]): string[]; buildTableWidget(start: number, end: number, markdown: string): CodeMirror.LineWidget; private addColumnAtEnd; private addRowAtBottom; removeAllWidgets(): void; syncCell(cell: TableCell): void; syncCompleteTable(cell: TableCell, rebuild?: boolean): void; resetAutoFocus(): void; setCellFocus(row: number, col: number): void; showContextMenu(evt: MouseEvent, cell: TableCell | null): void; insertRow(widgetData: TableWidgetData, targetRow: number, position: "above" | "below"): void; setFocusOnCell(widgetData: any, cell: TableCell): void; deleteRow(widgetData: TableWidgetData, targetRow: number): void; deleteTable(widgetData: TableWidgetData): void; insertColumn(widgetData: TableWidgetData, targetCol: number, position: "left" | "right"): void; deleteColumn(widgetData: TableWidgetData, targetCol: number): void; syncMarkdown(widgetData: TableWidgetData, rebuild?: boolean): void; } /************************************************************************************ * Export the Addon Getter ************************************************************************************/ /** ADDON GETTER (Singleton Pattern): a editor can have only one tableEditor instance */ export declare const getAddon: (cm: cm_t) => TableEditor; declare global { namespace HyperMD { interface HelperCollection { qikmdTable?: TableEditor; } } } export {};