@alitons/ckeditor5 0.0.16 → 0.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/ckeditor.d.ts +10 -0
- package/build/ckeditor.js +3 -3
- package/build/ckeditor.js.map +1 -1
- package/package.json +1 -1
- package/sample/index.html +2 -1
- package/src/ckeditor.js +23 -1
- package/src/ckeditor.ts +12 -0
- package/src/css/sei.css +7 -0
- package/src/plugins/listaNumerada.ts +101 -14
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@alitons/ckeditor5",
|
|
3
3
|
"author": "Aliton Silva",
|
|
4
4
|
"description": "Ckeditor 5 Personalizado adicionados campos para atender as demandas da SEAD/AC",
|
|
5
|
-
"version": "0.0.
|
|
5
|
+
"version": "0.0.18",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
7
7
|
"private": false,
|
|
8
8
|
"main": "./build/ckeditor.js",
|
package/sample/index.html
CHANGED
|
@@ -20,7 +20,6 @@
|
|
|
20
20
|
<div class="col-12 row-editor">
|
|
21
21
|
<div class="editor-container">
|
|
22
22
|
<div class="editor" ready="initEditorPage">
|
|
23
|
-
<p>a</p>
|
|
24
23
|
</div>
|
|
25
24
|
</div>
|
|
26
25
|
</div>
|
|
@@ -29,6 +28,8 @@
|
|
|
29
28
|
</div>
|
|
30
29
|
</div>
|
|
31
30
|
|
|
31
|
+
<p class="item1">conteudo 1</p><p class="item2">subconteudo</p>
|
|
32
|
+
|
|
32
33
|
<div class="row">
|
|
33
34
|
<div class="col-12 html">
|
|
34
35
|
<h3>Conteúdo HTML gerado:</h3>
|
package/src/ckeditor.js
CHANGED
|
@@ -122,7 +122,29 @@ Editor.builtinPlugins = [
|
|
|
122
122
|
Timestamp
|
|
123
123
|
];
|
|
124
124
|
Editor.defaultConfig = {
|
|
125
|
-
extraAllowedContent: 'div[dir,id,lang,title](*){*}',
|
|
125
|
+
extraAllowedContent: 'div[dir,id,lang,title](*){*};p[dir,id,lang,title](*){*}',
|
|
126
|
+
htmlSupport: {
|
|
127
|
+
allow: [
|
|
128
|
+
{
|
|
129
|
+
name: 'p',
|
|
130
|
+
classes: true,
|
|
131
|
+
attributes: true,
|
|
132
|
+
styles: true
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
name: 'div',
|
|
136
|
+
classes: true,
|
|
137
|
+
attributes: true,
|
|
138
|
+
styles: true
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
name: 'span',
|
|
142
|
+
classes: true,
|
|
143
|
+
attributes: true,
|
|
144
|
+
styles: true
|
|
145
|
+
}
|
|
146
|
+
]
|
|
147
|
+
},
|
|
126
148
|
toolbar: {
|
|
127
149
|
items: [
|
|
128
150
|
'fontSize',
|
package/src/ckeditor.ts
CHANGED
|
@@ -91,6 +91,7 @@ import NumberedDivList from './plugins/listaNumerada';
|
|
|
91
91
|
import NumberedDivListSplit from './plugins/NumberedDivListSplit';
|
|
92
92
|
|
|
93
93
|
import './css/custom.css';
|
|
94
|
+
import './css/sei.css';
|
|
94
95
|
|
|
95
96
|
// You can read more about extending the build with additional plugins in the "Installing plugins" guide.
|
|
96
97
|
// See https://ckeditor.com/docs/ckeditor5/latest/installation/plugins/installing-plugins.html for details.
|
|
@@ -177,6 +178,17 @@ class Editor extends DecoupledEditor {
|
|
|
177
178
|
];
|
|
178
179
|
|
|
179
180
|
public static override defaultConfig = {
|
|
181
|
+
extraAllowedContent: 'div[dir,id,lang,title](*){*};p[dir,id,lang,title](*){*}',
|
|
182
|
+
htmlSupport: {
|
|
183
|
+
allow: [
|
|
184
|
+
{
|
|
185
|
+
name: 'p',
|
|
186
|
+
classes: true, // permite todas as classes em <p>
|
|
187
|
+
attributes: true, // permite todos os atributos
|
|
188
|
+
styles: true // permite todos os estilos
|
|
189
|
+
}
|
|
190
|
+
]
|
|
191
|
+
},
|
|
180
192
|
toolbar: {
|
|
181
193
|
items: [
|
|
182
194
|
'undo',
|
package/src/css/sei.css
ADDED
|
@@ -8,6 +8,7 @@ export default class NumberedDivList extends Plugin {
|
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
init() {
|
|
11
|
+
|
|
11
12
|
const editor = this.editor;
|
|
12
13
|
const toolbar = editor.config.get('toolbar') as any;
|
|
13
14
|
const config = toolbar!.listaNumeradaOptions || {};
|
|
@@ -21,7 +22,8 @@ export default class NumberedDivList extends Plugin {
|
|
|
21
22
|
});
|
|
22
23
|
|
|
23
24
|
editor.model.schema.register('numItem', {
|
|
24
|
-
allowIn: 'numList',
|
|
25
|
+
// allowIn: 'numList',
|
|
26
|
+
allowWhere: '$block',
|
|
25
27
|
allowContentOf: '$root',
|
|
26
28
|
allowAttributesOf: '$block',
|
|
27
29
|
isLimit: true,
|
|
@@ -128,6 +130,65 @@ export default class NumberedDivList extends Plugin {
|
|
|
128
130
|
model: (viewElement, { writer }) => writer.createElement('numItem')
|
|
129
131
|
});
|
|
130
132
|
|
|
133
|
+
let firstConversion = true;
|
|
134
|
+
let nivelAtual = config?.forceList ? 1 : 0;
|
|
135
|
+
let lastItemAdded = {} as any;
|
|
136
|
+
editor.conversion.for('upcast').add( dispatcher => {
|
|
137
|
+
dispatcher.on( 'element:p', async ( evt, data, conversionApi ) => {
|
|
138
|
+
const viewElement = data.viewItem;
|
|
139
|
+
const classAttr = viewElement.getAttribute('class');
|
|
140
|
+
const {
|
|
141
|
+
consumable,
|
|
142
|
+
writer,
|
|
143
|
+
safeInsert,
|
|
144
|
+
convertChildren,
|
|
145
|
+
updateConversionResult
|
|
146
|
+
} = conversionApi;
|
|
147
|
+
const { viewItem } = data;
|
|
148
|
+
|
|
149
|
+
if(classAttr && (classAttr.match(/Item_Nivel(\d+)/) || classAttr.match(/Paragrafo_Numerado_Nivel(\d+)/))) {
|
|
150
|
+
const nivelLocal = parseInt(classAttr.replace(/\D/g, '') ?? 0);
|
|
151
|
+
|
|
152
|
+
if ( !consumable.test( viewItem, { name: true } ) ) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
evt.stop();
|
|
156
|
+
|
|
157
|
+
consumable.consume( viewItem, { name: true } );
|
|
158
|
+
|
|
159
|
+
if(nivelLocal > nivelAtual) {
|
|
160
|
+
const numList = writer.createElement('numList', { 'dataBlock': 'true' });
|
|
161
|
+
let children = null;
|
|
162
|
+
|
|
163
|
+
if(nivelLocal > (config?.forceList ? 2 : 1)) {
|
|
164
|
+
children = lastItemAdded[nivelLocal - 1].parent ?? null;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const numItem = writer.createElement('numItem');
|
|
168
|
+
writer.insert( numItem, writer.createPositionAt( numList, 'end' ) );
|
|
169
|
+
safeInsert( numList, !firstConversion ? writer.createPositionAt(children ?? data.modelCursor.parent, 'end') : data.modelCursor );
|
|
170
|
+
convertChildren( viewItem, numItem );
|
|
171
|
+
updateConversionResult( numList, data );
|
|
172
|
+
|
|
173
|
+
firstConversion = false;
|
|
174
|
+
nivelAtual = nivelLocal;
|
|
175
|
+
lastItemAdded[nivelLocal] = numItem;
|
|
176
|
+
|
|
177
|
+
} else {
|
|
178
|
+
const numItem = writer.createElement('numItem');
|
|
179
|
+
safeInsert( numItem, lastItemAdded[nivelLocal]?.parent ? writer.createPositionAt(lastItemAdded[nivelLocal]?.parent, 'end') : data.modelCursor );
|
|
180
|
+
convertChildren( viewItem, numItem );
|
|
181
|
+
updateConversionResult( numItem, data );
|
|
182
|
+
|
|
183
|
+
nivelAtual = nivelLocal;
|
|
184
|
+
lastItemAdded[nivelLocal] = numItem;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
}
|
|
188
|
+
}, { priority: 'high' } );
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
|
|
131
192
|
const viewDoc = editor.editing.view.document;
|
|
132
193
|
|
|
133
194
|
const selectionSpansBlocks = (model: any) => {
|
|
@@ -217,6 +278,9 @@ export default class NumberedDivList extends Plugin {
|
|
|
217
278
|
viewDoc.on(
|
|
218
279
|
'keydown',
|
|
219
280
|
(evt, data) => {
|
|
281
|
+
firstConversion = true;
|
|
282
|
+
nivelAtual = config?.forceList ? 1 : 0;
|
|
283
|
+
lastItemAdded = {} as any;
|
|
220
284
|
const isBackspace = data.keyCode === keyCodes.backspace;
|
|
221
285
|
const isDelete = data.keyCode === keyCodes.delete;
|
|
222
286
|
if (!isBackspace && !isDelete) return;
|
|
@@ -306,10 +370,10 @@ export default class NumberedDivList extends Plugin {
|
|
|
306
370
|
},
|
|
307
371
|
{ priority: 'high' }
|
|
308
372
|
);
|
|
309
|
-
|
|
310
373
|
|
|
311
374
|
editor.model.document.on('change:data', () => {
|
|
312
|
-
|
|
375
|
+
// ajusteSeiContent(editor);
|
|
376
|
+
executeForceList(editor, config);
|
|
313
377
|
});
|
|
314
378
|
|
|
315
379
|
|
|
@@ -501,18 +565,16 @@ function executeForceList(editor: any, config: any) {
|
|
|
501
565
|
const model = editor.model;
|
|
502
566
|
const firstElement = editor.model.document.getRoot().getChild(0) as any;
|
|
503
567
|
if(config?.forceList && firstElement && firstElement.name !== 'numList') {
|
|
504
|
-
|
|
505
|
-
|
|
568
|
+
// cria um num list e move todo o conteudo para dento dele
|
|
569
|
+
model.change( (writer: any) => {
|
|
570
|
+
const root = model.document.getRoot();
|
|
506
571
|
const numList = writer.createElement('numList', {
|
|
507
572
|
'data-block': 'true',
|
|
508
573
|
'start': config?.forceList ? config.forceList + 1 : null
|
|
509
574
|
});
|
|
510
|
-
writer.insert(numList,
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
model.change( (writer: any) => {
|
|
515
|
-
const root = model.document.getRoot();
|
|
575
|
+
writer.insert(numList, writer.createPositionAt(root, 0));
|
|
576
|
+
const secondNumList = writer.createElement('numList');
|
|
577
|
+
writer.insert(secondNumList, writer.createPositionAt(numList, 0));
|
|
516
578
|
const itemsToMove = [];
|
|
517
579
|
for ( const child of root.getChildren() ) {
|
|
518
580
|
if ( child !== numList ) {
|
|
@@ -520,10 +582,35 @@ function executeForceList(editor: any, config: any) {
|
|
|
520
582
|
}
|
|
521
583
|
}
|
|
522
584
|
for ( const item of itemsToMove ) {
|
|
523
|
-
|
|
524
|
-
writer.insert( numItem, writer.createPositionAt( numList, 'end' ) );
|
|
525
|
-
writer.move( writer.createRangeOn( item ), writer.createPositionAt( numItem, 0 ) );
|
|
585
|
+
writer.move( writer.createRangeOn( item ), writer.createPositionAt( secondNumList, 0 ) );
|
|
526
586
|
}
|
|
527
587
|
});
|
|
588
|
+
|
|
589
|
+
|
|
590
|
+
|
|
591
|
+
// const numList = model.change( (writer: any) => {
|
|
592
|
+
// const insertPos = writer.createPositionAt(model.document.getRoot(), 0);
|
|
593
|
+
// const numList = writer.createElement('numList', {
|
|
594
|
+
// 'data-block': 'true',
|
|
595
|
+
// 'start': config?.forceList ? config.forceList + 1 : null
|
|
596
|
+
// });
|
|
597
|
+
// writer.insert(numList, insertPos);
|
|
598
|
+
// return numList;
|
|
599
|
+
// });
|
|
600
|
+
|
|
601
|
+
// model.change( (writer: any) => {
|
|
602
|
+
// const root = model.document.getRoot();
|
|
603
|
+
// const itemsToMove = [];
|
|
604
|
+
// for ( const child of root.getChildren() ) {
|
|
605
|
+
// if ( child !== numList ) {
|
|
606
|
+
// itemsToMove.push(child);
|
|
607
|
+
// }
|
|
608
|
+
// }
|
|
609
|
+
// for ( const item of itemsToMove ) {
|
|
610
|
+
// const numItem = writer.createElement('numList');
|
|
611
|
+
// writer.insert( numItem, writer.createPositionAt( numList, 'end' ) );
|
|
612
|
+
// writer.move( writer.createRangeOn( item ), writer.createPositionAt( numItem, 0 ) );
|
|
613
|
+
// }
|
|
614
|
+
// });
|
|
528
615
|
}
|
|
529
616
|
}
|