roosterjs-content-model-dom 0.25.0 → 0.26.1

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.
Files changed (94) hide show
  1. package/lib/config/defaultHTMLStyleMap.js +3 -2
  2. package/lib/config/defaultHTMLStyleMap.js.map +1 -1
  3. package/lib/domToModel/processors/entityProcessor.js +2 -1
  4. package/lib/domToModel/processors/entityProcessor.js.map +1 -1
  5. package/lib/domToModel/processors/generalProcessor.js +3 -0
  6. package/lib/domToModel/processors/generalProcessor.js.map +1 -1
  7. package/lib/domUtils/entityUtils.d.ts +7 -3
  8. package/lib/domUtils/entityUtils.js +13 -2
  9. package/lib/domUtils/entityUtils.js.map +1 -1
  10. package/lib/formatHandlers/block/paddingFormatHandler.d.ts +2 -2
  11. package/lib/formatHandlers/block/paddingFormatHandler.js +27 -6
  12. package/lib/formatHandlers/block/paddingFormatHandler.js.map +1 -1
  13. package/lib/formatHandlers/defaultFormatHandlers.js +1 -0
  14. package/lib/formatHandlers/defaultFormatHandlers.js.map +1 -1
  15. package/lib/formatHandlers/segment/fontSizeFormatHandler.js +5 -4
  16. package/lib/formatHandlers/segment/fontSizeFormatHandler.js.map +1 -1
  17. package/lib/formatHandlers/utils/parseValueWithUnit.js +4 -1
  18. package/lib/formatHandlers/utils/parseValueWithUnit.js.map +1 -1
  19. package/lib/index.d.ts +3 -1
  20. package/lib/index.js +7 -2
  21. package/lib/index.js.map +1 -1
  22. package/lib/modelApi/common/normalizeParagraph.d.ts +2 -1
  23. package/lib/modelApi/common/normalizeParagraph.js +2 -1
  24. package/lib/modelApi/common/normalizeParagraph.js.map +1 -1
  25. package/lib/modelToDom/handlers/handleEntity.js +22 -5
  26. package/lib/modelToDom/handlers/handleEntity.js.map +1 -1
  27. package/lib/modelToDom/handlers/handleGeneralModel.js +3 -0
  28. package/lib/modelToDom/handlers/handleGeneralModel.js.map +1 -1
  29. package/lib/modelToText/contentModelToText.d.ts +7 -0
  30. package/lib/modelToText/contentModelToText.js +60 -0
  31. package/lib/modelToText/contentModelToText.js.map +1 -0
  32. package/lib-amd/config/defaultHTMLStyleMap.js +3 -3
  33. package/lib-amd/config/defaultHTMLStyleMap.js.map +1 -1
  34. package/lib-amd/domToModel/processors/entityProcessor.js +2 -1
  35. package/lib-amd/domToModel/processors/entityProcessor.js.map +1 -1
  36. package/lib-amd/domToModel/processors/generalProcessor.js +3 -1
  37. package/lib-amd/domToModel/processors/generalProcessor.js.map +1 -1
  38. package/lib-amd/domUtils/entityUtils.d.ts +7 -3
  39. package/lib-amd/domUtils/entityUtils.js +13 -3
  40. package/lib-amd/domUtils/entityUtils.js.map +1 -1
  41. package/lib-amd/formatHandlers/block/paddingFormatHandler.d.ts +2 -2
  42. package/lib-amd/formatHandlers/block/paddingFormatHandler.js +27 -7
  43. package/lib-amd/formatHandlers/block/paddingFormatHandler.js.map +1 -1
  44. package/lib-amd/formatHandlers/defaultFormatHandlers.js +1 -0
  45. package/lib-amd/formatHandlers/defaultFormatHandlers.js.map +1 -1
  46. package/lib-amd/formatHandlers/segment/fontSizeFormatHandler.js +5 -4
  47. package/lib-amd/formatHandlers/segment/fontSizeFormatHandler.js.map +1 -1
  48. package/lib-amd/formatHandlers/utils/parseValueWithUnit.js +4 -1
  49. package/lib-amd/formatHandlers/utils/parseValueWithUnit.js.map +1 -1
  50. package/lib-amd/index.d.ts +3 -1
  51. package/lib-amd/index.js +5 -2
  52. package/lib-amd/index.js.map +1 -1
  53. package/lib-amd/modelApi/common/normalizeParagraph.d.ts +2 -1
  54. package/lib-amd/modelApi/common/normalizeParagraph.js +2 -1
  55. package/lib-amd/modelApi/common/normalizeParagraph.js.map +1 -1
  56. package/lib-amd/modelToDom/handlers/handleEntity.js +22 -5
  57. package/lib-amd/modelToDom/handlers/handleEntity.js.map +1 -1
  58. package/lib-amd/modelToDom/handlers/handleGeneralModel.js +3 -1
  59. package/lib-amd/modelToDom/handlers/handleGeneralModel.js.map +1 -1
  60. package/lib-amd/modelToText/contentModelToText.d.ts +7 -0
  61. package/lib-amd/modelToText/contentModelToText.js +62 -0
  62. package/lib-amd/modelToText/contentModelToText.js.map +1 -0
  63. package/lib-mjs/config/defaultHTMLStyleMap.js +3 -2
  64. package/lib-mjs/config/defaultHTMLStyleMap.js.map +1 -1
  65. package/lib-mjs/domToModel/processors/entityProcessor.js +2 -1
  66. package/lib-mjs/domToModel/processors/entityProcessor.js.map +1 -1
  67. package/lib-mjs/domToModel/processors/generalProcessor.js +3 -0
  68. package/lib-mjs/domToModel/processors/generalProcessor.js.map +1 -1
  69. package/lib-mjs/domUtils/entityUtils.d.ts +7 -3
  70. package/lib-mjs/domUtils/entityUtils.js +13 -2
  71. package/lib-mjs/domUtils/entityUtils.js.map +1 -1
  72. package/lib-mjs/formatHandlers/block/paddingFormatHandler.d.ts +2 -2
  73. package/lib-mjs/formatHandlers/block/paddingFormatHandler.js +27 -6
  74. package/lib-mjs/formatHandlers/block/paddingFormatHandler.js.map +1 -1
  75. package/lib-mjs/formatHandlers/defaultFormatHandlers.js +1 -0
  76. package/lib-mjs/formatHandlers/defaultFormatHandlers.js.map +1 -1
  77. package/lib-mjs/formatHandlers/segment/fontSizeFormatHandler.js +5 -4
  78. package/lib-mjs/formatHandlers/segment/fontSizeFormatHandler.js.map +1 -1
  79. package/lib-mjs/formatHandlers/utils/parseValueWithUnit.js +4 -1
  80. package/lib-mjs/formatHandlers/utils/parseValueWithUnit.js.map +1 -1
  81. package/lib-mjs/index.d.ts +3 -1
  82. package/lib-mjs/index.js +3 -1
  83. package/lib-mjs/index.js.map +1 -1
  84. package/lib-mjs/modelApi/common/normalizeParagraph.d.ts +2 -1
  85. package/lib-mjs/modelApi/common/normalizeParagraph.js +2 -1
  86. package/lib-mjs/modelApi/common/normalizeParagraph.js.map +1 -1
  87. package/lib-mjs/modelToDom/handlers/handleEntity.js +23 -6
  88. package/lib-mjs/modelToDom/handlers/handleEntity.js.map +1 -1
  89. package/lib-mjs/modelToDom/handlers/handleGeneralModel.js +3 -0
  90. package/lib-mjs/modelToDom/handlers/handleGeneralModel.js.map +1 -1
  91. package/lib-mjs/modelToText/contentModelToText.d.ts +7 -0
  92. package/lib-mjs/modelToText/contentModelToText.js +56 -0
  93. package/lib-mjs/modelToText/contentModelToText.js.map +1 -0
  94. package/package.json +2 -2
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.defaultHTMLStyleMap = void 0;
4
+ var tslib_1 = require("tslib");
4
5
  var blockElement = {
5
6
  display: 'block',
6
7
  };
@@ -77,7 +78,7 @@ exports.defaultHTMLStyleMap = {
77
78
  },
78
79
  main: blockElement,
79
80
  nav: blockElement,
80
- ol: blockElement,
81
+ ol: (0, tslib_1.__assign)((0, tslib_1.__assign)({}, blockElement), { paddingInlineStart: '40px' }),
81
82
  p: {
82
83
  display: 'block',
83
84
  marginTop: '1em',
@@ -121,6 +122,6 @@ exports.defaultHTMLStyleMap = {
121
122
  u: {
122
123
  textDecoration: 'underline',
123
124
  },
124
- ul: blockElement,
125
+ ul: (0, tslib_1.__assign)((0, tslib_1.__assign)({}, blockElement), { paddingInlineStart: '40px' }),
125
126
  };
126
127
  //# sourceMappingURL=defaultHTMLStyleMap.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaultHTMLStyleMap.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-dom/lib/config/defaultHTMLStyleMap.ts"],"names":[],"mappings":";;;AAEA,IAAM,YAAY,GAAiC;IAC/C,OAAO,EAAE,OAAO;CACnB,CAAC;AAEF;;GAEG;AACU,QAAA,mBAAmB,GAAoB;IAChD,OAAO,EAAE,YAAY;IACrB,OAAO,EAAE,YAAY;IACrB,KAAK,EAAE,YAAY;IACnB,CAAC,EAAE;QACC,UAAU,EAAE,MAAM;KACrB;IACD,UAAU,EAAE;QACR,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,KAAK;QAChB,YAAY,EAAE,KAAK;QACnB,UAAU,EAAE,MAAM;QAClB,WAAW,EAAE,MAAM;KACtB;IACD,EAAE,EAAE,YAAY;IAChB,MAAM,EAAE;QACJ,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,QAAQ;KACtB;IACD,EAAE,EAAE,YAAY;IAChB,GAAG,EAAE,YAAY;IACjB,EAAE,EAAE,YAAY;IAChB,EAAE,EAAE,YAAY;IAChB,EAAE,EAAE;QACA,SAAS,EAAE,QAAQ;KACtB;IACD,QAAQ,EAAE,YAAY;IACtB,UAAU,EAAE,YAAY;IACxB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,YAAY;IACpB,IAAI,EAAE,YAAY;IAClB,EAAE,EAAE;QACA,OAAO,EAAE,OAAO;QAChB,UAAU,EAAE,MAAM;QAClB,QAAQ,EAAE,KAAK;KAClB;IACD,EAAE,EAAE;QACA,OAAO,EAAE,OAAO;QAChB,UAAU,EAAE,MAAM;QAClB,QAAQ,EAAE,OAAO;KACpB;IACD,EAAE,EAAE;QACA,OAAO,EAAE,OAAO;QAChB,UAAU,EAAE,MAAM;QAClB,QAAQ,EAAE,QAAQ;KACrB;IACD,EAAE,EAAE;QACA,OAAO,EAAE,OAAO;QAChB,UAAU,EAAE,MAAM;KACrB;IACD,EAAE,EAAE;QACA,OAAO,EAAE,OAAO;QAChB,UAAU,EAAE,MAAM;QAClB,QAAQ,EAAE,QAAQ;KACrB;IACD,EAAE,EAAE;QACA,OAAO,EAAE,OAAO;QAChB,UAAU,EAAE,MAAM;QAClB,QAAQ,EAAE,QAAQ;KACrB;IACD,MAAM,EAAE,YAAY;IACpB,EAAE,EAAE,YAAY;IAChB,CAAC,EAAE;QACC,SAAS,EAAE,QAAQ;KACtB;IACD,EAAE,EAAE;QACA,OAAO,EAAE,WAAW;KACvB;IACD,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,YAAY;IACjB,EAAE,EAAE,YAAY;IAChB,CAAC,EAAE;QACC,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,KAAK;QAChB,YAAY,EAAE,KAAK;KACtB;IACD,GAAG,EAAE;QACD,OAAO,EAAE,OAAO;QAChB,UAAU,EAAE,WAAW;QACvB,UAAU,EAAE,KAAK;QACjB,SAAS,EAAE,KAAK;QAChB,YAAY,EAAE,KAAK;KACtB;IACD,CAAC,EAAE;QACC,cAAc,EAAE,cAAc;KACjC;IACD,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE;QACJ,cAAc,EAAE,cAAc;KACjC;IACD,MAAM,EAAE;QACJ,UAAU,EAAE,MAAM;KACrB;IACD,GAAG,EAAE;QACD,aAAa,EAAE,KAAK;QACpB,QAAQ,EAAE,SAAS;KACtB;IACD,GAAG,EAAE;QACD,aAAa,EAAE,OAAO;QACtB,QAAQ,EAAE,SAAS;KACtB;IACD,KAAK,EAAE;QACH,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,YAAY;KAC1B;IACD,EAAE,EAAE;QACA,OAAO,EAAE,YAAY;KACxB;IACD,EAAE,EAAE;QACA,OAAO,EAAE,YAAY;KACxB;IACD,CAAC,EAAE;QACC,cAAc,EAAE,WAAW;KAC9B;IACD,EAAE,EAAE,YAAY;CACnB,CAAC","sourcesContent":["import type { DefaultStyleMap } from 'roosterjs-content-model-types';\n\nconst blockElement: Partial<CSSStyleDeclaration> = {\n display: 'block',\n};\n\n/**\n * @internal\n */\nexport const defaultHTMLStyleMap: DefaultStyleMap = {\n address: blockElement,\n article: blockElement,\n aside: blockElement,\n b: {\n fontWeight: 'bold',\n },\n blockquote: {\n display: 'block',\n marginTop: '1em',\n marginBottom: '1em',\n marginLeft: '40px',\n marginRight: '40px',\n },\n br: blockElement,\n center: {\n display: 'block',\n textAlign: 'center',\n },\n dd: blockElement,\n div: blockElement,\n dl: blockElement,\n dt: blockElement,\n em: {\n fontStyle: 'italic',\n },\n fieldset: blockElement,\n figcaption: blockElement,\n figure: blockElement,\n footer: blockElement,\n form: blockElement,\n h1: {\n display: 'block',\n fontWeight: 'bold',\n fontSize: '2em',\n },\n h2: {\n display: 'block',\n fontWeight: 'bold',\n fontSize: '1.5em',\n },\n h3: {\n display: 'block',\n fontWeight: 'bold',\n fontSize: '1.17em',\n },\n h4: {\n display: 'block',\n fontWeight: 'bold',\n },\n h5: {\n display: 'block',\n fontWeight: 'bold',\n fontSize: '0.83em',\n },\n h6: {\n display: 'block',\n fontWeight: 'bold',\n fontSize: '0.67em',\n },\n header: blockElement,\n hr: blockElement,\n i: {\n fontStyle: 'italic',\n },\n li: {\n display: 'list-item',\n },\n main: blockElement,\n nav: blockElement,\n ol: blockElement,\n p: {\n display: 'block',\n marginTop: '1em',\n marginBottom: '1em',\n },\n pre: {\n display: 'block',\n fontFamily: 'monospace',\n whiteSpace: 'pre',\n marginTop: '1em',\n marginBottom: '1em',\n },\n s: {\n textDecoration: 'line-through',\n },\n section: blockElement,\n strike: {\n textDecoration: 'line-through',\n },\n strong: {\n fontWeight: 'bold',\n },\n sub: {\n verticalAlign: 'sub',\n fontSize: 'smaller',\n },\n sup: {\n verticalAlign: 'super',\n fontSize: 'smaller',\n },\n table: {\n display: 'table',\n boxSizing: 'border-box',\n },\n td: {\n display: 'table-cell',\n },\n th: {\n display: 'table-cell',\n },\n u: {\n textDecoration: 'underline',\n },\n ul: blockElement,\n};\n"]}
1
+ {"version":3,"file":"defaultHTMLStyleMap.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-dom/lib/config/defaultHTMLStyleMap.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DefaultStyleMap } from 'roosterjs-content-model-types';\n\nconst blockElement: Partial<CSSStyleDeclaration> = {\n display: 'block',\n};\n\n/**\n * @internal\n */\nexport const defaultHTMLStyleMap: DefaultStyleMap = {\n address: blockElement,\n article: blockElement,\n aside: blockElement,\n b: {\n fontWeight: 'bold',\n },\n blockquote: {\n display: 'block',\n marginTop: '1em',\n marginBottom: '1em',\n marginLeft: '40px',\n marginRight: '40px',\n },\n br: blockElement,\n center: {\n display: 'block',\n textAlign: 'center',\n },\n dd: blockElement,\n div: blockElement,\n dl: blockElement,\n dt: blockElement,\n em: {\n fontStyle: 'italic',\n },\n fieldset: blockElement,\n figcaption: blockElement,\n figure: blockElement,\n footer: blockElement,\n form: blockElement,\n h1: {\n display: 'block',\n fontWeight: 'bold',\n fontSize: '2em',\n },\n h2: {\n display: 'block',\n fontWeight: 'bold',\n fontSize: '1.5em',\n },\n h3: {\n display: 'block',\n fontWeight: 'bold',\n fontSize: '1.17em',\n },\n h4: {\n display: 'block',\n fontWeight: 'bold',\n },\n h5: {\n display: 'block',\n fontWeight: 'bold',\n fontSize: '0.83em',\n },\n h6: {\n display: 'block',\n fontWeight: 'bold',\n fontSize: '0.67em',\n },\n header: blockElement,\n hr: blockElement,\n i: {\n fontStyle: 'italic',\n },\n li: {\n display: 'list-item',\n },\n main: blockElement,\n nav: blockElement,\n ol: { ...blockElement, paddingInlineStart: '40px' },\n p: {\n display: 'block',\n marginTop: '1em',\n marginBottom: '1em',\n },\n pre: {\n display: 'block',\n fontFamily: 'monospace',\n whiteSpace: 'pre',\n marginTop: '1em',\n marginBottom: '1em',\n },\n s: {\n textDecoration: 'line-through',\n },\n section: blockElement,\n strike: {\n textDecoration: 'line-through',\n },\n strong: {\n fontWeight: 'bold',\n },\n sub: {\n verticalAlign: 'sub',\n fontSize: 'smaller',\n },\n sup: {\n verticalAlign: 'super',\n fontSize: 'smaller',\n },\n table: {\n display: 'table',\n boxSizing: 'border-box',\n },\n td: {\n display: 'table-cell',\n },\n th: {\n display: 'table-cell',\n },\n u: {\n textDecoration: 'underline',\n },\n ul: { ...blockElement, paddingInlineStart: '40px' },\n};\n"]}
@@ -14,7 +14,8 @@ 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
+ (element.style.display == 'inline-block' && element.style.width == '100%');
18
19
  (0, stackFormat_1.stackFormat)(context, { segment: isBlockEntity ? 'empty' : undefined, paragraph: 'empty' }, function () {
19
20
  var _a;
20
21
  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,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,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;AAvBW,QAAA,eAAe,mBAuB1B","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 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"]}
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,GACf,IAAA,+BAAc,EAAC,OAAO,CAAC;QACvB,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,IAAI,cAAc,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC;IAE/E,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,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;AAzBW,QAAA,eAAe,mBAyB1B","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 =\n isBlockElement(element) ||\n (element.style.display == 'inline-block' && element.style.width == '100%');\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 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"]}
@@ -7,6 +7,7 @@ var addSegment_1 = require("../../modelApi/common/addSegment");
7
7
  var createGeneralBlock_1 = require("../../modelApi/creators/createGeneralBlock");
8
8
  var createGeneralSegment_1 = require("../../modelApi/creators/createGeneralSegment");
9
9
  var isBlockElement_1 = require("../utils/isBlockElement");
10
+ var parseFormat_1 = require("../utils/parseFormat");
10
11
  var stackFormat_1 = require("../utils/stackFormat");
11
12
  var generalBlockProcessor = function (group, element, context) {
12
13
  var block = (0, createGeneralBlock_1.createGeneralBlock)(element);
@@ -17,6 +18,7 @@ var generalBlockProcessor = function (group, element, context) {
17
18
  link: 'empty',
18
19
  }, function () {
19
20
  (0, addBlock_1.addBlock)(group, block);
21
+ (0, parseFormat_1.parseFormat)(element, context.formatParsers.general, block.format, context);
20
22
  context.elementProcessors.child(block, element, context);
21
23
  });
22
24
  if (isSelectedBefore && context.isInSelection) {
@@ -33,6 +35,7 @@ var generalSegmentProcessor = function (group, element, context) {
33
35
  (0, stackFormat_1.stackFormat)(context, {
34
36
  segment: 'empty' /*clearFormat, General segment will include all properties and styles when generate back to HTML, so no need to carry over existing segment format*/,
35
37
  }, function () {
38
+ (0, parseFormat_1.parseFormat)(element, context.formatParsers.general, segment.format, context);
36
39
  context.elementProcessors.child(segment, element, context);
37
40
  });
38
41
  if (isSelectedBefore && context.isInSelection) {
@@ -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,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"]}
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;AACnD,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,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAE3E,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,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAE7E,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 { parseFormat } from '../utils/parseFormat';\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 parseFormat(element, context.formatParsers.general, block.format, context);\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 parseFormat(element, context.formatParsers.general, segment.format, context);\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"]}
@@ -1,4 +1,4 @@
1
- import type { ContentModelEntityFormat } from 'roosterjs-content-model-types';
1
+ import type { ContentModelEntityFormat, ContentModelSegmentFormat, ModelToDomContext } from 'roosterjs-content-model-types';
2
2
  /**
3
3
  * Check if the given DOM Node is an entity wrapper element
4
4
  */
@@ -22,11 +22,15 @@ export declare function parseEntityClassName(className: string, format: ContentM
22
22
  */
23
23
  export declare function generateEntityClassNames(format: ContentModelEntityFormat): string;
24
24
  /**
25
- * @internal
25
+ * Checks whether the node provided is a Entity delimiter
26
+ * @param node the node to check
27
+ * @return true if it is a delimiter
26
28
  */
27
29
  export declare function isEntityDelimiter(element: HTMLElement): boolean;
28
30
  /**
29
31
  * Adds delimiters to the element provided. If the delimiters already exists, will not be added
30
32
  * @param element the node to add the delimiters
33
+ * @param format format to set to the delimiters, so when typing inside of one the format is not lost
34
+ * @param context Model to Dom context to use.
31
35
  */
32
- export declare function addDelimiters(doc: Document, element: HTMLElement): HTMLElement[];
36
+ export declare function addDelimiters(doc: Document, element: HTMLElement, format?: ContentModelSegmentFormat | null, context?: ModelToDomContext): HTMLElement[];
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.addDelimiters = exports.isEntityDelimiter = exports.generateEntityClassNames = exports.parseEntityClassName = exports.getAllEntityWrappers = exports.isEntityElement = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  var toArray_1 = require("./toArray");
6
+ var applyFormat_1 = require("../modelToDom/utils/applyFormat");
6
7
  var isElementOfType_1 = require("./isElementOfType");
7
8
  var isNodeOfType_1 = require("./isNodeOfType");
8
9
  var ENTITY_INFO_NAME = '_Entity';
@@ -61,7 +62,9 @@ function generateEntityClassNames(format) {
61
62
  }
62
63
  exports.generateEntityClassNames = generateEntityClassNames;
63
64
  /**
64
- * @internal
65
+ * Checks whether the node provided is a Entity delimiter
66
+ * @param node the node to check
67
+ * @return true if it is a delimiter
65
68
  */
66
69
  function isEntityDelimiter(element) {
67
70
  return ((0, isElementOfType_1.isElementOfType)(element, 'span') &&
@@ -73,14 +76,22 @@ exports.isEntityDelimiter = isEntityDelimiter;
73
76
  /**
74
77
  * Adds delimiters to the element provided. If the delimiters already exists, will not be added
75
78
  * @param element the node to add the delimiters
79
+ * @param format format to set to the delimiters, so when typing inside of one the format is not lost
80
+ * @param context Model to Dom context to use.
76
81
  */
77
- function addDelimiters(doc, element) {
82
+ function addDelimiters(doc, element, format, context) {
78
83
  var _a = (0, tslib_1.__read)(getDelimiters(element), 2), delimiterAfter = _a[0], delimiterBefore = _a[1];
79
84
  if (!delimiterAfter) {
80
85
  delimiterAfter = insertDelimiter(doc, element, true /*isAfter*/);
86
+ if (context && format) {
87
+ (0, applyFormat_1.applyFormat)(delimiterAfter, context.formatAppliers.segment, format, context);
88
+ }
81
89
  }
82
90
  if (!delimiterBefore) {
83
91
  delimiterBefore = insertDelimiter(doc, element, false /*isAfter*/);
92
+ if (context && format) {
93
+ (0, applyFormat_1.applyFormat)(delimiterBefore, context.formatAppliers.segment, format, context);
94
+ }
84
95
  }
85
96
  return [delimiterAfter, delimiterBefore];
86
97
  }
@@ -1 +1 @@
1
- {"version":3,"file":"entityUtils.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-dom/lib/domUtils/entityUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import toArray from './toArray';\nimport { isElementOfType } from './isElementOfType';\nimport { isNodeOfType } from './isNodeOfType';\nimport type { ContentModelEntityFormat } from 'roosterjs-content-model-types';\n\nconst ENTITY_INFO_NAME = '_Entity';\nconst ENTITY_TYPE_PREFIX = '_EType_';\nconst ENTITY_ID_PREFIX = '_EId_';\nconst ENTITY_READONLY_PREFIX = '_EReadonly_';\nconst ZERO_WIDTH_SPACE = '\\u200B';\nconst DELIMITER_BEFORE = 'entityDelimiterBefore';\nconst DELIMITER_AFTER = 'entityDelimiterAfter';\n\n/**\n * Check if the given DOM Node is an entity wrapper element\n */\nexport function isEntityElement(node: Node): boolean {\n return isNodeOfType(node, 'ELEMENT_NODE') && node.classList.contains(ENTITY_INFO_NAME);\n}\n\n/**\n * Get all entity wrapper elements under the given root element\n * @param root The root element to query from\n * @returns An array of entity wrapper elements\n */\nexport function getAllEntityWrappers(root: HTMLElement): HTMLElement[] {\n return toArray(root.querySelectorAll('.' + ENTITY_INFO_NAME)) as HTMLElement[];\n}\n\n/**\n * Parse entity class names from entity wrapper element\n * @param className Class names of entity\n * @param format The output entity format object\n */\nexport function parseEntityClassName(\n className: string,\n format: ContentModelEntityFormat\n): boolean | undefined {\n if (className == ENTITY_INFO_NAME) {\n return true;\n } else if (className.indexOf(ENTITY_TYPE_PREFIX) == 0) {\n format.entityType = className.substring(ENTITY_TYPE_PREFIX.length);\n } else if (className.indexOf(ENTITY_ID_PREFIX) == 0) {\n format.id = className.substring(ENTITY_ID_PREFIX.length);\n } else if (className.indexOf(ENTITY_READONLY_PREFIX) == 0) {\n format.isReadonly = className.substring(ENTITY_READONLY_PREFIX.length) == '1';\n }\n}\n\n/**\n * Generate Entity class names for an entity wrapper\n * @param format The source entity format object\n * @returns A combined CSS class name string for entity wrapper\n */\nexport function generateEntityClassNames(format: ContentModelEntityFormat): string {\n return format.isFakeEntity\n ? ''\n : `${ENTITY_INFO_NAME} ${ENTITY_TYPE_PREFIX}${format.entityType ?? ''} ${\n format.id ? `${ENTITY_ID_PREFIX}${format.id} ` : ''\n }${ENTITY_READONLY_PREFIX}${format.isReadonly ? '1' : '0'}`;\n}\n\n/**\n * @internal\n */\nexport function isEntityDelimiter(element: HTMLElement): boolean {\n return (\n isElementOfType(element, 'span') &&\n (element.classList.contains(DELIMITER_AFTER) ||\n element.classList.contains(DELIMITER_BEFORE)) &&\n element.textContent === ZERO_WIDTH_SPACE\n );\n}\n\n/**\n * Adds delimiters to the element provided. If the delimiters already exists, will not be added\n * @param element the node to add the delimiters\n */\nexport function addDelimiters(doc: Document, element: HTMLElement): HTMLElement[] {\n let [delimiterAfter, delimiterBefore] = getDelimiters(element);\n\n if (!delimiterAfter) {\n delimiterAfter = insertDelimiter(doc, element, true /*isAfter*/);\n }\n\n if (!delimiterBefore) {\n delimiterBefore = insertDelimiter(doc, element, false /*isAfter*/);\n }\n\n return [delimiterAfter, delimiterBefore];\n}\n\nfunction getDelimiters(entityWrapper: HTMLElement): (HTMLElement | undefined)[] {\n const result: (HTMLElement | undefined)[] = [];\n const { nextElementSibling, previousElementSibling } = entityWrapper;\n result.push(\n isDelimiter(nextElementSibling, DELIMITER_AFTER),\n isDelimiter(previousElementSibling, DELIMITER_BEFORE)\n );\n\n return result;\n}\n\nfunction isDelimiter(el: Element | null, className: string): HTMLElement | undefined {\n return el?.classList.contains(className) && el.textContent == ZERO_WIDTH_SPACE\n ? (el as HTMLElement)\n : undefined;\n}\n\nfunction insertDelimiter(doc: Document, element: Element, isAfter: boolean) {\n const span = doc.createElement('span');\n\n span.className = isAfter ? DELIMITER_AFTER : DELIMITER_BEFORE;\n span.appendChild(doc.createTextNode(ZERO_WIDTH_SPACE));\n element.parentNode?.insertBefore(span, isAfter ? element.nextSibling : element);\n\n return span;\n}\n"]}
1
+ {"version":3,"file":"entityUtils.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-dom/lib/domUtils/entityUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import toArray from './toArray';\nimport { applyFormat } from '../modelToDom/utils/applyFormat';\nimport { isElementOfType } from './isElementOfType';\nimport { isNodeOfType } from './isNodeOfType';\nimport type {\n ContentModelEntityFormat,\n ContentModelSegmentFormat,\n ModelToDomContext,\n} from 'roosterjs-content-model-types';\n\nconst ENTITY_INFO_NAME = '_Entity';\nconst ENTITY_TYPE_PREFIX = '_EType_';\nconst ENTITY_ID_PREFIX = '_EId_';\nconst ENTITY_READONLY_PREFIX = '_EReadonly_';\nconst ZERO_WIDTH_SPACE = '\\u200B';\nconst DELIMITER_BEFORE = 'entityDelimiterBefore';\nconst DELIMITER_AFTER = 'entityDelimiterAfter';\n\n/**\n * Check if the given DOM Node is an entity wrapper element\n */\nexport function isEntityElement(node: Node): boolean {\n return isNodeOfType(node, 'ELEMENT_NODE') && node.classList.contains(ENTITY_INFO_NAME);\n}\n\n/**\n * Get all entity wrapper elements under the given root element\n * @param root The root element to query from\n * @returns An array of entity wrapper elements\n */\nexport function getAllEntityWrappers(root: HTMLElement): HTMLElement[] {\n return toArray(root.querySelectorAll('.' + ENTITY_INFO_NAME)) as HTMLElement[];\n}\n\n/**\n * Parse entity class names from entity wrapper element\n * @param className Class names of entity\n * @param format The output entity format object\n */\nexport function parseEntityClassName(\n className: string,\n format: ContentModelEntityFormat\n): boolean | undefined {\n if (className == ENTITY_INFO_NAME) {\n return true;\n } else if (className.indexOf(ENTITY_TYPE_PREFIX) == 0) {\n format.entityType = className.substring(ENTITY_TYPE_PREFIX.length);\n } else if (className.indexOf(ENTITY_ID_PREFIX) == 0) {\n format.id = className.substring(ENTITY_ID_PREFIX.length);\n } else if (className.indexOf(ENTITY_READONLY_PREFIX) == 0) {\n format.isReadonly = className.substring(ENTITY_READONLY_PREFIX.length) == '1';\n }\n}\n\n/**\n * Generate Entity class names for an entity wrapper\n * @param format The source entity format object\n * @returns A combined CSS class name string for entity wrapper\n */\nexport function generateEntityClassNames(format: ContentModelEntityFormat): string {\n return format.isFakeEntity\n ? ''\n : `${ENTITY_INFO_NAME} ${ENTITY_TYPE_PREFIX}${format.entityType ?? ''} ${\n format.id ? `${ENTITY_ID_PREFIX}${format.id} ` : ''\n }${ENTITY_READONLY_PREFIX}${format.isReadonly ? '1' : '0'}`;\n}\n\n/**\n * Checks whether the node provided is a Entity delimiter\n * @param node the node to check\n * @return true if it is a delimiter\n */\nexport function isEntityDelimiter(element: HTMLElement): boolean {\n return (\n isElementOfType(element, 'span') &&\n (element.classList.contains(DELIMITER_AFTER) ||\n element.classList.contains(DELIMITER_BEFORE)) &&\n element.textContent === ZERO_WIDTH_SPACE\n );\n}\n\n/**\n * Adds delimiters to the element provided. If the delimiters already exists, will not be added\n * @param element the node to add the delimiters\n * @param format format to set to the delimiters, so when typing inside of one the format is not lost\n * @param context Model to Dom context to use.\n */\nexport function addDelimiters(\n doc: Document,\n element: HTMLElement,\n format?: ContentModelSegmentFormat | null,\n context?: ModelToDomContext\n): HTMLElement[] {\n let [delimiterAfter, delimiterBefore] = getDelimiters(element);\n\n if (!delimiterAfter) {\n delimiterAfter = insertDelimiter(doc, element, true /*isAfter*/);\n if (context && format) {\n applyFormat(delimiterAfter, context.formatAppliers.segment, format, context);\n }\n }\n\n if (!delimiterBefore) {\n delimiterBefore = insertDelimiter(doc, element, false /*isAfter*/);\n if (context && format) {\n applyFormat(delimiterBefore, context.formatAppliers.segment, format, context);\n }\n }\n\n return [delimiterAfter, delimiterBefore];\n}\n\nfunction getDelimiters(entityWrapper: HTMLElement): (HTMLElement | undefined)[] {\n const result: (HTMLElement | undefined)[] = [];\n const { nextElementSibling, previousElementSibling } = entityWrapper;\n result.push(\n isDelimiter(nextElementSibling, DELIMITER_AFTER),\n isDelimiter(previousElementSibling, DELIMITER_BEFORE)\n );\n\n return result;\n}\n\nfunction isDelimiter(el: Element | null, className: string): HTMLElement | undefined {\n return el?.classList.contains(className) && el.textContent == ZERO_WIDTH_SPACE\n ? (el as HTMLElement)\n : undefined;\n}\n\nfunction insertDelimiter(doc: Document, element: Element, isAfter: boolean) {\n const span = doc.createElement('span');\n\n span.className = isAfter ? DELIMITER_AFTER : DELIMITER_BEFORE;\n span.appendChild(doc.createTextNode(ZERO_WIDTH_SPACE));\n element.parentNode?.insertBefore(span, isAfter ? element.nextSibling : element);\n\n return span;\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import type { FormatHandler } from '../FormatHandler';
2
- import type { PaddingFormat } from 'roosterjs-content-model-types';
2
+ import type { DirectionFormat, PaddingFormat } from 'roosterjs-content-model-types';
3
3
  /**
4
4
  * @internal
5
5
  */
6
- export declare const paddingFormatHandler: FormatHandler<PaddingFormat>;
6
+ export declare const paddingFormatHandler: FormatHandler<PaddingFormat & DirectionFormat>;
@@ -1,22 +1,36 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.paddingFormatHandler = void 0;
4
+ var directionFormatHandler_1 = require("./directionFormatHandler");
4
5
  var PaddingKeys = [
5
6
  'paddingTop',
6
7
  'paddingRight',
7
8
  'paddingBottom',
8
9
  'paddingLeft',
9
10
  ];
11
+ var AlternativeKeyLtr = {
12
+ paddingLeft: 'paddingInlineStart',
13
+ };
14
+ var AlternativeKeyRtl = {
15
+ paddingRight: 'paddingInlineStart',
16
+ };
10
17
  /**
11
18
  * @internal
12
19
  */
13
20
  exports.paddingFormatHandler = {
14
- parse: function (format, element, _, defaultStyle) {
21
+ parse: function (format, element, context, defaultStyle) {
22
+ directionFormatHandler_1.directionFormatHandler.parse(format, element, context, defaultStyle);
15
23
  PaddingKeys.forEach(function (key) {
16
- var _a;
24
+ var _a, _b;
17
25
  var value = element.style[key];
18
- var defaultValue = (_a = defaultStyle[key]) !== null && _a !== void 0 ? _a : '0px';
19
- if (value == '0') {
26
+ var alterativeKey = (format.direction == 'rtl'
27
+ ? AlternativeKeyRtl
28
+ : AlternativeKeyLtr)[key];
29
+ var defaultValue = ((_b = (_a = defaultStyle[key]) !== null && _a !== void 0 ? _a : (alterativeKey ? defaultStyle[alterativeKey] : undefined)) !== null && _b !== void 0 ? _b : '0px') + '';
30
+ if (!value) {
31
+ value = defaultValue;
32
+ }
33
+ if (!value || value == '0') {
20
34
  value = '0px';
21
35
  }
22
36
  if (value && value != defaultValue) {
@@ -24,10 +38,17 @@ exports.paddingFormatHandler = {
24
38
  }
25
39
  });
26
40
  },
27
- apply: function (format, element) {
41
+ apply: function (format, element, context) {
28
42
  PaddingKeys.forEach(function (key) {
29
43
  var value = format[key];
30
- if (value) {
44
+ var defaultValue = undefined;
45
+ if (element.tagName == 'OL' || element.tagName == 'UL') {
46
+ if ((format.direction == 'rtl' && key == 'paddingRight') ||
47
+ (format.direction != 'rtl' && key == 'paddingLeft')) {
48
+ defaultValue = '40px';
49
+ }
50
+ }
51
+ if (value && value != defaultValue) {
31
52
  element.style[key] = value;
32
53
  }
33
54
  });
@@ -1 +1 @@
1
- {"version":3,"file":"paddingFormatHandler.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-dom/lib/formatHandlers/block/paddingFormatHandler.ts"],"names":[],"mappings":";;;AAGA,IAAM,WAAW,GAAwD;IACrE,YAAY;IACZ,cAAc;IACd,eAAe;IACf,aAAa;CAChB,CAAC;AAEF;;GAEG;AACU,QAAA,oBAAoB,GAAiC;IAC9D,KAAK,EAAE,UAAC,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY;QACpC,WAAW,CAAC,OAAO,CAAC,UAAA,GAAG;;YACnB,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAM,YAAY,GAAG,MAAA,YAAY,CAAC,GAAG,CAAC,mCAAI,KAAK,CAAC;YAEhD,IAAI,KAAK,IAAI,GAAG,EAAE;gBACd,KAAK,GAAG,KAAK,CAAC;aACjB;YAED,IAAI,KAAK,IAAI,KAAK,IAAI,YAAY,EAAE;gBAChC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;aACvB;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IACD,KAAK,EAAE,UAAC,MAAM,EAAE,OAAO;QACnB,WAAW,CAAC,OAAO,CAAC,UAAA,GAAG;YACnB,IAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1B,IAAI,KAAK,EAAE;gBACP,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;aAC9B;QACL,CAAC,CAAC,CAAC;IACP,CAAC;CACJ,CAAC","sourcesContent":["import type { FormatHandler } from '../FormatHandler';\nimport type { PaddingFormat } from 'roosterjs-content-model-types';\n\nconst PaddingKeys: (keyof PaddingFormat & keyof CSSStyleDeclaration)[] = [\n 'paddingTop',\n 'paddingRight',\n 'paddingBottom',\n 'paddingLeft',\n];\n\n/**\n * @internal\n */\nexport const paddingFormatHandler: FormatHandler<PaddingFormat> = {\n parse: (format, element, _, defaultStyle) => {\n PaddingKeys.forEach(key => {\n let value = element.style[key];\n const defaultValue = defaultStyle[key] ?? '0px';\n\n if (value == '0') {\n value = '0px';\n }\n\n if (value && value != defaultValue) {\n format[key] = value;\n }\n });\n },\n apply: (format, element) => {\n PaddingKeys.forEach(key => {\n const value = format[key];\n if (value) {\n element.style[key] = value;\n }\n });\n },\n};\n"]}
1
+ {"version":3,"file":"paddingFormatHandler.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-dom/lib/formatHandlers/block/paddingFormatHandler.ts"],"names":[],"mappings":";;;AAAA,mEAAkE;AAIlE,IAAM,WAAW,GAAwD;IACrE,YAAY;IACZ,cAAc;IACd,eAAe;IACf,aAAa;CAChB,CAAC;AAEF,IAAM,iBAAiB,GAGlB;IACD,WAAW,EAAE,oBAAoB;CACpC,CAAC;AAEF,IAAM,iBAAiB,GAGlB;IACD,YAAY,EAAE,oBAAoB;CACrC,CAAC;AAEF;;GAEG;AACU,QAAA,oBAAoB,GAAmD;IAChF,KAAK,EAAE,UAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY;QAC1C,+CAAsB,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;QAErE,WAAW,CAAC,OAAO,CAAC,UAAA,GAAG;;YACnB,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAM,aAAa,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,KAAK;gBAC5C,CAAC,CAAC,iBAAiB;gBACnB,CAAC,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAM,YAAY,GACd,CAAC,MAAA,MAAA,YAAY,CAAC,GAAG,CAAC,mCACd,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,mCACzD,KAAK,CAAC,GAAG,EAAE,CAAC;YAEpB,IAAI,CAAC,KAAK,EAAE;gBACR,KAAK,GAAG,YAAY,CAAC;aACxB;YAED,IAAI,CAAC,KAAK,IAAI,KAAK,IAAI,GAAG,EAAE;gBACxB,KAAK,GAAG,KAAK,CAAC;aACjB;YAED,IAAI,KAAK,IAAI,KAAK,IAAI,YAAY,EAAE;gBAChC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;aACvB;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IACD,KAAK,EAAE,UAAC,MAAM,EAAE,OAAO,EAAE,OAAO;QAC5B,WAAW,CAAC,OAAO,CAAC,UAAA,GAAG;YACnB,IAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1B,IAAI,YAAY,GAAuB,SAAS,CAAC;YAEjD,IAAI,OAAO,CAAC,OAAO,IAAI,IAAI,IAAI,OAAO,CAAC,OAAO,IAAI,IAAI,EAAE;gBACpD,IACI,CAAC,MAAM,CAAC,SAAS,IAAI,KAAK,IAAI,GAAG,IAAI,cAAc,CAAC;oBACpD,CAAC,MAAM,CAAC,SAAS,IAAI,KAAK,IAAI,GAAG,IAAI,aAAa,CAAC,EACrD;oBACE,YAAY,GAAG,MAAM,CAAC;iBACzB;aACJ;YAED,IAAI,KAAK,IAAI,KAAK,IAAI,YAAY,EAAE;gBAChC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;aAC9B;QACL,CAAC,CAAC,CAAC;IACP,CAAC;CACJ,CAAC","sourcesContent":["import { directionFormatHandler } from './directionFormatHandler';\nimport type { FormatHandler } from '../FormatHandler';\nimport type { DirectionFormat, PaddingFormat } from 'roosterjs-content-model-types';\n\nconst PaddingKeys: (keyof PaddingFormat & keyof CSSStyleDeclaration)[] = [\n 'paddingTop',\n 'paddingRight',\n 'paddingBottom',\n 'paddingLeft',\n];\n\nconst AlternativeKeyLtr: Partial<Record<\n keyof PaddingFormat,\n keyof CSSStyleDeclaration | undefined\n>> = {\n paddingLeft: 'paddingInlineStart',\n};\n\nconst AlternativeKeyRtl: Partial<Record<\n keyof PaddingFormat,\n keyof CSSStyleDeclaration | undefined\n>> = {\n paddingRight: 'paddingInlineStart',\n};\n\n/**\n * @internal\n */\nexport const paddingFormatHandler: FormatHandler<PaddingFormat & DirectionFormat> = {\n parse: (format, element, context, defaultStyle) => {\n directionFormatHandler.parse(format, element, context, defaultStyle);\n\n PaddingKeys.forEach(key => {\n let value = element.style[key];\n const alterativeKey = (format.direction == 'rtl'\n ? AlternativeKeyRtl\n : AlternativeKeyLtr)[key];\n const defaultValue: string =\n (defaultStyle[key] ??\n (alterativeKey ? defaultStyle[alterativeKey] : undefined) ??\n '0px') + '';\n\n if (!value) {\n value = defaultValue;\n }\n\n if (!value || value == '0') {\n value = '0px';\n }\n\n if (value && value != defaultValue) {\n format[key] = value;\n }\n });\n },\n apply: (format, element, context) => {\n PaddingKeys.forEach(key => {\n const value = format[key];\n let defaultValue: string | undefined = undefined;\n\n if (element.tagName == 'OL' || element.tagName == 'UL') {\n if (\n (format.direction == 'rtl' && key == 'paddingRight') ||\n (format.direction != 'rtl' && key == 'paddingLeft')\n ) {\n defaultValue = '40px';\n }\n }\n\n if (value && value != defaultValue) {\n element.style[key] = value;\n }\n });\n },\n};\n"]}
@@ -183,6 +183,7 @@ exports.defaultFormatKeysPerCategory = {
183
183
  divider: (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(sharedBlockFormats), false), (0, tslib_1.__read)(sharedContainerFormats), false), ['display', 'size', 'htmlAlign'], false),
184
184
  container: (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(sharedContainerFormats), false), ['htmlAlign', 'size', 'display'], false),
185
185
  entity: ['entity'],
186
+ general: ['textColor', 'backgroundColor'], // General model still need to do color transformation in dark mode
186
187
  };
187
188
  /**
188
189
  * @internal
@@ -1 +1 @@
1
- {"version":3,"file":"defaultFormatHandlers.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-dom/lib/formatHandlers/defaultFormatHandlers.ts"],"names":[],"mappings":";;;;AAAA,sFAAqF;AACrF,iEAAgE;AAChE,0EAAyE;AACzE,oEAAmE;AACnE,0EAAyE;AACzE,sEAAqE;AACrE,yEAAwE;AACxE,qEAAoE;AACpE,oEAAmE;AACnE,kEAAiE;AACjE,6EAA4E;AAC5E,yEAAwE;AACxE,2DAA0D;AAC1D,yEAAwE;AACxE,4DAA2D;AAC3D,qEAAoE;AACpE,mFAAkF;AAClF,2EAA0E;AAC1E,iEAAgE;AAChE,kFAAiF;AACjF,oFAAmF;AACnF,wEAAuE;AACvE,mEAAkE;AAClE,qEAAoE;AACpE,gEAA+D;AAC/D,qEAAoE;AACpE,yFAAwF;AACxF,6EAA4E;AAC5E,+EAA8E;AAC9E,yEAAwE;AACxE,2EAA0E;AAC1E,+FAA8F;AAC9F,2EAA0E;AAC1E,2EAA0E;AAC1E,kFAAiF;AACjF,2EAA0E;AAC1E,0EAAyE;AAgBzE,IAAM,uBAAuB,GAAmB;IAC5C,eAAe,EAAE,2DAA4B;IAC7C,IAAI,EAAE,qCAAiB;IACvB,MAAM,EAAE,yCAAmB;IAC3B,SAAS,EAAE,+CAAsB;IACjC,SAAS,EAAE,+CAAsB;IACjC,OAAO,EAAE,2CAAoB;IAC7B,SAAS,EAAE,+CAAsB;IACjC,OAAO,EAAE,2CAAoB;IAC7B,KAAK,EAAE,uCAAkB;IACzB,UAAU,EAAE,iDAAuB;IACnC,QAAQ,EAAE,6CAAqB;IAC/B,MAAM,EAAE,yCAAmB;IAC3B,SAAS,EAAE,+CAAsB;IACjC,EAAE,EAAE,iCAAe;IACnB,MAAM,EAAE,yCAAmB;IAC3B,aAAa,EAAE,uDAA0B;IACzC,UAAU,EAAE,iDAAuB;IACnC,IAAI,EAAE,qCAAiB;IACvB,cAAc,EAAE,yDAA2B;IAC3C,eAAe,EAAE,2DAA4B;IAC7C,SAAS,EAAE,+CAAsB;IACjC,MAAM,EAAE,yCAAmB;IAC3B,OAAO,EAAE,2CAAoB;IAC7B,IAAI,EAAE,qCAAiB;IACvB,MAAM,EAAE,yCAAmB;IAC3B,gBAAgB,EAAE,6DAA6B;IAC/C,WAAW,EAAE,mDAAwB;IACrC,YAAY,EAAE,qDAAyB;IACvC,SAAS,EAAE,+CAAsB;IACjC,SAAS,EAAE,+CAAsB;IACjC,oBAAoB,EAAE,qEAAiC;IACvD,UAAU,EAAE,iDAAuB;IACnC,SAAS,EAAE,+CAAsB;IACjC,aAAa,EAAE,uDAA0B;IACzC,UAAU,EAAE,iDAAuB;IACnC,SAAS,EAAE,+CAAsB;CACpC,CAAC;AAEF,IAAM,wBAAwB,GAAmC;IAC7D,eAAe;IACf,YAAY;IACZ,UAAU;CACb,CAAC;AAEF,IAAM,0BAA0B,GAAmC;IAC/D,QAAQ;IACR,WAAW;IACX,kBAAkB;IAClB,QAAQ;IACR,MAAM;CACT,CAAC;AACF,IAAM,kBAAkB,GAAmC;IACvD,WAAW;IACX,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,YAAY;CACf,CAAC;AACF,IAAM,sBAAsB,GAAmC;IAC3D,iBAAiB;IACjB,QAAQ;IACR,SAAS;IACT,QAAQ;CACX,CAAC;AAEF;;GAEG;AACU,QAAA,4BAA4B,GAErC;IACA,KAAK,EAAE,kBAAkB;IACzB,cAAc,EAAE,CAAC,gBAAgB,CAAC;IAClC,eAAe,EAAE,CAAC,iBAAiB,CAAC;IACpC,eAAe,gFACR,kBAAkB;QACrB,WAAW;QACX,WAAW;QACX,YAAY;QACZ,QAAQ;QACR,WAAW;aACd;IACD,SAAS,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,CAAC;IAC1F,iBAAiB,gFAAM,wBAAwB,YAAE,WAAW,EAAE,iBAAiB,EAAE,YAAY,SAAC;IAC9F,mBAAmB,EAAE,0BAA0B;IAC/C,OAAO,2GACA,wBAAwB,+BACxB,0BAA0B;QAC7B,WAAW;QACX,iBAAiB;QACjB,YAAY;aACf;IACD,cAAc,2GAAM,wBAAwB,+BAAK,0BAA0B,YAAE,WAAW,SAAC;IACzF,kBAAkB,2GACX,wBAAwB,+BACxB,0BAA0B;QAC7B,sBAAsB;aACzB;IACD,SAAS,EAAE;QACP,QAAQ;QACR,iBAAiB;QACjB,SAAS;QACT,eAAe;QACf,WAAW;QACX,WAAW;QACX,WAAW;QACX,MAAM;KACT;IACD,QAAQ,EAAE,CAAC,iBAAiB,CAAC;IAC7B,WAAW,EAAE,CAAC,MAAM,CAAC;IACrB,KAAK,EAAE;QACH,IAAI;QACJ,QAAQ;QACR,iBAAiB;QACjB,SAAS;QACT,WAAW;QACX,QAAQ;QACR,MAAM;QACN,aAAa;QACb,WAAW;KACd;IACD,WAAW,EAAE,CAAC,WAAW,EAAE,cAAc,CAAC;IAC1C,eAAe,EAAE,CAAC,WAAW,CAAC;IAC9B,KAAK,EAAE;QACH,IAAI;QACJ,MAAM;QACN,QAAQ;QACR,SAAS;QACT,WAAW;QACX,QAAQ;QACR,WAAW;QACX,SAAS;QACT,OAAO;QACP,eAAe;KAClB;IACD,IAAI,EAAE;QACF,MAAM;QACN,WAAW;QACX,WAAW;QACX,SAAS;QACT,QAAQ;QACR,SAAS;QACT,iBAAiB;QACjB,QAAQ;QACR,MAAM;QACN,WAAW;KACd;IACD,gBAAgB,EAAE,CAAC,WAAW,CAAC;IAC/B,IAAI,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC;IAC/B,OAAO,EAAE,CAAC,SAAS,CAAC;IACpB,OAAO,2GAAM,kBAAkB,+BAAK,sBAAsB,YAAE,SAAS,EAAE,MAAM,EAAE,WAAW,SAAC;IAC3F,SAAS,gFAAM,sBAAsB,YAAE,WAAW,EAAE,MAAM,EAAE,SAAS,SAAC;IACtE,MAAM,EAAE,CAAC,QAAQ,CAAC;CACrB,CAAC;AAEF;;GAEG;AACU,QAAA,oBAAoB,GAAkB,IAAA,6BAAa,EAAC,uBAAuB,CAAC,CAAC,MAAM,CAC5F,UAAC,MAAM,EAAE,GAAG;IACR,MAAM,CAAC,GAAG,CAAC,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC,KAA0B,CAAC;IACtE,OAAO,MAAM,CAAC;AAClB,CAAC,EACc,EAAE,CACpB,CAAC;AAEF;;GAEG;AACU,QAAA,qBAAqB,GAAmB,IAAA,6BAAa,EAAC,uBAAuB,CAAC,CAAC,MAAM,CAC9F,UAAC,MAAM,EAAE,GAAG;IACR,MAAM,CAAC,GAAG,CAAC,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC,KAA2B,CAAC;IACvE,OAAO,MAAM,CAAC;AAClB,CAAC,EACe,EAAE,CACrB,CAAC","sourcesContent":["import { backgroundColorFormatHandler } from './common/backgroundColorFormatHandler';\nimport { boldFormatHandler } from './segment/boldFormatHandler';\nimport { borderBoxFormatHandler } from './common/borderBoxFormatHandler';\nimport { borderFormatHandler } from './common/borderFormatHandler';\nimport { boxShadowFormatHandler } from './common/boxShadowFormatHandler';\nimport { datasetFormatHandler } from './common/datasetFormatHandler';\nimport { directionFormatHandler } from './block/directionFormatHandler';\nimport { displayFormatHandler } from './block/displayFormatHandler';\nimport { entityFormatHandler } from './entity/entityFormatHandler';\nimport { floatFormatHandler } from './common/floatFormatHandler';\nimport { fontFamilyFormatHandler } from './segment/fontFamilyFormatHandler';\nimport { fontSizeFormatHandler } from './segment/fontSizeFormatHandler';\nimport { getObjectKeys } from '../domUtils/getObjectKeys';\nimport { htmlAlignFormatHandler } from './block/htmlAlignFormatHandler';\nimport { idFormatHandler } from './common/idFormatHandler';\nimport { italicFormatHandler } from './segment/italicFormatHandler';\nimport { letterSpacingFormatHandler } from './segment/letterSpacingFormatHandler';\nimport { lineHeightFormatHandler } from './block/lineHeightFormatHandler';\nimport { linkFormatHandler } from './segment/linkFormatHandler';\nimport { listItemThreadFormatHandler } from './list/listItemThreadFormatHandler';\nimport { listLevelThreadFormatHandler } from './list/listLevelThreadFormatHandler';\nimport { listStyleFormatHandler } from './list/listStyleFormatHandler';\nimport { marginFormatHandler } from './block/marginFormatHandler';\nimport { paddingFormatHandler } from './block/paddingFormatHandler';\nimport { sizeFormatHandler } from './common/sizeFormatHandler';\nimport { strikeFormatHandler } from './segment/strikeFormatHandler';\nimport { superOrSubScriptFormatHandler } from './segment/superOrSubScriptFormatHandler';\nimport { tableLayoutFormatHandler } from './table/tableLayoutFormatHandler';\nimport { tableSpacingFormatHandler } from './table/tableSpacingFormatHandler';\nimport { textAlignFormatHandler } from './block/textAlignFormatHandler';\nimport { textColorFormatHandler } from './segment/textColorFormatHandler';\nimport { textColorOnTableCellFormatHandler } from './table/textColorOnTableCellFormatHandler';\nimport { textIndentFormatHandler } from './block/textIndentFormatHandler';\nimport { underlineFormatHandler } from './segment/underlineFormatHandler';\nimport { verticalAlignFormatHandler } from './common/verticalAlignFormatHandler';\nimport { whiteSpaceFormatHandler } from './block/whiteSpaceFormatHandler';\nimport { wordBreakFormatHandler } from './common/wordBreakFormatHandler';\nimport type { FormatHandler } from './FormatHandler';\nimport type {\n ContentModelFormatMap,\n FormatApplier,\n FormatAppliers,\n FormatHandlerTypeMap,\n FormatKey,\n FormatParser,\n FormatParsers,\n} from 'roosterjs-content-model-types';\n\ntype FormatHandlers = {\n [Key in FormatKey]: FormatHandler<FormatHandlerTypeMap[Key]>;\n};\n\nconst defaultFormatHandlerMap: FormatHandlers = {\n backgroundColor: backgroundColorFormatHandler,\n bold: boldFormatHandler,\n border: borderFormatHandler,\n borderBox: borderBoxFormatHandler,\n boxShadow: boxShadowFormatHandler,\n dataset: datasetFormatHandler,\n direction: directionFormatHandler,\n display: displayFormatHandler,\n float: floatFormatHandler,\n fontFamily: fontFamilyFormatHandler,\n fontSize: fontSizeFormatHandler,\n entity: entityFormatHandler,\n htmlAlign: htmlAlignFormatHandler,\n id: idFormatHandler,\n italic: italicFormatHandler,\n letterSpacing: letterSpacingFormatHandler,\n lineHeight: lineHeightFormatHandler,\n link: linkFormatHandler,\n listItemThread: listItemThreadFormatHandler,\n listLevelThread: listLevelThreadFormatHandler,\n listStyle: listStyleFormatHandler,\n margin: marginFormatHandler,\n padding: paddingFormatHandler,\n size: sizeFormatHandler,\n strike: strikeFormatHandler,\n superOrSubScript: superOrSubScriptFormatHandler,\n tableLayout: tableLayoutFormatHandler,\n tableSpacing: tableSpacingFormatHandler,\n textAlign: textAlignFormatHandler,\n textColor: textColorFormatHandler,\n textColorOnTableCell: textColorOnTableCellFormatHandler,\n textIndent: textIndentFormatHandler,\n underline: underlineFormatHandler,\n verticalAlign: verticalAlignFormatHandler,\n whiteSpace: whiteSpaceFormatHandler,\n wordBreak: wordBreakFormatHandler,\n};\n\nconst styleBasedSegmentFormats: (keyof FormatHandlerTypeMap)[] = [\n 'letterSpacing',\n 'fontFamily',\n 'fontSize',\n];\n\nconst elementBasedSegmentFormats: (keyof FormatHandlerTypeMap)[] = [\n 'strike',\n 'underline',\n 'superOrSubScript',\n 'italic',\n 'bold',\n];\nconst sharedBlockFormats: (keyof FormatHandlerTypeMap)[] = [\n 'direction',\n 'textAlign',\n 'textIndent',\n 'lineHeight',\n 'whiteSpace',\n];\nconst sharedContainerFormats: (keyof FormatHandlerTypeMap)[] = [\n 'backgroundColor',\n 'margin',\n 'padding',\n 'border',\n];\n\n/**\n * @internal\n */\nexport const defaultFormatKeysPerCategory: {\n [key in keyof ContentModelFormatMap]: (keyof FormatHandlerTypeMap)[];\n} = {\n block: sharedBlockFormats,\n listItemThread: ['listItemThread'],\n listLevelThread: ['listLevelThread'],\n listItemElement: [\n ...sharedBlockFormats,\n 'direction',\n 'textAlign',\n 'lineHeight',\n 'margin',\n 'listStyle',\n ],\n listLevel: ['direction', 'textAlign', 'margin', 'padding', 'listStyle', 'backgroundColor'],\n styleBasedSegment: [...styleBasedSegmentFormats, 'textColor', 'backgroundColor', 'lineHeight'],\n elementBasedSegment: elementBasedSegmentFormats,\n segment: [\n ...styleBasedSegmentFormats,\n ...elementBasedSegmentFormats,\n 'textColor',\n 'backgroundColor',\n 'lineHeight',\n ],\n segmentOnBlock: [...styleBasedSegmentFormats, ...elementBasedSegmentFormats, 'textColor'],\n segmentOnTableCell: [\n ...styleBasedSegmentFormats,\n ...elementBasedSegmentFormats,\n 'textColorOnTableCell',\n ],\n tableCell: [\n 'border',\n 'backgroundColor',\n 'padding',\n 'verticalAlign',\n 'wordBreak',\n 'textColor',\n 'htmlAlign',\n 'size',\n ],\n tableRow: ['backgroundColor'],\n tableColumn: ['size'],\n table: [\n 'id',\n 'border',\n 'backgroundColor',\n 'display',\n 'htmlAlign',\n 'margin',\n 'size',\n 'tableLayout',\n 'textColor',\n ],\n tableBorder: ['borderBox', 'tableSpacing'],\n tableCellBorder: ['borderBox'],\n image: [\n 'id',\n 'size',\n 'margin',\n 'padding',\n 'borderBox',\n 'border',\n 'boxShadow',\n 'display',\n 'float',\n 'verticalAlign',\n ],\n link: [\n 'link',\n 'textColor',\n 'underline',\n 'display',\n 'margin',\n 'padding',\n 'backgroundColor',\n 'border',\n 'size',\n 'textAlign',\n ],\n segmentUnderLink: ['textColor'],\n code: ['fontFamily', 'display'],\n dataset: ['dataset'],\n divider: [...sharedBlockFormats, ...sharedContainerFormats, 'display', 'size', 'htmlAlign'],\n container: [...sharedContainerFormats, 'htmlAlign', 'size', 'display'],\n entity: ['entity'],\n};\n\n/**\n * @internal\n */\nexport const defaultFormatParsers: FormatParsers = getObjectKeys(defaultFormatHandlerMap).reduce(\n (result, key) => {\n result[key] = defaultFormatHandlerMap[key].parse as FormatParser<any>;\n return result;\n },\n <FormatParsers>{}\n);\n\n/**\n * @internal\n */\nexport const defaultFormatAppliers: FormatAppliers = getObjectKeys(defaultFormatHandlerMap).reduce(\n (result, key) => {\n result[key] = defaultFormatHandlerMap[key].apply as FormatApplier<any>;\n return result;\n },\n <FormatAppliers>{}\n);\n"]}
1
+ {"version":3,"file":"defaultFormatHandlers.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-dom/lib/formatHandlers/defaultFormatHandlers.ts"],"names":[],"mappings":"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","sourcesContent":["import { backgroundColorFormatHandler } from './common/backgroundColorFormatHandler';\nimport { boldFormatHandler } from './segment/boldFormatHandler';\nimport { borderBoxFormatHandler } from './common/borderBoxFormatHandler';\nimport { borderFormatHandler } from './common/borderFormatHandler';\nimport { boxShadowFormatHandler } from './common/boxShadowFormatHandler';\nimport { datasetFormatHandler } from './common/datasetFormatHandler';\nimport { directionFormatHandler } from './block/directionFormatHandler';\nimport { displayFormatHandler } from './block/displayFormatHandler';\nimport { entityFormatHandler } from './entity/entityFormatHandler';\nimport { floatFormatHandler } from './common/floatFormatHandler';\nimport { fontFamilyFormatHandler } from './segment/fontFamilyFormatHandler';\nimport { fontSizeFormatHandler } from './segment/fontSizeFormatHandler';\nimport { getObjectKeys } from '../domUtils/getObjectKeys';\nimport { htmlAlignFormatHandler } from './block/htmlAlignFormatHandler';\nimport { idFormatHandler } from './common/idFormatHandler';\nimport { italicFormatHandler } from './segment/italicFormatHandler';\nimport { letterSpacingFormatHandler } from './segment/letterSpacingFormatHandler';\nimport { lineHeightFormatHandler } from './block/lineHeightFormatHandler';\nimport { linkFormatHandler } from './segment/linkFormatHandler';\nimport { listItemThreadFormatHandler } from './list/listItemThreadFormatHandler';\nimport { listLevelThreadFormatHandler } from './list/listLevelThreadFormatHandler';\nimport { listStyleFormatHandler } from './list/listStyleFormatHandler';\nimport { marginFormatHandler } from './block/marginFormatHandler';\nimport { paddingFormatHandler } from './block/paddingFormatHandler';\nimport { sizeFormatHandler } from './common/sizeFormatHandler';\nimport { strikeFormatHandler } from './segment/strikeFormatHandler';\nimport { superOrSubScriptFormatHandler } from './segment/superOrSubScriptFormatHandler';\nimport { tableLayoutFormatHandler } from './table/tableLayoutFormatHandler';\nimport { tableSpacingFormatHandler } from './table/tableSpacingFormatHandler';\nimport { textAlignFormatHandler } from './block/textAlignFormatHandler';\nimport { textColorFormatHandler } from './segment/textColorFormatHandler';\nimport { textColorOnTableCellFormatHandler } from './table/textColorOnTableCellFormatHandler';\nimport { textIndentFormatHandler } from './block/textIndentFormatHandler';\nimport { underlineFormatHandler } from './segment/underlineFormatHandler';\nimport { verticalAlignFormatHandler } from './common/verticalAlignFormatHandler';\nimport { whiteSpaceFormatHandler } from './block/whiteSpaceFormatHandler';\nimport { wordBreakFormatHandler } from './common/wordBreakFormatHandler';\nimport type { FormatHandler } from './FormatHandler';\nimport type {\n ContentModelFormatMap,\n FormatApplier,\n FormatAppliers,\n FormatHandlerTypeMap,\n FormatKey,\n FormatParser,\n FormatParsers,\n} from 'roosterjs-content-model-types';\n\ntype FormatHandlers = {\n [Key in FormatKey]: FormatHandler<FormatHandlerTypeMap[Key]>;\n};\n\nconst defaultFormatHandlerMap: FormatHandlers = {\n backgroundColor: backgroundColorFormatHandler,\n bold: boldFormatHandler,\n border: borderFormatHandler,\n borderBox: borderBoxFormatHandler,\n boxShadow: boxShadowFormatHandler,\n dataset: datasetFormatHandler,\n direction: directionFormatHandler,\n display: displayFormatHandler,\n float: floatFormatHandler,\n fontFamily: fontFamilyFormatHandler,\n fontSize: fontSizeFormatHandler,\n entity: entityFormatHandler,\n htmlAlign: htmlAlignFormatHandler,\n id: idFormatHandler,\n italic: italicFormatHandler,\n letterSpacing: letterSpacingFormatHandler,\n lineHeight: lineHeightFormatHandler,\n link: linkFormatHandler,\n listItemThread: listItemThreadFormatHandler,\n listLevelThread: listLevelThreadFormatHandler,\n listStyle: listStyleFormatHandler,\n margin: marginFormatHandler,\n padding: paddingFormatHandler,\n size: sizeFormatHandler,\n strike: strikeFormatHandler,\n superOrSubScript: superOrSubScriptFormatHandler,\n tableLayout: tableLayoutFormatHandler,\n tableSpacing: tableSpacingFormatHandler,\n textAlign: textAlignFormatHandler,\n textColor: textColorFormatHandler,\n textColorOnTableCell: textColorOnTableCellFormatHandler,\n textIndent: textIndentFormatHandler,\n underline: underlineFormatHandler,\n verticalAlign: verticalAlignFormatHandler,\n whiteSpace: whiteSpaceFormatHandler,\n wordBreak: wordBreakFormatHandler,\n};\n\nconst styleBasedSegmentFormats: (keyof FormatHandlerTypeMap)[] = [\n 'letterSpacing',\n 'fontFamily',\n 'fontSize',\n];\n\nconst elementBasedSegmentFormats: (keyof FormatHandlerTypeMap)[] = [\n 'strike',\n 'underline',\n 'superOrSubScript',\n 'italic',\n 'bold',\n];\nconst sharedBlockFormats: (keyof FormatHandlerTypeMap)[] = [\n 'direction',\n 'textAlign',\n 'textIndent',\n 'lineHeight',\n 'whiteSpace',\n];\nconst sharedContainerFormats: (keyof FormatHandlerTypeMap)[] = [\n 'backgroundColor',\n 'margin',\n 'padding',\n 'border',\n];\n\n/**\n * @internal\n */\nexport const defaultFormatKeysPerCategory: {\n [key in keyof ContentModelFormatMap]: (keyof FormatHandlerTypeMap)[];\n} = {\n block: sharedBlockFormats,\n listItemThread: ['listItemThread'],\n listLevelThread: ['listLevelThread'],\n listItemElement: [\n ...sharedBlockFormats,\n 'direction',\n 'textAlign',\n 'lineHeight',\n 'margin',\n 'listStyle',\n ],\n listLevel: ['direction', 'textAlign', 'margin', 'padding', 'listStyle', 'backgroundColor'],\n styleBasedSegment: [...styleBasedSegmentFormats, 'textColor', 'backgroundColor', 'lineHeight'],\n elementBasedSegment: elementBasedSegmentFormats,\n segment: [\n ...styleBasedSegmentFormats,\n ...elementBasedSegmentFormats,\n 'textColor',\n 'backgroundColor',\n 'lineHeight',\n ],\n segmentOnBlock: [...styleBasedSegmentFormats, ...elementBasedSegmentFormats, 'textColor'],\n segmentOnTableCell: [\n ...styleBasedSegmentFormats,\n ...elementBasedSegmentFormats,\n 'textColorOnTableCell',\n ],\n tableCell: [\n 'border',\n 'backgroundColor',\n 'padding',\n 'verticalAlign',\n 'wordBreak',\n 'textColor',\n 'htmlAlign',\n 'size',\n ],\n tableRow: ['backgroundColor'],\n tableColumn: ['size'],\n table: [\n 'id',\n 'border',\n 'backgroundColor',\n 'display',\n 'htmlAlign',\n 'margin',\n 'size',\n 'tableLayout',\n 'textColor',\n ],\n tableBorder: ['borderBox', 'tableSpacing'],\n tableCellBorder: ['borderBox'],\n image: [\n 'id',\n 'size',\n 'margin',\n 'padding',\n 'borderBox',\n 'border',\n 'boxShadow',\n 'display',\n 'float',\n 'verticalAlign',\n ],\n link: [\n 'link',\n 'textColor',\n 'underline',\n 'display',\n 'margin',\n 'padding',\n 'backgroundColor',\n 'border',\n 'size',\n 'textAlign',\n ],\n segmentUnderLink: ['textColor'],\n code: ['fontFamily', 'display'],\n dataset: ['dataset'],\n divider: [...sharedBlockFormats, ...sharedContainerFormats, 'display', 'size', 'htmlAlign'],\n container: [...sharedContainerFormats, 'htmlAlign', 'size', 'display'],\n entity: ['entity'],\n general: ['textColor', 'backgroundColor'], // General model still need to do color transformation in dark mode\n};\n\n/**\n * @internal\n */\nexport const defaultFormatParsers: FormatParsers = getObjectKeys(defaultFormatHandlerMap).reduce(\n (result, key) => {\n result[key] = defaultFormatHandlerMap[key].parse as FormatParser<any>;\n return result;\n },\n <FormatParsers>{}\n);\n\n/**\n * @internal\n */\nexport const defaultFormatAppliers: FormatAppliers = getObjectKeys(defaultFormatHandlerMap).reduce(\n (result, key) => {\n result[key] = defaultFormatHandlerMap[key].apply as FormatApplier<any>;\n return result;\n },\n <FormatAppliers>{}\n);\n"]}
@@ -14,7 +14,7 @@ exports.fontSizeFormatHandler = {
14
14
  // the font size will be handled by superOrSubScript handler
15
15
  if (fontSize && !(0, superOrSubScriptFormatHandler_1.isSuperOrSubScript)(fontSize, verticalAlign) && fontSize != 'inherit') {
16
16
  if (element.style.fontSize) {
17
- format.fontSize = normalizeFontSize(fontSize, context.segmentFormat.fontSize);
17
+ format.fontSize = normalizeFontSize(fontSize, context.segmentFormat.fontSize, context);
18
18
  }
19
19
  else if (defaultStyle.fontSize) {
20
20
  format.fontSize = fontSize;
@@ -38,7 +38,7 @@ var KnownFontSizes = {
38
38
  'xx-large': '24pt',
39
39
  'xxx-large': '36pt',
40
40
  };
41
- function normalizeFontSize(fontSize, contextFont) {
41
+ function normalizeFontSize(fontSize, contextFont, context) {
42
42
  var knownFontSize = KnownFontSizes[fontSize];
43
43
  if (knownFontSize) {
44
44
  return knownFontSize;
@@ -46,12 +46,13 @@ function normalizeFontSize(fontSize, contextFont) {
46
46
  else if (fontSize == 'smaller' ||
47
47
  fontSize == 'larger' ||
48
48
  fontSize.endsWith('em') ||
49
- fontSize.endsWith('%')) {
49
+ fontSize.endsWith('%') ||
50
+ fontSize.endsWith('rem')) {
50
51
  if (!contextFont) {
51
52
  return undefined;
52
53
  }
53
54
  else {
54
- var existingFontSize = (0, parseValueWithUnit_1.parseValueWithUnit)(contextFont, undefined /*element*/, 'px');
55
+ var existingFontSize = (0, parseValueWithUnit_1.parseValueWithUnit)(contextFont, fontSize.endsWith('rem') ? context.rootFontSize : undefined /*element*/, 'px');
55
56
  if (existingFontSize) {
56
57
  switch (fontSize) {
57
58
  case 'smaller':
@@ -1 +1 @@
1
- {"version":3,"file":"fontSizeFormatHandler.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-dom/lib/formatHandlers/segment/fontSizeFormatHandler.ts"],"names":[],"mappings":";;;AAAA,iFAAqE;AACrE,kEAAiE;AAIjE;;GAEG;AACU,QAAA,qBAAqB,GAAkC;IAChE,KAAK,EAAE,UAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY;QAC1C,IAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,IAAI,YAAY,CAAC,QAAQ,CAAC;QACjE,IAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,IAAI,YAAY,CAAC,aAAa,CAAC;QAEhF,0EAA0E;QAC1E,4DAA4D;QAC5D,IAAI,QAAQ,IAAI,CAAC,IAAA,kDAAkB,EAAC,QAAQ,EAAE,aAAa,CAAC,IAAI,QAAQ,IAAI,SAAS,EAAE;YACnF,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE;gBACxB,MAAM,CAAC,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;aACjF;iBAAM,IAAI,YAAY,CAAC,QAAQ,EAAE;gBAC9B,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;aAC9B;SACJ;IACL,CAAC;IACD,KAAK,EAAE,UAAC,MAAM,EAAE,OAAO,EAAE,OAAO;QAC5B,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE;YACvE,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;SAC5C;IACL,CAAC;CACJ,CAAC;AAEF,6DAA6D;AAC7D,IAAM,cAAc,GAA2B;IAC3C,UAAU,EAAE,QAAQ;IACpB,SAAS,EAAE,OAAO;IAClB,KAAK,EAAE,QAAQ;IACf,MAAM,EAAE,MAAM;IACd,KAAK,EAAE,QAAQ;IACf,SAAS,EAAE,MAAM;IACjB,UAAU,EAAE,MAAM;IAClB,WAAW,EAAE,MAAM;CACtB,CAAC;AAEF,SAAS,iBAAiB,CAAC,QAAgB,EAAE,WAA+B;IACxE,IAAM,aAAa,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAE/C,IAAI,aAAa,EAAE;QACf,OAAO,aAAa,CAAC;KACxB;SAAM,IACH,QAAQ,IAAI,SAAS;QACrB,QAAQ,IAAI,QAAQ;QACpB,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;QACvB,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EACxB;QACE,IAAI,CAAC,WAAW,EAAE;YACd,OAAO,SAAS,CAAC;SACpB;aAAM;YACH,IAAM,gBAAgB,GAAG,IAAA,uCAAkB,EAAC,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAEtF,IAAI,gBAAgB,EAAE;gBAClB,QAAQ,QAAQ,EAAE;oBACd,KAAK,SAAS;wBACV,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,gBAAgB,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;oBACjE,KAAK,QAAQ;wBACT,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,gBAAgB,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;oBACjE;wBACI,OAAO,IAAA,uCAAkB,EAAC,QAAQ,EAAE,gBAAgB,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;iBAC1E;aACJ;SACJ;KACJ;SAAM,IAAI,QAAQ,IAAI,SAAS,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,OAAO,EAAE;QAC7E,OAAO,SAAS,CAAC;KACpB;SAAM;QACH,OAAO,QAAQ,CAAC;KACnB;AACL,CAAC","sourcesContent":["import { isSuperOrSubScript } from './superOrSubScriptFormatHandler';\nimport { parseValueWithUnit } from '../utils/parseValueWithUnit';\nimport type { FontSizeFormat } from 'roosterjs-content-model-types';\nimport type { FormatHandler } from '../FormatHandler';\n\n/**\n * @internal\n */\nexport const fontSizeFormatHandler: FormatHandler<FontSizeFormat> = {\n parse: (format, element, context, defaultStyle) => {\n const fontSize = element.style.fontSize || defaultStyle.fontSize;\n const verticalAlign = element.style.verticalAlign || defaultStyle.verticalAlign;\n\n // when font size is 'smaller' and the style is for superscript/subscript,\n // the font size will be handled by superOrSubScript handler\n if (fontSize && !isSuperOrSubScript(fontSize, verticalAlign) && fontSize != 'inherit') {\n if (element.style.fontSize) {\n format.fontSize = normalizeFontSize(fontSize, context.segmentFormat.fontSize);\n } else if (defaultStyle.fontSize) {\n format.fontSize = fontSize;\n }\n }\n },\n apply: (format, element, context) => {\n if (format.fontSize && format.fontSize != context.implicitFormat.fontSize) {\n element.style.fontSize = format.fontSize;\n }\n },\n};\n\n// https://developer.mozilla.org/en-US/docs/Web/CSS/font-size\nconst KnownFontSizes: Record<string, string> = {\n 'xx-small': '6.75pt',\n 'x-small': '7.5pt',\n small: '9.75pt',\n medium: '12pt',\n large: '13.5pt',\n 'x-large': '18pt',\n 'xx-large': '24pt',\n 'xxx-large': '36pt',\n};\n\nfunction normalizeFontSize(fontSize: string, contextFont: string | undefined): string | undefined {\n const knownFontSize = KnownFontSizes[fontSize];\n\n if (knownFontSize) {\n return knownFontSize;\n } else if (\n fontSize == 'smaller' ||\n fontSize == 'larger' ||\n fontSize.endsWith('em') ||\n fontSize.endsWith('%')\n ) {\n if (!contextFont) {\n return undefined;\n } else {\n const existingFontSize = parseValueWithUnit(contextFont, undefined /*element*/, 'px');\n\n if (existingFontSize) {\n switch (fontSize) {\n case 'smaller':\n return Math.round((existingFontSize * 500) / 6) / 100 + 'px';\n case 'larger':\n return Math.round((existingFontSize * 600) / 5) / 100 + 'px';\n default:\n return parseValueWithUnit(fontSize, existingFontSize, 'px') + 'px';\n }\n }\n }\n } else if (fontSize == 'inherit' || fontSize == 'revert' || fontSize == 'unset') {\n return undefined;\n } else {\n return fontSize;\n }\n}\n"]}
1
+ {"version":3,"file":"fontSizeFormatHandler.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-dom/lib/formatHandlers/segment/fontSizeFormatHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import { isSuperOrSubScript } from './superOrSubScriptFormatHandler';\nimport { parseValueWithUnit } from '../utils/parseValueWithUnit';\nimport type { EditorContext, FontSizeFormat } from 'roosterjs-content-model-types';\nimport type { FormatHandler } from '../FormatHandler';\n\n/**\n * @internal\n */\nexport const fontSizeFormatHandler: FormatHandler<FontSizeFormat> = {\n parse: (format, element, context, defaultStyle) => {\n const fontSize = element.style.fontSize || defaultStyle.fontSize;\n const verticalAlign = element.style.verticalAlign || defaultStyle.verticalAlign;\n\n // when font size is 'smaller' and the style is for superscript/subscript,\n // the font size will be handled by superOrSubScript handler\n if (fontSize && !isSuperOrSubScript(fontSize, verticalAlign) && fontSize != 'inherit') {\n if (element.style.fontSize) {\n format.fontSize = normalizeFontSize(\n fontSize,\n context.segmentFormat.fontSize,\n context\n );\n } else if (defaultStyle.fontSize) {\n format.fontSize = fontSize;\n }\n }\n },\n apply: (format, element, context) => {\n if (format.fontSize && format.fontSize != context.implicitFormat.fontSize) {\n element.style.fontSize = format.fontSize;\n }\n },\n};\n\n// https://developer.mozilla.org/en-US/docs/Web/CSS/font-size\nconst KnownFontSizes: Record<string, string> = {\n 'xx-small': '6.75pt',\n 'x-small': '7.5pt',\n small: '9.75pt',\n medium: '12pt',\n large: '13.5pt',\n 'x-large': '18pt',\n 'xx-large': '24pt',\n 'xxx-large': '36pt',\n};\n\nfunction normalizeFontSize(\n fontSize: string,\n contextFont: string | undefined,\n context: EditorContext\n): string | undefined {\n const knownFontSize = KnownFontSizes[fontSize];\n\n if (knownFontSize) {\n return knownFontSize;\n } else if (\n fontSize == 'smaller' ||\n fontSize == 'larger' ||\n fontSize.endsWith('em') ||\n fontSize.endsWith('%') ||\n fontSize.endsWith('rem')\n ) {\n if (!contextFont) {\n return undefined;\n } else {\n const existingFontSize = parseValueWithUnit(\n contextFont,\n fontSize.endsWith('rem') ? context.rootFontSize : undefined /*element*/,\n 'px'\n );\n\n if (existingFontSize) {\n switch (fontSize) {\n case 'smaller':\n return Math.round((existingFontSize * 500) / 6) / 100 + 'px';\n case 'larger':\n return Math.round((existingFontSize * 600) / 5) / 100 + 'px';\n default:\n return parseValueWithUnit(fontSize, existingFontSize, 'px') + 'px';\n }\n }\n }\n } else if (fontSize == 'inherit' || fontSize == 'revert' || fontSize == 'unset') {\n return undefined;\n } else {\n return fontSize;\n }\n}\n"]}
@@ -5,6 +5,7 @@ var tslib_1 = require("tslib");
5
5
  var MarginValueRegex = /(-?\d+(\.\d+)?)([a-z]+|%)/;
6
6
  // According to https://developer.mozilla.org/en-US/docs/Glossary/CSS_pixel, 1in = 96px
7
7
  var PixelPerInch = 96;
8
+ var DefaultRootFontSize = 16;
8
9
  /**
9
10
  * Parse unit value with its unit
10
11
  * @param value The source value to parse
@@ -27,7 +28,6 @@ function parseValueWithUnit(value, currentSizePxOrElement, resultUnit) {
27
28
  result = ptToPx(num);
28
29
  break;
29
30
  case 'em':
30
- case 'rem':
31
31
  result = getFontSize(currentSizePxOrElement) * num;
32
32
  break;
33
33
  case 'ex':
@@ -39,6 +39,9 @@ function parseValueWithUnit(value, currentSizePxOrElement, resultUnit) {
39
39
  case 'in':
40
40
  result = num * PixelPerInch;
41
41
  break;
42
+ case 'rem':
43
+ result = (getFontSize(currentSizePxOrElement) || DefaultRootFontSize) * num;
44
+ break;
42
45
  }
43
46
  }
44
47
  if (result > 0 && resultUnit == 'pt') {
@@ -1 +1 @@
1
- {"version":3,"file":"parseValueWithUnit.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-dom/lib/formatHandlers/utils/parseValueWithUnit.ts"],"names":[],"mappings":";;;;AAAA,IAAM,gBAAgB,GAAG,2BAA2B,CAAC;AAErD,uFAAuF;AACvF,IAAM,YAAY,GAAG,EAAE,CAAC;AAExB;;;;;GAKG;AACH,SAAgB,kBAAkB,CAC9B,KAAkB,EAClB,sBAA6C,EAC7C,UAA8B;IAF9B,sBAAA,EAAA,UAAkB;IAElB,2BAAA,EAAA,iBAA8B;IAE9B,IAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,IAAI,KAAK,EAAE;QACD,IAAA,KAAA,oBAAwB,KAAK,IAAA,EAA5B,CAAC,QAAA,EAAE,MAAM,QAAA,EAAE,EAAE,QAAA,EAAE,IAAI,QAAS,CAAC;QACpC,IAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAE/B,QAAQ,IAAI,EAAE;YACV,KAAK,IAAI;gBACL,MAAM,GAAG,GAAG,CAAC;gBACb,MAAM;YACV,KAAK,IAAI;gBACL,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBACrB,MAAM;YACV,KAAK,IAAI,CAAC;YACV,KAAK,KAAK;gBACN,MAAM,GAAG,WAAW,CAAC,sBAAsB,CAAC,GAAG,GAAG,CAAC;gBACnD,MAAM;YACV,KAAK,IAAI;gBACL,MAAM,GAAG,CAAC,WAAW,CAAC,sBAAsB,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;gBACzD,MAAM;YACV,KAAK,GAAG;gBACJ,MAAM,GAAG,CAAC,WAAW,CAAC,sBAAsB,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;gBAC3D,MAAM;YACV,KAAK,IAAI;gBACL,MAAM,GAAG,GAAG,GAAG,YAAY,CAAC;gBAC5B,MAAM;SACb;KACJ;IAED,IAAI,MAAM,GAAG,CAAC,IAAI,UAAU,IAAI,IAAI,EAAE;QAClC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;KAC3B;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAxCD,gDAwCC;AAED,SAAS,WAAW,CAAC,oBAA2C;;IAC5D,IAAI,OAAO,oBAAoB,KAAK,WAAW,EAAE;QAC7C,OAAO,CAAC,CAAC;KACZ;SAAM,IAAI,OAAO,oBAAoB,KAAK,QAAQ,EAAE;QACjD,OAAO,oBAAoB,CAAC;KAC/B;SAAM;QACH,IAAM,SAAS,GACX,MAAA,MAAA,oBAAoB,CAAC,aAAa,CAAC,WAAW,0CAAE,gBAAgB,CAAC,oBAAoB,EAChF,QAAQ,mCAAI,EAAE,CAAC;QACxB,IAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QACxC,IAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QAEpC,OAAO,SAAS,CAAC;KACpB;AACL,CAAC;AAED,SAAS,MAAM,CAAC,EAAU;IACtB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;AAC9C,CAAC;AAED,SAAS,MAAM,CAAC,EAAU;IACtB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;AAC9C,CAAC","sourcesContent":["const MarginValueRegex = /(-?\\d+(\\.\\d+)?)([a-z]+|%)/;\n\n// According to https://developer.mozilla.org/en-US/docs/Glossary/CSS_pixel, 1in = 96px\nconst PixelPerInch = 96;\n\n/**\n * Parse unit value with its unit\n * @param value The source value to parse\n * @param currentSizePxOrElement The source element which has this unit value, or current font size (in px) from context.\n * @param resultUnit Unit for result, can be px or pt. @default px\n */\nexport function parseValueWithUnit(\n value: string = '',\n currentSizePxOrElement?: number | HTMLElement,\n resultUnit: 'px' | 'pt' = 'px'\n): number {\n const match = MarginValueRegex.exec(value);\n let result = 0;\n\n if (match) {\n const [_, numStr, __, unit] = match;\n const num = parseFloat(numStr);\n\n switch (unit) {\n case 'px':\n result = num;\n break;\n case 'pt':\n result = ptToPx(num);\n break;\n case 'em':\n case 'rem':\n result = getFontSize(currentSizePxOrElement) * num;\n break;\n case 'ex':\n result = (getFontSize(currentSizePxOrElement) * num) / 2;\n break;\n case '%':\n result = (getFontSize(currentSizePxOrElement) * num) / 100;\n break;\n case 'in':\n result = num * PixelPerInch;\n break;\n }\n }\n\n if (result > 0 && resultUnit == 'pt') {\n result = pxToPt(result);\n }\n\n return result;\n}\n\nfunction getFontSize(currentSizeOrElement?: number | HTMLElement): number {\n if (typeof currentSizeOrElement === 'undefined') {\n return 0;\n } else if (typeof currentSizeOrElement === 'number') {\n return currentSizeOrElement;\n } else {\n const styleInPt =\n currentSizeOrElement.ownerDocument.defaultView?.getComputedStyle(currentSizeOrElement)\n .fontSize ?? '';\n const floatInPt = parseFloat(styleInPt);\n const floatInPx = ptToPx(floatInPt);\n\n return floatInPx;\n }\n}\n\nfunction ptToPx(pt: number): number {\n return Math.round((pt * 4000) / 3) / 1000;\n}\n\nfunction pxToPt(px: number) {\n return Math.round((px * 3000) / 4) / 1000;\n}\n"]}
1
+ {"version":3,"file":"parseValueWithUnit.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-dom/lib/formatHandlers/utils/parseValueWithUnit.ts"],"names":[],"mappings":";;;;AAAA,IAAM,gBAAgB,GAAG,2BAA2B,CAAC;AAErD,uFAAuF;AACvF,IAAM,YAAY,GAAG,EAAE,CAAC;AAExB,IAAM,mBAAmB,GAAG,EAAE,CAAC;AAE/B;;;;;GAKG;AACH,SAAgB,kBAAkB,CAC9B,KAAkB,EAClB,sBAA6C,EAC7C,UAA8B;IAF9B,sBAAA,EAAA,UAAkB;IAElB,2BAAA,EAAA,iBAA8B;IAE9B,IAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,IAAI,KAAK,EAAE;QACD,IAAA,KAAA,oBAAwB,KAAK,IAAA,EAA5B,CAAC,QAAA,EAAE,MAAM,QAAA,EAAE,EAAE,QAAA,EAAE,IAAI,QAAS,CAAC;QACpC,IAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAE/B,QAAQ,IAAI,EAAE;YACV,KAAK,IAAI;gBACL,MAAM,GAAG,GAAG,CAAC;gBACb,MAAM;YACV,KAAK,IAAI;gBACL,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBACrB,MAAM;YACV,KAAK,IAAI;gBACL,MAAM,GAAG,WAAW,CAAC,sBAAsB,CAAC,GAAG,GAAG,CAAC;gBACnD,MAAM;YACV,KAAK,IAAI;gBACL,MAAM,GAAG,CAAC,WAAW,CAAC,sBAAsB,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;gBACzD,MAAM;YACV,KAAK,GAAG;gBACJ,MAAM,GAAG,CAAC,WAAW,CAAC,sBAAsB,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;gBAC3D,MAAM;YACV,KAAK,IAAI;gBACL,MAAM,GAAG,GAAG,GAAG,YAAY,CAAC;gBAC5B,MAAM;YACV,KAAK,KAAK;gBACN,MAAM,GAAG,CAAC,WAAW,CAAC,sBAAsB,CAAC,IAAI,mBAAmB,CAAC,GAAG,GAAG,CAAC;gBAC5E,MAAM;SACb;KACJ;IAED,IAAI,MAAM,GAAG,CAAC,IAAI,UAAU,IAAI,IAAI,EAAE;QAClC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;KAC3B;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AA1CD,gDA0CC;AAED,SAAS,WAAW,CAAC,oBAA2C;;IAC5D,IAAI,OAAO,oBAAoB,KAAK,WAAW,EAAE;QAC7C,OAAO,CAAC,CAAC;KACZ;SAAM,IAAI,OAAO,oBAAoB,KAAK,QAAQ,EAAE;QACjD,OAAO,oBAAoB,CAAC;KAC/B;SAAM;QACH,IAAM,SAAS,GACX,MAAA,MAAA,oBAAoB,CAAC,aAAa,CAAC,WAAW,0CAAE,gBAAgB,CAAC,oBAAoB,EAChF,QAAQ,mCAAI,EAAE,CAAC;QACxB,IAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QACxC,IAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QAEpC,OAAO,SAAS,CAAC;KACpB;AACL,CAAC;AAED,SAAS,MAAM,CAAC,EAAU;IACtB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;AAC9C,CAAC;AAED,SAAS,MAAM,CAAC,EAAU;IACtB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;AAC9C,CAAC","sourcesContent":["const MarginValueRegex = /(-?\\d+(\\.\\d+)?)([a-z]+|%)/;\n\n// According to https://developer.mozilla.org/en-US/docs/Glossary/CSS_pixel, 1in = 96px\nconst PixelPerInch = 96;\n\nconst DefaultRootFontSize = 16;\n\n/**\n * Parse unit value with its unit\n * @param value The source value to parse\n * @param currentSizePxOrElement The source element which has this unit value, or current font size (in px) from context.\n * @param resultUnit Unit for result, can be px or pt. @default px\n */\nexport function parseValueWithUnit(\n value: string = '',\n currentSizePxOrElement?: number | HTMLElement,\n resultUnit: 'px' | 'pt' = 'px'\n): number {\n const match = MarginValueRegex.exec(value);\n let result = 0;\n\n if (match) {\n const [_, numStr, __, unit] = match;\n const num = parseFloat(numStr);\n\n switch (unit) {\n case 'px':\n result = num;\n break;\n case 'pt':\n result = ptToPx(num);\n break;\n case 'em':\n result = getFontSize(currentSizePxOrElement) * num;\n break;\n case 'ex':\n result = (getFontSize(currentSizePxOrElement) * num) / 2;\n break;\n case '%':\n result = (getFontSize(currentSizePxOrElement) * num) / 100;\n break;\n case 'in':\n result = num * PixelPerInch;\n break;\n case 'rem':\n result = (getFontSize(currentSizePxOrElement) || DefaultRootFontSize) * num;\n break;\n }\n }\n\n if (result > 0 && resultUnit == 'pt') {\n result = pxToPt(result);\n }\n\n return result;\n}\n\nfunction getFontSize(currentSizeOrElement?: number | HTMLElement): number {\n if (typeof currentSizeOrElement === 'undefined') {\n return 0;\n } else if (typeof currentSizeOrElement === 'number') {\n return currentSizeOrElement;\n } else {\n const styleInPt =\n currentSizeOrElement.ownerDocument.defaultView?.getComputedStyle(currentSizeOrElement)\n .fontSize ?? '';\n const floatInPt = parseFloat(styleInPt);\n const floatInPx = ptToPx(floatInPt);\n\n return floatInPx;\n }\n}\n\nfunction ptToPx(pt: number): number {\n return Math.round((pt * 4000) / 3) / 1000;\n}\n\nfunction pxToPt(px: number) {\n return Math.round((px * 3000) / 4) / 1000;\n}\n"]}
package/lib/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export { domToContentModel } from './domToModel/domToContentModel';
2
2
  export { contentModelToDom } from './modelToDom/contentModelToDom';
3
+ export { contentModelToText } from './modelToText/contentModelToText';
3
4
  export { childProcessor, handleRegularSelection, processChildNode, } from './domToModel/processors/childProcessor';
4
5
  export { entityProcessor } from './domToModel/processors/entityProcessor';
5
6
  export { tableProcessor } from './domToModel/processors/tableProcessor';
@@ -14,7 +15,7 @@ export { getObjectKeys } from './domUtils/getObjectKeys';
14
15
  export { default as toArray } from './domUtils/toArray';
15
16
  export { moveChildNodes, wrapAllChildNodes } from './domUtils/moveChildNodes';
16
17
  export { wrap } from './domUtils/wrap';
17
- export { isEntityElement, getAllEntityWrappers, parseEntityClassName, generateEntityClassNames, addDelimiters, } from './domUtils/entityUtils';
18
+ export { isEntityElement, getAllEntityWrappers, parseEntityClassName, generateEntityClassNames, addDelimiters, isEntityDelimiter, } from './domUtils/entityUtils';
18
19
  export { reuseCachedElement } from './domUtils/reuseCachedElement';
19
20
  export { isWhiteSpacePreserved } from './domUtils/isWhiteSpacePreserved';
20
21
  export { createBr } from './modelApi/creators/createBr';
@@ -37,6 +38,7 @@ export { createEmptyModel } from './modelApi/creators/createEmptyModel';
37
38
  export { addBlock } from './modelApi/common/addBlock';
38
39
  export { addCode } from './modelApi/common/addDecorators';
39
40
  export { addLink } from './modelApi/common/addDecorators';
41
+ export { normalizeParagraph } from './modelApi/common/normalizeParagraph';
40
42
  export { normalizeContentModel } from './modelApi/common/normalizeContentModel';
41
43
  export { isGeneralSegment } from './modelApi/common/isGeneralSegment';
42
44
  export { unwrapBlock } from './modelApi/common/unwrapBlock';
package/lib/index.js CHANGED
@@ -1,11 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.unwrapBlock = exports.isGeneralSegment = exports.normalizeContentModel = exports.addLink = exports.addCode = exports.addBlock = exports.createEmptyModel = exports.createListLevel = exports.createDivider = exports.createEntity = exports.createGeneralBlock = exports.createGeneralSegment = exports.createParagraphDecorator = exports.createContentModelDocument = exports.createImage = exports.createText = exports.createTableCell = exports.createTable = exports.createSelectionMarker = exports.createParagraph = exports.createFormatContainer = exports.createListItem = exports.createBr = exports.isWhiteSpacePreserved = exports.reuseCachedElement = exports.addDelimiters = exports.generateEntityClassNames = exports.parseEntityClassName = exports.getAllEntityWrappers = exports.isEntityElement = exports.wrap = exports.wrapAllChildNodes = exports.moveChildNodes = exports.toArray = exports.getObjectKeys = exports.isElementOfType = exports.isNodeOfType = exports.hasMetadata = exports.updateMetadata = exports.isBlockElement = exports.areSameFormats = exports.parseFormat = exports.getRegularSelectionOffsets = exports.tableProcessor = exports.entityProcessor = exports.processChildNode = exports.handleRegularSelection = exports.childProcessor = exports.contentModelToDom = exports.domToContentModel = void 0;
4
- exports.createModelToDomConfig = exports.createModelToDomContextWithConfig = exports.createModelToDomContext = exports.createDomToModelConfig = exports.createDomToModelContextWithConfig = exports.createDomToModelContext = exports.parseColor = exports.setColor = exports.getColor = exports.DeprecatedColors = exports.BorderKeys = exports.parseValueWithUnit = exports.setParagraphNotImplicit = exports.normalizeSingleSegment = exports.isEmpty = exports.addSegment = void 0;
3
+ exports.normalizeParagraph = exports.addLink = exports.addCode = exports.addBlock = exports.createEmptyModel = exports.createListLevel = exports.createDivider = exports.createEntity = exports.createGeneralBlock = exports.createGeneralSegment = exports.createParagraphDecorator = exports.createContentModelDocument = exports.createImage = exports.createText = exports.createTableCell = exports.createTable = exports.createSelectionMarker = exports.createParagraph = exports.createFormatContainer = exports.createListItem = exports.createBr = exports.isWhiteSpacePreserved = exports.reuseCachedElement = exports.isEntityDelimiter = exports.addDelimiters = exports.generateEntityClassNames = exports.parseEntityClassName = exports.getAllEntityWrappers = exports.isEntityElement = exports.wrap = exports.wrapAllChildNodes = exports.moveChildNodes = exports.toArray = exports.getObjectKeys = exports.isElementOfType = exports.isNodeOfType = exports.hasMetadata = exports.updateMetadata = exports.isBlockElement = exports.areSameFormats = exports.parseFormat = exports.getRegularSelectionOffsets = exports.tableProcessor = exports.entityProcessor = exports.processChildNode = exports.handleRegularSelection = exports.childProcessor = exports.contentModelToText = exports.contentModelToDom = exports.domToContentModel = void 0;
4
+ exports.createModelToDomConfig = exports.createModelToDomContextWithConfig = exports.createModelToDomContext = exports.createDomToModelConfig = exports.createDomToModelContextWithConfig = exports.createDomToModelContext = exports.parseColor = exports.setColor = exports.getColor = exports.DeprecatedColors = exports.BorderKeys = exports.parseValueWithUnit = exports.setParagraphNotImplicit = exports.normalizeSingleSegment = exports.isEmpty = exports.addSegment = exports.unwrapBlock = exports.isGeneralSegment = exports.normalizeContentModel = void 0;
5
5
  var domToContentModel_1 = require("./domToModel/domToContentModel");
6
6
  Object.defineProperty(exports, "domToContentModel", { enumerable: true, get: function () { return domToContentModel_1.domToContentModel; } });
7
7
  var contentModelToDom_1 = require("./modelToDom/contentModelToDom");
8
8
  Object.defineProperty(exports, "contentModelToDom", { enumerable: true, get: function () { return contentModelToDom_1.contentModelToDom; } });
9
+ var contentModelToText_1 = require("./modelToText/contentModelToText");
10
+ Object.defineProperty(exports, "contentModelToText", { enumerable: true, get: function () { return contentModelToText_1.contentModelToText; } });
9
11
  var childProcessor_1 = require("./domToModel/processors/childProcessor");
10
12
  Object.defineProperty(exports, "childProcessor", { enumerable: true, get: function () { return childProcessor_1.childProcessor; } });
11
13
  Object.defineProperty(exports, "handleRegularSelection", { enumerable: true, get: function () { return childProcessor_1.handleRegularSelection; } });
@@ -44,6 +46,7 @@ Object.defineProperty(exports, "getAllEntityWrappers", { enumerable: true, get:
44
46
  Object.defineProperty(exports, "parseEntityClassName", { enumerable: true, get: function () { return entityUtils_1.parseEntityClassName; } });
45
47
  Object.defineProperty(exports, "generateEntityClassNames", { enumerable: true, get: function () { return entityUtils_1.generateEntityClassNames; } });
46
48
  Object.defineProperty(exports, "addDelimiters", { enumerable: true, get: function () { return entityUtils_1.addDelimiters; } });
49
+ Object.defineProperty(exports, "isEntityDelimiter", { enumerable: true, get: function () { return entityUtils_1.isEntityDelimiter; } });
47
50
  var reuseCachedElement_1 = require("./domUtils/reuseCachedElement");
48
51
  Object.defineProperty(exports, "reuseCachedElement", { enumerable: true, get: function () { return reuseCachedElement_1.reuseCachedElement; } });
49
52
  var isWhiteSpacePreserved_1 = require("./domUtils/isWhiteSpacePreserved");
@@ -88,6 +91,8 @@ var addDecorators_1 = require("./modelApi/common/addDecorators");
88
91
  Object.defineProperty(exports, "addCode", { enumerable: true, get: function () { return addDecorators_1.addCode; } });
89
92
  var addDecorators_2 = require("./modelApi/common/addDecorators");
90
93
  Object.defineProperty(exports, "addLink", { enumerable: true, get: function () { return addDecorators_2.addLink; } });
94
+ var normalizeParagraph_1 = require("./modelApi/common/normalizeParagraph");
95
+ Object.defineProperty(exports, "normalizeParagraph", { enumerable: true, get: function () { return normalizeParagraph_1.normalizeParagraph; } });
91
96
  var normalizeContentModel_1 = require("./modelApi/common/normalizeContentModel");
92
97
  Object.defineProperty(exports, "normalizeContentModel", { enumerable: true, get: function () { return normalizeContentModel_1.normalizeContentModel; } });
93
98
  var isGeneralSegment_1 = require("./modelApi/common/isGeneralSegment");