1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 | import { toWidget, toWidgetEditable } from 'ckeditor5/src/widget';
|
9 | import TableWalker from './../tablewalker';
|
10 |
|
11 |
|
12 |
|
13 | export function downcastTable(tableUtils, options) {
|
14 | return (table, { writer }) => {
|
15 | const headingRows = table.getAttribute('headingRows') || 0;
|
16 | const tableElement = writer.createContainerElement('table', null, []);
|
17 | const figureElement = writer.createContainerElement('figure', { class: 'table' }, tableElement);
|
18 |
|
19 | if (headingRows > 0) {
|
20 | writer.insert(writer.createPositionAt(tableElement, 'end'), writer.createContainerElement('thead', null, writer.createSlot(element => element.is('element', 'tableRow') && element.index < headingRows)));
|
21 | }
|
22 |
|
23 | if (headingRows < tableUtils.getRows(table)) {
|
24 | writer.insert(writer.createPositionAt(tableElement, 'end'), writer.createContainerElement('tbody', null, writer.createSlot(element => element.is('element', 'tableRow') && element.index >= headingRows)));
|
25 | }
|
26 |
|
27 | for (const { positionOffset, filter } of options.additionalSlots) {
|
28 | writer.insert(writer.createPositionAt(tableElement, positionOffset), writer.createSlot(filter));
|
29 | }
|
30 |
|
31 | writer.insert(writer.createPositionAt(tableElement, 'after'), writer.createSlot(element => {
|
32 | if (element.is('element', 'tableRow')) {
|
33 | return false;
|
34 | }
|
35 | return !options.additionalSlots.some(({ filter }) => filter(element));
|
36 | }));
|
37 | return options.asWidget ? toTableWidget(figureElement, writer) : figureElement;
|
38 | };
|
39 | }
|
40 |
|
41 |
|
42 |
|
43 |
|
44 |
|
45 | export function downcastRow() {
|
46 | return (tableRow, { writer }) => {
|
47 | return tableRow.isEmpty ?
|
48 | writer.createEmptyElement('tr') :
|
49 | writer.createContainerElement('tr');
|
50 | };
|
51 | }
|
52 |
|
53 |
|
54 |
|
55 |
|
56 |
|
57 |
|
58 |
|
59 |
|
60 |
|
61 | export function downcastCell(options = {}) {
|
62 | return (tableCell, { writer }) => {
|
63 | const tableRow = tableCell.parent;
|
64 | const table = tableRow.parent;
|
65 | const rowIndex = table.getChildIndex(tableRow);
|
66 | const tableWalker = new TableWalker(table, { row: rowIndex });
|
67 | const headingRows = table.getAttribute('headingRows') || 0;
|
68 | const headingColumns = table.getAttribute('headingColumns') || 0;
|
69 | let result = null;
|
70 |
|
71 | for (const tableSlot of tableWalker) {
|
72 | if (tableSlot.cell == tableCell) {
|
73 | const isHeading = tableSlot.row < headingRows || tableSlot.column < headingColumns;
|
74 | const cellElementName = isHeading ? 'th' : 'td';
|
75 | result = options.asWidget ?
|
76 | toWidgetEditable(writer.createEditableElement(cellElementName), writer) :
|
77 | writer.createContainerElement(cellElementName);
|
78 | break;
|
79 | }
|
80 | }
|
81 | return result;
|
82 | };
|
83 | }
|
84 |
|
85 |
|
86 |
|
87 |
|
88 |
|
89 |
|
90 |
|
91 |
|
92 |
|
93 |
|
94 |
|
95 |
|
96 | export function convertParagraphInTableCell(options = {}) {
|
97 | return (modelElement, { writer }) => {
|
98 | if (!modelElement.parent.is('element', 'tableCell')) {
|
99 | return null;
|
100 | }
|
101 | if (!isSingleParagraphWithoutAttributes(modelElement)) {
|
102 | return null;
|
103 | }
|
104 | if (options.asWidget) {
|
105 | return writer.createContainerElement('span', { class: 'ck-table-bogus-paragraph' });
|
106 | }
|
107 | else {
|
108 |
|
109 | const viewElement = writer.createContainerElement('p');
|
110 | writer.setCustomProperty('dataPipeline:transparentRendering', true, viewElement);
|
111 | return viewElement;
|
112 | }
|
113 | };
|
114 | }
|
115 |
|
116 |
|
117 |
|
118 |
|
119 |
|
120 |
|
121 |
|
122 |
|
123 | export function isSingleParagraphWithoutAttributes(modelElement) {
|
124 | const tableCell = modelElement.parent;
|
125 | const isSingleParagraph = tableCell.childCount == 1;
|
126 | return isSingleParagraph && !hasAnyAttribute(modelElement);
|
127 | }
|
128 |
|
129 |
|
130 |
|
131 |
|
132 |
|
133 |
|
134 |
|
135 |
|
136 | function toTableWidget(viewElement, writer) {
|
137 | writer.setCustomProperty('table', true, viewElement);
|
138 | return toWidget(viewElement, writer, { hasSelectionHandle: true });
|
139 | }
|
140 |
|
141 |
|
142 |
|
143 | function hasAnyAttribute(element) {
|
144 | const iteratorItem = element.getAttributeKeys().next();
|
145 | return !iteratorItem.done;
|
146 | }
|