wed
Version:
Wed is a schema-aware editor for XML documents.
236 lines (235 loc) • 9.83 kB
TypeScript
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<{}>[];
}