roosterjs-content-model-dom 0.17.0 → 0.18.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/README.md +21 -66
- package/lib/domToModel/processors/elementProcessor.js +1 -2
- package/lib/domToModel/processors/elementProcessor.js.map +1 -1
- package/lib/domToModel/processors/entityProcessor.js +1 -1
- package/lib/domToModel/processors/entityProcessor.js.map +1 -1
- package/lib/domToModel/processors/fontProcessor.js +1 -1
- package/lib/domToModel/processors/fontProcessor.js.map +1 -1
- package/lib/domToModel/processors/formatContainerProcessor.js +1 -3
- package/lib/domToModel/processors/formatContainerProcessor.js.map +1 -1
- package/lib/domToModel/processors/generalProcessor.js +1 -3
- package/lib/domToModel/processors/generalProcessor.js.map +1 -1
- package/lib/domToModel/processors/knownElementProcessor.js +2 -2
- package/lib/domToModel/processors/knownElementProcessor.js.map +1 -1
- package/lib/domToModel/processors/listItemProcessor.js +1 -1
- package/lib/domToModel/processors/listItemProcessor.js.map +1 -1
- package/lib/domToModel/processors/listProcessor.js +1 -12
- package/lib/domToModel/processors/listProcessor.js.map +1 -1
- package/lib/domToModel/processors/tableProcessor.js.map +1 -1
- package/lib/domToModel/processors/textProcessor.js +3 -2
- package/lib/domToModel/processors/textProcessor.js.map +1 -1
- package/lib/domToModel/utils/getDefaultStyle.d.ts +1 -3
- package/lib/domToModel/utils/getDefaultStyle.js +1 -2
- package/lib/domToModel/utils/getDefaultStyle.js.map +1 -1
- package/lib/domToModel/utils/getRegularSelectionOffsets.js.map +1 -1
- package/lib/domToModel/utils/isBlockElement.d.ts +1 -3
- package/lib/domToModel/utils/isBlockElement.js +2 -3
- package/lib/domToModel/utils/isBlockElement.js.map +1 -1
- package/lib/domToModel/utils/parseFormat.js +1 -1
- package/lib/domToModel/utils/parseFormat.js.map +1 -1
- package/lib/domUtils/entityUtils.d.ts +10 -0
- package/lib/domUtils/entityUtils.js +35 -1
- package/lib/domUtils/entityUtils.js.map +1 -1
- package/lib/domUtils/metadata/updateMetadata.d.ts +1 -2
- package/lib/domUtils/metadata/updateMetadata.js +3 -3
- package/lib/domUtils/metadata/updateMetadata.js.map +1 -1
- package/lib/domUtils/metadata/validate.d.ts +9 -0
- package/lib/domUtils/metadata/validate.js +62 -0
- package/lib/domUtils/metadata/validate.js.map +1 -0
- package/lib/domUtils/unwrap.d.ts +6 -0
- package/lib/domUtils/unwrap.js +22 -0
- package/lib/domUtils/unwrap.js.map +1 -0
- package/lib/domUtils/wrap.d.ts +9 -0
- package/lib/domUtils/wrap.js +20 -0
- package/lib/domUtils/wrap.js.map +1 -0
- package/lib/formatHandlers/defaultFormatHandlers.js +9 -10
- package/lib/formatHandlers/defaultFormatHandlers.js.map +1 -1
- package/lib/formatHandlers/list/listLevelThreadFormatHandler.js +3 -1
- package/lib/formatHandlers/list/listLevelThreadFormatHandler.js.map +1 -1
- package/lib/formatHandlers/list/listStyleFormatHandler.d.ts +6 -0
- package/lib/formatHandlers/list/{listStylePositionFormatHandler.js → listStyleFormatHandler.js} +10 -3
- package/lib/formatHandlers/list/listStyleFormatHandler.js.map +1 -0
- package/lib/formatHandlers/utils/color.d.ts +3 -3
- package/lib/formatHandlers/utils/color.js +4 -26
- package/lib/formatHandlers/utils/color.js.map +1 -1
- package/lib/index.d.ts +2 -1
- package/lib/index.js +6 -4
- package/lib/index.js.map +1 -1
- package/lib/modelToDom/context/createModelToDomContext.js +1 -0
- package/lib/modelToDom/context/createModelToDomContext.js.map +1 -1
- package/lib/modelToDom/handlers/handleEntity.js +5 -4
- package/lib/modelToDom/handlers/handleEntity.js.map +1 -1
- package/lib/modelToDom/handlers/handleGeneralModel.js +2 -2
- package/lib/modelToDom/handlers/handleGeneralModel.js.map +1 -1
- package/lib/modelToDom/handlers/handleList.js +8 -18
- package/lib/modelToDom/handlers/handleList.js.map +1 -1
- package/lib/modelToDom/handlers/handleListItem.js +8 -11
- package/lib/modelToDom/handlers/handleListItem.js.map +1 -1
- package/lib/modelToDom/handlers/handleParagraph.js +2 -2
- package/lib/modelToDom/handlers/handleParagraph.js.map +1 -1
- package/lib/modelToDom/handlers/handleTable.js.map +1 -1
- package/lib/modelToDom/utils/applyMetadata.d.ts +5 -0
- package/lib/modelToDom/utils/applyMetadata.js +17 -0
- package/lib/modelToDom/utils/applyMetadata.js.map +1 -0
- package/lib-amd/domToModel/processors/elementProcessor.js +2 -2
- package/lib-amd/domToModel/processors/elementProcessor.js.map +1 -1
- package/lib-amd/domToModel/processors/entityProcessor.js +1 -1
- package/lib-amd/domToModel/processors/entityProcessor.js.map +1 -1
- package/lib-amd/domToModel/processors/fontProcessor.js +1 -1
- package/lib-amd/domToModel/processors/fontProcessor.js.map +1 -1
- package/lib-amd/domToModel/processors/formatContainerProcessor.js +1 -3
- package/lib-amd/domToModel/processors/formatContainerProcessor.js.map +1 -1
- package/lib-amd/domToModel/processors/generalProcessor.js +1 -3
- package/lib-amd/domToModel/processors/generalProcessor.js.map +1 -1
- package/lib-amd/domToModel/processors/knownElementProcessor.js +2 -2
- package/lib-amd/domToModel/processors/knownElementProcessor.js.map +1 -1
- package/lib-amd/domToModel/processors/listItemProcessor.js +1 -1
- package/lib-amd/domToModel/processors/listItemProcessor.js.map +1 -1
- package/lib-amd/domToModel/processors/listProcessor.js +2 -11
- package/lib-amd/domToModel/processors/listProcessor.js.map +1 -1
- package/lib-amd/domToModel/processors/tableProcessor.js.map +1 -1
- package/lib-amd/domToModel/processors/textProcessor.js +4 -2
- package/lib-amd/domToModel/processors/textProcessor.js.map +1 -1
- package/lib-amd/domToModel/utils/getDefaultStyle.d.ts +1 -3
- package/lib-amd/domToModel/utils/getDefaultStyle.js +1 -2
- package/lib-amd/domToModel/utils/getDefaultStyle.js.map +1 -1
- package/lib-amd/domToModel/utils/getRegularSelectionOffsets.js.map +1 -1
- package/lib-amd/domToModel/utils/isBlockElement.d.ts +1 -3
- package/lib-amd/domToModel/utils/isBlockElement.js +2 -3
- package/lib-amd/domToModel/utils/isBlockElement.js.map +1 -1
- package/lib-amd/domToModel/utils/parseFormat.js +1 -1
- package/lib-amd/domToModel/utils/parseFormat.js.map +1 -1
- package/lib-amd/domUtils/entityUtils.d.ts +10 -0
- package/lib-amd/domUtils/entityUtils.js +35 -2
- package/lib-amd/domUtils/entityUtils.js.map +1 -1
- package/lib-amd/domUtils/metadata/updateMetadata.d.ts +1 -2
- package/lib-amd/domUtils/metadata/updateMetadata.js +3 -3
- package/lib-amd/domUtils/metadata/updateMetadata.js.map +1 -1
- package/lib-amd/domUtils/metadata/validate.d.ts +9 -0
- package/lib-amd/domUtils/metadata/validate.js +63 -0
- package/lib-amd/domUtils/metadata/validate.js.map +1 -0
- package/lib-amd/domUtils/unwrap.d.ts +6 -0
- package/lib-amd/domUtils/unwrap.js +24 -0
- package/lib-amd/domUtils/unwrap.js.map +1 -0
- package/lib-amd/domUtils/wrap.d.ts +9 -0
- package/lib-amd/domUtils/wrap.js +22 -0
- package/lib-amd/domUtils/wrap.js.map +1 -0
- package/lib-amd/formatHandlers/defaultFormatHandlers.js +9 -10
- package/lib-amd/formatHandlers/defaultFormatHandlers.js.map +1 -1
- package/lib-amd/formatHandlers/list/listLevelThreadFormatHandler.js +3 -1
- package/lib-amd/formatHandlers/list/listLevelThreadFormatHandler.js.map +1 -1
- package/lib-amd/formatHandlers/list/listStyleFormatHandler.d.ts +6 -0
- package/lib-amd/formatHandlers/list/{listStylePositionFormatHandler.js → listStyleFormatHandler.js} +10 -3
- package/lib-amd/formatHandlers/list/listStyleFormatHandler.js.map +1 -0
- package/lib-amd/formatHandlers/utils/color.d.ts +3 -3
- package/lib-amd/formatHandlers/utils/color.js +4 -26
- package/lib-amd/formatHandlers/utils/color.js.map +1 -1
- package/lib-amd/index.d.ts +2 -1
- package/lib-amd/index.js +4 -3
- package/lib-amd/index.js.map +1 -1
- package/lib-amd/modelToDom/context/createModelToDomContext.js +1 -0
- package/lib-amd/modelToDom/context/createModelToDomContext.js.map +1 -1
- package/lib-amd/modelToDom/handlers/handleEntity.js +4 -4
- package/lib-amd/modelToDom/handlers/handleEntity.js.map +1 -1
- package/lib-amd/modelToDom/handlers/handleGeneralModel.js +2 -2
- package/lib-amd/modelToDom/handlers/handleGeneralModel.js.map +1 -1
- package/lib-amd/modelToDom/handlers/handleList.js +8 -17
- package/lib-amd/modelToDom/handlers/handleList.js.map +1 -1
- package/lib-amd/modelToDom/handlers/handleListItem.js +7 -9
- package/lib-amd/modelToDom/handlers/handleListItem.js.map +1 -1
- package/lib-amd/modelToDom/handlers/handleParagraph.js +2 -2
- package/lib-amd/modelToDom/handlers/handleParagraph.js.map +1 -1
- package/lib-amd/modelToDom/handlers/handleTable.js.map +1 -1
- package/lib-amd/modelToDom/utils/applyMetadata.d.ts +5 -0
- package/lib-amd/modelToDom/utils/applyMetadata.js +18 -0
- package/lib-amd/modelToDom/utils/applyMetadata.js.map +1 -0
- package/lib-mjs/domToModel/processors/elementProcessor.js +2 -3
- package/lib-mjs/domToModel/processors/elementProcessor.js.map +1 -1
- package/lib-mjs/domToModel/processors/entityProcessor.js +1 -1
- package/lib-mjs/domToModel/processors/entityProcessor.js.map +1 -1
- package/lib-mjs/domToModel/processors/fontProcessor.js +1 -1
- package/lib-mjs/domToModel/processors/fontProcessor.js.map +1 -1
- package/lib-mjs/domToModel/processors/formatContainerProcessor.js +1 -3
- package/lib-mjs/domToModel/processors/formatContainerProcessor.js.map +1 -1
- package/lib-mjs/domToModel/processors/generalProcessor.js +1 -3
- package/lib-mjs/domToModel/processors/generalProcessor.js.map +1 -1
- package/lib-mjs/domToModel/processors/knownElementProcessor.js +2 -2
- package/lib-mjs/domToModel/processors/knownElementProcessor.js.map +1 -1
- package/lib-mjs/domToModel/processors/listItemProcessor.js +1 -1
- package/lib-mjs/domToModel/processors/listItemProcessor.js.map +1 -1
- package/lib-mjs/domToModel/processors/listProcessor.js +1 -12
- package/lib-mjs/domToModel/processors/listProcessor.js.map +1 -1
- package/lib-mjs/domToModel/processors/tableProcessor.js.map +1 -1
- package/lib-mjs/domToModel/processors/textProcessor.js +3 -2
- package/lib-mjs/domToModel/processors/textProcessor.js.map +1 -1
- package/lib-mjs/domToModel/utils/getDefaultStyle.d.ts +1 -3
- package/lib-mjs/domToModel/utils/getDefaultStyle.js +1 -2
- package/lib-mjs/domToModel/utils/getDefaultStyle.js.map +1 -1
- package/lib-mjs/domToModel/utils/getRegularSelectionOffsets.js.map +1 -1
- package/lib-mjs/domToModel/utils/isBlockElement.d.ts +1 -3
- package/lib-mjs/domToModel/utils/isBlockElement.js +2 -3
- package/lib-mjs/domToModel/utils/isBlockElement.js.map +1 -1
- package/lib-mjs/domToModel/utils/parseFormat.js +1 -1
- package/lib-mjs/domToModel/utils/parseFormat.js.map +1 -1
- package/lib-mjs/domUtils/entityUtils.d.ts +10 -0
- package/lib-mjs/domUtils/entityUtils.js +32 -0
- package/lib-mjs/domUtils/entityUtils.js.map +1 -1
- package/lib-mjs/domUtils/metadata/updateMetadata.d.ts +1 -2
- package/lib-mjs/domUtils/metadata/updateMetadata.js +1 -1
- package/lib-mjs/domUtils/metadata/updateMetadata.js.map +1 -1
- package/lib-mjs/domUtils/metadata/validate.d.ts +9 -0
- package/lib-mjs/domUtils/metadata/validate.js +58 -0
- package/lib-mjs/domUtils/metadata/validate.js.map +1 -0
- package/lib-mjs/domUtils/unwrap.d.ts +6 -0
- package/lib-mjs/domUtils/unwrap.js +18 -0
- package/lib-mjs/domUtils/unwrap.js.map +1 -0
- package/lib-mjs/domUtils/wrap.d.ts +9 -0
- package/lib-mjs/domUtils/wrap.js +16 -0
- package/lib-mjs/domUtils/wrap.js.map +1 -0
- package/lib-mjs/formatHandlers/defaultFormatHandlers.js +9 -10
- package/lib-mjs/formatHandlers/defaultFormatHandlers.js.map +1 -1
- package/lib-mjs/formatHandlers/list/listLevelThreadFormatHandler.js +3 -1
- package/lib-mjs/formatHandlers/list/listLevelThreadFormatHandler.js.map +1 -1
- package/lib-mjs/formatHandlers/list/listStyleFormatHandler.d.ts +6 -0
- package/lib-mjs/formatHandlers/list/{listStylePositionFormatHandler.js → listStyleFormatHandler.js} +9 -2
- package/lib-mjs/formatHandlers/list/listStyleFormatHandler.js.map +1 -0
- package/lib-mjs/formatHandlers/utils/color.d.ts +3 -3
- package/lib-mjs/formatHandlers/utils/color.js +4 -26
- package/lib-mjs/formatHandlers/utils/color.js.map +1 -1
- package/lib-mjs/index.d.ts +2 -1
- package/lib-mjs/index.js +2 -1
- package/lib-mjs/index.js.map +1 -1
- package/lib-mjs/modelToDom/context/createModelToDomContext.js +1 -0
- package/lib-mjs/modelToDom/context/createModelToDomContext.js.map +1 -1
- package/lib-mjs/modelToDom/handlers/handleEntity.js +5 -4
- package/lib-mjs/modelToDom/handlers/handleEntity.js.map +1 -1
- package/lib-mjs/modelToDom/handlers/handleGeneralModel.js +2 -2
- package/lib-mjs/modelToDom/handlers/handleGeneralModel.js.map +1 -1
- package/lib-mjs/modelToDom/handlers/handleList.js +8 -18
- package/lib-mjs/modelToDom/handlers/handleList.js.map +1 -1
- package/lib-mjs/modelToDom/handlers/handleListItem.js +7 -10
- package/lib-mjs/modelToDom/handlers/handleListItem.js.map +1 -1
- package/lib-mjs/modelToDom/handlers/handleParagraph.js +1 -1
- package/lib-mjs/modelToDom/handlers/handleParagraph.js.map +1 -1
- package/lib-mjs/modelToDom/handlers/handleTable.js.map +1 -1
- package/lib-mjs/modelToDom/utils/applyMetadata.d.ts +5 -0
- package/lib-mjs/modelToDom/utils/applyMetadata.js +13 -0
- package/lib-mjs/modelToDom/utils/applyMetadata.js.map +1 -0
- package/package.json +2 -4
- package/lib/domUtils/metadata/updateListMetadata.d.ts +0 -7
- package/lib/domUtils/metadata/updateListMetadata.js +0 -19
- package/lib/domUtils/metadata/updateListMetadata.js.map +0 -1
- package/lib/formatHandlers/list/listItemMetadataFormatHandler.d.ts +0 -11
- package/lib/formatHandlers/list/listItemMetadataFormatHandler.js +0 -102
- package/lib/formatHandlers/list/listItemMetadataFormatHandler.js.map +0 -1
- package/lib/formatHandlers/list/listLevelMetadataFormatHandler.d.ts +0 -15
- package/lib/formatHandlers/list/listLevelMetadataFormatHandler.js +0 -89
- package/lib/formatHandlers/list/listLevelMetadataFormatHandler.js.map +0 -1
- package/lib/formatHandlers/list/listStylePositionFormatHandler.d.ts +0 -6
- package/lib/formatHandlers/list/listStylePositionFormatHandler.js.map +0 -1
- package/lib-amd/domUtils/metadata/updateListMetadata.d.ts +0 -7
- package/lib-amd/domUtils/metadata/updateListMetadata.js +0 -19
- package/lib-amd/domUtils/metadata/updateListMetadata.js.map +0 -1
- package/lib-amd/formatHandlers/list/listItemMetadataFormatHandler.d.ts +0 -11
- package/lib-amd/formatHandlers/list/listItemMetadataFormatHandler.js +0 -100
- package/lib-amd/formatHandlers/list/listItemMetadataFormatHandler.js.map +0 -1
- package/lib-amd/formatHandlers/list/listLevelMetadataFormatHandler.d.ts +0 -15
- package/lib-amd/formatHandlers/list/listLevelMetadataFormatHandler.js +0 -89
- package/lib-amd/formatHandlers/list/listLevelMetadataFormatHandler.js.map +0 -1
- package/lib-amd/formatHandlers/list/listStylePositionFormatHandler.d.ts +0 -6
- package/lib-amd/formatHandlers/list/listStylePositionFormatHandler.js.map +0 -1
- package/lib-mjs/domUtils/metadata/updateListMetadata.d.ts +0 -7
- package/lib-mjs/domUtils/metadata/updateListMetadata.js +0 -15
- package/lib-mjs/domUtils/metadata/updateListMetadata.js.map +0 -1
- package/lib-mjs/formatHandlers/list/listItemMetadataFormatHandler.d.ts +0 -11
- package/lib-mjs/formatHandlers/list/listItemMetadataFormatHandler.js +0 -98
- package/lib-mjs/formatHandlers/list/listItemMetadataFormatHandler.js.map +0 -1
- package/lib-mjs/formatHandlers/list/listLevelMetadataFormatHandler.d.ts +0 -15
- package/lib-mjs/formatHandlers/list/listLevelMetadataFormatHandler.js +0 -86
- package/lib-mjs/formatHandlers/list/listLevelMetadataFormatHandler.js.map +0 -1
- package/lib-mjs/formatHandlers/list/listStylePositionFormatHandler.d.ts +0 -6
- package/lib-mjs/formatHandlers/list/listStylePositionFormatHandler.js.map +0 -1
package/README.md
CHANGED
|
@@ -128,81 +128,36 @@ In order to run the code below, you may also need to install [webpack](https://w
|
|
|
128
128
|
|
|
129
129
|
### A quick start
|
|
130
130
|
|
|
131
|
-
1. Create `editor.htm` contains a DIV with some styles, and a reference to
|
|
132
|
-
.js file:
|
|
131
|
+
1. Create `editor.htm` which contains a DIV with some styles, buttons to handle some click events and a reference to rooster.js (update with the path to your rooster.js file):
|
|
133
132
|
|
|
134
133
|
```html
|
|
135
134
|
<html>
|
|
136
135
|
<body>
|
|
137
|
-
<div
|
|
138
|
-
id="editorDiv"
|
|
139
|
-
style="width: 500px; height: 300px; overflow: auto;
|
|
140
|
-
border: solid 1px black"
|
|
141
|
-
></div>
|
|
142
|
-
<script src="editor.js"></script>
|
|
143
|
-
</body>
|
|
144
|
-
</html>
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
2. Create `source.js` to import roosterjs and create an editor:
|
|
148
|
-
|
|
149
|
-
```javascript
|
|
150
|
-
var roosterjs = require('roosterjs');
|
|
151
|
-
var editorDiv = document.getElementById('editorDiv');
|
|
152
|
-
var editor = roosterjs.createEditor(editorDiv);
|
|
153
|
-
editor.setContent('Welcome to <b>RoosterJs</b>!');
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
3. Compile the javascript file using webpack:
|
|
157
|
-
|
|
158
|
-
`webpack source.js editor.js`
|
|
159
|
-
|
|
160
|
-
4. Navigate to editor.htm, you will see a editor shown in the page.
|
|
161
|
-
|
|
162
|
-
### Add some format buttons
|
|
163
|
-
|
|
164
|
-
1. Add some buttons into `editor.htm`:
|
|
165
|
-
|
|
166
|
-
```html
|
|
167
|
-
<html>
|
|
168
|
-
<body>
|
|
169
|
-
<div
|
|
170
|
-
id="editorDiv"
|
|
171
|
-
style="width: 500px; height: 300px; overflow: auto;
|
|
172
|
-
border: solid 1px black"
|
|
173
|
-
></div>
|
|
136
|
+
<div style="width: 500px; height: 400px; border: solid 1px black" id="contentDiv"></div>
|
|
174
137
|
<button id="buttonB">B</button> <button id="buttonI">I</button>
|
|
175
138
|
<button id="buttonU">U</button>
|
|
176
|
-
<script src="
|
|
139
|
+
<script src="rooster.js"></script>
|
|
140
|
+
<script>
|
|
141
|
+
var contentDiv = document.getElementById('contentDiv');
|
|
142
|
+
var editor = roosterjs.createEditor(contentDiv);
|
|
143
|
+
|
|
144
|
+
editor.setContent('Welcome to <b>RoosterJs</b>!');
|
|
145
|
+
document.getElementById('buttonB').addEventListener('click', function () {
|
|
146
|
+
roosterjs.toggleBold(editor);
|
|
147
|
+
});
|
|
148
|
+
document.getElementById('buttonI').addEventListener('click', function () {
|
|
149
|
+
roosterjs.toggleItalic(editor);
|
|
150
|
+
});
|
|
151
|
+
document.getElementById('buttonU').addEventListener('click', function () {
|
|
152
|
+
roosterjs.toggleUnderline(editor);
|
|
153
|
+
});
|
|
154
|
+
</script>
|
|
177
155
|
</body>
|
|
178
156
|
</html>
|
|
179
157
|
```
|
|
180
158
|
|
|
181
|
-
2.
|
|
182
|
-
|
|
183
|
-
```javascript
|
|
184
|
-
var roosterjs = require('roosterjs');
|
|
185
|
-
var editorDiv = document.getElementById('editorDiv');
|
|
186
|
-
var editor = roosterjs.createEditor(editorDiv);
|
|
187
|
-
editor.setContent('Welcome to <b>RoosterJs</b>!');
|
|
188
|
-
|
|
189
|
-
document.getElementById('buttonB').addEventListener('click', function () {
|
|
190
|
-
roosterjs.toggleBold(editor);
|
|
191
|
-
});
|
|
192
|
-
document.getElementById('buttonI').addEventListener('click', function () {
|
|
193
|
-
roosterjs.toggleItalic(editor);
|
|
194
|
-
});
|
|
195
|
-
document.getElementById('buttonU').addEventListener('click', function () {
|
|
196
|
-
roosterjs.toggleUnderline(editor);
|
|
197
|
-
});
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
3. Compile the javascript file using webpack:
|
|
201
|
-
|
|
202
|
-
`webpack source.js editor.js`
|
|
203
|
-
|
|
204
|
-
4. Navigate to editor.htm, you will see buttons with bold, italic, underline
|
|
205
|
-
actions in the page.
|
|
159
|
+
2. Navigate to editor.htm, you will see a editor shown in the page which includes buttons with bold, italic, underline
|
|
160
|
+
actions.
|
|
206
161
|
|
|
207
162
|
## Sample code
|
|
208
163
|
|
|
@@ -292,7 +247,7 @@ Currently we have very few external dependencies. Before adding any new dependen
|
|
|
292
247
|
If you still feel a new dependency is required after checking these questions, we can review it and
|
|
293
248
|
finally decide whether we should add the new dependency.
|
|
294
249
|
|
|
295
|
-
For build time dependencies, it is more
|
|
250
|
+
For build time dependencies, it is more flexible to add new dependencies since it won't increase runtime
|
|
296
251
|
code size or dependencies.
|
|
297
252
|
|
|
298
253
|
## More documentation
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.elementProcessor = void 0;
|
|
4
|
-
var roosterjs_editor_dom_1 = require("roosterjs-editor-dom");
|
|
5
4
|
var entityUtils_1 = require("../../domUtils/entityUtils");
|
|
6
5
|
/**
|
|
7
6
|
* @internal
|
|
@@ -25,6 +24,6 @@ function tryGetProcessorForEntity(element, context) {
|
|
|
25
24
|
: null;
|
|
26
25
|
}
|
|
27
26
|
function tryGetProcessorForDelimiter(element, context) {
|
|
28
|
-
return (0,
|
|
27
|
+
return (0, entityUtils_1.isEntityDelimiter)(element) ? context.elementProcessors.delimiter : null;
|
|
29
28
|
}
|
|
30
29
|
//# sourceMappingURL=elementProcessor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"elementProcessor.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/elementProcessor.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"elementProcessor.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/elementProcessor.ts"],"names":[],"mappings":";;;AAAA,0DAAgF;AAOhF;;;;;GAKG;AACI,IAAM,gBAAgB,GAAkC,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;IACnF,IAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAA+B,CAAC;IAC3E,IAAM,SAAS,GAAG,CAAC,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC;QACzD,2BAA2B,CAAC,OAAO,EAAE,OAAO,CAAC;QAC7C,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC;QAClC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC;QAC9D,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAA2B,CAAC;IAC9D,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC,CAAC;AARW,QAAA,gBAAgB,oBAQ3B;AAEF,SAAS,wBAAwB,CAAC,OAAoB,EAAE,OAA0B;IAC9E,OAAO,IAAA,6BAAe,EAAC,OAAO,CAAC,IAAI,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,2CAA2C;QAC7G,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,MAAM;QAClC,CAAC,CAAC,IAAI,CAAC;AACf,CAAC;AAED,SAAS,2BAA2B,CAAC,OAAoB,EAAE,OAA0B;IACjF,OAAO,IAAA,+BAAiB,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AACnF,CAAC","sourcesContent":["import { isEntityDelimiter, isEntityElement } from '../../domUtils/entityUtils';\nimport type {\n DomToModelContext,\n ElementProcessor,\n ElementProcessorMap,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * @param group\n * @param element\n * @param context\n */\nexport const elementProcessor: ElementProcessor<HTMLElement> = (group, element, context) => {\n const tagName = element.tagName.toLowerCase() as keyof ElementProcessorMap;\n const processor = (tryGetProcessorForEntity(element, context) ||\n tryGetProcessorForDelimiter(element, context) ||\n context.elementProcessors[tagName] ||\n (tagName.indexOf(':') >= 0 && context.elementProcessors.child) ||\n context.elementProcessors['*']) as ElementProcessor<Node>;\n processor(group, element, context);\n};\n\nfunction tryGetProcessorForEntity(element: HTMLElement, context: DomToModelContext) {\n return isEntityElement(element) || element.contentEditable == 'false' // For readonly element, treat as an entity\n ? context.elementProcessors.entity\n : null;\n}\n\nfunction tryGetProcessorForDelimiter(element: HTMLElement, context: DomToModelContext) {\n return isEntityDelimiter(element) ? context.elementProcessors.delimiter : null;\n}\n"]}
|
|
@@ -14,7 +14,7 @@ var stackFormat_1 = require("../utils/stackFormat");
|
|
|
14
14
|
* @param context DOM to Content Model context
|
|
15
15
|
*/
|
|
16
16
|
var entityProcessor = function (group, element, context) {
|
|
17
|
-
var isBlockEntity = (0, isBlockElement_1.isBlockElement)(element
|
|
17
|
+
var isBlockEntity = (0, isBlockElement_1.isBlockElement)(element);
|
|
18
18
|
(0, stackFormat_1.stackFormat)(context, { segment: isBlockEntity ? 'empty' : undefined, paragraph: 'empty' }, function () {
|
|
19
19
|
var _a;
|
|
20
20
|
var entityModel = (0, createEntity_1.createEntity)(element, true /*isReadonly*/, context.segmentFormat);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entityProcessor.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/entityProcessor.ts"],"names":[],"mappings":";;;AAAA,2DAA0D;AAC1D,+DAA8D;AAC9D,qEAAoE;AACpE,0DAAyD;AACzD,oDAAmD;AACnD,oDAAmD;AAGnD;;;;;GAKG;AACI,IAAM,eAAe,GAAkC,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;IAClF,IAAM,aAAa,GAAG,IAAA,+BAAc,EAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"entityProcessor.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/entityProcessor.ts"],"names":[],"mappings":";;;AAAA,2DAA0D;AAC1D,+DAA8D;AAC9D,qEAAoE;AACpE,0DAAyD;AACzD,oDAAmD;AACnD,oDAAmD;AAGnD;;;;;GAKG;AACI,IAAM,eAAe,GAAkC,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;IAClF,IAAM,aAAa,GAAG,IAAA,+BAAc,EAAC,OAAO,CAAC,CAAC;IAE9C,IAAA,yBAAW,EACP,OAAO,EACP,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,EACpE;;QACI,IAAM,WAAW,GAAG,IAAA,2BAAY,EAAC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;QAEtF,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAEtF,qDAAqD;QACrD,IAAI,OAAO,CAAC,aAAa,EAAE;YACvB,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC;SACjC;QAED,IAAI,aAAa,EAAE;YACf,IAAA,mBAAQ,EAAC,KAAK,EAAE,WAAW,CAAC,CAAC;SAChC;aAAM;YACH,IAAM,SAAS,GAAG,IAAA,uBAAU,EAAC,KAAK,EAAE,WAAW,CAAC,CAAC;YACjD,MAAA,OAAO,CAAC,UAAU,0CAAE,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;SACpE;IACL,CAAC,CACJ,CAAC;AACN,CAAC,CAAC;AAxBW,QAAA,eAAe,mBAwB1B","sourcesContent":["import { addBlock } from '../../modelApi/common/addBlock';\nimport { addSegment } from '../../modelApi/common/addSegment';\nimport { createEntity } from '../../modelApi/creators/createEntity';\nimport { isBlockElement } from '../utils/isBlockElement';\nimport { parseFormat } from '../utils/parseFormat';\nimport { stackFormat } from '../utils/stackFormat';\nimport type { ElementProcessor } from 'roosterjs-content-model-types';\n\n/**\n * Content Model Element Processor for entity\n * @param group The parent block group\n * @param parent Parent DOM node to process\n * @param context DOM to Content Model context\n */\nexport const entityProcessor: ElementProcessor<HTMLElement> = (group, element, context) => {\n const isBlockEntity = isBlockElement(element);\n\n stackFormat(\n context,\n { segment: isBlockEntity ? 'empty' : undefined, paragraph: 'empty' },\n () => {\n const entityModel = createEntity(element, true /*isReadonly*/, context.segmentFormat);\n\n parseFormat(element, context.formatParsers.entity, entityModel.entityFormat, context);\n\n // TODO: Need to handle selection for editable entity\n if (context.isInSelection) {\n entityModel.isSelected = true;\n }\n\n if (isBlockEntity) {\n addBlock(group, entityModel);\n } else {\n const paragraph = addSegment(group, entityModel);\n context.domIndexer?.onSegment(element, paragraph, [entityModel]);\n }\n }\n );\n};\n"]}
|
|
@@ -25,7 +25,7 @@ function getFontSize(size) {
|
|
|
25
25
|
*/
|
|
26
26
|
var fontProcessor = function (group, element, context) {
|
|
27
27
|
(0, stackFormat_1.stackFormat)(context, {
|
|
28
|
-
segment: (0, isBlockElement_1.isBlockElement)(element
|
|
28
|
+
segment: (0, isBlockElement_1.isBlockElement)(element) ? 'shallowCloneForBlock' : 'shallowClone',
|
|
29
29
|
}, function () {
|
|
30
30
|
var fontFamily = element.getAttribute('face');
|
|
31
31
|
var fontSize = getFontSize(element.getAttribute('size'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fontProcessor.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/fontProcessor.ts"],"names":[],"mappings":";;;AAAA,0DAAyD;AACzD,oDAAmD;AACnD,oDAAmD;AAGnD,IAAM,SAAS,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAE3E,SAAS,WAAW,CAAC,IAAmB;IACpC,IAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAErC,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;QACvB,OAAO,SAAS,CAAC;KACpB;SAAM,IAAI,OAAO,GAAG,CAAC,EAAE;QACpB,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;KACvB;SAAM,IAAI,OAAO,GAAG,SAAS,CAAC,MAAM,EAAE;QACnC,OAAO,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;KAC1C;SAAM;QACH,OAAO,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;KACjC;AACL,CAAC;AAED;;GAEG;AACI,IAAM,aAAa,GAAsC,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;IACpF,IAAA,yBAAW,EACP,OAAO,EACP;QACI,OAAO,EAAE,IAAA,+BAAc,EAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"fontProcessor.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/fontProcessor.ts"],"names":[],"mappings":";;;AAAA,0DAAyD;AACzD,oDAAmD;AACnD,oDAAmD;AAGnD,IAAM,SAAS,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAE3E,SAAS,WAAW,CAAC,IAAmB;IACpC,IAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAErC,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;QACvB,OAAO,SAAS,CAAC;KACpB;SAAM,IAAI,OAAO,GAAG,CAAC,EAAE;QACpB,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;KACvB;SAAM,IAAI,OAAO,GAAG,SAAS,CAAC,MAAM,EAAE;QACnC,OAAO,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;KAC1C;SAAM;QACH,OAAO,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;KACjC;AACL,CAAC;AAED;;GAEG;AACI,IAAM,aAAa,GAAsC,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;IACpF,IAAA,yBAAW,EACP,OAAO,EACP;QACI,OAAO,EAAE,IAAA,+BAAc,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,cAAc;KAC7E,EACD;QACI,IAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAChD,IAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3D,IAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAChD,IAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;QAErC,IAAI,UAAU,EAAE;YACZ,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;SAClC;QAED,IAAI,QAAQ,EAAE;YACV,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;SAC9B;QAED,IAAI,SAAS,EAAE;YACX,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;SAChC;QAED,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAEpF,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC,CACJ,CAAC;AACN,CAAC,CAAC;AA7BW,QAAA,aAAa,iBA6BxB","sourcesContent":["import { isBlockElement } from '../utils/isBlockElement';\nimport { parseFormat } from '../utils/parseFormat';\nimport { stackFormat } from '../utils/stackFormat';\nimport type { ElementProcessor } from 'roosterjs-content-model-types';\n\nconst FontSizes = ['10px', '13px', '16px', '18px', '24px', '32px', '48px'];\n\nfunction getFontSize(size: string | null) {\n const intSize = parseInt(size || '');\n\n if (Number.isNaN(intSize)) {\n return undefined;\n } else if (intSize < 1) {\n return FontSizes[0];\n } else if (intSize > FontSizes.length) {\n return FontSizes[FontSizes.length - 1];\n } else {\n return FontSizes[intSize - 1];\n }\n}\n\n/**\n * @internal\n */\nexport const fontProcessor: ElementProcessor<HTMLFontElement> = (group, element, context) => {\n stackFormat(\n context,\n {\n segment: isBlockElement(element) ? 'shallowCloneForBlock' : 'shallowClone',\n },\n () => {\n const fontFamily = element.getAttribute('face');\n const fontSize = getFontSize(element.getAttribute('size'));\n const textColor = element.getAttribute('color');\n const format = context.segmentFormat;\n\n if (fontFamily) {\n format.fontFamily = fontFamily;\n }\n\n if (fontSize) {\n format.fontSize = fontSize;\n }\n\n if (textColor) {\n format.textColor = textColor;\n }\n\n parseFormat(element, context.formatParsers.segment, context.segmentFormat, context);\n\n context.elementProcessors.child(group, element, context);\n }\n );\n};\n"]}
|
|
@@ -27,9 +27,7 @@ var formatContainerProcessor = function (group, element, context) {
|
|
|
27
27
|
(0, parseFormat_1.parseFormat)(element, context.formatParsers.segmentOnBlock, context.segmentFormat, context);
|
|
28
28
|
var format = (0, tslib_1.__assign)({}, context.blockFormat);
|
|
29
29
|
(0, parseFormat_1.parseFormat)(element, context.formatParsers.container, format, context);
|
|
30
|
-
var tagName = (0, getDefaultStyle_1.getDefaultStyle)(element
|
|
31
|
-
? element.tagName.toLowerCase()
|
|
32
|
-
: 'div';
|
|
30
|
+
var tagName = (0, getDefaultStyle_1.getDefaultStyle)(element).display == 'block' ? element.tagName.toLowerCase() : 'div';
|
|
33
31
|
var formatContainer = (0, createFormatContainer_1.createFormatContainer)(tagName, format);
|
|
34
32
|
// It is possible to inherit margin left/right styles from parent DIV or other containers,
|
|
35
33
|
// since we are going into a deeper level of format container now,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatContainerProcessor.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/formatContainerProcessor.ts"],"names":[],"mappings":";;;;AAAA,2DAA0D;AAC1D,uFAAsF;AACtF,2EAA0E;AAC1E,4DAA2D;AAC3D,oDAAmD;AACnD,wFAAuF;AACvF,oDAAmD;AAUnD;;GAEG;AACU,QAAA,aAAa,GAA6C;IACnE,YAAY;IACZ,aAAa;IACb,aAAa;IACb,cAAc;CACjB,CAAC;AAEF;;GAEG;AACI,IAAM,wBAAwB,GAAkC,UACnE,KAAK,EACL,OAAO,EACP,OAAO;IAEP,IAAA,yBAAW,EAAC,OAAO,EAAE,EAAE,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,cAAc,EAAE,EAAE;QACjF,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAChF,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,cAAc,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAE3F,IAAM,MAAM,6BACL,OAAO,CAAC,WAAW,CACzB,CAAC;QAEF,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAEvE,IAAM,OAAO,GACT,IAAA,iCAAe,EAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"formatContainerProcessor.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/formatContainerProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["import { addBlock } from '../../modelApi/common/addBlock';\nimport { createFormatContainer } from '../../modelApi/creators/createFormatContainer';\nimport { createParagraph } from '../../modelApi/creators/createParagraph';\nimport { getDefaultStyle } from '../utils/getDefaultStyle';\nimport { parseFormat } from '../utils/parseFormat';\nimport { setParagraphNotImplicit } from '../../modelApi/block/setParagraphNotImplicit';\nimport { stackFormat } from '../utils/stackFormat';\nimport type {\n ContentModelFormatContainer,\n ContentModelFormatContainerFormat,\n ContentModelParagraph,\n ElementProcessor,\n MarginFormat,\n PaddingFormat,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const ContextStyles: (keyof (MarginFormat & PaddingFormat))[] = [\n 'marginLeft',\n 'marginRight',\n 'paddingLeft',\n 'paddingRight',\n];\n\n/**\n * @internal\n */\nexport const formatContainerProcessor: ElementProcessor<HTMLElement> = (\n group,\n element,\n context\n) => {\n stackFormat(context, { segment: 'shallowCloneForBlock', paragraph: 'shallowClone' }, () => {\n parseFormat(element, context.formatParsers.block, context.blockFormat, context);\n parseFormat(element, context.formatParsers.segmentOnBlock, context.segmentFormat, context);\n\n const format: ContentModelFormatContainerFormat = {\n ...context.blockFormat,\n };\n\n parseFormat(element, context.formatParsers.container, format, context);\n\n const tagName =\n getDefaultStyle(element).display == 'block' ? element.tagName.toLowerCase() : 'div';\n const formatContainer = createFormatContainer(tagName, format);\n\n // It is possible to inherit margin left/right styles from parent DIV or other containers,\n // since we are going into a deeper level of format container now,\n // the container will render these styles so no need to keep them in context format\n ContextStyles.forEach(style => {\n delete context.blockFormat[style];\n });\n\n context.elementProcessors.child(formatContainer, element, context);\n\n if (element.style.fontSize && parseInt(element.style.fontSize) == 0) {\n formatContainer.zeroFontSize = true;\n }\n\n if (shouldFallbackToParagraph(formatContainer)) {\n // For DIV container that only has one paragraph child, container style can be merged into paragraph\n // and no need to have this container\n const paragraph = formatContainer.blocks[0] as ContentModelParagraph;\n\n if (formatContainer.zeroFontSize) {\n paragraph.segmentFormat = Object.assign({}, paragraph.segmentFormat, {\n fontSize: '0',\n });\n }\n\n Object.assign(paragraph.format, formatContainer.format);\n setParagraphNotImplicit(paragraph);\n addBlock(group, paragraph);\n } else {\n addBlock(group, formatContainer);\n }\n });\n\n addBlock(group, createParagraph(true /*isImplicit*/, context.blockFormat));\n};\n\nfunction shouldFallbackToParagraph(formatContainer: ContentModelFormatContainer) {\n const firstChild = formatContainer.blocks[0];\n\n return (\n formatContainer.tagName == 'div' &&\n formatContainer.blocks.length == 1 &&\n firstChild.blockType == 'Paragraph' &&\n firstChild.isImplicit\n );\n}\n"]}
|
|
@@ -43,9 +43,7 @@ var generalSegmentProcessor = function (group, element, context) {
|
|
|
43
43
|
* @internal
|
|
44
44
|
*/
|
|
45
45
|
var generalProcessor = function (group, element, context) {
|
|
46
|
-
var processor = (0, isBlockElement_1.isBlockElement)(element
|
|
47
|
-
? generalBlockProcessor
|
|
48
|
-
: generalSegmentProcessor;
|
|
46
|
+
var processor = (0, isBlockElement_1.isBlockElement)(element) ? generalBlockProcessor : generalSegmentProcessor;
|
|
49
47
|
processor(group, element, context);
|
|
50
48
|
};
|
|
51
49
|
exports.generalProcessor = generalProcessor;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generalProcessor.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/generalProcessor.ts"],"names":[],"mappings":";;;AAAA,2DAA0D;AAC1D,qEAAoE;AACpE,+DAA8D;AAC9D,iFAAgF;AAChF,qFAAoF;AACpF,0DAAyD;AACzD,oDAAmD;AAGnD,IAAM,qBAAqB,GAAkC,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;IACjF,IAAM,KAAK,GAAG,IAAA,uCAAkB,EAAC,OAAO,CAAC,CAAC;IAC1C,IAAM,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAE/C,IAAA,yBAAW,EACP,OAAO,EACP;QACI,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,OAAO;QAClB,IAAI,EAAE,OAAO;KAChB,EACD;QACI,IAAA,mBAAQ,EAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAEvB,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC,CACJ,CAAC;IAEF,IAAI,gBAAgB,IAAI,OAAO,CAAC,aAAa,EAAE;QAC3C,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;KAC3B;AACL,CAAC,CAAC;AAEF,IAAM,uBAAuB,GAAkC,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;;IACnF,IAAM,OAAO,GAAG,IAAA,2CAAoB,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACrE,IAAM,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAE/C,IAAA,6BAAa,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChC,IAAM,SAAS,GAAG,IAAA,uBAAU,EAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAA,OAAO,CAAC,UAAU,0CAAE,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAE7D,IAAA,yBAAW,EACP,OAAO,EACP;QACI,OAAO,EACH,OAAO,CAAC,oJAAoJ;KACnK,EACD;QACI,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC,CACJ,CAAC;IAEF,IAAI,gBAAgB,IAAI,OAAO,CAAC,aAAa,EAAE;QAC3C,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;KAC7B;AACL,CAAC,CAAC;AAEF;;GAEG;AACI,IAAM,gBAAgB,GAAkC,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;IACnF,IAAM,SAAS,GAAG,IAAA,+BAAc,EAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"generalProcessor.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/generalProcessor.ts"],"names":[],"mappings":";;;AAAA,2DAA0D;AAC1D,qEAAoE;AACpE,+DAA8D;AAC9D,iFAAgF;AAChF,qFAAoF;AACpF,0DAAyD;AACzD,oDAAmD;AAGnD,IAAM,qBAAqB,GAAkC,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;IACjF,IAAM,KAAK,GAAG,IAAA,uCAAkB,EAAC,OAAO,CAAC,CAAC;IAC1C,IAAM,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAE/C,IAAA,yBAAW,EACP,OAAO,EACP;QACI,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,OAAO;QAClB,IAAI,EAAE,OAAO;KAChB,EACD;QACI,IAAA,mBAAQ,EAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAEvB,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC,CACJ,CAAC;IAEF,IAAI,gBAAgB,IAAI,OAAO,CAAC,aAAa,EAAE;QAC3C,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;KAC3B;AACL,CAAC,CAAC;AAEF,IAAM,uBAAuB,GAAkC,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;;IACnF,IAAM,OAAO,GAAG,IAAA,2CAAoB,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACrE,IAAM,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAE/C,IAAA,6BAAa,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChC,IAAM,SAAS,GAAG,IAAA,uBAAU,EAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAA,OAAO,CAAC,UAAU,0CAAE,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAE7D,IAAA,yBAAW,EACP,OAAO,EACP;QACI,OAAO,EACH,OAAO,CAAC,oJAAoJ;KACnK,EACD;QACI,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC,CACJ,CAAC;IAEF,IAAI,gBAAgB,IAAI,OAAO,CAAC,aAAa,EAAE;QAC3C,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;KAC7B;AACL,CAAC,CAAC;AAEF;;GAEG;AACI,IAAM,gBAAgB,GAAkC,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;IACnF,IAAM,SAAS,GAAG,IAAA,+BAAc,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,uBAAuB,CAAC;IAE5F,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC,CAAC;AAJW,QAAA,gBAAgB,oBAI3B","sourcesContent":["import { addBlock } from '../../modelApi/common/addBlock';\nimport { addDecorators } from '../../modelApi/common/addDecorators';\nimport { addSegment } from '../../modelApi/common/addSegment';\nimport { createGeneralBlock } from '../../modelApi/creators/createGeneralBlock';\nimport { createGeneralSegment } from '../../modelApi/creators/createGeneralSegment';\nimport { isBlockElement } from '../utils/isBlockElement';\nimport { stackFormat } from '../utils/stackFormat';\nimport type { ElementProcessor } from 'roosterjs-content-model-types';\n\nconst generalBlockProcessor: ElementProcessor<HTMLElement> = (group, element, context) => {\n const block = createGeneralBlock(element);\n const isSelectedBefore = context.isInSelection;\n\n stackFormat(\n context,\n {\n segment: 'empty',\n paragraph: 'empty',\n link: 'empty',\n },\n () => {\n addBlock(group, block);\n\n context.elementProcessors.child(block, element, context);\n }\n );\n\n if (isSelectedBefore && context.isInSelection) {\n block.isSelected = true;\n }\n};\n\nconst generalSegmentProcessor: ElementProcessor<HTMLElement> = (group, element, context) => {\n const segment = createGeneralSegment(element, context.segmentFormat);\n const isSelectedBefore = context.isInSelection;\n\n addDecorators(segment, context);\n const paragraph = addSegment(group, segment);\n context.domIndexer?.onSegment(element, paragraph, [segment]);\n\n stackFormat(\n context,\n {\n segment:\n 'empty' /*clearFormat, General segment will include all properties and styles when generate back to HTML, so no need to carry over existing segment format*/,\n },\n () => {\n context.elementProcessors.child(segment, element, context);\n }\n );\n\n if (isSelectedBefore && context.isInSelection) {\n segment.isSelected = true;\n }\n};\n\n/**\n * @internal\n */\nexport const generalProcessor: ElementProcessor<HTMLElement> = (group, element, context) => {\n const processor = isBlockElement(element) ? generalBlockProcessor : generalSegmentProcessor;\n\n processor(group, element, context);\n};\n"]}
|
|
@@ -33,7 +33,7 @@ var SegmentDecoratorTags = ['A', 'CODE'];
|
|
|
33
33
|
* @internal
|
|
34
34
|
*/
|
|
35
35
|
var knownElementProcessor = function (group, element, context) {
|
|
36
|
-
var isBlock = (0, isBlockElement_1.isBlockElement)(element
|
|
36
|
+
var isBlock = (0, isBlockElement_1.isBlockElement)(element);
|
|
37
37
|
if ((isBlock || element.style.display == 'inline-block') && // For inline-block here, we will also check if it should be represented as Format Container
|
|
38
38
|
shouldUseFormatContainer(element, context)) {
|
|
39
39
|
(0, formatContainerProcessor_1.formatContainerProcessor)(group, element, context);
|
|
@@ -72,7 +72,7 @@ function shouldUseFormatContainer(element, context) {
|
|
|
72
72
|
return false;
|
|
73
73
|
}
|
|
74
74
|
var style = element.style;
|
|
75
|
-
var defaultStyle = (0, getDefaultStyle_1.getDefaultStyle)(element
|
|
75
|
+
var defaultStyle = (0, getDefaultStyle_1.getDefaultStyle)(element);
|
|
76
76
|
var bgcolor = style.getPropertyValue('background-color');
|
|
77
77
|
// For block element with background, we need to use format container
|
|
78
78
|
if (bgcolor && bgcolor != 'transparent') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knownElementProcessor.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/knownElementProcessor.ts"],"names":[],"mappings":";;;AAAA,2DAA0D;AAC1D,mDAAkD;AAClD,2EAA0E;AAC1E,uEAAsE;AACtE,4DAA2D;AAC3D,0DAAyD;AACzD,oDAAmD;AACnD,oDAAmD;AAOnD,IAAM,4BAA4B,GAAkC;IAChE,cAAc;IACd,WAAW;IACX,eAAe;IACf,YAAY;IACZ,aAAa;IACb,cAAc;IACd,gBAAgB;IAChB,mBAAmB;IACnB,iBAAiB;IACjB,kBAAkB;IAClB,OAAO;IACP,QAAQ;IACR,UAAU;IACV,WAAW;IACX,UAAU;IACV,WAAW;CACd,CAAC;AACF,IAAM,yBAAyB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACjF,IAAM,oBAAoB,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAE3C;;GAEG;AACI,IAAM,qBAAqB,GAAkC,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;IACxF,IAAM,OAAO,GAAG,IAAA,+BAAc,EAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"knownElementProcessor.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/knownElementProcessor.ts"],"names":[],"mappings":";;;AAAA,2DAA0D;AAC1D,mDAAkD;AAClD,2EAA0E;AAC1E,uEAAsE;AACtE,4DAA2D;AAC3D,0DAAyD;AACzD,oDAAmD;AACnD,oDAAmD;AAOnD,IAAM,4BAA4B,GAAkC;IAChE,cAAc;IACd,WAAW;IACX,eAAe;IACf,YAAY;IACZ,aAAa;IACb,cAAc;IACd,gBAAgB;IAChB,mBAAmB;IACnB,iBAAiB;IACjB,kBAAkB;IAClB,OAAO;IACP,QAAQ;IACR,UAAU;IACV,WAAW;IACX,UAAU;IACV,WAAW;CACd,CAAC;AACF,IAAM,yBAAyB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACjF,IAAM,oBAAoB,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAE3C;;GAEG;AACI,IAAM,qBAAqB,GAAkC,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;IACxF,IAAM,OAAO,GAAG,IAAA,+BAAc,EAAC,OAAO,CAAC,CAAC;IAExC,IACI,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,IAAI,cAAc,CAAC,IAAI,4FAA4F;QACpJ,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC,EAC5C;QACE,IAAA,mDAAwB,EAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;KACrD;SAAM,IAAI,OAAO,EAAE;QAChB,IAAM,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;QACtF,IAAM,kBAAkB,GAAG,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAE9E,IAAA,yBAAW,EAAC,OAAO,EAAE,EAAE,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,cAAc,EAAE,EAAE;YACjF,IAAM,aAAa,GAA8B,EAAE,CAAC;YAEpD,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,cAAc,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;YACnF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;YAEpD,IAAA,+BAAc,EAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,IAAI,OAAO,IAAI,CAAC,kBAAkB,EAAE;YAChC,IAAA,mBAAQ,EACJ,KAAK,EACL,IAAA,iCAAe,EACX,IAAI,CAAC,cAAc,EACnB,OAAO,CAAC,WAAW,EACnB,SAAS,CAAC,iBAAiB,EAC3B,SAAS,CACZ,CACJ,CAAC;SACL;KACJ;SAAM;QACH,IAAA,yBAAW,EACP,OAAO,EACP;YACI,OAAO,EAAE,cAAc;YACvB,SAAS,EAAE,cAAc;YACzB,IAAI,EAAE,aAAa;SACtB,EACD;YACI,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YAEpF,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,IAAI,GAAG,EAAE;gBACpD,IAAA,yBAAW,EACP,OAAO,EACP,OAAO,CAAC,aAAa,CAAC,gBAAgB,EACtC,OAAO,CAAC,IAAI,CAAC,MAAM,EACnB,OAAO,CACV,CAAC;aACL;YAED,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7D,CAAC,CACJ,CAAC;KACL;AACL,CAAC,CAAC;AAxDW,QAAA,qBAAqB,yBAwDhC;AAEF,SAAS,wBAAwB,CAAC,OAAoB,EAAE,OAA0B;IAC9E,oFAAoF;IACpF,IAAI,yBAAyB,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACzD,OAAO,KAAK,CAAC;KAChB;IAED,IAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,IAAM,YAAY,GAAG,IAAA,iCAAe,EAAC,OAAO,CAAC,CAAC;IAE9C,IAAM,OAAO,GAAG,KAAK,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;IAE3D,qEAAqE;IACrE,IAAI,OAAO,IAAI,OAAO,IAAI,aAAa,EAAE;QACrC,OAAO,IAAI,CAAC;KACf;IAED,sFAAsF;IACtF,kCAAkC;IAClC,IACI,4BAA4B,CAAC,IAAI,CAC7B,UAAA,GAAG,IAAI,OAAA,QAAQ,CAAE,KAAK,CAAC,GAAG,CAAY,IAAK,YAAY,CAAC,GAAG,CAAY,IAAI,EAAE,CAAC,GAAG,CAAC,EAA3E,CAA2E,CACrF,EACH;QACE,OAAO,IAAI,CAAC;KACf;IAED,2EAA2E;IAC3E,IAAI,KAAK,CAAC,UAAU,IAAI,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,MAAM,EAAE;QAC3D,OAAO,IAAI,CAAC;KACf;IAED,sEAAsE;IACtE,IAAI,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE;QAC/B,OAAO,IAAI,CAAC;KACf;IAED,OAAO,KAAK,CAAC;AACjB,CAAC","sourcesContent":["import { addBlock } from '../../modelApi/common/addBlock';\nimport { blockProcessor } from './blockProcessor';\nimport { createParagraph } from '../../modelApi/creators/createParagraph';\nimport { formatContainerProcessor } from './formatContainerProcessor';\nimport { getDefaultStyle } from '../utils/getDefaultStyle';\nimport { isBlockElement } from '../utils/isBlockElement';\nimport { parseFormat } from '../utils/parseFormat';\nimport { stackFormat } from '../utils/stackFormat';\nimport type {\n ContentModelSegmentFormat,\n DomToModelContext,\n ElementProcessor,\n} from 'roosterjs-content-model-types';\n\nconst FormatContainerTriggerStyles: (keyof CSSStyleDeclaration)[] = [\n 'marginBottom',\n 'marginTop',\n 'paddingBottom',\n 'paddingTop',\n 'paddingLeft',\n 'paddingRight',\n 'borderTopWidth',\n 'borderBottomWidth',\n 'borderLeftWidth',\n 'borderRightWidth',\n 'width',\n 'height',\n 'maxWidth',\n 'maxHeight',\n 'minWidth',\n 'minHeight',\n];\nconst ByPassFormatContainerTags = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'P', 'A'];\nconst SegmentDecoratorTags = ['A', 'CODE'];\n\n/**\n * @internal\n */\nexport const knownElementProcessor: ElementProcessor<HTMLElement> = (group, element, context) => {\n const isBlock = isBlockElement(element);\n\n if (\n (isBlock || element.style.display == 'inline-block') && // For inline-block here, we will also check if it should be represented as Format Container\n shouldUseFormatContainer(element, context)\n ) {\n formatContainerProcessor(group, element, context);\n } else if (isBlock) {\n const decorator = context.blockDecorator.tagName ? context.blockDecorator : undefined;\n const isSegmentDecorator = SegmentDecoratorTags.indexOf(element.tagName) >= 0;\n\n stackFormat(context, { segment: 'shallowCloneForBlock', paragraph: 'shallowClone' }, () => {\n const segmentFormat: ContentModelSegmentFormat = {};\n\n parseFormat(element, context.formatParsers.segmentOnBlock, segmentFormat, context);\n Object.assign(context.segmentFormat, segmentFormat);\n\n blockProcessor(group, element, context, segmentFormat);\n });\n\n if (isBlock && !isSegmentDecorator) {\n addBlock(\n group,\n createParagraph(\n true /*isImplicit*/,\n context.blockFormat,\n undefined /*segmentFormat*/,\n decorator\n )\n );\n }\n } else {\n stackFormat(\n context,\n {\n segment: 'shallowClone',\n paragraph: 'shallowClone',\n link: 'cloneFormat',\n },\n () => {\n parseFormat(element, context.formatParsers.segment, context.segmentFormat, context);\n\n if (context.link.format.href && element.tagName != 'A') {\n parseFormat(\n element,\n context.formatParsers.segmentUnderLink,\n context.link.format,\n context\n );\n }\n\n context.elementProcessors.child(group, element, context);\n }\n );\n }\n};\n\nfunction shouldUseFormatContainer(element: HTMLElement, context: DomToModelContext) {\n // For those tags that we know we should not use format container, just return false\n if (ByPassFormatContainerTags.indexOf(element.tagName) >= 0) {\n return false;\n }\n\n const style = element.style;\n const defaultStyle = getDefaultStyle(element);\n\n const bgcolor = style.getPropertyValue('background-color');\n\n // For block element with background, we need to use format container\n if (bgcolor && bgcolor != 'transparent') {\n return true;\n }\n\n // For block element with positive value of border width or top/bottom margin/padding,\n // we need to use format container\n if (\n FormatContainerTriggerStyles.some(\n key => parseInt((style[key] as string) || (defaultStyle[key] as string) || '') > 0\n )\n ) {\n return true;\n }\n\n // For margin left/right with value \"auto\", we need to use format container\n if (style.marginLeft == 'auto' || style.marginRight == 'auto') {\n return true;\n }\n\n // For element with \"align\" attribute, we need to use format container\n if (element.getAttribute('align')) {\n return true;\n }\n\n return false;\n}\n"]}
|
|
@@ -18,7 +18,7 @@ var listItemProcessor = function (group, element, context) {
|
|
|
18
18
|
var listItem = (0, createListItem_1.createListItem)(listFormat.levels, context.segmentFormat);
|
|
19
19
|
(0, parseFormat_1.parseFormat)(element, context.formatParsers.listItemElement, listItem.format, context);
|
|
20
20
|
listFormat.listParent.blocks.push(listItem);
|
|
21
|
-
(0, parseFormat_1.parseFormat)(element, context.formatParsers.
|
|
21
|
+
(0, parseFormat_1.parseFormat)(element, context.formatParsers.listItemThread, listItem.levels[listItem.levels.length - 1].format, context);
|
|
22
22
|
context.elementProcessors.child(listItem, element, context);
|
|
23
23
|
var firstChild = listItem.blocks[0];
|
|
24
24
|
if (listItem.blocks.length == 1 &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listItemProcessor.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/listItemProcessor.ts"],"names":[],"mappings":";;;AAAA,yEAAwE;AACxE,oDAAmD;AACnD,oDAAmD;AAGnD;;GAEG;AACI,IAAM,iBAAiB,GAAoC,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;;IAC9E,IAAA,UAAU,GAAK,OAAO,WAAZ,CAAa;IAE/B,IAAI,UAAU,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;QACvD,IAAA,yBAAW,EACP,OAAO,EACP;YACI,OAAO,EAAE,sBAAsB;SAClC,EACD;YACI,IAAA,yBAAW,EACP,OAAO,EACP,OAAO,CAAC,aAAa,CAAC,cAAc,EACpC,OAAO,CAAC,aAAa,EACrB,OAAO,CACV,CAAC;YAEF,IAAM,QAAQ,GAAG,IAAA,+BAAc,EAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;YAC1E,IAAA,yBAAW,EACP,OAAO,EACP,OAAO,CAAC,aAAa,CAAC,eAAe,EACrC,QAAQ,CAAC,MAAM,EACf,OAAO,CACV,CAAC;YAEF,UAAU,CAAC,UAAW,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAE7C,IAAA,yBAAW,EACP,OAAO,EACP,OAAO,CAAC,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"listItemProcessor.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/listItemProcessor.ts"],"names":[],"mappings":";;;AAAA,yEAAwE;AACxE,oDAAmD;AACnD,oDAAmD;AAGnD;;GAEG;AACI,IAAM,iBAAiB,GAAoC,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;;IAC9E,IAAA,UAAU,GAAK,OAAO,WAAZ,CAAa;IAE/B,IAAI,UAAU,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;QACvD,IAAA,yBAAW,EACP,OAAO,EACP;YACI,OAAO,EAAE,sBAAsB;SAClC,EACD;YACI,IAAA,yBAAW,EACP,OAAO,EACP,OAAO,CAAC,aAAa,CAAC,cAAc,EACpC,OAAO,CAAC,aAAa,EACrB,OAAO,CACV,CAAC;YAEF,IAAM,QAAQ,GAAG,IAAA,+BAAc,EAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;YAC1E,IAAA,yBAAW,EACP,OAAO,EACP,OAAO,CAAC,aAAa,CAAC,eAAe,EACrC,QAAQ,CAAC,MAAM,EACf,OAAO,CACV,CAAC;YAEF,UAAU,CAAC,UAAW,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAE7C,IAAA,yBAAW,EACP,OAAO,EACP,OAAO,CAAC,aAAa,CAAC,cAAc,EACpC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,EAClD,OAAO,CACV,CAAC;YAEF,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAE5D,IAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAEtC,IACI,QAAQ,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC;gBAC3B,UAAU,CAAC,SAAS,IAAI,WAAW;gBACnC,UAAU,CAAC,UAAU,EACvB;gBACE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;gBAClD,UAAU,CAAC,MAAM,GAAG,EAAE,CAAC;aAC1B;QACL,CAAC,CACJ,CAAC;KACL;SAAM;QACH,IAAM,aAAa,GAAG,MAAA,UAAU,CAAC,UAAU,0CAAE,MAAM,CAAC;QACpD,IAAM,QAAQ,GAAG,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAG,CAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,MAAM,IAAG,CAAC,CAAC,CAAC;QAE5D,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAC1B,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,SAAS,KAAI,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,EACtD,OAAO,EACP,OAAO,CACV,CAAC;KACL;AACL,CAAC,CAAC;AA1DW,QAAA,iBAAiB,qBA0D5B","sourcesContent":["import { createListItem } from '../../modelApi/creators/createListItem';\nimport { parseFormat } from '../utils/parseFormat';\nimport { stackFormat } from '../utils/stackFormat';\nimport type { ElementProcessor } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const listItemProcessor: ElementProcessor<HTMLLIElement> = (group, element, context) => {\n const { listFormat } = context;\n\n if (listFormat.listParent && listFormat.levels.length > 0) {\n stackFormat(\n context,\n {\n segment: 'shallowCloneForBlock',\n },\n () => {\n parseFormat(\n element,\n context.formatParsers.segmentOnBlock,\n context.segmentFormat,\n context\n );\n\n const listItem = createListItem(listFormat.levels, context.segmentFormat);\n parseFormat(\n element,\n context.formatParsers.listItemElement,\n listItem.format,\n context\n );\n\n listFormat.listParent!.blocks.push(listItem);\n\n parseFormat(\n element,\n context.formatParsers.listItemThread,\n listItem.levels[listItem.levels.length - 1].format,\n context\n );\n\n context.elementProcessors.child(listItem, element, context);\n\n const firstChild = listItem.blocks[0];\n\n if (\n listItem.blocks.length == 1 &&\n firstChild.blockType == 'Paragraph' &&\n firstChild.isImplicit\n ) {\n Object.assign(listItem.format, firstChild.format);\n firstChild.format = {};\n }\n }\n );\n } else {\n const currentBlocks = listFormat.listParent?.blocks;\n const lastItem = currentBlocks?.[currentBlocks?.length - 1];\n\n context.elementProcessors['*'](\n lastItem?.blockType == 'BlockGroup' ? lastItem : group,\n element,\n context\n );\n }\n};\n"]}
|
|
@@ -2,10 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.listProcessor = void 0;
|
|
4
4
|
var createListLevel_1 = require("../../modelApi/creators/createListLevel");
|
|
5
|
-
var listLevelMetadataFormatHandler_1 = require("../../formatHandlers/list/listLevelMetadataFormatHandler");
|
|
6
5
|
var parseFormat_1 = require("../utils/parseFormat");
|
|
7
6
|
var stackFormat_1 = require("../utils/stackFormat");
|
|
8
|
-
var updateListMetadata_1 = require("../../domUtils/metadata/updateListMetadata");
|
|
9
7
|
/**
|
|
10
8
|
* @internal
|
|
11
9
|
*/
|
|
@@ -17,17 +15,8 @@ var listProcessor = function (group, element, context) {
|
|
|
17
15
|
var level = (0, createListLevel_1.createListLevel)(element.tagName, context.blockFormat);
|
|
18
16
|
var listFormat = context.listFormat;
|
|
19
17
|
(0, parseFormat_1.parseFormat)(element, context.formatParsers.dataset, level.dataset, context);
|
|
18
|
+
(0, parseFormat_1.parseFormat)(element, context.formatParsers.listLevelThread, level.format, context);
|
|
20
19
|
(0, parseFormat_1.parseFormat)(element, context.formatParsers.listLevel, level.format, context);
|
|
21
|
-
// TODO: Move this out into roosterjs-content-model-editor package
|
|
22
|
-
(0, updateListMetadata_1.updateListMetadata)(level, function (metadata) {
|
|
23
|
-
metadata = metadata || {};
|
|
24
|
-
(0, parseFormat_1.parseFormat)(element, [listLevelMetadataFormatHandler_1.listLevelMetadataFormatHandler.parse], metadata, context);
|
|
25
|
-
if (typeof metadata.orderedStyleType == 'undefined' &&
|
|
26
|
-
typeof metadata.unorderedStyleType == 'undefined') {
|
|
27
|
-
metadata = null;
|
|
28
|
-
}
|
|
29
|
-
return metadata;
|
|
30
|
-
});
|
|
31
20
|
(0, parseFormat_1.parseFormat)(element, context.formatParsers.segment, context.segmentFormat, context);
|
|
32
21
|
var originalListParent = listFormat.listParent;
|
|
33
22
|
listFormat.listParent = listFormat.listParent || group;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listProcessor.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/listProcessor.ts"],"names":[],"mappings":";;;AAAA,2EAA0E;AAC1E,
|
|
1
|
+
{"version":3,"file":"listProcessor.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/listProcessor.ts"],"names":[],"mappings":";;;AAAA,2EAA0E;AAC1E,oDAAmD;AACnD,oDAAmD;AAGnD;;GAEG;AACI,IAAM,aAAa,GAA0D,UAChF,KAAK,EACL,OAAO,EACP,OAAO;IAEP,IAAA,yBAAW,EACP,OAAO,EACP;QACI,OAAO,EAAE,sBAAsB;QAC/B,SAAS,EAAE,sBAAsB;KACpC,EACD;QACI,IAAM,KAAK,GAA0B,IAAA,iCAAe,EAChD,OAAO,CAAC,OAAsB,EAC9B,OAAO,CAAC,WAAW,CACtB,CAAC;QACM,IAAA,UAAU,GAAK,OAAO,WAAZ,CAAa;QAE/B,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5E,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,eAAe,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnF,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7E,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAEpF,IAAM,kBAAkB,GAAG,UAAU,CAAC,UAAU,CAAC;QAEjD,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,IAAI,KAAK,CAAC;QACvD,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE9B,IAAI;YACA,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;SAC5D;gBAAS;YACN,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YACxB,UAAU,CAAC,UAAU,GAAG,kBAAkB,CAAC;SAC9C;IACL,CAAC,CACJ,CAAC;AACN,CAAC,CAAC;AApCW,QAAA,aAAa,iBAoCxB","sourcesContent":["import { createListLevel } from '../../modelApi/creators/createListLevel';\nimport { parseFormat } from '../utils/parseFormat';\nimport { stackFormat } from '../utils/stackFormat';\nimport type { ContentModelListLevel, ElementProcessor } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const listProcessor: ElementProcessor<HTMLOListElement | HTMLUListElement> = (\n group,\n element,\n context\n) => {\n stackFormat(\n context,\n {\n segment: 'shallowCloneForBlock',\n paragraph: 'shallowCloneForGroup',\n },\n () => {\n const level: ContentModelListLevel = createListLevel(\n element.tagName as 'OL' | 'UL',\n context.blockFormat\n );\n const { listFormat } = context;\n\n parseFormat(element, context.formatParsers.dataset, level.dataset, context);\n parseFormat(element, context.formatParsers.listLevelThread, level.format, context);\n parseFormat(element, context.formatParsers.listLevel, level.format, context);\n parseFormat(element, context.formatParsers.segment, context.segmentFormat, context);\n\n const originalListParent = listFormat.listParent;\n\n listFormat.listParent = listFormat.listParent || group;\n listFormat.levels.push(level);\n\n try {\n context.elementProcessors.child(group, element, context);\n } finally {\n listFormat.levels.pop();\n listFormat.listParent = originalListParent;\n }\n }\n );\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tableProcessor.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/tableProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["import { addBlock } from '../../modelApi/common/addBlock';\nimport { createTable } from '../../modelApi/creators/createTable';\nimport { createTableCell } from '../../modelApi/creators/createTableCell';\nimport { getBoundingClientRect } from '../utils/getBoundingClientRect';\nimport { isElementOfType } from '../../domUtils/isElementOfType';\nimport { isNodeOfType } from '../../domUtils/isNodeOfType';\nimport { parseFormat } from '../utils/parseFormat';\nimport { stackFormat } from '../utils/stackFormat';\nimport type {\n ContentModelTableCellFormat,\n DatasetFormat,\n ElementProcessor,\n} from 'roosterjs-content-model-types';\n\n/**\n * Content Model Element Processor for table\n *\n * For Table with merged/splitted cells, HTML uses colSpan and rowSpan attributes to specify how it should be rendered.\n * To make it easier to edit a table, we will use a different way to describe table.\n *\n * 1. For a m * n table (m rows, n columns), we always create a m * n array for the cells.\n * 2. For a regular table cell, it is mapped to one item of this array\n * 3. For a merged/splitted table cell, it will has colSpan/rowSpan value. We also created TableCell model for those spanned\n * cells, and use \"spanLeft\" and \"spanAbove\" to mark its state\n * 4. When edit table, we always edit on this mapped m * n array because it always has an item for each cell\n * 5. When write back to DOM, we create TD/TH elements for those non-spanned cells, and mark its colSpan/rowSpan value according\n * its neighbour cell's spanLeft/spanAbove attribute\n * @param group The parent block group\n * @param parent Parent DOM node to process\n * @param context DOM to Content Model context\n */\nexport const tableProcessor: ElementProcessor<HTMLTableElement> = (\n group,\n tableElement,\n context\n) => {\n stackFormat(\n context,\n { segment: 'shallowCloneForBlock', paragraph: 'shallowCloneForGroup' },\n () => {\n parseFormat(tableElement, context.formatParsers.block, context.blockFormat, context);\n\n const table = createTable(tableElement.rows.length, context.blockFormat);\n const tableSelection = context.selection?.type == 'table' ? context.selection : null;\n const selectedTable = tableSelection?.table;\n const hasTableSelection = selectedTable == tableElement;\n\n if (context.allowCacheElement) {\n table.cachedElement = tableElement;\n }\n\n context.domIndexer?.onTable(tableElement, table);\n\n parseFormat(tableElement, context.formatParsers.table, table.format, context);\n parseFormat(tableElement, context.formatParsers.tableBorder, table.format, context);\n parseFormat(\n tableElement,\n context.formatParsers.segmentOnBlock,\n context.segmentFormat,\n context\n );\n parseFormat(tableElement, context.formatParsers.dataset, table.dataset, context);\n addBlock(group, table);\n\n const columnPositions: number[] = [0];\n const rowPositions: number[] = [0];\n const zoomScale = context.zoomScale || 1;\n\n for (let row = 0; row < tableElement.rows.length; row++) {\n const tr = tableElement.rows[row];\n const tableRow = table.rows[row];\n\n const tbody = tr.parentNode;\n\n if (\n isNodeOfType(tbody, 'ELEMENT_NODE') &&\n (isElementOfType(tbody, 'tbody') ||\n isElementOfType(tbody, 'thead') ||\n isElementOfType(tbody, 'tfoot'))\n ) {\n parseFormat(tbody, context.formatParsers.tableRow, tableRow.format, context);\n } else if (context.allowCacheElement) {\n tableRow.cachedElement = tr;\n }\n\n parseFormat(tr, context.formatParsers.tableRow, tableRow.format, context);\n\n stackFormat(context, { paragraph: 'shallowClone', segment: 'shallowClone' }, () => {\n const parent = tr.parentElement;\n const parentTag = parent?.tagName;\n\n if (\n parent &&\n (parentTag == 'TBODY' || parentTag == 'THEAD' || parentTag == 'TFOOT')\n ) {\n // If there is TBODY around TR, retrieve format from TBODY first, in case some format are declared there\n parseFormat(\n parent,\n context.formatParsers.block,\n context.blockFormat,\n context\n );\n parseFormat(\n parent,\n context.formatParsers.segmentOnBlock,\n context.segmentFormat,\n context\n );\n }\n\n parseFormat(tr, context.formatParsers.block, context.blockFormat, context);\n parseFormat(\n tr,\n context.formatParsers.segmentOnBlock,\n context.segmentFormat,\n context\n );\n\n for (\n let sourceCol = 0, targetCol = 0;\n sourceCol < tr.cells.length;\n sourceCol++\n ) {\n for (; tableRow.cells[targetCol]; targetCol++) {}\n\n const td = tr.cells[sourceCol];\n const hasSelectionBeforeCell = context.isInSelection;\n const colEnd = targetCol + td.colSpan;\n const rowEnd = row + td.rowSpan;\n const needCalcWidth = columnPositions[colEnd] === undefined;\n const needCalcHeight = rowPositions[rowEnd] === undefined;\n\n if (needCalcWidth || needCalcHeight) {\n const rect = getBoundingClientRect(td);\n\n if (rect.width > 0 || rect.height > 0) {\n if (needCalcWidth) {\n columnPositions[colEnd] =\n columnPositions[targetCol] + rect.width / zoomScale;\n }\n\n if (needCalcHeight) {\n rowPositions[rowEnd] =\n rowPositions[row] + rect.height / zoomScale;\n }\n }\n }\n\n stackFormat(\n context,\n { paragraph: 'shallowClone', segment: 'shallowClone' },\n () => {\n parseFormat(\n td,\n context.formatParsers.block,\n context.blockFormat,\n context\n );\n parseFormat(\n td,\n context.formatParsers.segmentOnTableCell,\n context.segmentFormat,\n context\n );\n\n const cellFormat: ContentModelTableCellFormat = {\n ...context.blockFormat,\n };\n const dataset: DatasetFormat = {};\n\n parseFormat(\n td,\n context.formatParsers.tableCell,\n cellFormat,\n context\n );\n parseFormat(\n td,\n context.formatParsers.tableBorder,\n cellFormat,\n context\n );\n parseFormat(td, context.formatParsers.dataset, dataset, context);\n\n for (\n let colSpan = 1;\n colSpan <= td.colSpan;\n colSpan++, targetCol++\n ) {\n for (let rowSpan = 1; rowSpan <= td.rowSpan; rowSpan++) {\n const hasTd = colSpan == 1 && rowSpan == 1;\n const cell = createTableCell(\n colSpan > 1,\n rowSpan > 1,\n td.tagName == 'TH',\n cellFormat\n );\n\n cell.dataset = { ...dataset };\n\n const spannedRow = table.rows[row + rowSpan - 1];\n\n if (spannedRow) {\n spannedRow.cells[targetCol] = cell;\n }\n\n if (hasTd) {\n if (context.allowCacheElement) {\n cell.cachedElement = td;\n }\n\n const { listParent, levels } = context.listFormat;\n\n context.listFormat.listParent = undefined;\n context.listFormat.levels = [];\n\n try {\n context.elementProcessors.child(cell, td, context);\n } finally {\n context.listFormat.listParent = listParent;\n context.listFormat.levels = levels;\n }\n }\n\n const hasSelectionAfterCell = context.isInSelection;\n\n if (\n (hasSelectionBeforeCell && hasSelectionAfterCell) ||\n (hasTableSelection &&\n tableSelection &&\n row >= tableSelection.firstRow &&\n row <= tableSelection.lastRow &&\n targetCol >= tableSelection.firstColumn &&\n targetCol <= tableSelection.lastColumn)\n ) {\n cell.isSelected = true;\n }\n }\n }\n }\n );\n }\n });\n\n for (let col = 0; col < tableRow.cells.length; col++) {\n if (!tableRow.cells[col]) {\n tableRow.cells[col] = createTableCell(\n false,\n false,\n false,\n context.blockFormat\n );\n }\n }\n }\n\n table.widths = calcSizes(columnPositions);\n\n const heights = calcSizes(rowPositions);\n\n table.rows.forEach((row, i) => {\n if (heights[i] > 0) {\n row.height = heights[i];\n }\n });\n }\n );\n};\n\nfunction calcSizes(positions: number[]): number[] {\n let result: number[] = [];\n let lastPos = positions[positions.length - 1];\n\n for (let i = positions.length - 2; i >= 0; i--) {\n if (positions[i] === undefined) {\n result[i] = 0;\n } else {\n result[i] = lastPos - positions[i];\n lastPos = positions[i];\n }\n }\n\n return result;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tableProcessor.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/tableProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["import { addBlock } from '../../modelApi/common/addBlock';\nimport { createTable } from '../../modelApi/creators/createTable';\nimport { createTableCell } from '../../modelApi/creators/createTableCell';\nimport { getBoundingClientRect } from '../utils/getBoundingClientRect';\nimport { isElementOfType } from '../../domUtils/isElementOfType';\nimport { isNodeOfType } from '../../domUtils/isNodeOfType';\nimport { parseFormat } from '../utils/parseFormat';\nimport { stackFormat } from '../utils/stackFormat';\nimport type {\n ContentModelTableCellFormat,\n DatasetFormat,\n ElementProcessor,\n} from 'roosterjs-content-model-types';\n\n/**\n * Content Model Element Processor for table\n *\n * For Table with merged/splitted cells, HTML uses colSpan and rowSpan attributes to specify how it should be rendered.\n * To make it easier to edit a table, we will use a different way to describe table.\n *\n * 1. For a m * n table (m rows, n columns), we always create a m * n array for the cells.\n * 2. For a regular table cell, it is mapped to one item of this array\n * 3. For a merged/splitted table cell, it will has colSpan/rowSpan value. We also created TableCell model for those spanned\n * cells, and use \"spanLeft\" and \"spanAbove\" to mark its state\n * 4. When edit table, we always edit on this mapped m * n array because it always has an item for each cell\n * 5. When write back to DOM, we create TD/TH elements for those non-spanned cells, and mark its colSpan/rowSpan value according\n * its neighbour cell's spanLeft/spanAbove attribute\n * @param group The parent block group\n * @param parent Parent DOM node to process\n * @param context DOM to Content Model context\n */\nexport const tableProcessor: ElementProcessor<HTMLTableElement> = (\n group,\n tableElement,\n context\n) => {\n stackFormat(\n context,\n { segment: 'shallowCloneForBlock', paragraph: 'shallowCloneForGroup' },\n () => {\n parseFormat(tableElement, context.formatParsers.block, context.blockFormat, context);\n\n const table = createTable(tableElement.rows.length, context.blockFormat);\n const tableSelection = context.selection?.type == 'table' ? context.selection : null;\n const selectedTable = tableSelection?.table;\n const hasTableSelection = selectedTable == tableElement;\n\n if (context.allowCacheElement) {\n table.cachedElement = tableElement;\n }\n\n context.domIndexer?.onTable(tableElement, table);\n\n parseFormat(tableElement, context.formatParsers.table, table.format, context);\n parseFormat(tableElement, context.formatParsers.tableBorder, table.format, context);\n parseFormat(\n tableElement,\n context.formatParsers.segmentOnBlock,\n context.segmentFormat,\n context\n );\n parseFormat(tableElement, context.formatParsers.dataset, table.dataset, context);\n addBlock(group, table);\n\n const columnPositions: number[] = [0];\n const rowPositions: number[] = [0];\n const zoomScale = context.zoomScale || 1;\n\n for (let row = 0; row < tableElement.rows.length; row++) {\n const tr = tableElement.rows[row];\n const tableRow = table.rows[row];\n\n const tbody = tr.parentNode;\n\n if (\n isNodeOfType(tbody, 'ELEMENT_NODE') &&\n (isElementOfType(tbody, 'tbody') ||\n isElementOfType(tbody, 'thead') ||\n isElementOfType(tbody, 'tfoot'))\n ) {\n parseFormat(tbody, context.formatParsers.tableRow, tableRow.format, context);\n } else if (context.allowCacheElement) {\n tableRow.cachedElement = tr;\n }\n\n parseFormat(tr, context.formatParsers.tableRow, tableRow.format, context);\n\n stackFormat(context, { paragraph: 'shallowClone', segment: 'shallowClone' }, () => {\n const parent = tr.parentElement;\n const parentTag = parent?.tagName;\n\n if (\n parent &&\n (parentTag == 'TBODY' || parentTag == 'THEAD' || parentTag == 'TFOOT')\n ) {\n // If there is TBODY around TR, retrieve format from TBODY first, in case some format are declared there\n parseFormat(\n parent,\n context.formatParsers.block,\n context.blockFormat,\n context\n );\n parseFormat(\n parent,\n context.formatParsers.segmentOnBlock,\n context.segmentFormat,\n context\n );\n }\n\n parseFormat(tr, context.formatParsers.block, context.blockFormat, context);\n parseFormat(\n tr,\n context.formatParsers.segmentOnBlock,\n context.segmentFormat,\n context\n );\n\n for (\n let sourceCol = 0, targetCol = 0;\n sourceCol < tr.cells.length;\n sourceCol++\n ) {\n for (; tableRow.cells[targetCol]; targetCol++) {}\n\n const td = tr.cells[sourceCol];\n const hasSelectionBeforeCell = context.isInSelection;\n const colEnd = targetCol + td.colSpan;\n const rowEnd = row + td.rowSpan;\n const needCalcWidth = columnPositions[colEnd] === undefined;\n const needCalcHeight = rowPositions[rowEnd] === undefined;\n\n if (needCalcWidth || needCalcHeight) {\n const rect = getBoundingClientRect(td);\n\n if (rect.width > 0 || rect.height > 0) {\n if (needCalcWidth) {\n columnPositions[colEnd] =\n columnPositions[targetCol] + rect.width / zoomScale;\n }\n\n if (needCalcHeight) {\n rowPositions[rowEnd] =\n rowPositions[row] + rect.height / zoomScale;\n }\n }\n }\n\n stackFormat(\n context,\n { paragraph: 'shallowClone', segment: 'shallowClone' },\n () => {\n parseFormat(\n td,\n context.formatParsers.block,\n context.blockFormat,\n context\n );\n parseFormat(\n td,\n context.formatParsers.segmentOnTableCell,\n context.segmentFormat,\n context\n );\n\n const cellFormat: ContentModelTableCellFormat = {\n ...context.blockFormat,\n };\n const dataset: DatasetFormat = {};\n\n parseFormat(\n td,\n context.formatParsers.tableCell,\n cellFormat,\n context\n );\n parseFormat(\n td,\n context.formatParsers.tableBorder,\n cellFormat,\n context\n );\n parseFormat(td, context.formatParsers.dataset, dataset, context);\n\n for (\n let colSpan = 1;\n colSpan <= td.colSpan;\n colSpan++, targetCol++\n ) {\n for (let rowSpan = 1; rowSpan <= td.rowSpan; rowSpan++) {\n const hasTd = colSpan == 1 && rowSpan == 1;\n const cell = createTableCell(\n colSpan > 1,\n rowSpan > 1,\n td.tagName == 'TH',\n cellFormat\n );\n\n cell.dataset = { ...dataset };\n\n const spannedRow = table.rows[row + rowSpan - 1];\n\n if (spannedRow) {\n spannedRow.cells[targetCol] = cell;\n }\n\n if (hasTd) {\n if (context.allowCacheElement) {\n cell.cachedElement = td;\n }\n\n const { listParent, levels } = context.listFormat;\n\n context.listFormat.listParent = undefined;\n context.listFormat.levels = [];\n\n try {\n context.elementProcessors.child(cell, td, context);\n } finally {\n context.listFormat.listParent = listParent;\n context.listFormat.levels = levels;\n }\n }\n\n const hasSelectionAfterCell = context.isInSelection;\n\n if (\n (hasSelectionBeforeCell && hasSelectionAfterCell) ||\n (hasTableSelection &&\n tableSelection &&\n row >= tableSelection.firstRow &&\n row <= tableSelection.lastRow &&\n targetCol >= tableSelection.firstColumn &&\n targetCol <= tableSelection.lastColumn)\n ) {\n cell.isSelected = true;\n }\n }\n }\n }\n );\n }\n });\n\n for (let col = 0; col < tableRow.cells.length; col++) {\n if (!tableRow.cells[col]) {\n tableRow.cells[col] = createTableCell(\n false,\n false,\n false,\n context.blockFormat\n );\n }\n }\n }\n\n table.widths = calcSizes(columnPositions);\n\n const heights = calcSizes(rowPositions);\n\n table.rows.forEach((row, i) => {\n if (heights[i] > 0) {\n row.height = heights[i];\n }\n });\n }\n );\n};\n\nfunction calcSizes(positions: number[]): number[] {\n const result: number[] = [];\n let lastPos = positions[positions.length - 1];\n\n for (let i = positions.length - 2; i >= 0; i--) {\n if (positions[i] === undefined) {\n result[i] = 0;\n } else {\n result[i] = lastPos - positions[i];\n lastPos = positions[i];\n }\n }\n\n return result;\n}\n"]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.textProcessor = void 0;
|
|
4
|
-
var tslib_1 = require("tslib");
|
|
5
4
|
var addDecorators_1 = require("../../modelApi/common/addDecorators");
|
|
6
5
|
var addSegment_1 = require("../../modelApi/common/addSegment");
|
|
7
6
|
var addSelectionMarker_1 = require("../utils/addSelectionMarker");
|
|
@@ -15,7 +14,9 @@ var hasSpacesOnly_1 = require("../../modelApi/common/hasSpacesOnly");
|
|
|
15
14
|
var textProcessor = function (group, textNode, context) {
|
|
16
15
|
var _a;
|
|
17
16
|
var txt = textNode.nodeValue || '';
|
|
18
|
-
var
|
|
17
|
+
var offsets = (0, getRegularSelectionOffsets_1.getRegularSelectionOffsets)(context, textNode);
|
|
18
|
+
var txtStartOffset = offsets[0];
|
|
19
|
+
var txtEndOffset = offsets[1];
|
|
19
20
|
var segments = [];
|
|
20
21
|
var paragraph = (0, ensureParagraph_1.ensureParagraph)(group, context.blockFormat);
|
|
21
22
|
if (txtStartOffset >= 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textProcessor.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/textProcessor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"textProcessor.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/textProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["import { addDecorators } from '../../modelApi/common/addDecorators';\nimport { addSegment } from '../../modelApi/common/addSegment';\nimport { addSelectionMarker } from '../utils/addSelectionMarker';\nimport { createText } from '../../modelApi/creators/createText';\nimport { ensureParagraph } from '../../modelApi/common/ensureParagraph';\nimport { getRegularSelectionOffsets } from '../utils/getRegularSelectionOffsets';\nimport { hasSpacesOnly } from '../../modelApi/common/hasSpacesOnly';\nimport type {\n ContentModelBlockGroup,\n ContentModelParagraph,\n ContentModelText,\n DomToModelContext,\n ElementProcessor,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const textProcessor: ElementProcessor<Text> = (\n group: ContentModelBlockGroup,\n textNode: Text,\n context: DomToModelContext\n) => {\n let txt = textNode.nodeValue || '';\n const offsets = getRegularSelectionOffsets(context, textNode);\n const txtStartOffset = offsets[0];\n let txtEndOffset = offsets[1];\n const segments: (ContentModelText | undefined)[] = [];\n const paragraph = ensureParagraph(group, context.blockFormat);\n\n if (txtStartOffset >= 0) {\n const subText = txt.substring(0, txtStartOffset);\n segments.push(addTextSegment(group, subText, paragraph, context));\n context.isInSelection = true;\n\n addSelectionMarker(group, context);\n\n txt = txt.substring(txtStartOffset);\n txtEndOffset -= txtStartOffset;\n }\n\n if (txtEndOffset >= 0) {\n const subText = txt.substring(0, txtEndOffset);\n segments.push(addTextSegment(group, subText, paragraph, context));\n\n if (\n context.selection &&\n (context.selection.type != 'range' || !context.selection.range.collapsed)\n ) {\n addSelectionMarker(group, context);\n }\n\n context.isInSelection = false;\n txt = txt.substring(txtEndOffset);\n }\n\n segments.push(addTextSegment(group, txt, paragraph, context));\n context.domIndexer?.onSegment(\n textNode,\n paragraph,\n segments.filter((x): x is ContentModelText => !!x)\n );\n};\n\n// When we see these values of white-space style, need to preserve spaces and line-breaks and let browser handle it for us.\nconst WhiteSpaceValuesNeedToHandle = ['pre', 'pre-wrap', 'pre-line', 'break-spaces'];\n\nfunction addTextSegment(\n group: ContentModelBlockGroup,\n text: string,\n paragraph: ContentModelParagraph,\n context: DomToModelContext\n): ContentModelText | undefined {\n let textModel: ContentModelText | undefined;\n\n if (text) {\n if (\n !hasSpacesOnly(text) ||\n (paragraph?.segments.length ?? 0) > 0 ||\n WhiteSpaceValuesNeedToHandle.indexOf(paragraph?.format.whiteSpace || '') >= 0\n ) {\n textModel = createText(text, context.segmentFormat);\n\n if (context.isInSelection) {\n textModel.isSelected = true;\n }\n\n addDecorators(textModel, context);\n\n addSegment(group, textModel, context.blockFormat);\n }\n }\n\n return textModel;\n}\n"]}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import type { DomToModelContext } from 'roosterjs-content-model-types';
|
|
2
1
|
/**
|
|
3
2
|
* @internal
|
|
4
3
|
* Get default CSS style of given element
|
|
5
4
|
* @param element The element to get default style from
|
|
6
|
-
* @param context The context of DOM to Content Model conversion
|
|
7
5
|
* @returns A valid CSS style object
|
|
8
6
|
*/
|
|
9
|
-
export declare function getDefaultStyle(element: HTMLElement
|
|
7
|
+
export declare function getDefaultStyle(element: HTMLElement): Partial<CSSStyleDeclaration>;
|
|
@@ -6,10 +6,9 @@ var defaultHTMLStyleMap_1 = require("../../config/defaultHTMLStyleMap");
|
|
|
6
6
|
* @internal
|
|
7
7
|
* Get default CSS style of given element
|
|
8
8
|
* @param element The element to get default style from
|
|
9
|
-
* @param context The context of DOM to Content Model conversion
|
|
10
9
|
* @returns A valid CSS style object
|
|
11
10
|
*/
|
|
12
|
-
function getDefaultStyle(element
|
|
11
|
+
function getDefaultStyle(element) {
|
|
13
12
|
var tag = element.tagName.toLowerCase();
|
|
14
13
|
return defaultHTMLStyleMap_1.defaultHTMLStyleMap[tag] || {};
|
|
15
14
|
}
|