import { Subject } from 'rxjs';
import { MarkdownEditorProps } from '../../BaseMarkdownEditor';
import type { EditorStore } from '../store';
export type Methods<T> = {
    [P in keyof T]: T[P] extends Function ? P : never;
}[keyof T];
export declare class KeyboardTask {
    store: EditorStore;
    editor: EditorStore['editor'];
    props: MarkdownEditorProps;
    constructor(store: EditorStore, props: MarkdownEditorProps);
    /**
     * 获取当前编辑器中的最低层级元素节点
     *
     * @returns 编辑器中所有匹配的元素节点及其路径
     */
    get curNodes(): Generator<import("slate").NodeEntry<any>, void, undefined>;
    /**
     * 全选编辑器内容
     *
     * 如果当前位于表格单元格内，则选中整个表格；
     * 否则选中编辑器中的所有内容
     */
    selectAll(): void;
    /**
     * 选择当前行的文本。
     *
     * 如果编辑器中有选区，则选择当前行的文本，并打开浮动工具栏。
     *
     * @remarks
     * 该方法首先检查编辑器中是否有选区。如果有选区，则选择当前行的文本路径。
     * 然后获取当前行的文本内容，如果文本内容存在，则打开浮动工具栏。
     */
    selectLine(): void;
    /**
     * 将选中文本转换为行内代码
     *
     * 如果编辑器存在选区，将选中的文本转换为行内代码格式
     */
    selectFormatToCode(): void;
    /**
     * 选择当前光标所在的单词或汉字。
     *
     * 如果当前选区是折叠的（即光标没有选中任何文本），则会尝试选择光标所在位置的整个单词或汉字。
     *
     * 具体步骤如下：
     * 1. 获取当前选区，如果选区是折叠的，则继续。
     * 2. 获取光标所在位置的文本内容。
     * 3. 根据光标位置，向前和向后查找单词或汉字的边界。
     * 4. 更新选区，使其包含整个单词或汉字。
     * 5. 如果选区不再是折叠的，则打开浮动工具栏。
     *
     * @remarks
     * 该方法支持英文单词和中文汉字的选择。
     */
    selectWord(): void;
    /**
     * 从剪贴板粘贴纯文本内容到编辑器中。
     *
     * 该方法首先从剪贴板读取文本内容，然后根据当前节点的类型决定如何插入文本。
     * 如果当前节点是表格单元格类型，则将换行符替换为空格后插入文本；
     * 否则，直接插入文本。
     *
     * @returns {Promise<void>} 一个表示异步操作的 Promise 对象。
     */
    pastePlainText(): Promise<void>;
    /**
     * 上传图片
     *
     * 创建文件上传输入框，允许用户选择图片文件上传，
     * 然后根据当前节点位置将图片插入到编辑器中适当的位置。
     * 支持列单元格、普通节点和空编辑器的不同插入逻辑。
     */
    uploadImage(): void;
    /**
     * 设置标题级别
     *
     * 将当前段落或标题节点转换为指定级别的标题。
     * 如果级别为4，则转换为普通段落。
     *
     * @param level 标题级别（1-3）或4（表示普通段落）
     */
    head(level: number): void;
    /**
     * 将标题转换为普通段落
     *
     * 如果当前节点是标题类型，将其转换为普通段落
     */
    paragraph(): void;
    /**
     * 增加标题级别（使标题变小）
     *
     * 将段落转换为4级标题，
     * 或将标题级别从1级改为普通段落，
     * 或将其他级别标题升级一级（数字变小）
     */
    increaseHead(): void;
    /**
     * 降低标题级别（使标题变大）
     *
     * 将段落转换为1级标题，
     * 或将4级标题改为普通段落，
     * 或将其他级别标题降级一级（数字变大）
     */
    decreaseHead(): void;
    /**
     * 插入或移除引用块
     *
     * 如果当前节点已在引用块中，则移除引用块；
     * 否则，将当前节点转换为引用块。
     * 如果当前节点是标题，先将其转换为普通段落。
     */
    insertQuote(): void;
    /**
     * 插入表格
     *
     * 在当前位置插入一个3x3的表格（包含表头行）。
     * 根据当前节点类型（段落、标题或列单元格）
     * 决定在何处插入表格及如何处理现有内容。
     */
    insertTable(): void;
    /**
     * 插入分栏组
     *
     * 在当前位置插入一个两列的分栏布局。
     * 如果当前节点是空段落，会被删除。
     */
    /**
     * 插入代码块
     *
     * 在当前位置插入代码块，并根据传入的类型设置语言和渲染模式。
     * 支持在列单元格内或普通段落/标题后插入代码块。
     *
     * @param type 可选的代码块类型，'mermaid'表示流程图，'html'表示HTML渲染
     */
    insertCode(type?: 'mermaid' | 'html'): void;
    /**
     * 插入水平分割线
     *
     * 在当前位置插入水平分割线，并将光标定位到分割线后的位置。
     * 如果分割线后没有内容，则自动插入一个空段落并将光标定位到该段落。
     */
    horizontalLine(): void;
    /**
     * 创建或转换列表
     *
     * 将当前段落或标题转换为指定类型的列表。
     * 如果已经是列表项，则更改列表类型。
     *
     * @param mode 列表类型 'ordered'(有序列表), 'unordered'(无序列表), 'task'(任务列表)
     */
    list(mode: 'ordered' | 'unordered' | 'task'): void;
    /**
     * 切换文本格式
     *
     * 在当前选区上应用或取消指定的文本格式（如加粗、斜体等）
     *
     * @param type 要应用的格式类型（'bold'、'italic'、'strikethrough'等）
     */
    format(type: string): void;
    /**
     * 清除文本格式
     *
     * 移除当前选区中的所有格式标记。
     * 如果选区是折叠的（只有光标），则清除光标所在位置的所有标记
     */
    clear(): void;
    /**
     * 撤销上一步操作
     *
     * 调用编辑器的undo方法，回退到上一个历史状态
     */
    undo(): void;
    /**
     * 重做上一步被撤销的操作
     *
     * 调用编辑器的redo方法，前进到下一个历史状态
     */
    redo(): void;
}
export declare const useSystemKeyboard: (keyTask$: Subject<{
    key: Methods<KeyboardTask>;
    args?: any[];
}>, store: EditorStore, props: MarkdownEditorProps, markdownContainerRef?: React.RefObject<HTMLDivElement>) => void;
