UNPKG

wed

Version:

Wed is a schema-aware editor for XML documents.

236 lines (235 loc) 9.83 kB
import { DefaultNameResolver, EName } from "salve"; import { Action, Decorator, EditorAPI, gui, ModeValidator, WedOptions } from "wed"; import Button = gui.button.Button; /** * These are mode options that are supported by default by all modes. Wed is * responsible for providing support for them. */ export interface CommonModeOptions { /** Whether to turn on autoinsertion of elements. */ autoinsert?: boolean; } export interface Mode<ModeOptions extends CommonModeOptions = CommonModeOptions> { /** * This is called by the editor when a mode is ready to be initialized. The * mode could use this to add a toolbar above the editor or add listeners to * key events, etc. * * @returns A promise that resolves once the mode is done initializing. */ init(): Promise<void>; /** * Gets the mode options. */ getModeOptions(): ModeOptions; /** * Gets the options that the mode wants wed to use with this mode. * * @returns The options. Callers are not allowed to modify the value returned. */ getWedOptions(): WedOptions; /** * This method returns a mappings of prefix to namespace URI that are set to * resolve names outside the context of an XML tree. It is sometimes useful to * use qualified names that do not depend on how a specific XML document is * structured, this method provides for such functionality. * * @returns The mappings. This is a new copy which you can modify at will. */ getAbsoluteNamespaceMappings(): Record<string, string>; /** * Unresolve a name according to the absolute reverse mapping. * * If the forward mappings define multiple prefixes pointing to the same URI, * the unresolving algorithm will arbitrarily select one of the prefixes as * the value corresponding to the URI. Modes may impose whatever rules they * desire to select which prefix they should privilege. * * @param name The name to unresolve. * * @returns The unresolved name or ``undefined`` if the name cannot be * unresolved. */ unresolveName(name: EName): string | undefined; /** * This method returns a name resolver that uses the map returned by * [[getAbsoluteNamespaceMappings]]. The resolver is created once and for * all. So code using the resolver should not modify it because it will modify * the resolver for all clients. If you need a resolver you can modify, use * [[getAbsoluteNamespaceMappings]] and initialize a resolver from it. * * @returns The resolver. */ getAbsoluteResolver(): DefaultNameResolver; /** * Make a decorator that this mode will use. */ makeDecorator(): Decorator; /** * Get the toolbar actions that this mode wants the editor to present. * * @returns The toolbar actions for this mode. */ getToolbarButtons(): Button[]; /** * Modes must implement this method to specify what transformations they allow * based on state. The implementation should rely on the ``container`` and * ``offset`` position rather than use the caret because the editor may be * seeking information about possible actions near to the caret. * * @param transformationType The type or types of transformations to return. * * @param tag The tag name we are interested in. This should be in a * prefix:localName format where "prefix" is one of the prefixes defined in * the absolute mappings known to the mode. * * @param container The position in the data tree. * * @param offset The position in the data tree. * * @returns The actions. */ getContextualActions(transformationType: string | string[], tag: string, container: Node, offset?: number): Action<{}>[]; /** * Provide the possible value completions for an attribute. This allows a mode * to support dynamic computations for completions. * * @param attribute The attribute for which we want completions. * * @returns The possible completions. */ getAttributeCompletions(attribute: Attr): string[]; /** * Get additional stylesheets to use to render the HTML. * * @returns An array of paths to the stylesheets to load for this mode. The * paths must not require any additional interpretation from wed. */ getStylesheets(): string[]; /** * Find the nodes that are children of ``element`` and that are just before * and just after the content of element that is editable. * * @param element This is the element to examine. **MUST BE PART OF THE GUI * TREE.** * * @returns An array of two elements. The first is the node before editable * contents, the second is the node after. Either node can be null if there is * nothing before or after editable contents. Both are null if there is * nothing around the editable content. */ nodesAroundEditableContents(element: Element): [Node | null, Node | null]; /** * This method can be overriden by modes to provide the editor with different * placeholders for different elements. The default implementation returns a * default placeholder for all elements. * * @param element This is the element for which to make a placeholder. * * @returns A placeholder for the element. */ makePlaceholderFor(element: Element): Element; /** * Returns a short description for an element. The element should be named * according to the mappings reported by the resolve returned by * [[getAbsoluteResolver]]. * * @param name The name of the element. * * @returns The description. If the value returned is ``undefined``, then * description is not available. If the value returned is ``null``, the * description has not been loaded yet. */ shortDescriptionFor(name: string): string | null | undefined; /** * Returns a URL to the documentation for an element. The element should be * named according to the mappings reported by the resolve returned by * [[getAbsoluteResolver]]. The default implementation returns ``undefined`` * for everything. * * @param name The name of the element. * * @returns The URL. If the value returned is ``undefined``, then the URL is * not available. If the value returned is ``null``, the URL has not been * loaded yet. */ documentationLinkFor(name: string): string | null | undefined; /** * Allows the mode to perform mode-specific checks on the document. This * method will be called by wed to obtain a mode-specific validator to give to * wed's own validator. Mode-specific validators are meant to provide checks * that **cannot** be provided by a schema. It would be conceivable for * instance to call a schematron processor. * * @returns The validator if this mode has one. */ getValidator(): ModeValidator | undefined; } /** * A mode for wed should be implemented as a module which exports a * class derived from this class. */ export declare abstract class BaseMode<ModeOptions> implements Mode<ModeOptions> { protected readonly editor: EditorAPI; protected options: ModeOptions; protected wedOptions: WedOptions; /** * @param editor The editor for which this mode is created. * * @param options The options for the mode. Each mode defines * what fields this object contains. */ constructor(editor: EditorAPI, options: ModeOptions); /** * Gets the mode options. The returned object should be considered frozen. You * may inspect it, not modify it. */ getModeOptions(): ModeOptions; /** * Gets the options that the mode wants wed to use with this mode. * * @returns The options. Callers are not allowed to modify the value returned. */ getWedOptions(): WedOptions; /** * @returns The base implementation returns an empty array. */ getStylesheets(): string[]; nodesAroundEditableContents(element: Element): [Node | null, Node | null]; makePlaceholderFor(_element: Element): Element; /** * While this API provides for the case where descriptions have not been * loaded yet or cannot be loaded, this class does not allow such eventuality * to occur. Derived classes could allow it. * * @returns This default implementation always returns ``undefined``. */ shortDescriptionFor(_name: string): string | null | undefined; /** * While this API provides for the case such URL have not been loaded * yet or cannot be loaded, this class does not allow such eventuality * to occur. Derived classes could allow it. * * @returns The default implementation always returns ``undefined``. */ documentationLinkFor(_name: string): string | null | undefined; /** * @returns ``undefined``. The default implementation has no mode-specific * checks and thus not return a validator. */ getValidator(): ModeValidator | undefined; /** * The default implementation returns an empty array. */ getAttributeCompletions(_attribute: Attr): string[]; /** * The default implementaiton returns an empty array. */ getToolbarButtons(): Button[]; abstract init(): Promise<void>; abstract getAbsoluteNamespaceMappings(): Record<string, string>; abstract unresolveName(name: EName): string | undefined; abstract getAbsoluteResolver(): DefaultNameResolver; abstract makeDecorator(): Decorator; abstract getContextualActions(transformationType: string | string[], tag: string, container: Node, offset: number): Action<{}>[]; }