1 | /**
|
2 | * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
|
3 | * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
4 | */
|
5 | /**
|
6 | * @module list/documentlist/utils/model
|
7 | */
|
8 | import type { DocumentFragment, Element, Model, Node, Writer, Item } from 'ckeditor5/src/engine';
|
9 | import { type ArrayOrItem } from 'ckeditor5/src/utils';
|
10 | /**
|
11 | * The list item ID generator.
|
12 | *
|
13 | * @internal
|
14 | */
|
15 | export declare class ListItemUid {
|
16 | /**
|
17 | * Returns the next ID.
|
18 | *
|
19 | * @internal
|
20 | */
|
21 | static next(): string;
|
22 | }
|
23 | /**
|
24 | * An {@link module:engine/model/element~Element} that is known to be a list element.
|
25 | *
|
26 | * @internal
|
27 | */
|
28 | export interface ListElement extends Element {
|
29 | getAttribute(key: 'listItemId'): string;
|
30 | getAttribute(key: 'listIndent'): number;
|
31 | getAttribute(key: 'listType'): 'numbered' | 'bulleted';
|
32 | getAttribute(key: string): unknown;
|
33 | }
|
34 | /**
|
35 | * Returns true if the given model node is a list item block.
|
36 | *
|
37 | * @internal
|
38 | */
|
39 | export declare function isListItemBlock(node: Item | DocumentFragment | null): node is ListElement;
|
40 | /**
|
41 | * Returns an array with all elements that represents the same list item.
|
42 | *
|
43 | * It means that values for `listIndent`, and `listItemId` for all items are equal.
|
44 | *
|
45 | * @internal
|
46 | * @param listItem Starting list item element.
|
47 | * @param options.higherIndent Whether blocks with a higher indent level than the start block should be included
|
48 | * in the result.
|
49 | */
|
50 | export declare function getAllListItemBlocks(listItem: Node, options?: {
|
51 | higherIndent?: boolean;
|
52 | }): Array<ListElement>;
|
53 | /**
|
54 | * Returns an array with elements that represents the same list item in the specified direction.
|
55 | *
|
56 | * It means that values for `listIndent` and `listItemId` for all items are equal.
|
57 | *
|
58 | * **Note**: For backward search the provided item is not included, but for forward search it is included in the result.
|
59 | *
|
60 | * @internal
|
61 | * @param listItem Starting list item element.
|
62 | * @param options.direction Walking direction.
|
63 | * @param options.higherIndent Whether blocks with a higher indent level than the start block should be included in the result.
|
64 | */
|
65 | export declare function getListItemBlocks(listItem: Node, options?: {
|
66 | direction?: 'forward' | 'backward';
|
67 | higherIndent?: boolean;
|
68 | }): Array<ListElement>;
|
69 | /**
|
70 | * Returns a list items nested inside the given list item.
|
71 | *
|
72 | * @internal
|
73 | */
|
74 | export declare function getNestedListBlocks(listItem: Element): Array<ListElement>;
|
75 | /**
|
76 | * Returns array of all blocks/items of the same list as given block (same indent, same type and properties).
|
77 | *
|
78 | * @internal
|
79 | * @param listItem Starting list item element.
|
80 | */
|
81 | export declare function getListItems(listItem: Element): Array<ListElement>;
|
82 | /**
|
83 | * Check if the given block is the first in the list item.
|
84 | *
|
85 | * @internal
|
86 | * @param listBlock The list block element.
|
87 | */
|
88 | export declare function isFirstBlockOfListItem(listBlock: Node): boolean;
|
89 | /**
|
90 | * Check if the given block is the last in the list item.
|
91 | *
|
92 | * @internal
|
93 | */
|
94 | export declare function isLastBlockOfListItem(listBlock: Element): boolean;
|
95 | /**
|
96 | * Expands the given list of selected blocks to include the leading and tailing blocks of partially selected list items.
|
97 | *
|
98 | * @internal
|
99 | * @param blocks The list of selected blocks.
|
100 | * @param options.withNested Whether should include nested list items.
|
101 | */
|
102 | export declare function expandListBlocksToCompleteItems(blocks: ArrayOrItem<Element>, options?: {
|
103 | withNested?: boolean;
|
104 | }): Array<ListElement>;
|
105 | /**
|
106 | * Expands the given list of selected blocks to include all the items of the lists they're in.
|
107 | *
|
108 | * @internal
|
109 | * @param blocks The list of selected blocks.
|
110 | */
|
111 | export declare function expandListBlocksToCompleteList(blocks: ArrayOrItem<Element>): Array<ListElement>;
|
112 | /**
|
113 | * Splits the list item just before the provided list block.
|
114 | *
|
115 | * @internal
|
116 | * @param listBlock The list block element.
|
117 | * @param writer The model writer.
|
118 | * @returns The array of updated blocks.
|
119 | */
|
120 | export declare function splitListItemBefore(listBlock: Element, writer: Writer): Array<ListElement>;
|
121 | /**
|
122 | * Merges the list item with the parent list item.
|
123 | *
|
124 | * @internal
|
125 | * @param listBlock The list block element.
|
126 | * @param parentBlock The list block element to merge with.
|
127 | * @param writer The model writer.
|
128 | * @returns The array of updated blocks.
|
129 | */
|
130 | export declare function mergeListItemBefore(listBlock: Node, parentBlock: Element, writer: Writer): Array<ListElement>;
|
131 | /**
|
132 | * Increases indentation of given list blocks.
|
133 | *
|
134 | * @internal
|
135 | * @param blocks The block or iterable of blocks.
|
136 | * @param writer The model writer.
|
137 | * @param options.expand Whether should expand the list of blocks to include complete list items.
|
138 | * @param options.indentBy The number of levels the indentation should change (could be negative).
|
139 | */
|
140 | export declare function indentBlocks(blocks: ArrayOrItem<ListElement>, writer: Writer, { expand, indentBy }?: {
|
141 | expand?: boolean;
|
142 | indentBy?: number;
|
143 | }): Array<ListElement>;
|
144 | /**
|
145 | * Decreases indentation of given list of blocks. If the indentation of some blocks matches the indentation
|
146 | * of surrounding blocks, they get merged together.
|
147 | *
|
148 | * @internal
|
149 | * @param blocks The block or iterable of blocks.
|
150 | * @param writer The model writer.
|
151 | */
|
152 | export declare function outdentBlocksWithMerge(blocks: ArrayOrItem<ListElement>, writer: Writer): Array<ListElement>;
|
153 | /**
|
154 | * Removes all list attributes from the given blocks.
|
155 | *
|
156 | * @internal
|
157 | * @param blocks The block or iterable of blocks.
|
158 | * @param writer The model writer.
|
159 | * @returns Array of altered blocks.
|
160 | */
|
161 | export declare function removeListAttributes(blocks: ArrayOrItem<Element>, writer: Writer): Array<Element>;
|
162 | /**
|
163 | * Checks whether the given blocks are related to a single list item.
|
164 | *
|
165 | * @internal
|
166 | * @param blocks The list block elements.
|
167 | */
|
168 | export declare function isSingleListItem(blocks: Array<Node>): boolean;
|
169 | /**
|
170 | * Modifies the indents of list blocks following the given list block so the indentation is valid after
|
171 | * the given block is no longer a list item.
|
172 | *
|
173 | * @internal
|
174 | * @param lastBlock The last list block that has become a non-list element.
|
175 | * @param writer The model writer.
|
176 | * @returns Array of altered blocks.
|
177 | */
|
178 | export declare function outdentFollowingItems(lastBlock: Element, writer: Writer): Array<ListElement>;
|
179 | /**
|
180 | * Returns the array of given blocks sorted by model indexes (document order).
|
181 | *
|
182 | * @internal
|
183 | */
|
184 | export declare function sortBlocks<T extends Element>(blocks: Iterable<T>): Array<T>;
|
185 | /**
|
186 | * Returns a selected block object. If a selected object is inline or when there is no selected
|
187 | * object, `null` is returned.
|
188 | *
|
189 | * @internal
|
190 | * @param model The instance of editor model.
|
191 | * @returns Selected block object or `null`.
|
192 | */
|
193 | export declare function getSelectedBlockObject(model: Model): Element | null;
|