@ckeditor/ckeditor5-engine
Version:
The editing engine of CKEditor 5 – the best browser-based rich text editor.
64 lines (63 loc) • 2.37 kB
JavaScript
/**
* @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/model/utils/autoparagraphing
*/
/**
* Fixes all empty roots.
*
* @internal
* @param writer The model writer.
* @returns `true` if any change has been applied, `false` otherwise.
*/
export function autoParagraphEmptyRoots(writer) {
const { schema, document } = writer.model;
for (const root of document.getRoots()) {
if (root.isEmpty && !schema.checkChild(root, '$text')) {
// If paragraph element is allowed in the root, create paragraph element.
if (schema.checkChild(root, 'paragraph')) {
writer.insertElement('paragraph', root);
// Other roots will get fixed in the next post-fixer round. Those will be triggered
// in the same batch no matter if this method was triggered by the post-fixing or not
// (the above insertElement call will trigger the post-fixers).
return true;
}
}
}
return false;
}
/**
* Checks if the given node wrapped with a paragraph would be accepted by the schema in the given position.
*
* @internal
* @param position The position at which to check.
* @param nodeOrType The child node or child type to check.
* @param schema A schema instance used for element validation.
*/
export function isParagraphable(position, nodeOrType, schema) {
const context = schema.createContext(position);
// When paragraph is allowed in this context...
if (!schema.checkChild(context, 'paragraph')) {
return false;
}
// And a node would be allowed in this paragraph...
if (!schema.checkChild(context.push('paragraph'), nodeOrType)) {
return false;
}
return true;
}
/**
* Inserts a new paragraph at the given position and returns a position inside that paragraph.
*
* @internal
* @param position The position where a paragraph should be inserted.
* @param writer The model writer.
* @returns Position inside the created paragraph.
*/
export function wrapInParagraph(position, writer) {
const paragraph = writer.createElement('paragraph');
writer.insert(paragraph, position);
return writer.createPositionAt(paragraph, 0);
}