/// <reference types="react" />
import { Editor, Node, Path, Point, Range } from 'slate';
import { DOMNode } from 'slate-dom';
import { History } from 'slate-history';
import { ReactEditor } from 'slate-react';
import { CardNode, CustomLeaf, Elements, ListNode, ParagraphNode } from '../../el';
export declare class EditorUtils {
    static get p(): {
        readonly type: "paragraph";
        readonly children: readonly [{
            readonly text: "";
        }];
    };
    static hasPath(editor: Editor, path: Path): boolean;
    static focus(editor: Editor): void;
    static blur(editor: Editor): void;
    static isPrevious(firstPath: Path, nextPath: Path): boolean;
    static isNextPath(firstPath: Path, nextPath: Path): boolean;
    static isDirtLeaf(leaf: CustomLeaf): string | true | undefined;
    static isTop(editor: Editor, path: Path): boolean;
    static findPrev(editor: Editor, path: Path): Path;
    static findMediaInsertPath(editor: Editor): Path | null;
    static findNext(editor: Editor, path: Path): Path | undefined;
    static moveNodes(editor: Editor, from: Path, to: Path, index?: number): void;
    static moveAfterSpace(editor: Editor, path: Path): void;
    static moveBeforeSpace(editor: Editor, path: Path): void;
    private static readonly CLEARABLE_MARKS;
    /**
     * 清除编辑器中选中的文本的所有标记
     *
     * @param editor - 编辑器实例
     * @param split - 是否在格式边界处分割文本节点，默认为 false
     *
     * @description
     * 该方法执行以下操作：
     * 1. 移除选中文本的所有格式标记
     * 2. 处理列表项的提升和转换
     * 3. 将选中区域转换为段落格式
     *
     * 当 split=true 时，会在不同格式的边界处分割文本节点，
     * 这允许对部分文本应用/移除格式而不影响相邻文本
     */
    static clearMarks(editor: Editor, split?: boolean): void;
    /**
     * 将列表节点转换为段落节点数组
     *
     * @param editor - 编辑器实例
     * @param listNode - 要处理的列表节点
     * @returns 从列表节点中提取的所有段落节点的数组
     *
     * @description
     * 该方法通过递归遍历列表节点及其子节点，提取所有段落节点，
     * 并将它们汇集成一个扁平化的数组。支持嵌套列表的处理。
     */
    static listToParagraph(editor: Editor, listNode: ListNode): ParagraphNode[];
    /**
     * 替换编辑器中当前选中的节点
     *
     * @param editor - 编辑器实例
     * @param newNode - 要插入的新节点数组
     *
     * @description
     * 该方法会查找当前选区中的最低块级节点，然后用新的节点替换它。
     * 替换过程包括：查找最低块级节点，选中整个节点，插入新节点来替换原内容。
     */
    static replaceSelectedNode: (editor: Editor, newNode: Elements[]) => void;
    /**
     * 删除编辑器中的所有内容，并插入新的节点
     *
     * @param editor - 编辑器实例
     * @param insertNodes - 要插入的新节点数组。如果未提供，将插入默认段落节点
     */
    static deleteAll(editor: Editor, insertNodes?: Elements[]): void;
    /**
     * 重置编辑器的内容，并可选地插入新的节点和重置历史记录
     *
     * @param editor - 要重置的编辑器实例
     * @param insertNodes - 可选的插入节点数组。如果未提供，则使用默认段落节点
     * @param force - 可选的布尔值或历史记录对象。如果为布尔值，则强制重置历史记录；如果为历史记录对象，则使用提供的历史记录
     */
    static reset(editor: Editor, insertNodes?: Elements[], force?: boolean | History): void;
    /**
     * 检查选区是否完全包含在指定节点路径中。
     *
     * @param editor - 编辑器实例。
     * @param sel - 选区范围。
     * @param nodePath - 节点路径。
     * @returns 如果选区完全包含在节点路径中，则返回 true，否则返回 false。
     */
    static includeAll(editor: Editor, sel: Range, nodePath: Path): boolean;
    static copy(data: object): any;
    /**
     * 复制指定范围内的文本内容。
     *
     * @param editor - 编辑器实例。
     * @param start - 文本复制的起始位置。
     * @param end - （可选）文本复制的结束位置。如果未提供，则复制从起始位置到文档末尾的所有文本。
     * @returns 返回指定范围内的文本内容。
     */
    static copyText(editor: Editor, start: Point, end?: Point): string;
    /**
     * 从编辑器中剪切文本。
     *
     * @param editor - 编辑器实例。
     * @param start - 开始位置的点。
     * @param end - 结束位置的点（可选）。
     * @returns 剪切的文本数组，每个元素为一个 CustomLeaf 对象。
     */
    static cutText(editor: Editor, start: Point, end?: Point): CustomLeaf[];
    /**
     * 检查编辑器中是否有指定格式的活动节点
     *
     * @param editor - 编辑器实例
     * @param format - 要检查的格式名称
     * @param value - 可选的值，用于进一步验证格式是否匹配
     * @returns 如果存在匹配的格式节点，则返回 true；否则返回 false
     */
    static isFormatActive(editor: Editor, format: string, value?: any): boolean;
    /**
     * 获取编辑器中选中文本的URL
     *
     * @param editor - 编辑器实例
     * @returns 返回选中文本的URL，如果没有则返回空字符串
     */
    static getUrl(editor: Editor): string;
    /**
     * 切换文本格式（加粗、斜体等）
     *
     * @param editor - 编辑器实例
     * @param format - 要切换的格式类型
     */
    static toggleFormat(editor: Editor, format: string): void;
    /**
     * 为编辑器中的文本节点设置高亮颜色
     *
     * @param editor - 编辑器实例
     * @param color - 可选的高亮颜色字符串。如果未提供，则移除高亮颜色
     */
    static highColor(editor: Editor, color?: string): void;
    /**
     * 设置文本对齐方式
     *
     * @param editor - 编辑器实例
     * @param alignment - 对齐方式：'left', 'center', 或 'right'
     */
    static setAlignment(editor: Editor, alignment: 'left' | 'center' | 'right'): void;
    /**
     * 检查当前选中块的对齐方式
     *
     * @param editor - 编辑器实例
     * @param alignment - 要检查的对齐方式
     * @returns 是否处于指定的对齐方式
     */
    static isAlignmentActive(editor: Editor, alignment: string): boolean;
    /**
     * 检查编辑器末尾是否需要添加段落节点
     *
     * @param editor - 编辑器实例
     * @returns 如果添加了段落节点则返回 true，否则返回 false
     */
    static checkEnd(editor: Editor): boolean;
    /**
     * 检查指定路径是否在编辑器末尾
     *
     * @param editor - 编辑器实例
     * @param path - 要检查的路径
     * @returns 如果路径在末尾则返回 true，否则返回 false
     */
    static checkSelEnd(editor: Editor, path: Path): boolean;
    /**
     * 安全地查找元素对应的Slate路径
     *
     * @param editor - 编辑器实例
     * @param el - DOM元素
     * @returns 元素对应的路径，如果查找失败则返回编辑器起始路径
     */
    static findPath(editor: Editor, el: any): Path;
    /**
     * 创建媒体节点（图片、视频等）
     *
     * @param src - 媒体资源URL
     * @param type - 媒体类型
     * @param extraPros - 额外属性
     * @returns 创建的媒体节点
     */
    static createMediaNode(src: string | undefined, type: string, extraPros?: Record<string, any>): CardNode | {
        text: string;
    };
    /**
     * 标准化URL，添加协议前缀
     */
    private static normalizeUrl;
    /**
     * 解析URL参数
     */
    private static parseUrlParams;
    /**
     * 检查是否为图片类型
     */
    private static isImageType;
    /**
     * 创建图片节点
     */
    private static createImageNode;
    /**
     * 创建通用媒体节点
     */
    private static createGenericMediaNode;
    /**
     * 用卡片节点包装普通节点
     *
     * @param node - 要包装的节点
     * @param props - 额外属性
     * @returns 包装后的卡片节点
     */
    static wrapperCardNode(node: any, props?: Record<string, any>): CardNode;
}
export declare const getDefaultView: (value: any) => Window | null;
export declare const isDOMNode: (value: any) => value is DOMNode;
export declare const isEventHandled: <EventType extends import("react").SyntheticEvent<unknown, unknown>>(event: EventType, handler?: ((event: EventType) => void) | undefined) => boolean;
export declare const hasTarget: (editor: ReactEditor, target: EventTarget | null) => target is DOMNode;
export declare const isTargetInsideVoid: (editor: ReactEditor, target: EventTarget | null) => boolean;
/**
 * 基于 anchorNode 和 focusNode 创建新的 DOM Selection 对象
 *
 * @param anchorNode - 选区起始节点
 * @param anchorOffset - 起始节点中的偏移量
 * @param focusNode - 选区结束节点
 * @param focusOffset - 结束节点中的偏移量
 * @returns 新创建的 Selection 对象，如果创建失败则返回 null
 */
export declare function createSelectionFromNodes(anchorNode: Node | null, anchorOffset: number, focusNode: Node | null, focusOffset: number): Selection | null;
/**
 * 基于 anchorNode 和 focusNode 创建 DOM Range 对象
 *
 * @param anchorNode - 选区起始节点
 * @param anchorOffset - 起始节点中的偏移量
 * @param focusNode - 选区结束节点
 * @param focusOffset - 结束节点中的偏移量
 * @returns 新创建的 DOM Range 对象，如果创建失败则返回 null
 */
export declare function createDomRangeFromNodes(anchorNode: Node | null, anchorOffset: number, focusNode: Node | null, focusOffset: number): globalThis.Range | null;
/**
 * 从 DOM Selection 对象中提取并转换为 Slate Range
 *
 * @param editor - React 编辑器实例
 * @param domSelection - DOM Selection 对象
 * @returns 转换后的 Slate Range 对象，如果转换失败则返回 null
 */
export declare function getSelectionFromDomSelection(editor: ReactEditor, domSelection: Selection): Range | null;
/**
 * 检查目标是否为可编辑的 DOM 节点。
 *
 * @param editor - React 编辑器实例。
 * @param target - 事件目标，可能为 null。
 * @returns 如果目标是可编辑的 DOM 节点，则返回 true。
 */
export declare const hasEditableTarget: (editor: ReactEditor, target: EventTarget | null) => target is DOMNode;
export declare function getPointStrOffset(editor: Editor, point: Point): number;
export declare function getRelativePath(path: string | any[], anther: string | any[]): any[];
export declare function calcPath(path: string | any[], anther: string | any[]): any[];
export declare function isPath(path: string | any[]): boolean;
export declare function findLeafPath(editor: Editor, path: Path): Path;
/**
 * 转义正则表达式特殊字符
 *
 * @param string - 需要转义的字符串
 * @returns 转义后的字符串
 * @private
 */
export declare function escapeRegExp(string: string): string;
/**
 * 清理和标准化 Markdown 搜索文本
 *
 * @param searchText - 原始搜索文本，可能包含 Markdown 语法
 * @returns 包含原文本和清理后文本的数组
 * @public
 */
export declare function normalizeMarkdownSearchText(searchText: string): string[];
/**
 * 在编辑器中按路径和文本搜索内容，支持 Markdown 文本的智能处理
 *
 * @param editor - 编辑器实例
 * @param pathDescription - 搜索范围的路径描述
 * @param searchText - 搜索文本，支持 Markdown 语法
 * @param options - 搜索选项
 * @param options.caseSensitive - 是否区分大小写，默认 false
 * @param options.wholeWord - 是否全词匹配，默认 false
 * @param options.maxResults - 最大结果数量，默认 2
 * @param options.includeMarkdownVariants - 是否包含 Markdown 语法的清理变体，默认 true
 * @returns 搜索结果数组，包含路径、范围、节点、链接信息等
 *
 * @description
 * 该函数支持以下功能：
 * - 自动清理 Markdown 语法（链接、粗体、斜体、代码等）
 * - 生成多个搜索变体以提高匹配率
 * - 避免重复匹配同一位置的文本
 * - 记录匹配的搜索变体信息
 * - 支持识别链接（a 标签）：返回结果包含 isLink 和 linkUrl 字段
 *
 * @example
 * // 搜索包含 Markdown 语法的文本
 * const results = findByPathAndText(editor, [0], "**粗体文本**");
 * // 将同时匹配 "**粗体文本**" 和 "粗体文本"
 *
 * @example
 * // 搜索链接文本
 * const results = findByPathAndText(editor, [0], "点击这里");
 * // 如果匹配到的是链接，results[0].isLink === true 且 results[0].linkUrl 包含 URL
 */
export declare function findByPathAndText(editor: Editor, pathDescription: Path, searchText: string, options?: {
    caseSensitive?: boolean;
    wholeWord?: boolean;
    maxResults?: number;
    includeMarkdownVariants?: boolean;
}): {
    path: Path;
    range: Range;
    node: Node;
    matchedText: string;
    offset: {
        start: number;
        end: number;
    };
    lineContent: string;
    nodeType?: string | undefined;
    searchVariant?: string | undefined;
    isLink?: boolean | undefined;
    linkUrl?: string | undefined;
}[];
