/
autoparagraphing.js
77 lines (64 loc) · 2.53 KB
/
autoparagraphing.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/**
* @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/
/**
* @module engine/model/utils/autoparagraphing
*/
/**
* Fixes all empty roots.
*
* @protected
* @param {module:engine/model/writer~Writer} writer The model writer.
* @returns {Boolean} `true` if any change has been applied, `false` otherwise.
*/
export function autoParagraphEmptyRoots( writer ) {
const { schema, document } = writer.model;
for ( const rootName of document.getRootNames() ) {
const root = document.getRoot( rootName );
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.
*
* @protected
* @param {module:engine/model/position~Position} position The position at which to check.
* @param {module:engine/model/node~Node|String} nodeOrType The child node or child type to check.
* @param {module:engine/model/schema~Schema} 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.
*
* @protected
* @param {module:engine/model/position~Position} position The position where a paragraph should be inserted.
* @param {module:engine/model/writer~Writer} writer The model writer.
* @returns {module:engine/model/position~Position} Position inside the created paragraph.
*/
export function wrapInParagraph( position, writer ) {
const paragraph = writer.createElement( 'paragraph' );
writer.insert( paragraph, position );
return writer.createPositionAt( paragraph, 0 );
}