import { Attribute, Component, ContentType, Formatter, FormatValue, Slot, Textbus } from '@textbus/core';
import { ViewOptions } from './browser-module';
/**
 * 插槽解析器
 */
export interface SlotParser {
    /**
     * 将指定 DOM 节点解析为插槽数据
     * @param childSlot 储存数据的插槽
     * @param slotRootElement 插槽的根节点
     * @param slotContentHostElement 插槽的内容节点
     *
     * 注意：当不传入内容节点时，Textbus 会把根节点当成内容节点
     */ <T extends Slot>(childSlot: T, slotRootElement: Element, slotContentHostElement?: Element): T;
}
/**
 * 组件加载器
 */
export interface ComponentLoader {
    /** 识别组件的匹配方法 */
    match(element: Element, returnableContentTypes: ContentType[]): boolean;
    /** 读取组件内容的方法 */
    read(element: Element, textbus: Textbus, slotParser: SlotParser): Component | Slot | void;
}
export interface FormatLoaderReadResult<T = FormatValue> {
    formatter: Formatter<T>;
    value: T;
}
/**
 * 格式加载器
 */
export interface FormatLoader<T = FormatValue> {
    /**
     * 匹配一个 DOM 节点是否是某个格式节点
     * @param element
     */
    match(element: Element): boolean;
    /**
     * 读取匹配到的节点，并返回读取后的信息
     * @param element
     */
    read(element: Element): FormatLoaderReadResult<T>;
}
export interface AttributeLoaderReadResult<T = FormatValue> {
    attribute: Attribute<T>;
    value: T;
}
/**
 * 属性加载器
 */
export interface AttributeLoader<T = FormatValue> {
    /**
     * 匹配一个 DOM 节点是否是某个属性节点
     * @param element
     */
    match(element: Element): boolean;
    /**
     * 读取匹配到的节点，并返回读取后的信息
     * @param element
     */
    read(element: Element): AttributeLoaderReadResult<T>;
}
/**
 * 用于解析 HTML，并把 HTML 内容转换为 Textbus 可以支持的组件或插槽数据
 */
export declare class Parser {
    private textbus;
    static parseHTML(html: string): HTMLElement;
    componentLoaders: ComponentLoader[];
    formatLoaders: FormatLoader<any>[];
    attributeLoaders: AttributeLoader<any>[];
    constructor(options: ViewOptions, textbus: Textbus);
    /**
     * 使用指定的组件加载器解析一段 HTML 字符串或 DOM 元素
     * @param html
     * @param rootComponentLoader
     */
    parseDoc(html: string | HTMLElement, rootComponentLoader: ComponentLoader): void | Slot | Component<import("@textbus/core").State>;
    /**
     * 将一段 HTML 或 DOM 元素解析到指定插槽
     * @param html
     * @param rootSlot
     */
    parse(html: string | HTMLElement, rootSlot: Slot): Slot;
    private readComponent;
    private readText;
    private readFormats;
    private readSlot;
    private applyFormats;
}
