@ckeditor/ckeditor5-engine 40.0.0 → 40.1.0
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/LICENSE.md +3 -3
- package/package.json +2 -2
- package/src/controller/datacontroller.d.ts +334 -334
- package/src/controller/datacontroller.js +481 -481
- package/src/controller/editingcontroller.d.ts +98 -98
- package/src/controller/editingcontroller.js +191 -191
- package/src/conversion/conversion.d.ts +478 -478
- package/src/conversion/conversion.js +601 -601
- package/src/conversion/conversionhelpers.d.ts +26 -26
- package/src/conversion/conversionhelpers.js +32 -32
- package/src/conversion/downcastdispatcher.d.ts +562 -562
- package/src/conversion/downcastdispatcher.js +547 -547
- package/src/conversion/downcasthelpers.d.ts +1226 -1226
- package/src/conversion/downcasthelpers.js +2178 -2183
- package/src/conversion/mapper.d.ts +503 -503
- package/src/conversion/mapper.js +536 -536
- package/src/conversion/modelconsumable.d.ts +201 -201
- package/src/conversion/modelconsumable.js +333 -333
- package/src/conversion/upcastdispatcher.d.ts +492 -492
- package/src/conversion/upcastdispatcher.js +460 -460
- package/src/conversion/upcasthelpers.d.ts +499 -499
- package/src/conversion/upcasthelpers.js +950 -950
- package/src/conversion/viewconsumable.d.ts +369 -369
- package/src/conversion/viewconsumable.js +536 -532
- package/src/dataprocessor/basichtmlwriter.d.ts +18 -18
- package/src/dataprocessor/basichtmlwriter.js +20 -19
- package/src/dataprocessor/dataprocessor.d.ts +61 -61
- package/src/dataprocessor/dataprocessor.js +5 -5
- package/src/dataprocessor/htmldataprocessor.d.ts +76 -76
- package/src/dataprocessor/htmldataprocessor.js +96 -96
- package/src/dataprocessor/htmlwriter.d.ts +16 -16
- package/src/dataprocessor/htmlwriter.js +5 -5
- package/src/dataprocessor/xmldataprocessor.d.ts +90 -90
- package/src/dataprocessor/xmldataprocessor.js +108 -108
- package/src/dev-utils/model.d.ts +124 -124
- package/src/dev-utils/model.js +395 -395
- package/src/dev-utils/operationreplayer.d.ts +51 -51
- package/src/dev-utils/operationreplayer.js +112 -112
- package/src/dev-utils/utils.d.ts +37 -37
- package/src/dev-utils/utils.js +73 -73
- package/src/dev-utils/view.d.ts +319 -319
- package/src/dev-utils/view.js +967 -967
- package/src/index.d.ts +114 -114
- package/src/index.js +78 -78
- package/src/model/batch.d.ts +106 -106
- package/src/model/batch.js +96 -96
- package/src/model/differ.d.ts +387 -387
- package/src/model/differ.js +1149 -1149
- package/src/model/document.d.ts +272 -272
- package/src/model/document.js +360 -361
- package/src/model/documentfragment.d.ts +200 -200
- package/src/model/documentfragment.js +306 -306
- package/src/model/documentselection.d.ts +420 -420
- package/src/model/documentselection.js +993 -993
- package/src/model/element.d.ts +165 -165
- package/src/model/element.js +281 -281
- package/src/model/history.d.ts +114 -114
- package/src/model/history.js +207 -207
- package/src/model/item.d.ts +14 -14
- package/src/model/item.js +5 -5
- package/src/model/liveposition.d.ts +77 -77
- package/src/model/liveposition.js +93 -93
- package/src/model/liverange.d.ts +102 -102
- package/src/model/liverange.js +120 -120
- package/src/model/markercollection.d.ts +335 -335
- package/src/model/markercollection.js +403 -403
- package/src/model/model.d.ts +919 -919
- package/src/model/model.js +842 -842
- package/src/model/node.d.ts +256 -256
- package/src/model/node.js +375 -375
- package/src/model/nodelist.d.ts +91 -91
- package/src/model/nodelist.js +163 -163
- package/src/model/operation/attributeoperation.d.ts +103 -103
- package/src/model/operation/attributeoperation.js +148 -148
- package/src/model/operation/detachoperation.d.ts +60 -60
- package/src/model/operation/detachoperation.js +77 -77
- package/src/model/operation/insertoperation.d.ts +90 -90
- package/src/model/operation/insertoperation.js +135 -135
- package/src/model/operation/markeroperation.d.ts +91 -91
- package/src/model/operation/markeroperation.js +107 -107
- package/src/model/operation/mergeoperation.d.ts +100 -100
- package/src/model/operation/mergeoperation.js +167 -167
- package/src/model/operation/moveoperation.d.ts +96 -96
- package/src/model/operation/moveoperation.js +164 -164
- package/src/model/operation/nooperation.d.ts +38 -38
- package/src/model/operation/nooperation.js +48 -48
- package/src/model/operation/operation.d.ts +96 -96
- package/src/model/operation/operation.js +59 -62
- package/src/model/operation/operationfactory.d.ts +18 -18
- package/src/model/operation/operationfactory.js +44 -44
- package/src/model/operation/renameoperation.d.ts +83 -83
- package/src/model/operation/renameoperation.js +115 -115
- package/src/model/operation/rootattributeoperation.d.ts +98 -98
- package/src/model/operation/rootattributeoperation.js +155 -155
- package/src/model/operation/rootoperation.d.ts +76 -76
- package/src/model/operation/rootoperation.js +90 -90
- package/src/model/operation/splitoperation.d.ts +109 -109
- package/src/model/operation/splitoperation.js +194 -194
- package/src/model/operation/transform.d.ts +100 -100
- package/src/model/operation/transform.js +1985 -1985
- package/src/model/operation/utils.d.ts +71 -71
- package/src/model/operation/utils.js +217 -213
- package/src/model/position.d.ts +539 -539
- package/src/model/position.js +979 -979
- package/src/model/range.d.ts +458 -458
- package/src/model/range.js +875 -875
- package/src/model/rootelement.d.ts +60 -60
- package/src/model/rootelement.js +74 -74
- package/src/model/schema.d.ts +1186 -1186
- package/src/model/schema.js +1242 -1242
- package/src/model/selection.d.ts +482 -482
- package/src/model/selection.js +789 -789
- package/src/model/text.d.ts +66 -66
- package/src/model/text.js +85 -85
- package/src/model/textproxy.d.ts +144 -144
- package/src/model/textproxy.js +189 -189
- package/src/model/treewalker.d.ts +186 -186
- package/src/model/treewalker.js +244 -244
- package/src/model/typecheckable.d.ts +285 -285
- package/src/model/typecheckable.js +16 -16
- package/src/model/utils/autoparagraphing.d.ts +37 -37
- package/src/model/utils/autoparagraphing.js +63 -63
- package/src/model/utils/deletecontent.d.ts +58 -58
- package/src/model/utils/deletecontent.js +488 -488
- package/src/model/utils/findoptimalinsertionrange.d.ts +32 -32
- package/src/model/utils/findoptimalinsertionrange.js +57 -57
- package/src/model/utils/getselectedcontent.d.ts +30 -30
- package/src/model/utils/getselectedcontent.js +125 -125
- package/src/model/utils/insertcontent.d.ts +46 -46
- package/src/model/utils/insertcontent.js +705 -705
- package/src/model/utils/insertobject.d.ts +44 -44
- package/src/model/utils/insertobject.js +139 -139
- package/src/model/utils/modifyselection.d.ts +48 -48
- package/src/model/utils/modifyselection.js +186 -186
- package/src/model/utils/selection-post-fixer.d.ts +74 -74
- package/src/model/utils/selection-post-fixer.js +260 -260
- package/src/model/writer.d.ts +851 -851
- package/src/model/writer.js +1306 -1306
- package/src/view/attributeelement.d.ts +108 -108
- package/src/view/attributeelement.js +184 -184
- package/src/view/containerelement.d.ts +49 -49
- package/src/view/containerelement.js +80 -80
- package/src/view/datatransfer.d.ts +79 -79
- package/src/view/datatransfer.js +98 -98
- package/src/view/document.d.ts +184 -184
- package/src/view/document.js +122 -120
- package/src/view/documentfragment.d.ts +153 -149
- package/src/view/documentfragment.js +234 -228
- package/src/view/documentselection.d.ts +306 -306
- package/src/view/documentselection.js +256 -256
- package/src/view/domconverter.d.ts +652 -640
- package/src/view/domconverter.js +1473 -1450
- package/src/view/downcastwriter.d.ts +996 -996
- package/src/view/downcastwriter.js +1696 -1696
- package/src/view/editableelement.d.ts +62 -62
- package/src/view/editableelement.js +62 -62
- package/src/view/element.d.ts +468 -468
- package/src/view/element.js +724 -724
- package/src/view/elementdefinition.d.ts +87 -87
- package/src/view/elementdefinition.js +5 -5
- package/src/view/emptyelement.d.ts +41 -41
- package/src/view/emptyelement.js +73 -73
- package/src/view/filler.d.ts +111 -111
- package/src/view/filler.js +150 -150
- package/src/view/item.d.ts +14 -14
- package/src/view/item.js +5 -5
- package/src/view/matcher.d.ts +486 -486
- package/src/view/matcher.js +507 -507
- package/src/view/node.d.ts +163 -163
- package/src/view/node.js +228 -228
- package/src/view/observer/arrowkeysobserver.d.ts +45 -45
- package/src/view/observer/arrowkeysobserver.js +40 -40
- package/src/view/observer/bubblingemittermixin.d.ts +166 -166
- package/src/view/observer/bubblingemittermixin.js +172 -172
- package/src/view/observer/bubblingeventinfo.d.ts +47 -47
- package/src/view/observer/bubblingeventinfo.js +37 -37
- package/src/view/observer/clickobserver.d.ts +43 -43
- package/src/view/observer/clickobserver.js +29 -29
- package/src/view/observer/compositionobserver.d.ts +82 -82
- package/src/view/observer/compositionobserver.js +60 -60
- package/src/view/observer/domeventdata.d.ts +50 -50
- package/src/view/observer/domeventdata.js +47 -47
- package/src/view/observer/domeventobserver.d.ts +73 -73
- package/src/view/observer/domeventobserver.js +79 -79
- package/src/view/observer/fakeselectionobserver.d.ts +47 -47
- package/src/view/observer/fakeselectionobserver.js +91 -91
- package/src/view/observer/focusobserver.d.ts +82 -82
- package/src/view/observer/focusobserver.js +86 -86
- package/src/view/observer/inputobserver.d.ts +86 -86
- package/src/view/observer/inputobserver.js +164 -164
- package/src/view/observer/keyobserver.d.ts +66 -66
- package/src/view/observer/keyobserver.js +39 -39
- package/src/view/observer/mouseobserver.d.ts +89 -89
- package/src/view/observer/mouseobserver.js +29 -29
- package/src/view/observer/mutationobserver.d.ts +86 -86
- package/src/view/observer/mutationobserver.js +206 -206
- package/src/view/observer/observer.d.ts +89 -89
- package/src/view/observer/observer.js +84 -84
- package/src/view/observer/selectionobserver.d.ts +148 -148
- package/src/view/observer/selectionobserver.js +202 -202
- package/src/view/observer/tabobserver.d.ts +46 -46
- package/src/view/observer/tabobserver.js +42 -42
- package/src/view/placeholder.d.ts +96 -96
- package/src/view/placeholder.js +267 -267
- package/src/view/position.d.ts +189 -189
- package/src/view/position.js +324 -324
- package/src/view/range.d.ts +279 -279
- package/src/view/range.js +430 -430
- package/src/view/rawelement.d.ts +73 -73
- package/src/view/rawelement.js +105 -105
- package/src/view/renderer.d.ts +265 -265
- package/src/view/renderer.js +1000 -999
- package/src/view/rooteditableelement.d.ts +41 -41
- package/src/view/rooteditableelement.js +69 -69
- package/src/view/selection.d.ts +375 -375
- package/src/view/selection.js +559 -559
- package/src/view/styles/background.d.ts +33 -33
- package/src/view/styles/background.js +74 -74
- package/src/view/styles/border.d.ts +43 -43
- package/src/view/styles/border.js +316 -316
- package/src/view/styles/margin.d.ts +29 -29
- package/src/view/styles/margin.js +34 -34
- package/src/view/styles/padding.d.ts +29 -29
- package/src/view/styles/padding.js +34 -34
- package/src/view/styles/utils.d.ts +93 -93
- package/src/view/styles/utils.js +219 -219
- package/src/view/stylesmap.d.ts +675 -675
- package/src/view/stylesmap.js +765 -766
- package/src/view/text.d.ts +74 -74
- package/src/view/text.js +93 -93
- package/src/view/textproxy.d.ts +97 -97
- package/src/view/textproxy.js +124 -124
- package/src/view/treewalker.d.ts +195 -195
- package/src/view/treewalker.js +327 -327
- package/src/view/typecheckable.d.ts +448 -448
- package/src/view/typecheckable.js +19 -19
- package/src/view/uielement.d.ts +96 -96
- package/src/view/uielement.js +183 -182
- package/src/view/upcastwriter.d.ts +417 -417
- package/src/view/upcastwriter.js +359 -359
- package/src/view/view.d.ts +487 -487
- package/src/view/view.js +546 -546
|
@@ -1,316 +1,316 @@
|
|
|
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
|
-
import { getShorthandValues, getBoxSidesValueReducer, getBoxSidesValues, isLength, isLineStyle } from './utils';
|
|
6
|
-
/**
|
|
7
|
-
* Adds a border CSS styles processing rules.
|
|
8
|
-
*
|
|
9
|
-
* ```ts
|
|
10
|
-
* editor.data.addStyleProcessorRules( addBorderRules );
|
|
11
|
-
* ```
|
|
12
|
-
*
|
|
13
|
-
* This rules merges all [border](https://developer.mozilla.org/en-US/docs/Web/CSS/border) styles notation shorthands:
|
|
14
|
-
*
|
|
15
|
-
* - border
|
|
16
|
-
* - border-top
|
|
17
|
-
* - border-right
|
|
18
|
-
* - border-bottom
|
|
19
|
-
* - border-left
|
|
20
|
-
* - border-color
|
|
21
|
-
* - border-style
|
|
22
|
-
* - border-width
|
|
23
|
-
*
|
|
24
|
-
* and all corresponding longhand forms (like `border-top-color`, `border-top-style`, etc).
|
|
25
|
-
*
|
|
26
|
-
* It does not handle other shorthands (like `border-radius` or `border-image`).
|
|
27
|
-
*
|
|
28
|
-
* The normalized model stores border values as:
|
|
29
|
-
*
|
|
30
|
-
* ```ts
|
|
31
|
-
* const styles = {
|
|
32
|
-
* border: {
|
|
33
|
-
* color: { top, right, bottom, left },
|
|
34
|
-
* style: { top, right, bottom, left },
|
|
35
|
-
* width: { top, right, bottom, left },
|
|
36
|
-
* }
|
|
37
|
-
* };
|
|
38
|
-
* ```
|
|
39
|
-
*/
|
|
40
|
-
export function addBorderRules(stylesProcessor) {
|
|
41
|
-
stylesProcessor.setNormalizer('border', getBorderNormalizer());
|
|
42
|
-
// Border-position shorthands.
|
|
43
|
-
stylesProcessor.setNormalizer('border-top', getBorderPositionNormalizer('top'));
|
|
44
|
-
stylesProcessor.setNormalizer('border-right', getBorderPositionNormalizer('right'));
|
|
45
|
-
stylesProcessor.setNormalizer('border-bottom', getBorderPositionNormalizer('bottom'));
|
|
46
|
-
stylesProcessor.setNormalizer('border-left', getBorderPositionNormalizer('left'));
|
|
47
|
-
// Border-property shorthands.
|
|
48
|
-
stylesProcessor.setNormalizer('border-color', getBorderPropertyNormalizer('color'));
|
|
49
|
-
stylesProcessor.setNormalizer('border-width', getBorderPropertyNormalizer('width'));
|
|
50
|
-
stylesProcessor.setNormalizer('border-style', getBorderPropertyNormalizer('style'));
|
|
51
|
-
// Border longhands.
|
|
52
|
-
stylesProcessor.setNormalizer('border-top-color', getBorderPropertyPositionNormalizer('color', 'top'));
|
|
53
|
-
stylesProcessor.setNormalizer('border-top-style', getBorderPropertyPositionNormalizer('style', 'top'));
|
|
54
|
-
stylesProcessor.setNormalizer('border-top-width', getBorderPropertyPositionNormalizer('width', 'top'));
|
|
55
|
-
stylesProcessor.setNormalizer('border-right-color', getBorderPropertyPositionNormalizer('color', 'right'));
|
|
56
|
-
stylesProcessor.setNormalizer('border-right-style', getBorderPropertyPositionNormalizer('style', 'right'));
|
|
57
|
-
stylesProcessor.setNormalizer('border-right-width', getBorderPropertyPositionNormalizer('width', 'right'));
|
|
58
|
-
stylesProcessor.setNormalizer('border-bottom-color', getBorderPropertyPositionNormalizer('color', 'bottom'));
|
|
59
|
-
stylesProcessor.setNormalizer('border-bottom-style', getBorderPropertyPositionNormalizer('style', 'bottom'));
|
|
60
|
-
stylesProcessor.setNormalizer('border-bottom-width', getBorderPropertyPositionNormalizer('width', 'bottom'));
|
|
61
|
-
stylesProcessor.setNormalizer('border-left-color', getBorderPropertyPositionNormalizer('color', 'left'));
|
|
62
|
-
stylesProcessor.setNormalizer('border-left-style', getBorderPropertyPositionNormalizer('style', 'left'));
|
|
63
|
-
stylesProcessor.setNormalizer('border-left-width', getBorderPropertyPositionNormalizer('width', 'left'));
|
|
64
|
-
stylesProcessor.setExtractor('border-top', getBorderPositionExtractor('top'));
|
|
65
|
-
stylesProcessor.setExtractor('border-right', getBorderPositionExtractor('right'));
|
|
66
|
-
stylesProcessor.setExtractor('border-bottom', getBorderPositionExtractor('bottom'));
|
|
67
|
-
stylesProcessor.setExtractor('border-left', getBorderPositionExtractor('left'));
|
|
68
|
-
stylesProcessor.setExtractor('border-top-color', 'border.color.top');
|
|
69
|
-
stylesProcessor.setExtractor('border-right-color', 'border.color.right');
|
|
70
|
-
stylesProcessor.setExtractor('border-bottom-color', 'border.color.bottom');
|
|
71
|
-
stylesProcessor.setExtractor('border-left-color', 'border.color.left');
|
|
72
|
-
stylesProcessor.setExtractor('border-top-width', 'border.width.top');
|
|
73
|
-
stylesProcessor.setExtractor('border-right-width', 'border.width.right');
|
|
74
|
-
stylesProcessor.setExtractor('border-bottom-width', 'border.width.bottom');
|
|
75
|
-
stylesProcessor.setExtractor('border-left-width', 'border.width.left');
|
|
76
|
-
stylesProcessor.setExtractor('border-top-style', 'border.style.top');
|
|
77
|
-
stylesProcessor.setExtractor('border-right-style', 'border.style.right');
|
|
78
|
-
stylesProcessor.setExtractor('border-bottom-style', 'border.style.bottom');
|
|
79
|
-
stylesProcessor.setExtractor('border-left-style', 'border.style.left');
|
|
80
|
-
stylesProcessor.setReducer('border-color', getBoxSidesValueReducer('border-color'));
|
|
81
|
-
stylesProcessor.setReducer('border-style', getBoxSidesValueReducer('border-style'));
|
|
82
|
-
stylesProcessor.setReducer('border-width', getBoxSidesValueReducer('border-width'));
|
|
83
|
-
stylesProcessor.setReducer('border-top', getBorderPositionReducer('top'));
|
|
84
|
-
stylesProcessor.setReducer('border-right', getBorderPositionReducer('right'));
|
|
85
|
-
stylesProcessor.setReducer('border-bottom', getBorderPositionReducer('bottom'));
|
|
86
|
-
stylesProcessor.setReducer('border-left', getBorderPositionReducer('left'));
|
|
87
|
-
stylesProcessor.setReducer('border', getBorderReducer());
|
|
88
|
-
stylesProcessor.setStyleRelation('border', [
|
|
89
|
-
'border-color', 'border-style', 'border-width',
|
|
90
|
-
'border-top', 'border-right', 'border-bottom', 'border-left',
|
|
91
|
-
'border-top-color', 'border-right-color', 'border-bottom-color', 'border-left-color',
|
|
92
|
-
'border-top-style', 'border-right-style', 'border-bottom-style', 'border-left-style',
|
|
93
|
-
'border-top-width', 'border-right-width', 'border-bottom-width', 'border-left-width'
|
|
94
|
-
]);
|
|
95
|
-
stylesProcessor.setStyleRelation('border-color', [
|
|
96
|
-
'border-top-color', 'border-right-color', 'border-bottom-color', 'border-left-color'
|
|
97
|
-
]);
|
|
98
|
-
stylesProcessor.setStyleRelation('border-style', [
|
|
99
|
-
'border-top-style', 'border-right-style', 'border-bottom-style', 'border-left-style'
|
|
100
|
-
]);
|
|
101
|
-
stylesProcessor.setStyleRelation('border-width', [
|
|
102
|
-
'border-top-width', 'border-right-width', 'border-bottom-width', 'border-left-width'
|
|
103
|
-
]);
|
|
104
|
-
stylesProcessor.setStyleRelation('border-top', ['border-top-color', 'border-top-style', 'border-top-width']);
|
|
105
|
-
stylesProcessor.setStyleRelation('border-right', ['border-right-color', 'border-right-style', 'border-right-width']);
|
|
106
|
-
stylesProcessor.setStyleRelation('border-bottom', ['border-bottom-color', 'border-bottom-style', 'border-bottom-width']);
|
|
107
|
-
stylesProcessor.setStyleRelation('border-left', ['border-left-color', 'border-left-style', 'border-left-width']);
|
|
108
|
-
}
|
|
109
|
-
function getBorderNormalizer() {
|
|
110
|
-
return value => {
|
|
111
|
-
const { color, style, width } = normalizeBorderShorthand(value);
|
|
112
|
-
return {
|
|
113
|
-
path: 'border',
|
|
114
|
-
value: {
|
|
115
|
-
color: getBoxSidesValues(color),
|
|
116
|
-
style: getBoxSidesValues(style),
|
|
117
|
-
width: getBoxSidesValues(width)
|
|
118
|
-
}
|
|
119
|
-
};
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
function getBorderPositionNormalizer(side) {
|
|
123
|
-
return value => {
|
|
124
|
-
const { color, style, width } = normalizeBorderShorthand(value);
|
|
125
|
-
const border = {};
|
|
126
|
-
if (color !== undefined) {
|
|
127
|
-
border.color = { [side]: color };
|
|
128
|
-
}
|
|
129
|
-
if (style !== undefined) {
|
|
130
|
-
border.style = { [side]: style };
|
|
131
|
-
}
|
|
132
|
-
if (width !== undefined) {
|
|
133
|
-
border.width = { [side]: width };
|
|
134
|
-
}
|
|
135
|
-
return {
|
|
136
|
-
path: 'border',
|
|
137
|
-
value: border
|
|
138
|
-
};
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
function getBorderPropertyNormalizer(propertyName) {
|
|
142
|
-
return value => {
|
|
143
|
-
return {
|
|
144
|
-
path: 'border',
|
|
145
|
-
value: toBorderPropertyShorthand(value, propertyName)
|
|
146
|
-
};
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
function toBorderPropertyShorthand(value, property) {
|
|
150
|
-
return {
|
|
151
|
-
[property]: getBoxSidesValues(value)
|
|
152
|
-
};
|
|
153
|
-
}
|
|
154
|
-
function getBorderPropertyPositionNormalizer(property, side) {
|
|
155
|
-
return value => {
|
|
156
|
-
return {
|
|
157
|
-
path: 'border',
|
|
158
|
-
value: {
|
|
159
|
-
[property]: {
|
|
160
|
-
[side]: value
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
};
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
function getBorderPositionExtractor(which) {
|
|
167
|
-
return (name, styles) => {
|
|
168
|
-
if (styles.border) {
|
|
169
|
-
return extractBorderPosition(styles.border, which);
|
|
170
|
-
}
|
|
171
|
-
};
|
|
172
|
-
}
|
|
173
|
-
function extractBorderPosition(border, which) {
|
|
174
|
-
const value = {};
|
|
175
|
-
if (border.width && border.width[which]) {
|
|
176
|
-
value.width = border.width[which];
|
|
177
|
-
}
|
|
178
|
-
if (border.style && border.style[which]) {
|
|
179
|
-
value.style = border.style[which];
|
|
180
|
-
}
|
|
181
|
-
if (border.color && border.color[which]) {
|
|
182
|
-
value.color = border.color[which];
|
|
183
|
-
}
|
|
184
|
-
return value;
|
|
185
|
-
}
|
|
186
|
-
function normalizeBorderShorthand(string) {
|
|
187
|
-
const result = {};
|
|
188
|
-
const parts = getShorthandValues(string);
|
|
189
|
-
for (const part of parts) {
|
|
190
|
-
if (isLength(part) || /thin|medium|thick/.test(part)) {
|
|
191
|
-
result.width = part;
|
|
192
|
-
}
|
|
193
|
-
else if (isLineStyle(part)) {
|
|
194
|
-
result.style = part;
|
|
195
|
-
}
|
|
196
|
-
else {
|
|
197
|
-
result.color = part;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
return result;
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* The border reducer factory.
|
|
204
|
-
*
|
|
205
|
-
* It tries to produce the most optimal output for the specified styles.
|
|
206
|
-
*
|
|
207
|
-
* For a border style:
|
|
208
|
-
*
|
|
209
|
-
* ```css
|
|
210
|
-
* style: {top: "solid", bottom: "solid", right: "solid", left: "solid"}
|
|
211
|
-
* ```
|
|
212
|
-
*
|
|
213
|
-
* It will produce: `border-style: solid`.
|
|
214
|
-
* For a border style and color:
|
|
215
|
-
*
|
|
216
|
-
* ```css
|
|
217
|
-
* color: {top: "#ff0", bottom: "#ff0", right: "#ff0", left: "#ff0"}
|
|
218
|
-
* style: {top: "solid", bottom: "solid", right: "solid", left: "solid"}
|
|
219
|
-
* ```
|
|
220
|
-
*
|
|
221
|
-
* It will produce: `border-color: #ff0; border-style: solid`.
|
|
222
|
-
* If all border parameters are specified:
|
|
223
|
-
*
|
|
224
|
-
* ```css
|
|
225
|
-
* color: {top: "#ff0", bottom: "#ff0", right: "#ff0", left: "#ff0"}
|
|
226
|
-
* style: {top: "solid", bottom: "solid", right: "solid", left: "solid"}
|
|
227
|
-
* width: {top: "2px", bottom: "2px", right: "2px", left: "2px"}
|
|
228
|
-
* ```
|
|
229
|
-
*
|
|
230
|
-
* It will combine everything into a single property: `border: 2px solid #ff0`.
|
|
231
|
-
*
|
|
232
|
-
* The definitions are merged only if all border selectors have the same values.
|
|
233
|
-
*/
|
|
234
|
-
function getBorderReducer() {
|
|
235
|
-
return value => {
|
|
236
|
-
const topStyles = extractBorderPosition(value, 'top');
|
|
237
|
-
const rightStyles = extractBorderPosition(value, 'right');
|
|
238
|
-
const bottomStyles = extractBorderPosition(value, 'bottom');
|
|
239
|
-
const leftStyles = extractBorderPosition(value, 'left');
|
|
240
|
-
const borderStyles = [topStyles, rightStyles, bottomStyles, leftStyles];
|
|
241
|
-
const borderStylesByType = {
|
|
242
|
-
width: getReducedStyleValueForType(borderStyles, 'width'),
|
|
243
|
-
style: getReducedStyleValueForType(borderStyles, 'style'),
|
|
244
|
-
color: getReducedStyleValueForType(borderStyles, 'color')
|
|
245
|
-
};
|
|
246
|
-
// Try reducing to a single `border:` property.
|
|
247
|
-
const reducedBorderStyle = reduceBorderPosition(borderStylesByType, 'all');
|
|
248
|
-
if (reducedBorderStyle.length) {
|
|
249
|
-
return reducedBorderStyle;
|
|
250
|
-
}
|
|
251
|
-
// Try reducing to `border-style:`, `border-width:`, `border-color:` properties.
|
|
252
|
-
const reducedStyleTypes = Object.entries(borderStylesByType).reduce((reducedStyleTypes, [type, value]) => {
|
|
253
|
-
if (value) {
|
|
254
|
-
reducedStyleTypes.push([`border-${type}`, value]);
|
|
255
|
-
// Remove it from the full set to not include it in the most specific properties later.
|
|
256
|
-
borderStyles.forEach(style => delete style[type]);
|
|
257
|
-
}
|
|
258
|
-
return reducedStyleTypes;
|
|
259
|
-
}, []);
|
|
260
|
-
// The reduced properties (by type) and all that remains that could not be reduced.
|
|
261
|
-
return [
|
|
262
|
-
...reducedStyleTypes,
|
|
263
|
-
...reduceBorderPosition(topStyles, 'top'),
|
|
264
|
-
...reduceBorderPosition(rightStyles, 'right'),
|
|
265
|
-
...reduceBorderPosition(bottomStyles, 'bottom'),
|
|
266
|
-
...reduceBorderPosition(leftStyles, 'left')
|
|
267
|
-
];
|
|
268
|
-
};
|
|
269
|
-
/**
|
|
270
|
-
* @param styles The array of objects with `style`, `color`, `width` properties.
|
|
271
|
-
*/
|
|
272
|
-
function getReducedStyleValueForType(styles, type) {
|
|
273
|
-
return styles
|
|
274
|
-
.map(style => style[type])
|
|
275
|
-
.reduce((result, style) => result == style ? result : null);
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
function getBorderPositionReducer(which) {
|
|
279
|
-
return value => reduceBorderPosition(value, which);
|
|
280
|
-
}
|
|
281
|
-
/**
|
|
282
|
-
* Returns an array with reduced border styles depending on the specified values.
|
|
283
|
-
*
|
|
284
|
-
* If all border properties (width, style, color) are specified, the returned selector will be
|
|
285
|
-
* merged into a group: `border-*: [width] [style] [color]`.
|
|
286
|
-
*
|
|
287
|
-
* Otherwise, the specific definitions will be returned: `border-(width|style|color)-*: [value]`.
|
|
288
|
-
*
|
|
289
|
-
* @param value Styles if defined.
|
|
290
|
-
* @param which The border position.
|
|
291
|
-
*/
|
|
292
|
-
function reduceBorderPosition(value, which) {
|
|
293
|
-
const borderTypes = [];
|
|
294
|
-
if (value && (value.width)) {
|
|
295
|
-
borderTypes.push('width');
|
|
296
|
-
}
|
|
297
|
-
if (value && (value.style)) {
|
|
298
|
-
borderTypes.push('style');
|
|
299
|
-
}
|
|
300
|
-
if (value && (value.color)) {
|
|
301
|
-
borderTypes.push('color');
|
|
302
|
-
}
|
|
303
|
-
if (borderTypes.length == 3) {
|
|
304
|
-
const borderValue = borderTypes.map(item => value[item]).join(' ');
|
|
305
|
-
return [
|
|
306
|
-
which == 'all' ? ['border', borderValue] : [`border-${which}`, borderValue]
|
|
307
|
-
];
|
|
308
|
-
}
|
|
309
|
-
// We are unable to reduce to a single `border:` property.
|
|
310
|
-
if (which == 'all') {
|
|
311
|
-
return [];
|
|
312
|
-
}
|
|
313
|
-
return borderTypes.map(type => {
|
|
314
|
-
return [`border-${which}-${type}`, value[type]];
|
|
315
|
-
});
|
|
316
|
-
}
|
|
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
|
+
import { getShorthandValues, getBoxSidesValueReducer, getBoxSidesValues, isLength, isLineStyle } from './utils';
|
|
6
|
+
/**
|
|
7
|
+
* Adds a border CSS styles processing rules.
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* editor.data.addStyleProcessorRules( addBorderRules );
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* This rules merges all [border](https://developer.mozilla.org/en-US/docs/Web/CSS/border) styles notation shorthands:
|
|
14
|
+
*
|
|
15
|
+
* - border
|
|
16
|
+
* - border-top
|
|
17
|
+
* - border-right
|
|
18
|
+
* - border-bottom
|
|
19
|
+
* - border-left
|
|
20
|
+
* - border-color
|
|
21
|
+
* - border-style
|
|
22
|
+
* - border-width
|
|
23
|
+
*
|
|
24
|
+
* and all corresponding longhand forms (like `border-top-color`, `border-top-style`, etc).
|
|
25
|
+
*
|
|
26
|
+
* It does not handle other shorthands (like `border-radius` or `border-image`).
|
|
27
|
+
*
|
|
28
|
+
* The normalized model stores border values as:
|
|
29
|
+
*
|
|
30
|
+
* ```ts
|
|
31
|
+
* const styles = {
|
|
32
|
+
* border: {
|
|
33
|
+
* color: { top, right, bottom, left },
|
|
34
|
+
* style: { top, right, bottom, left },
|
|
35
|
+
* width: { top, right, bottom, left },
|
|
36
|
+
* }
|
|
37
|
+
* };
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export function addBorderRules(stylesProcessor) {
|
|
41
|
+
stylesProcessor.setNormalizer('border', getBorderNormalizer());
|
|
42
|
+
// Border-position shorthands.
|
|
43
|
+
stylesProcessor.setNormalizer('border-top', getBorderPositionNormalizer('top'));
|
|
44
|
+
stylesProcessor.setNormalizer('border-right', getBorderPositionNormalizer('right'));
|
|
45
|
+
stylesProcessor.setNormalizer('border-bottom', getBorderPositionNormalizer('bottom'));
|
|
46
|
+
stylesProcessor.setNormalizer('border-left', getBorderPositionNormalizer('left'));
|
|
47
|
+
// Border-property shorthands.
|
|
48
|
+
stylesProcessor.setNormalizer('border-color', getBorderPropertyNormalizer('color'));
|
|
49
|
+
stylesProcessor.setNormalizer('border-width', getBorderPropertyNormalizer('width'));
|
|
50
|
+
stylesProcessor.setNormalizer('border-style', getBorderPropertyNormalizer('style'));
|
|
51
|
+
// Border longhands.
|
|
52
|
+
stylesProcessor.setNormalizer('border-top-color', getBorderPropertyPositionNormalizer('color', 'top'));
|
|
53
|
+
stylesProcessor.setNormalizer('border-top-style', getBorderPropertyPositionNormalizer('style', 'top'));
|
|
54
|
+
stylesProcessor.setNormalizer('border-top-width', getBorderPropertyPositionNormalizer('width', 'top'));
|
|
55
|
+
stylesProcessor.setNormalizer('border-right-color', getBorderPropertyPositionNormalizer('color', 'right'));
|
|
56
|
+
stylesProcessor.setNormalizer('border-right-style', getBorderPropertyPositionNormalizer('style', 'right'));
|
|
57
|
+
stylesProcessor.setNormalizer('border-right-width', getBorderPropertyPositionNormalizer('width', 'right'));
|
|
58
|
+
stylesProcessor.setNormalizer('border-bottom-color', getBorderPropertyPositionNormalizer('color', 'bottom'));
|
|
59
|
+
stylesProcessor.setNormalizer('border-bottom-style', getBorderPropertyPositionNormalizer('style', 'bottom'));
|
|
60
|
+
stylesProcessor.setNormalizer('border-bottom-width', getBorderPropertyPositionNormalizer('width', 'bottom'));
|
|
61
|
+
stylesProcessor.setNormalizer('border-left-color', getBorderPropertyPositionNormalizer('color', 'left'));
|
|
62
|
+
stylesProcessor.setNormalizer('border-left-style', getBorderPropertyPositionNormalizer('style', 'left'));
|
|
63
|
+
stylesProcessor.setNormalizer('border-left-width', getBorderPropertyPositionNormalizer('width', 'left'));
|
|
64
|
+
stylesProcessor.setExtractor('border-top', getBorderPositionExtractor('top'));
|
|
65
|
+
stylesProcessor.setExtractor('border-right', getBorderPositionExtractor('right'));
|
|
66
|
+
stylesProcessor.setExtractor('border-bottom', getBorderPositionExtractor('bottom'));
|
|
67
|
+
stylesProcessor.setExtractor('border-left', getBorderPositionExtractor('left'));
|
|
68
|
+
stylesProcessor.setExtractor('border-top-color', 'border.color.top');
|
|
69
|
+
stylesProcessor.setExtractor('border-right-color', 'border.color.right');
|
|
70
|
+
stylesProcessor.setExtractor('border-bottom-color', 'border.color.bottom');
|
|
71
|
+
stylesProcessor.setExtractor('border-left-color', 'border.color.left');
|
|
72
|
+
stylesProcessor.setExtractor('border-top-width', 'border.width.top');
|
|
73
|
+
stylesProcessor.setExtractor('border-right-width', 'border.width.right');
|
|
74
|
+
stylesProcessor.setExtractor('border-bottom-width', 'border.width.bottom');
|
|
75
|
+
stylesProcessor.setExtractor('border-left-width', 'border.width.left');
|
|
76
|
+
stylesProcessor.setExtractor('border-top-style', 'border.style.top');
|
|
77
|
+
stylesProcessor.setExtractor('border-right-style', 'border.style.right');
|
|
78
|
+
stylesProcessor.setExtractor('border-bottom-style', 'border.style.bottom');
|
|
79
|
+
stylesProcessor.setExtractor('border-left-style', 'border.style.left');
|
|
80
|
+
stylesProcessor.setReducer('border-color', getBoxSidesValueReducer('border-color'));
|
|
81
|
+
stylesProcessor.setReducer('border-style', getBoxSidesValueReducer('border-style'));
|
|
82
|
+
stylesProcessor.setReducer('border-width', getBoxSidesValueReducer('border-width'));
|
|
83
|
+
stylesProcessor.setReducer('border-top', getBorderPositionReducer('top'));
|
|
84
|
+
stylesProcessor.setReducer('border-right', getBorderPositionReducer('right'));
|
|
85
|
+
stylesProcessor.setReducer('border-bottom', getBorderPositionReducer('bottom'));
|
|
86
|
+
stylesProcessor.setReducer('border-left', getBorderPositionReducer('left'));
|
|
87
|
+
stylesProcessor.setReducer('border', getBorderReducer());
|
|
88
|
+
stylesProcessor.setStyleRelation('border', [
|
|
89
|
+
'border-color', 'border-style', 'border-width',
|
|
90
|
+
'border-top', 'border-right', 'border-bottom', 'border-left',
|
|
91
|
+
'border-top-color', 'border-right-color', 'border-bottom-color', 'border-left-color',
|
|
92
|
+
'border-top-style', 'border-right-style', 'border-bottom-style', 'border-left-style',
|
|
93
|
+
'border-top-width', 'border-right-width', 'border-bottom-width', 'border-left-width'
|
|
94
|
+
]);
|
|
95
|
+
stylesProcessor.setStyleRelation('border-color', [
|
|
96
|
+
'border-top-color', 'border-right-color', 'border-bottom-color', 'border-left-color'
|
|
97
|
+
]);
|
|
98
|
+
stylesProcessor.setStyleRelation('border-style', [
|
|
99
|
+
'border-top-style', 'border-right-style', 'border-bottom-style', 'border-left-style'
|
|
100
|
+
]);
|
|
101
|
+
stylesProcessor.setStyleRelation('border-width', [
|
|
102
|
+
'border-top-width', 'border-right-width', 'border-bottom-width', 'border-left-width'
|
|
103
|
+
]);
|
|
104
|
+
stylesProcessor.setStyleRelation('border-top', ['border-top-color', 'border-top-style', 'border-top-width']);
|
|
105
|
+
stylesProcessor.setStyleRelation('border-right', ['border-right-color', 'border-right-style', 'border-right-width']);
|
|
106
|
+
stylesProcessor.setStyleRelation('border-bottom', ['border-bottom-color', 'border-bottom-style', 'border-bottom-width']);
|
|
107
|
+
stylesProcessor.setStyleRelation('border-left', ['border-left-color', 'border-left-style', 'border-left-width']);
|
|
108
|
+
}
|
|
109
|
+
function getBorderNormalizer() {
|
|
110
|
+
return value => {
|
|
111
|
+
const { color, style, width } = normalizeBorderShorthand(value);
|
|
112
|
+
return {
|
|
113
|
+
path: 'border',
|
|
114
|
+
value: {
|
|
115
|
+
color: getBoxSidesValues(color),
|
|
116
|
+
style: getBoxSidesValues(style),
|
|
117
|
+
width: getBoxSidesValues(width)
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function getBorderPositionNormalizer(side) {
|
|
123
|
+
return value => {
|
|
124
|
+
const { color, style, width } = normalizeBorderShorthand(value);
|
|
125
|
+
const border = {};
|
|
126
|
+
if (color !== undefined) {
|
|
127
|
+
border.color = { [side]: color };
|
|
128
|
+
}
|
|
129
|
+
if (style !== undefined) {
|
|
130
|
+
border.style = { [side]: style };
|
|
131
|
+
}
|
|
132
|
+
if (width !== undefined) {
|
|
133
|
+
border.width = { [side]: width };
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
path: 'border',
|
|
137
|
+
value: border
|
|
138
|
+
};
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
function getBorderPropertyNormalizer(propertyName) {
|
|
142
|
+
return value => {
|
|
143
|
+
return {
|
|
144
|
+
path: 'border',
|
|
145
|
+
value: toBorderPropertyShorthand(value, propertyName)
|
|
146
|
+
};
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
function toBorderPropertyShorthand(value, property) {
|
|
150
|
+
return {
|
|
151
|
+
[property]: getBoxSidesValues(value)
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
function getBorderPropertyPositionNormalizer(property, side) {
|
|
155
|
+
return value => {
|
|
156
|
+
return {
|
|
157
|
+
path: 'border',
|
|
158
|
+
value: {
|
|
159
|
+
[property]: {
|
|
160
|
+
[side]: value
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
function getBorderPositionExtractor(which) {
|
|
167
|
+
return (name, styles) => {
|
|
168
|
+
if (styles.border) {
|
|
169
|
+
return extractBorderPosition(styles.border, which);
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
function extractBorderPosition(border, which) {
|
|
174
|
+
const value = {};
|
|
175
|
+
if (border.width && border.width[which]) {
|
|
176
|
+
value.width = border.width[which];
|
|
177
|
+
}
|
|
178
|
+
if (border.style && border.style[which]) {
|
|
179
|
+
value.style = border.style[which];
|
|
180
|
+
}
|
|
181
|
+
if (border.color && border.color[which]) {
|
|
182
|
+
value.color = border.color[which];
|
|
183
|
+
}
|
|
184
|
+
return value;
|
|
185
|
+
}
|
|
186
|
+
function normalizeBorderShorthand(string) {
|
|
187
|
+
const result = {};
|
|
188
|
+
const parts = getShorthandValues(string);
|
|
189
|
+
for (const part of parts) {
|
|
190
|
+
if (isLength(part) || /thin|medium|thick/.test(part)) {
|
|
191
|
+
result.width = part;
|
|
192
|
+
}
|
|
193
|
+
else if (isLineStyle(part)) {
|
|
194
|
+
result.style = part;
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
result.color = part;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return result;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* The border reducer factory.
|
|
204
|
+
*
|
|
205
|
+
* It tries to produce the most optimal output for the specified styles.
|
|
206
|
+
*
|
|
207
|
+
* For a border style:
|
|
208
|
+
*
|
|
209
|
+
* ```css
|
|
210
|
+
* style: {top: "solid", bottom: "solid", right: "solid", left: "solid"}
|
|
211
|
+
* ```
|
|
212
|
+
*
|
|
213
|
+
* It will produce: `border-style: solid`.
|
|
214
|
+
* For a border style and color:
|
|
215
|
+
*
|
|
216
|
+
* ```css
|
|
217
|
+
* color: {top: "#ff0", bottom: "#ff0", right: "#ff0", left: "#ff0"}
|
|
218
|
+
* style: {top: "solid", bottom: "solid", right: "solid", left: "solid"}
|
|
219
|
+
* ```
|
|
220
|
+
*
|
|
221
|
+
* It will produce: `border-color: #ff0; border-style: solid`.
|
|
222
|
+
* If all border parameters are specified:
|
|
223
|
+
*
|
|
224
|
+
* ```css
|
|
225
|
+
* color: {top: "#ff0", bottom: "#ff0", right: "#ff0", left: "#ff0"}
|
|
226
|
+
* style: {top: "solid", bottom: "solid", right: "solid", left: "solid"}
|
|
227
|
+
* width: {top: "2px", bottom: "2px", right: "2px", left: "2px"}
|
|
228
|
+
* ```
|
|
229
|
+
*
|
|
230
|
+
* It will combine everything into a single property: `border: 2px solid #ff0`.
|
|
231
|
+
*
|
|
232
|
+
* The definitions are merged only if all border selectors have the same values.
|
|
233
|
+
*/
|
|
234
|
+
function getBorderReducer() {
|
|
235
|
+
return value => {
|
|
236
|
+
const topStyles = extractBorderPosition(value, 'top');
|
|
237
|
+
const rightStyles = extractBorderPosition(value, 'right');
|
|
238
|
+
const bottomStyles = extractBorderPosition(value, 'bottom');
|
|
239
|
+
const leftStyles = extractBorderPosition(value, 'left');
|
|
240
|
+
const borderStyles = [topStyles, rightStyles, bottomStyles, leftStyles];
|
|
241
|
+
const borderStylesByType = {
|
|
242
|
+
width: getReducedStyleValueForType(borderStyles, 'width'),
|
|
243
|
+
style: getReducedStyleValueForType(borderStyles, 'style'),
|
|
244
|
+
color: getReducedStyleValueForType(borderStyles, 'color')
|
|
245
|
+
};
|
|
246
|
+
// Try reducing to a single `border:` property.
|
|
247
|
+
const reducedBorderStyle = reduceBorderPosition(borderStylesByType, 'all');
|
|
248
|
+
if (reducedBorderStyle.length) {
|
|
249
|
+
return reducedBorderStyle;
|
|
250
|
+
}
|
|
251
|
+
// Try reducing to `border-style:`, `border-width:`, `border-color:` properties.
|
|
252
|
+
const reducedStyleTypes = Object.entries(borderStylesByType).reduce((reducedStyleTypes, [type, value]) => {
|
|
253
|
+
if (value) {
|
|
254
|
+
reducedStyleTypes.push([`border-${type}`, value]);
|
|
255
|
+
// Remove it from the full set to not include it in the most specific properties later.
|
|
256
|
+
borderStyles.forEach(style => delete style[type]);
|
|
257
|
+
}
|
|
258
|
+
return reducedStyleTypes;
|
|
259
|
+
}, []);
|
|
260
|
+
// The reduced properties (by type) and all that remains that could not be reduced.
|
|
261
|
+
return [
|
|
262
|
+
...reducedStyleTypes,
|
|
263
|
+
...reduceBorderPosition(topStyles, 'top'),
|
|
264
|
+
...reduceBorderPosition(rightStyles, 'right'),
|
|
265
|
+
...reduceBorderPosition(bottomStyles, 'bottom'),
|
|
266
|
+
...reduceBorderPosition(leftStyles, 'left')
|
|
267
|
+
];
|
|
268
|
+
};
|
|
269
|
+
/**
|
|
270
|
+
* @param styles The array of objects with `style`, `color`, `width` properties.
|
|
271
|
+
*/
|
|
272
|
+
function getReducedStyleValueForType(styles, type) {
|
|
273
|
+
return styles
|
|
274
|
+
.map(style => style[type])
|
|
275
|
+
.reduce((result, style) => result == style ? result : null);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
function getBorderPositionReducer(which) {
|
|
279
|
+
return value => reduceBorderPosition(value, which);
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Returns an array with reduced border styles depending on the specified values.
|
|
283
|
+
*
|
|
284
|
+
* If all border properties (width, style, color) are specified, the returned selector will be
|
|
285
|
+
* merged into a group: `border-*: [width] [style] [color]`.
|
|
286
|
+
*
|
|
287
|
+
* Otherwise, the specific definitions will be returned: `border-(width|style|color)-*: [value]`.
|
|
288
|
+
*
|
|
289
|
+
* @param value Styles if defined.
|
|
290
|
+
* @param which The border position.
|
|
291
|
+
*/
|
|
292
|
+
function reduceBorderPosition(value, which) {
|
|
293
|
+
const borderTypes = [];
|
|
294
|
+
if (value && (value.width)) {
|
|
295
|
+
borderTypes.push('width');
|
|
296
|
+
}
|
|
297
|
+
if (value && (value.style)) {
|
|
298
|
+
borderTypes.push('style');
|
|
299
|
+
}
|
|
300
|
+
if (value && (value.color)) {
|
|
301
|
+
borderTypes.push('color');
|
|
302
|
+
}
|
|
303
|
+
if (borderTypes.length == 3) {
|
|
304
|
+
const borderValue = borderTypes.map(item => value[item]).join(' ');
|
|
305
|
+
return [
|
|
306
|
+
which == 'all' ? ['border', borderValue] : [`border-${which}`, borderValue]
|
|
307
|
+
];
|
|
308
|
+
}
|
|
309
|
+
// We are unable to reduce to a single `border:` property.
|
|
310
|
+
if (which == 'all') {
|
|
311
|
+
return [];
|
|
312
|
+
}
|
|
313
|
+
return borderTypes.map(type => {
|
|
314
|
+
return [`border-${which}-${type}`, value[type]];
|
|
315
|
+
});
|
|
316
|
+
}
|