/**
 * Copyright 2016 Trim-marks Inc.
 * Copyright 2019 Vivliostyle Foundation
 *
 * Vivliostyle.js is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Vivliostyle.js is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.
 *
 * @fileoverview Plugin - Plugin mechanism
 */
import * as Base from "./base";
import * as Css from "./css";
import * as LayoutProcessor from "./layout-processor";
import * as Task from "./task";
import { Layout, Vtree } from "./types";
/**
 * Type of implemented hooks.
 * @enum {string}
 */
export declare enum HOOKS {
    /**
     * Called when a single property declaration is parsed.
     *
     * The hook is called with an object with the following properties:
     *   {string} name: Property name
     *   {!Css.Val} value: Property value
     *   {boolean} important: Whether '!important' flag is present or not
     * Functions called by this hook are expected to return a value with the same
     * type as the above. The declaration is then replaced by the returned value.
     *
     * Note that a shorthand declaration is not directly passed to this hook.
     * After the shorthand declaration is interpreted and broken into
     * non-shorthand declarations, the hook is called for each of the
     * non-shorthand declarations.
     */
    SIMPLE_PROPERTY = "SIMPLE_PROPERTY",
    /**
     * Called when a single document (i.e. a single spine item) has been fetched,
     * before parsing.
     *
     * The hook is called with the Document object.
     */
    PREPROCESS_SINGLE_DOCUMENT = "PREPROCESS_SINGLE_DOCUMENT",
    /**
     * Called before creating a text node for modifying a text content.
     *
     * The hook is called with an object with the following properties:
     *   {Vtree.NodeContext} nodeContext
     *   {string} sourceTextContent
     *
     * Functions called by this hook are expected to return a
     * Task.Result.<string>. The text content is then replaced by the
     * returned value.
     */
    PREPROCESS_TEXT_CONTENT = "PREPROCESS_TEXT_CONTENT",
    /**
     * Called before creating a element for modifying a element style.
     *
     * The hook is called with an object with the following properties:
     *   {Vtree.NodeContext} nodeContext
     *   {!Object} style
     */
    PREPROCESS_ELEMENT_STYLE = "PREPROCESS_ELEMENT_STYLE",
    /**
     * Called before geting CssCascade.polyfilledInheritedProps.
     *
     * The hook return a array of polyfilled inherited property name.
     */
    POLYFILLED_INHERITED_PROPS = "POLYFILLED_INHERITED_PROPS",
    /**
     * Called when a Viewer is configured.
     *
     * The hook is called with an object with the following properties:
     *  {Base.JSON} command
     */
    CONFIGURATION = "CONFIGURATION",
    /**
     * Called when resolving a text node breaker
     * which detects an acceptable breakpoint and break text node at this point.
     *
     * The hook is called with an object with the following properties:
     *  {Vtree.NodeContext} nodeContext
     *
     * Functions called by this hook are expected to
     * return an instnce of {Layout.TextNodeBreaker} or null.
     */
    RESOLVE_TEXT_NODE_BREAKER = "RESOLVE_TEXT_NODE_BREAKER",
    /**
     * Called when resolving a formatting context.
     *
     * The hook is called with the following parameters:
     *   nodeContext: a NodeContext object
     *   firstTime: a boolean flag representing whether this node is encountered
     * for the first time or not display: an Css.Ident value representing
     * 'display' value of the node position: an Css.Ident value representing
     * 'position' value of the node float: an Css.Ident value representing
     * 'float' value of the node isRoot: a boolean flag representing whether this
     * node is a root (of a flow) or not Functions called by this hook are
     * expected to return a formatting context for the NodeContext.
     */
    RESOLVE_FORMATTING_CONTEXT = "RESOLVE_FORMATTING_CONTEXT",
    /**
     * Called when resolving a layout processor (LayoutProcessor) for
     * a formatting context.
     *
     * The hook is called with a formatting context
     * (Vtree.FormattingContext). Functions called by this hook are expected
     * to return a layout processor corresponding to the formatting context.
     */
    RESOLVE_LAYOUT_PROCESSOR = "RESOLVE_LAYOUT_PROCESSOR",
    /**
     * Called after laid out a block contents.
     *
     * The hook is called with an object with the following properties:
     *  {Vtree.NodeContext} nodeContext
     *  {Array.<Vtree.NodeContext>} checkPoints
     *  {Layout.Column} column
     */
    POST_LAYOUT_BLOCK = "POST_LAYOUT_BLOCK"
}
export declare type PreProcessSingleDocumentHook = (p1: Document) => any;
export declare type PreProcessTextContentHook = (p1: Vtree.NodeContext, p2: string) => Task.Result<string>;
export declare type PreProcessElementStyleHook = (p1: Vtree.NodeContext, p2: object) => void;
export declare type PolyfilledInheritedPropsHook = () => string[];
export declare type ConfigurationHook = (p1: Base.JSON) => {
    needResize: boolean | null | undefined;
    needRefresh: boolean | null | undefined;
};
export declare type ResolveTextNodeBreakerHook = (p1: Vtree.NodeContext) => Layout.TextNodeBreaker;
export declare type ResolveFormattingContextHook = (p1: Vtree.NodeContext, p2: boolean, p3: Css.Ident, p4: Css.Ident, p5: Css.Ident, p6: boolean) => Vtree.FormattingContext;
export declare type ResolveLayoutProcessorHook = (p1: Vtree.FormattingContext) => LayoutProcessor.LayoutProcessor;
export declare type PostLayoutBlockHook = (p1: Vtree.NodeContext, p2: Vtree.NodeContext[], p3: Layout.Column) => void;
/**
 * Register a function to a hook with the specified name.
 * The registered function is called at appropriate timings by the core code.
 * Arguments passed to the function depend on the hook.
 * When multiple functions are registered, they are called by the order in which
 * they are registered.
 * @param name Name of the hook.
 * @param fn Function to be registered to the hook.
 */
export declare function registerHook(name: string, fn: (...p1: any[]) => any): void;
/**
 * Remove a function already registered to the specified name.
 * Note that even if the same function are registered multiple times, this
 * method removes only the first one.
 * @param name Name of the hook.
 * @param fn Function to be removed from the hook.
 */
export declare function removeHook(name: string, fn: (...p1: any[]) => any): void;
/**
 * Get all hooks registered to the specified name.
 * This method is for internal use (from the core code).
 */
export declare function getHooksForName(name: string): ((...p1: any[]) => any)[];
/**
 * Pubilc members of the bundled library.
 */
export declare const plugin: {
    registerHook: typeof registerHook;
    removeHook: typeof removeHook;
};
