UNPKG

@ckeditor/ckeditor5-engine

Version:

The editing engine of CKEditor 5 – the best browser-based rich text editor.

185 lines (184 loc) 7.92 kB
/** * @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options */ /** * @module engine/view/document */ import { ViewDocumentSelection } from './documentselection.js'; import { Collection } from '@ckeditor/ckeditor5-utils'; import type { StylesProcessor } from './stylesmap.js'; import { type ViewRootEditableElement } from './rooteditableelement.js'; import { type ViewDowncastWriter } from './downcastwriter.js'; declare const ViewDocument_base: import("@ckeditor/ckeditor5-utils").Mixed<{ new (): import("@ckeditor/ckeditor5-utils").Observable; prototype: import("@ckeditor/ckeditor5-utils").Observable; }, import("@ckeditor/ckeditor5-utils").Emitter>; /** * Document class creates an abstract layer over the content editable area, contains a tree of view elements and * {@link module:engine/view/documentselection~ViewDocumentSelection view selection} associated with this document. */ export declare class ViewDocument extends /* #__PURE__ */ ViewDocument_base { /** * Selection done on this document. */ readonly selection: ViewDocumentSelection; /** * Roots of the view tree. Collection of the {@link module:engine/view/element~ViewElement view elements}. * * View roots are created as a result of binding between {@link module:engine/view/document~ViewDocument#roots} and * {@link module:engine/model/document~ModelDocument#roots} and this is handled by * {@link module:engine/controller/editingcontroller~EditingController}, so to create view root we need to create * model root using {@link module:engine/model/document~ModelDocument#createRoot}. */ readonly roots: Collection<ViewRootEditableElement>; /** * The styles processor instance used by this document when normalizing styles. */ readonly stylesProcessor: StylesProcessor; /** * Defines whether document is in read-only mode. * * When document is read-ony then all roots are read-only as well and caret placed inside this root is hidden. * * @observable */ isReadOnly: boolean; /** * True if document is focused. * * This property is updated by the {@link module:engine/view/observer/focusobserver~FocusObserver}. * If the {@link module:engine/view/observer/focusobserver~FocusObserver} is disabled this property will not change. * * @readonly * @observable */ isFocused: boolean; /** * `true` while the user is making a selection in the document (e.g. holding the mouse button and moving the cursor). * When they stop selecting, the property goes back to `false`. * * This property is updated by the {@link module:engine/view/observer/selectionobserver~SelectionObserver}. * * @readonly * @observable */ isSelecting: boolean; /** * True if composition is in progress inside the document. * * This property is updated by the {@link module:engine/view/observer/compositionobserver~CompositionObserver}. * If the {@link module:engine/view/observer/compositionobserver~CompositionObserver} is disabled this property will not change. * * @readonly * @observable */ isComposing: boolean; /** * Post-fixer callbacks registered to the view document. */ private readonly _postFixers; /** * Creates a Document instance. * * @param stylesProcessor The styles processor instance. */ constructor(stylesProcessor: StylesProcessor); /** * Gets a {@link module:engine/view/document~ViewDocument#roots view root element} with the specified name. If the name is not * specific "main" root is returned. * * @param name Name of the root. * @returns The view root element with the specified name or null when there is no root of given name. */ getRoot(name?: string): ViewRootEditableElement | null; /** * Allows registering post-fixer callbacks. A post-fixers mechanism allows to update the view tree just before it is rendered * to the DOM. * * Post-fixers are executed right after all changes from the outermost change block were applied but * before the {@link module:engine/view/view~EditingView#event:render render event} is fired. If a post-fixer callback made * a change, it should return `true`. When this happens, all post-fixers are fired again to check if something else should * not be fixed in the new document tree state. * * View post-fixers are useful when you want to apply some fixes whenever the view structure changes. Keep in mind that * changes executed in a view post-fixer should not break model-view mapping. * * The types of changes which should be safe: * * * adding or removing attribute from elements, * * changes inside of {@link module:engine/view/uielement~ViewUIElement UI elements}, * * {@link module:engine/controller/editingcontroller~EditingController#reconvertItem marking some of the model elements to be * re-converted}. * * Try to avoid changes which touch view structure: * * * you should not add or remove nor wrap or unwrap any view elements, * * you should not change the editor data model in a view post-fixer. * * As a parameter, a post-fixer callback receives a {@link module:engine/view/downcastwriter~ViewDowncastWriter downcast writer}. * * Typically, a post-fixer will look like this: * * ```ts * editor.editing.view.document.registerPostFixer( writer => { * if ( checkSomeCondition() ) { * writer.doSomething(); * * // Let other post-fixers know that something changed. * return true; * } * * return false; * } ); * ``` * * Note that nothing happens right after you register a post-fixer (e.g. execute such a code in the console). * That is because adding a post-fixer does not execute it. * The post-fixer will be executed as soon as any change in the document needs to cause its rendering. * If you want to re-render the editor's view after registering the post-fixer then you should do it manually by calling * {@link module:engine/view/view~EditingView#forceRender `view.forceRender()`}. * * If you need to register a callback which is executed when DOM elements are already updated, * use {@link module:engine/view/view~EditingView#event:render render event}. */ registerPostFixer(postFixer: ViewDocumentPostFixer): void; /** * Destroys this instance. Makes sure that all observers are destroyed and listeners removed. */ destroy(): void; /** * Performs post-fixer loops. Executes post-fixer callbacks as long as none of them has done any changes to the model. * * @internal */ _callPostFixers(writer: ViewDowncastWriter): void; } /** * Document PostFixer. * * @see module:engine/view/document~ViewDocument#registerPostFixer */ export type ViewDocumentPostFixer = (writer: ViewDowncastWriter) => boolean; /** * Enum representing type of the change. * * Possible values: * * * `children` - for child list changes, * * `attributes` - for element attributes changes, * * `text` - for text nodes changes. */ export type ViewDocumentChangeType = 'children' | 'attributes' | 'text'; /** * Event fired whenever document content layout changes. It is fired whenever content is * {@link module:engine/view/view~EditingView#event:render rendered}, but should be also fired by observers in case of * other actions which may change layout, for instance when image loads. * * @eventName ~ViewDocument#layoutChanged */ export type ViewDocumentLayoutChangedEvent = { name: 'layoutChanged'; args: []; }; export {};