roosterjs-content-model-dom 9.42.0 → 9.44.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/lib/domUtils/retrieveDocumentMetadata.d.ts +6 -0
  2. package/lib/domUtils/retrieveDocumentMetadata.js +23 -0
  3. package/lib/domUtils/retrieveDocumentMetadata.js.map +1 -0
  4. package/lib/index.d.ts +1 -0
  5. package/lib/index.js +4 -2
  6. package/lib/index.js.map +1 -1
  7. package/lib/modelToDom/handlers/handleBlockGroupChildren.js +17 -11
  8. package/lib/modelToDom/handlers/handleBlockGroupChildren.js.map +1 -1
  9. package/lib/modelToDom/handlers/handleList.js +51 -11
  10. package/lib/modelToDom/handlers/handleList.js.map +1 -1
  11. package/lib/modelToDom/handlers/handleListItem.js +32 -7
  12. package/lib/modelToDom/handlers/handleListItem.js.map +1 -1
  13. package/lib/modelToDom/utils/cleanUpRestNodes.d.ts +8 -0
  14. package/lib/modelToDom/utils/cleanUpRestNodes.js +24 -0
  15. package/lib/modelToDom/utils/cleanUpRestNodes.js.map +1 -0
  16. package/lib/modelToDom/utils/stackFormat.js +3 -0
  17. package/lib/modelToDom/utils/stackFormat.js.map +1 -1
  18. package/lib-amd/domUtils/retrieveDocumentMetadata.d.ts +6 -0
  19. package/lib-amd/domUtils/retrieveDocumentMetadata.js +24 -0
  20. package/lib-amd/domUtils/retrieveDocumentMetadata.js.map +1 -0
  21. package/lib-amd/index.d.ts +1 -0
  22. package/lib-amd/index.js +3 -2
  23. package/lib-amd/index.js.map +1 -1
  24. package/lib-amd/modelToDom/handlers/handleBlockGroupChildren.js +17 -11
  25. package/lib-amd/modelToDom/handlers/handleBlockGroupChildren.js.map +1 -1
  26. package/lib-amd/modelToDom/handlers/handleList.js +50 -12
  27. package/lib-amd/modelToDom/handlers/handleList.js.map +1 -1
  28. package/lib-amd/modelToDom/handlers/handleListItem.js +32 -8
  29. package/lib-amd/modelToDom/handlers/handleListItem.js.map +1 -1
  30. package/lib-amd/modelToDom/utils/cleanUpRestNodes.d.ts +8 -0
  31. package/lib-amd/modelToDom/utils/cleanUpRestNodes.js +25 -0
  32. package/lib-amd/modelToDom/utils/cleanUpRestNodes.js.map +1 -0
  33. package/lib-amd/modelToDom/utils/stackFormat.js +3 -0
  34. package/lib-amd/modelToDom/utils/stackFormat.js.map +1 -1
  35. package/lib-mjs/domUtils/retrieveDocumentMetadata.d.ts +6 -0
  36. package/lib-mjs/domUtils/retrieveDocumentMetadata.js +19 -0
  37. package/lib-mjs/domUtils/retrieveDocumentMetadata.js.map +1 -0
  38. package/lib-mjs/index.d.ts +1 -0
  39. package/lib-mjs/index.js +1 -0
  40. package/lib-mjs/index.js.map +1 -1
  41. package/lib-mjs/modelToDom/handlers/handleBlockGroupChildren.js +17 -11
  42. package/lib-mjs/modelToDom/handlers/handleBlockGroupChildren.js.map +1 -1
  43. package/lib-mjs/modelToDom/handlers/handleList.js +51 -11
  44. package/lib-mjs/modelToDom/handlers/handleList.js.map +1 -1
  45. package/lib-mjs/modelToDom/handlers/handleListItem.js +32 -7
  46. package/lib-mjs/modelToDom/handlers/handleListItem.js.map +1 -1
  47. package/lib-mjs/modelToDom/utils/cleanUpRestNodes.d.ts +8 -0
  48. package/lib-mjs/modelToDom/utils/cleanUpRestNodes.js +20 -0
  49. package/lib-mjs/modelToDom/utils/cleanUpRestNodes.js.map +1 -0
  50. package/lib-mjs/modelToDom/utils/stackFormat.js +3 -0
  51. package/lib-mjs/modelToDom/utils/stackFormat.js.map +1 -1
  52. package/package.json +2 -2
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Retrieves metadata from the given document, including HTML attributes and meta tags.
3
+ * @param doc The document from which to retrieve metadata.
4
+ * @returns A record containing metadata key-value pairs.
5
+ */
6
+ export declare function retrieveDocumentMetadata(doc: Document): Record<string, string>;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.retrieveDocumentMetadata = void 0;
4
+ var toArray_1 = require("./toArray");
5
+ /**
6
+ * Retrieves metadata from the given document, including HTML attributes and meta tags.
7
+ * @param doc The document from which to retrieve metadata.
8
+ * @returns A record containing metadata key-value pairs.
9
+ */
10
+ function retrieveDocumentMetadata(doc) {
11
+ var _a;
12
+ var result = {};
13
+ var attributes = (_a = doc.querySelector('html')) === null || _a === void 0 ? void 0 : _a.attributes;
14
+ (attributes ? (0, toArray_1.toArray)(attributes) : []).forEach(function (attr) {
15
+ result[attr.name] = attr.value;
16
+ });
17
+ (0, toArray_1.toArray)(doc.querySelectorAll('meta')).forEach(function (meta) {
18
+ result[meta.name] = meta.content;
19
+ });
20
+ return result;
21
+ }
22
+ exports.retrieveDocumentMetadata = retrieveDocumentMetadata;
23
+ //# sourceMappingURL=retrieveDocumentMetadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retrieveDocumentMetadata.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-dom/lib/domUtils/retrieveDocumentMetadata.ts"],"names":[],"mappings":";;;AAAA,qCAAoC;AAEpC;;;;GAIG;AACH,SAAgB,wBAAwB,CAAC,GAAa;;IAClD,IAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,IAAM,UAAU,GAAG,MAAA,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,0CAAE,UAAU,CAAC;IAEzD,CAAC,UAAU,CAAC,CAAC,CAAC,IAAA,iBAAO,EAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,UAAA,IAAI;QAChD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAO,EAAC,GAAG,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,UAAA,IAAI;QAC9C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAClB,CAAC;AAbD,4DAaC","sourcesContent":["import { toArray } from './toArray';\n\n/**\n * Retrieves metadata from the given document, including HTML attributes and meta tags.\n * @param doc The document from which to retrieve metadata.\n * @returns A record containing metadata key-value pairs.\n */\nexport function retrieveDocumentMetadata(doc: Document): Record<string, string> {\n const result: Record<string, string> = {};\n const attributes = doc.querySelector('html')?.attributes;\n\n (attributes ? toArray(attributes) : []).forEach(attr => {\n result[attr.name] = attr.value;\n });\n\n toArray(doc.querySelectorAll('meta')).forEach(meta => {\n result[meta.name] = meta.content;\n });\n\n return result;\n}\n"]}
package/lib/index.d.ts CHANGED
@@ -73,6 +73,7 @@ export { combineBorderValue, extractBorderValues } from './domUtils/style/border
73
73
  export { isPunctuation, isSpace, normalizeText } from './domUtils/stringUtil';
74
74
  export { parseTableCells } from './domUtils/table/parseTableCells';
75
75
  export { readFile } from './domUtils/readFile';
76
+ export { retrieveDocumentMetadata } from './domUtils/retrieveDocumentMetadata';
76
77
  export { transformColor } from './domUtils/style/transformColor';
77
78
  export { normalizeFontFamily } from './domUtils/style/normalizeFontFamily';
78
79
  export { extractClipboardItems } from './domUtils/event/extractClipboardItems';
package/lib/index.js CHANGED
@@ -2,8 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createContentModelDocument = exports.createImage = exports.createText = exports.createTableCell = exports.createTable = exports.createSelectionMarker = exports.createParagraph = exports.createFormatContainer = exports.createListItem = exports.createBr = exports.isLinkUndeletable = exports.setLinkUndeletable = exports.scrollRectIntoView = exports.normalizeRect = exports.isWhiteSpacePreserved = exports.reuseCachedElement = exports.findClosestBlockEntityContainer = exports.isBlockEntityContainer = exports.isEntityDelimiter = exports.addDelimiters = exports.generateEntityClassNames = exports.parseEntityFormat = exports.getAllEntityWrappers = exports.findClosestEntityWrapper = exports.isEntityElement = exports.unwrap = exports.wrap = exports.wrapAllChildNodes = exports.moveChildNodes = exports.toArray = exports.getSafeIdSelector = exports.getObjectKeys = exports.isElementOfType = exports.isNodeOfType = exports.hasMetadata = exports.getMetadata = exports.updateMetadata = exports.buildSelectionMarker = 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
4
  exports.isModifierKey = exports.isCharacterValue = exports.getDOMInsertPointRect = exports.getSelectionRootNode = exports.isBold = exports.createModelToDomConfig = exports.createModelToDomContextWithConfig = exports.createModelToDomContext = exports.createDomToModelConfig = exports.createDomToModelContextWithConfig = exports.createDomToModelContext = exports.defaultGenerateColorKey = exports.parseColor = exports.setColor = exports.getColor = exports.DeprecatedColors = exports.BorderKeys = exports.parseValueWithUnit = exports.getAutoListStyleType = exports.getOrderedListNumberStr = exports.ParagraphFormats = exports.ListFormatsToMove = exports.ListFormatsToKeep = exports.ListFormats = exports.copyFormat = exports.setParagraphNotImplicit = exports.normalizeSegmentFormat = exports.mergeTextSegments = exports.normalizeSingleSegment = exports.isEmpty = exports.addSegment = exports.unwrapBlock = exports.isGeneralSegment = exports.normalizeContentModel = exports.normalizeParagraph = exports.addTextSegment = exports.addLink = exports.addCode = exports.addBlock = exports.mutateSegment = exports.mutateSegments = exports.mutateBlock = exports.createTableRow = exports.createEmptyModel = exports.createListLevel = exports.createDivider = exports.createEntity = exports.createGeneralBlock = exports.createGeneralSegment = exports.createParagraphDecorator = void 0;
5
- exports.getTableCellMetadata = exports.updateTableCellMetadata = exports.getImageMetadata = exports.updateImageMetadata = exports.runEditSteps = exports.getClosestAncestorBlockGroupIndex = exports.getSegmentTextFormat = exports.getListStyleTypeFromString = exports.retrieveModelFormatState = exports.setTableCellBackgroundColor = exports.MIN_ALLOWED_TABLE_CELL_HEIGHT = exports.MIN_ALLOWED_TABLE_CELL_WIDTH = exports.normalizeTable = exports.setFirstColumnFormatBorders = exports.applyTableFormat = exports.deleteBlock = exports.deleteSegment = exports.deleteSelection = exports.mergeModel = exports.cloneModel = exports.setSelection = exports.hasSelectionInBlockGroup = exports.hasSelectionInSegment = exports.hasSelectionInBlock = exports.getSelectedCells = exports.getSelectedSegmentsAndParagraphs = exports.getSelectedSegments = exports.getSelectedParagraphs = exports.getOperationalBlocks = exports.getFirstSelectedTable = exports.getFirstSelectedListItem = exports.iterateSelections = exports.isBlockGroupOfType = exports.getRangesByText = exports.getImageState = exports.setImageState = exports.getParagraphMarker = exports.setParagraphMarker = exports.cacheGetEventData = exports.extractClipboardItems = exports.normalizeFontFamily = exports.transformColor = exports.readFile = exports.parseTableCells = exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = exports.isCursorMovingKey = void 0;
6
- exports.EmptySegmentFormat = exports.UnorderedListStyleMap = exports.OrderedListStyleMap = exports.TableBorderFormat = exports.NumberingListType = exports.BulletListType = exports.ChangeSource = exports.ListMetadataDefinition = exports.getListMetadata = exports.updateListMetadata = exports.getTableMetadata = exports.updateTableMetadata = void 0;
5
+ exports.updateTableCellMetadata = exports.getImageMetadata = exports.updateImageMetadata = exports.runEditSteps = exports.getClosestAncestorBlockGroupIndex = exports.getSegmentTextFormat = exports.getListStyleTypeFromString = exports.retrieveModelFormatState = exports.setTableCellBackgroundColor = exports.MIN_ALLOWED_TABLE_CELL_HEIGHT = exports.MIN_ALLOWED_TABLE_CELL_WIDTH = exports.normalizeTable = exports.setFirstColumnFormatBorders = exports.applyTableFormat = exports.deleteBlock = exports.deleteSegment = exports.deleteSelection = exports.mergeModel = exports.cloneModel = exports.setSelection = exports.hasSelectionInBlockGroup = exports.hasSelectionInSegment = exports.hasSelectionInBlock = exports.getSelectedCells = exports.getSelectedSegmentsAndParagraphs = exports.getSelectedSegments = exports.getSelectedParagraphs = exports.getOperationalBlocks = exports.getFirstSelectedTable = exports.getFirstSelectedListItem = exports.iterateSelections = exports.isBlockGroupOfType = exports.getRangesByText = exports.getImageState = exports.setImageState = exports.getParagraphMarker = exports.setParagraphMarker = exports.cacheGetEventData = exports.extractClipboardItems = exports.normalizeFontFamily = exports.transformColor = exports.retrieveDocumentMetadata = exports.readFile = exports.parseTableCells = exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = exports.isCursorMovingKey = void 0;
6
+ exports.EmptySegmentFormat = exports.UnorderedListStyleMap = exports.OrderedListStyleMap = exports.TableBorderFormat = exports.NumberingListType = exports.BulletListType = exports.ChangeSource = exports.ListMetadataDefinition = exports.getListMetadata = exports.updateListMetadata = exports.getTableMetadata = exports.updateTableMetadata = exports.getTableCellMetadata = void 0;
7
7
  var domToContentModel_1 = require("./domToModel/domToContentModel");
8
8
  Object.defineProperty(exports, "domToContentModel", { enumerable: true, get: function () { return domToContentModel_1.domToContentModel; } });
9
9
  var contentModelToDom_1 = require("./modelToDom/contentModelToDom");
@@ -187,6 +187,8 @@ var parseTableCells_1 = require("./domUtils/table/parseTableCells");
187
187
  Object.defineProperty(exports, "parseTableCells", { enumerable: true, get: function () { return parseTableCells_1.parseTableCells; } });
188
188
  var readFile_1 = require("./domUtils/readFile");
189
189
  Object.defineProperty(exports, "readFile", { enumerable: true, get: function () { return readFile_1.readFile; } });
190
+ var retrieveDocumentMetadata_1 = require("./domUtils/retrieveDocumentMetadata");
191
+ Object.defineProperty(exports, "retrieveDocumentMetadata", { enumerable: true, get: function () { return retrieveDocumentMetadata_1.retrieveDocumentMetadata; } });
190
192
  var transformColor_1 = require("./domUtils/style/transformColor");
191
193
  Object.defineProperty(exports, "transformColor", { enumerable: true, get: function () { return transformColor_1.transformColor; } });
192
194
  var normalizeFontFamily_1 = require("./domUtils/style/normalizeFontFamily");
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/roosterjs-content-model-dom/lib/index.ts"],"names":[],"mappings":"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","sourcesContent":["export { domToContentModel } from './domToModel/domToContentModel';\nexport { contentModelToDom } from './modelToDom/contentModelToDom';\nexport { contentModelToText } from './modelToText/contentModelToText';\n\nexport {\n childProcessor,\n handleRegularSelection,\n processChildNode,\n} from './domToModel/processors/childProcessor';\nexport { entityProcessor } from './domToModel/processors/entityProcessor';\nexport { tableProcessor } from './domToModel/processors/tableProcessor';\nexport { getRegularSelectionOffsets } from './domToModel/utils/getRegularSelectionOffsets';\nexport { parseFormat } from './domToModel/utils/parseFormat';\nexport { areSameFormats } from './domToModel/utils/areSameFormats';\nexport { isBlockElement } from './domToModel/utils/isBlockElement';\nexport { buildSelectionMarker } from './domToModel/utils/buildSelectionMarker';\n\nexport { updateMetadata, getMetadata, hasMetadata } from './modelApi/metadata/updateMetadata';\nexport { isNodeOfType } from './domUtils/isNodeOfType';\nexport { isElementOfType } from './domUtils/isElementOfType';\nexport { getObjectKeys } from './domUtils/getObjectKeys';\nexport { getSafeIdSelector } from './domUtils/getSafeIdSelector';\nexport { toArray } from './domUtils/toArray';\nexport { moveChildNodes, wrapAllChildNodes } from './domUtils/moveChildNodes';\nexport { wrap } from './domUtils/wrap';\nexport { unwrap } from './domUtils/unwrap';\nexport {\n isEntityElement,\n findClosestEntityWrapper,\n getAllEntityWrappers,\n parseEntityFormat,\n generateEntityClassNames,\n addDelimiters,\n isEntityDelimiter,\n isBlockEntityContainer,\n findClosestBlockEntityContainer,\n} from './domUtils/entityUtils';\nexport { reuseCachedElement } from './domUtils/reuseCachedElement';\nexport { isWhiteSpacePreserved } from './domUtils/isWhiteSpacePreserved';\nexport { normalizeRect } from './domUtils/normalizeRect';\nexport { scrollRectIntoView } from './domUtils/scrollRectIntoView';\n\nexport { setLinkUndeletable, isLinkUndeletable } from './domUtils/hiddenProperties/undeletableLink';\n\nexport { createBr } from './modelApi/creators/createBr';\nexport { createListItem } from './modelApi/creators/createListItem';\nexport { createFormatContainer } from './modelApi/creators/createFormatContainer';\nexport { createParagraph } from './modelApi/creators/createParagraph';\nexport { createSelectionMarker } from './modelApi/creators/createSelectionMarker';\nexport { createTable } from './modelApi/creators/createTable';\nexport { createTableCell } from './modelApi/creators/createTableCell';\nexport { createText } from './modelApi/creators/createText';\nexport { createImage } from './modelApi/creators/createImage';\nexport { createContentModelDocument } from './modelApi/creators/createContentModelDocument';\nexport { createParagraphDecorator } from './modelApi/creators/createParagraphDecorator';\nexport { createGeneralSegment } from './modelApi/creators/createGeneralSegment';\nexport { createGeneralBlock } from './modelApi/creators/createGeneralBlock';\nexport { createEntity } from './modelApi/creators/createEntity';\nexport { createDivider } from './modelApi/creators/createDivider';\nexport { createListLevel } from './modelApi/creators/createListLevel';\nexport { createEmptyModel } from './modelApi/creators/createEmptyModel';\nexport { createTableRow } from './modelApi/creators/createTableRow';\n\nexport { mutateBlock, mutateSegments, mutateSegment } from './modelApi/common/mutate';\nexport { addBlock } from './modelApi/common/addBlock';\nexport { addCode } from './modelApi/common/addDecorators';\nexport { addLink } from './modelApi/common/addDecorators';\nexport { addTextSegment } from './modelApi/common/addTextSegment';\nexport { normalizeParagraph } from './modelApi/common/normalizeParagraph';\n\nexport { normalizeContentModel } from './modelApi/common/normalizeContentModel';\nexport { isGeneralSegment } from './modelApi/typeCheck/isGeneralSegment';\nexport { unwrapBlock } from './modelApi/common/unwrapBlock';\nexport { addSegment } from './modelApi/common/addSegment';\nexport { isEmpty } from './modelApi/common/isEmpty';\nexport { normalizeSingleSegment } from './modelApi/common/normalizeSegment';\nexport { mergeTextSegments } from './modelApi/common/mergeTextSegments';\nexport { normalizeSegmentFormat } from './modelApi/common/normalizeSegmentFormat';\n\nexport { setParagraphNotImplicit } from './modelApi/block/setParagraphNotImplicit';\nexport {\n copyFormat,\n ListFormats,\n ListFormatsToKeep,\n ListFormatsToMove,\n ParagraphFormats,\n} from './modelApi/block/copyFormat';\nexport { getOrderedListNumberStr } from './modelApi/list/getOrderedListNumberStr';\nexport { getAutoListStyleType } from './modelApi/list/getAutoListStyleType';\n\nexport { parseValueWithUnit } from './formatHandlers/utils/parseValueWithUnit';\nexport { BorderKeys } from './formatHandlers/common/borderFormatHandler';\nexport {\n DeprecatedColors,\n getColor,\n setColor,\n parseColor,\n defaultGenerateColorKey,\n} from './formatHandlers/utils/color';\n\nexport {\n createDomToModelContext,\n createDomToModelContextWithConfig,\n createDomToModelConfig,\n} from './domToModel/context/createDomToModelContext';\nexport {\n createModelToDomContext,\n createModelToDomContextWithConfig,\n createModelToDomConfig,\n} from './modelToDom/context/createModelToDomContext';\n\nexport { isBold } from './domUtils/style/isBold';\nexport { getSelectionRootNode } from './domUtils/selection/getSelectionRootNode';\nexport { getDOMInsertPointRect } from './domUtils/selection/getDOMInsertPointRect';\nexport { isCharacterValue, isModifierKey, isCursorMovingKey } from './domUtils/event/eventUtils';\nexport { combineBorderValue, extractBorderValues } from './domUtils/style/borderValues';\nexport { isPunctuation, isSpace, normalizeText } from './domUtils/stringUtil';\nexport { parseTableCells } from './domUtils/table/parseTableCells';\nexport { readFile } from './domUtils/readFile';\nexport { transformColor } from './domUtils/style/transformColor';\nexport { normalizeFontFamily } from './domUtils/style/normalizeFontFamily';\nexport { extractClipboardItems } from './domUtils/event/extractClipboardItems';\nexport { cacheGetEventData } from './domUtils/event/cacheGetEventData';\nexport {\n setParagraphMarker,\n getParagraphMarker,\n} from './domUtils/hiddenProperties/paragraphMarker';\nexport { setImageState, getImageState } from './domUtils/hiddenProperties/imageState';\nexport { getRangesByText } from './domUtils/getRangesByText';\n\nexport { isBlockGroupOfType } from './modelApi/typeCheck/isBlockGroupOfType';\n\nexport { iterateSelections } from './modelApi/selection/iterateSelections';\nexport {\n getFirstSelectedListItem,\n getFirstSelectedTable,\n getOperationalBlocks,\n getSelectedParagraphs,\n getSelectedSegments,\n getSelectedSegmentsAndParagraphs,\n} from './modelApi/selection/collectSelections';\nexport { getSelectedCells } from './modelApi/selection/getSelectedCells';\nexport { hasSelectionInBlock } from './modelApi/selection/hasSelectionInBlock';\nexport { hasSelectionInSegment } from './modelApi/selection/hasSelectionInSegment';\nexport { hasSelectionInBlockGroup } from './modelApi/selection/hasSelectionInBlockGroup';\nexport { setSelection } from './modelApi/selection/setSelection';\n\nexport { cloneModel } from './modelApi/editing/cloneModel';\nexport { mergeModel } from './modelApi/editing/mergeModel';\nexport { deleteSelection } from './modelApi/editing/deleteSelection';\nexport { deleteSegment } from './modelApi/editing/deleteSegment';\nexport { deleteBlock } from './modelApi/editing/deleteBlock';\nexport { applyTableFormat, setFirstColumnFormatBorders } from './modelApi/editing/applyTableFormat';\nexport {\n normalizeTable,\n MIN_ALLOWED_TABLE_CELL_WIDTH,\n MIN_ALLOWED_TABLE_CELL_HEIGHT,\n} from './modelApi/editing/normalizeTable';\nexport { setTableCellBackgroundColor } from './modelApi/editing/setTableCellBackgroundColor';\nexport { retrieveModelFormatState } from './modelApi/editing/retrieveModelFormatState';\nexport { getListStyleTypeFromString } from './modelApi/editing/getListStyleTypeFromString';\nexport { getSegmentTextFormat } from './modelApi/editing/getSegmentTextFormat';\nexport { getClosestAncestorBlockGroupIndex } from './modelApi/editing/getClosestAncestorBlockGroupIndex';\nexport { runEditSteps } from './modelApi/editing/runEditSteps';\n\nexport { updateImageMetadata, getImageMetadata } from './modelApi/metadata/updateImageMetadata';\nexport {\n updateTableCellMetadata,\n getTableCellMetadata,\n} from './modelApi/metadata/updateTableCellMetadata';\nexport { updateTableMetadata, getTableMetadata } from './modelApi/metadata/updateTableMetadata';\nexport {\n updateListMetadata,\n getListMetadata,\n ListMetadataDefinition,\n} from './modelApi/metadata/updateListMetadata';\n\nexport { ChangeSource } from './constants/ChangeSource';\nexport { BulletListType } from './constants/BulletListType';\nexport { NumberingListType } from './constants/NumberingListType';\nexport { TableBorderFormat } from './constants/TableBorderFormat';\nexport { OrderedListStyleMap } from './constants/OrderedListStyleMap';\nexport { UnorderedListStyleMap } from './constants/UnorderedListStyleMap';\nexport { EmptySegmentFormat } from './constants/EmptySegmentFormat';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/roosterjs-content-model-dom/lib/index.ts"],"names":[],"mappings":";;;;;;AAAA,oEAAmE;AAA1D,sHAAA,iBAAiB,OAAA;AAC1B,oEAAmE;AAA1D,sHAAA,iBAAiB,OAAA;AAC1B,uEAAsE;AAA7D,wHAAA,kBAAkB,OAAA;AAE3B,yEAIgD;AAH5C,gHAAA,cAAc,OAAA;AACd,wHAAA,sBAAsB,OAAA;AACtB,kHAAA,gBAAgB,OAAA;AAEpB,2EAA0E;AAAjE,kHAAA,eAAe,OAAA;AACxB,yEAAwE;AAA/D,gHAAA,cAAc,OAAA;AACvB,4FAA2F;AAAlF,wIAAA,0BAA0B,OAAA;AACnC,8DAA6D;AAApD,0GAAA,WAAW,OAAA;AACpB,oEAAmE;AAA1D,gHAAA,cAAc,OAAA;AACvB,oEAAmE;AAA1D,gHAAA,cAAc,OAAA;AACvB,gFAA+E;AAAtE,4HAAA,oBAAoB,OAAA;AAE7B,qEAA8F;AAArF,gHAAA,cAAc,OAAA;AAAE,6GAAA,WAAW,OAAA;AAAE,6GAAA,WAAW,OAAA;AACjD,wDAAuD;AAA9C,4GAAA,YAAY,OAAA;AACrB,8DAA6D;AAApD,kHAAA,eAAe,OAAA;AACxB,0DAAyD;AAAhD,8GAAA,aAAa,OAAA;AACtB,kEAAiE;AAAxD,sHAAA,iBAAiB,OAAA;AAC1B,8CAA6C;AAApC,kGAAA,OAAO,OAAA;AAChB,4DAA8E;AAArE,gHAAA,cAAc,OAAA;AAAE,mHAAA,iBAAiB,OAAA;AAC1C,wCAAuC;AAA9B,4FAAA,IAAI,OAAA;AACb,4CAA2C;AAAlC,gGAAA,MAAM,OAAA;AACf,sDAUgC;AAT5B,8GAAA,eAAe,OAAA;AACf,uHAAA,wBAAwB,OAAA;AACxB,mHAAA,oBAAoB,OAAA;AACpB,gHAAA,iBAAiB,OAAA;AACjB,uHAAA,wBAAwB,OAAA;AACxB,4GAAA,aAAa,OAAA;AACb,gHAAA,iBAAiB,OAAA;AACjB,qHAAA,sBAAsB,OAAA;AACtB,8HAAA,+BAA+B,OAAA;AAEnC,oEAAmE;AAA1D,wHAAA,kBAAkB,OAAA;AAC3B,0EAAyE;AAAhE,8HAAA,qBAAqB,OAAA;AAC9B,0DAAyD;AAAhD,8GAAA,aAAa,OAAA;AACtB,oEAAmE;AAA1D,wHAAA,kBAAkB,OAAA;AAE3B,+EAAoG;AAA3F,qHAAA,kBAAkB,OAAA;AAAE,oHAAA,iBAAiB,OAAA;AAE9C,yDAAwD;AAA/C,oGAAA,QAAQ,OAAA;AACjB,qEAAoE;AAA3D,gHAAA,cAAc,OAAA;AACvB,mFAAkF;AAAzE,8HAAA,qBAAqB,OAAA;AAC9B,uEAAsE;AAA7D,kHAAA,eAAe,OAAA;AACxB,mFAAkF;AAAzE,8HAAA,qBAAqB,OAAA;AAC9B,+DAA8D;AAArD,0GAAA,WAAW,OAAA;AACpB,uEAAsE;AAA7D,kHAAA,eAAe,OAAA;AACxB,6DAA4D;AAAnD,wGAAA,UAAU,OAAA;AACnB,+DAA8D;AAArD,0GAAA,WAAW,OAAA;AACpB,6FAA4F;AAAnF,wIAAA,0BAA0B,OAAA;AACnC,yFAAwF;AAA/E,oIAAA,wBAAwB,OAAA;AACjC,iFAAgF;AAAvE,4HAAA,oBAAoB,OAAA;AAC7B,6EAA4E;AAAnE,wHAAA,kBAAkB,OAAA;AAC3B,iEAAgE;AAAvD,4GAAA,YAAY,OAAA;AACrB,mEAAkE;AAAzD,8GAAA,aAAa,OAAA;AACtB,uEAAsE;AAA7D,kHAAA,eAAe,OAAA;AACxB,yEAAwE;AAA/D,oHAAA,gBAAgB,OAAA;AACzB,qEAAoE;AAA3D,gHAAA,cAAc,OAAA;AAEvB,mDAAsF;AAA7E,qGAAA,WAAW,OAAA;AAAE,wGAAA,cAAc,OAAA;AAAE,uGAAA,aAAa,OAAA;AACnD,uDAAsD;AAA7C,oGAAA,QAAQ,OAAA;AACjB,iEAA0D;AAAjD,wGAAA,OAAO,OAAA;AAChB,iEAA0D;AAAjD,wGAAA,OAAO,OAAA;AAChB,mEAAkE;AAAzD,gHAAA,cAAc,OAAA;AACvB,2EAA0E;AAAjE,wHAAA,kBAAkB,OAAA;AAE3B,iFAAgF;AAAvE,8HAAA,qBAAqB,OAAA;AAC9B,0EAAyE;AAAhE,oHAAA,gBAAgB,OAAA;AACzB,6DAA4D;AAAnD,0GAAA,WAAW,OAAA;AACpB,2DAA0D;AAAjD,wGAAA,UAAU,OAAA;AACnB,qDAAoD;AAA3C,kGAAA,OAAO,OAAA;AAChB,uEAA4E;AAAnE,0HAAA,sBAAsB,OAAA;AAC/B,yEAAwE;AAA/D,sHAAA,iBAAiB,OAAA;AAC1B,mFAAkF;AAAzE,gIAAA,sBAAsB,OAAA;AAE/B,oFAAmF;AAA1E,kIAAA,uBAAuB,OAAA;AAChC,0DAMqC;AALjC,wGAAA,UAAU,OAAA;AACV,yGAAA,WAAW,OAAA;AACX,+GAAA,iBAAiB,OAAA;AACjB,+GAAA,iBAAiB,OAAA;AACjB,8GAAA,gBAAgB,OAAA;AAEpB,mFAAkF;AAAzE,kIAAA,uBAAuB,OAAA;AAChC,6EAA4E;AAAnE,4HAAA,oBAAoB,OAAA;AAE7B,gFAA+E;AAAtE,wHAAA,kBAAkB,OAAA;AAC3B,mFAAyE;AAAhE,iHAAA,UAAU,OAAA;AACnB,sDAMsC;AALlC,yGAAA,gBAAgB,OAAA;AAChB,iGAAA,QAAQ,OAAA;AACR,iGAAA,QAAQ,OAAA;AACR,mGAAA,UAAU,OAAA;AACV,gHAAA,uBAAuB,OAAA;AAG3B,wFAIsD;AAHlD,kIAAA,uBAAuB,OAAA;AACvB,4IAAA,iCAAiC,OAAA;AACjC,iIAAA,sBAAsB,OAAA;AAE1B,wFAIsD;AAHlD,kIAAA,uBAAuB,OAAA;AACvB,4IAAA,iCAAiC,OAAA;AACjC,iIAAA,sBAAsB,OAAA;AAG1B,kDAAiD;AAAxC,gGAAA,MAAM,OAAA;AACf,kFAAiF;AAAxE,4HAAA,oBAAoB,OAAA;AAC7B,oFAAmF;AAA1E,8HAAA,qBAAqB,OAAA;AAC9B,0DAAiG;AAAxF,8GAAA,gBAAgB,OAAA;AAAE,2GAAA,aAAa,OAAA;AAAE,+GAAA,iBAAiB,OAAA;AAC3D,8DAAwF;AAA/E,kHAAA,kBAAkB,OAAA;AAAE,mHAAA,mBAAmB,OAAA;AAChD,oDAA8E;AAArE,2GAAA,aAAa,OAAA;AAAE,qGAAA,OAAO,OAAA;AAAE,2GAAA,aAAa,OAAA;AAC9C,oEAAmE;AAA1D,kHAAA,eAAe,OAAA;AACxB,gDAA+C;AAAtC,oGAAA,QAAQ,OAAA;AACjB,gFAA+E;AAAtE,oIAAA,wBAAwB,OAAA;AACjC,kEAAiE;AAAxD,gHAAA,cAAc,OAAA;AACvB,4EAA2E;AAAlE,0HAAA,mBAAmB,OAAA;AAC5B,gFAA+E;AAAtE,8HAAA,qBAAqB,OAAA;AAC9B,wEAAuE;AAA9D,sHAAA,iBAAiB,OAAA;AAC1B,+EAGqD;AAFjD,qHAAA,kBAAkB,OAAA;AAClB,qHAAA,kBAAkB,OAAA;AAEtB,qEAAsF;AAA7E,2GAAA,aAAa,OAAA;AAAE,2GAAA,aAAa,OAAA;AACrC,8DAA6D;AAApD,kHAAA,eAAe,OAAA;AAExB,8EAA6E;AAApE,wHAAA,kBAAkB,OAAA;AAE3B,4EAA2E;AAAlE,sHAAA,iBAAiB,OAAA;AAC1B,4EAOgD;AAN5C,6HAAA,wBAAwB,OAAA;AACxB,0HAAA,qBAAqB,OAAA;AACrB,yHAAA,oBAAoB,OAAA;AACpB,0HAAA,qBAAqB,OAAA;AACrB,wHAAA,mBAAmB,OAAA;AACnB,qIAAA,gCAAgC,OAAA;AAEpC,0EAAyE;AAAhE,oHAAA,gBAAgB,OAAA;AACzB,gFAA+E;AAAtE,0HAAA,mBAAmB,OAAA;AAC5B,oFAAmF;AAA1E,8HAAA,qBAAqB,OAAA;AAC9B,0FAAyF;AAAhF,oIAAA,wBAAwB,OAAA;AACjC,kEAAiE;AAAxD,4GAAA,YAAY,OAAA;AAErB,4DAA2D;AAAlD,wGAAA,UAAU,OAAA;AACnB,4DAA2D;AAAlD,wGAAA,UAAU,OAAA;AACnB,sEAAqE;AAA5D,kHAAA,eAAe,OAAA;AACxB,kEAAiE;AAAxD,8GAAA,aAAa,OAAA;AACtB,8DAA6D;AAApD,0GAAA,WAAW,OAAA;AACpB,wEAAoG;AAA3F,oHAAA,gBAAgB,OAAA;AAAE,+HAAA,2BAA2B,OAAA;AACtD,oEAI2C;AAHvC,gHAAA,cAAc,OAAA;AACd,8HAAA,4BAA4B,OAAA;AAC5B,+HAAA,6BAA6B,OAAA;AAEjC,8FAA6F;AAApF,0IAAA,2BAA2B,OAAA;AACpC,wFAAuF;AAA9E,oIAAA,wBAAwB,OAAA;AACjC,4FAA2F;AAAlF,wIAAA,0BAA0B,OAAA;AACnC,gFAA+E;AAAtE,4HAAA,oBAAoB,OAAA;AAC7B,0GAAyG;AAAhG,sJAAA,iCAAiC,OAAA;AAC1C,gEAA+D;AAAtD,4GAAA,YAAY,OAAA;AAErB,+EAAgG;AAAvF,0HAAA,mBAAmB,OAAA;AAAE,uHAAA,gBAAgB,OAAA;AAC9C,uFAGqD;AAFjD,kIAAA,uBAAuB,OAAA;AACvB,+HAAA,oBAAoB,OAAA;AAExB,+EAAgG;AAAvF,0HAAA,mBAAmB,OAAA;AAAE,uHAAA,gBAAgB,OAAA;AAC9C,6EAIgD;AAH5C,wHAAA,kBAAkB,OAAA;AAClB,qHAAA,eAAe,OAAA;AACf,4HAAA,sBAAsB,OAAA;AAG1B,yDAAwD;AAA/C,4GAAA,YAAY,OAAA;AACrB,6DAA4D;AAAnD,gHAAA,cAAc,OAAA;AACvB,mEAAkE;AAAzD,sHAAA,iBAAiB,OAAA;AAC1B,mEAAkE;AAAzD,sHAAA,iBAAiB,OAAA;AAC1B,uEAAsE;AAA7D,0HAAA,mBAAmB,OAAA;AAC5B,2EAA0E;AAAjE,8HAAA,qBAAqB,OAAA;AAC9B,qEAAoE;AAA3D,wHAAA,kBAAkB,OAAA","sourcesContent":["export { domToContentModel } from './domToModel/domToContentModel';\nexport { contentModelToDom } from './modelToDom/contentModelToDom';\nexport { contentModelToText } from './modelToText/contentModelToText';\n\nexport {\n childProcessor,\n handleRegularSelection,\n processChildNode,\n} from './domToModel/processors/childProcessor';\nexport { entityProcessor } from './domToModel/processors/entityProcessor';\nexport { tableProcessor } from './domToModel/processors/tableProcessor';\nexport { getRegularSelectionOffsets } from './domToModel/utils/getRegularSelectionOffsets';\nexport { parseFormat } from './domToModel/utils/parseFormat';\nexport { areSameFormats } from './domToModel/utils/areSameFormats';\nexport { isBlockElement } from './domToModel/utils/isBlockElement';\nexport { buildSelectionMarker } from './domToModel/utils/buildSelectionMarker';\n\nexport { updateMetadata, getMetadata, hasMetadata } from './modelApi/metadata/updateMetadata';\nexport { isNodeOfType } from './domUtils/isNodeOfType';\nexport { isElementOfType } from './domUtils/isElementOfType';\nexport { getObjectKeys } from './domUtils/getObjectKeys';\nexport { getSafeIdSelector } from './domUtils/getSafeIdSelector';\nexport { toArray } from './domUtils/toArray';\nexport { moveChildNodes, wrapAllChildNodes } from './domUtils/moveChildNodes';\nexport { wrap } from './domUtils/wrap';\nexport { unwrap } from './domUtils/unwrap';\nexport {\n isEntityElement,\n findClosestEntityWrapper,\n getAllEntityWrappers,\n parseEntityFormat,\n generateEntityClassNames,\n addDelimiters,\n isEntityDelimiter,\n isBlockEntityContainer,\n findClosestBlockEntityContainer,\n} from './domUtils/entityUtils';\nexport { reuseCachedElement } from './domUtils/reuseCachedElement';\nexport { isWhiteSpacePreserved } from './domUtils/isWhiteSpacePreserved';\nexport { normalizeRect } from './domUtils/normalizeRect';\nexport { scrollRectIntoView } from './domUtils/scrollRectIntoView';\n\nexport { setLinkUndeletable, isLinkUndeletable } from './domUtils/hiddenProperties/undeletableLink';\n\nexport { createBr } from './modelApi/creators/createBr';\nexport { createListItem } from './modelApi/creators/createListItem';\nexport { createFormatContainer } from './modelApi/creators/createFormatContainer';\nexport { createParagraph } from './modelApi/creators/createParagraph';\nexport { createSelectionMarker } from './modelApi/creators/createSelectionMarker';\nexport { createTable } from './modelApi/creators/createTable';\nexport { createTableCell } from './modelApi/creators/createTableCell';\nexport { createText } from './modelApi/creators/createText';\nexport { createImage } from './modelApi/creators/createImage';\nexport { createContentModelDocument } from './modelApi/creators/createContentModelDocument';\nexport { createParagraphDecorator } from './modelApi/creators/createParagraphDecorator';\nexport { createGeneralSegment } from './modelApi/creators/createGeneralSegment';\nexport { createGeneralBlock } from './modelApi/creators/createGeneralBlock';\nexport { createEntity } from './modelApi/creators/createEntity';\nexport { createDivider } from './modelApi/creators/createDivider';\nexport { createListLevel } from './modelApi/creators/createListLevel';\nexport { createEmptyModel } from './modelApi/creators/createEmptyModel';\nexport { createTableRow } from './modelApi/creators/createTableRow';\n\nexport { mutateBlock, mutateSegments, mutateSegment } from './modelApi/common/mutate';\nexport { addBlock } from './modelApi/common/addBlock';\nexport { addCode } from './modelApi/common/addDecorators';\nexport { addLink } from './modelApi/common/addDecorators';\nexport { addTextSegment } from './modelApi/common/addTextSegment';\nexport { normalizeParagraph } from './modelApi/common/normalizeParagraph';\n\nexport { normalizeContentModel } from './modelApi/common/normalizeContentModel';\nexport { isGeneralSegment } from './modelApi/typeCheck/isGeneralSegment';\nexport { unwrapBlock } from './modelApi/common/unwrapBlock';\nexport { addSegment } from './modelApi/common/addSegment';\nexport { isEmpty } from './modelApi/common/isEmpty';\nexport { normalizeSingleSegment } from './modelApi/common/normalizeSegment';\nexport { mergeTextSegments } from './modelApi/common/mergeTextSegments';\nexport { normalizeSegmentFormat } from './modelApi/common/normalizeSegmentFormat';\n\nexport { setParagraphNotImplicit } from './modelApi/block/setParagraphNotImplicit';\nexport {\n copyFormat,\n ListFormats,\n ListFormatsToKeep,\n ListFormatsToMove,\n ParagraphFormats,\n} from './modelApi/block/copyFormat';\nexport { getOrderedListNumberStr } from './modelApi/list/getOrderedListNumberStr';\nexport { getAutoListStyleType } from './modelApi/list/getAutoListStyleType';\n\nexport { parseValueWithUnit } from './formatHandlers/utils/parseValueWithUnit';\nexport { BorderKeys } from './formatHandlers/common/borderFormatHandler';\nexport {\n DeprecatedColors,\n getColor,\n setColor,\n parseColor,\n defaultGenerateColorKey,\n} from './formatHandlers/utils/color';\n\nexport {\n createDomToModelContext,\n createDomToModelContextWithConfig,\n createDomToModelConfig,\n} from './domToModel/context/createDomToModelContext';\nexport {\n createModelToDomContext,\n createModelToDomContextWithConfig,\n createModelToDomConfig,\n} from './modelToDom/context/createModelToDomContext';\n\nexport { isBold } from './domUtils/style/isBold';\nexport { getSelectionRootNode } from './domUtils/selection/getSelectionRootNode';\nexport { getDOMInsertPointRect } from './domUtils/selection/getDOMInsertPointRect';\nexport { isCharacterValue, isModifierKey, isCursorMovingKey } from './domUtils/event/eventUtils';\nexport { combineBorderValue, extractBorderValues } from './domUtils/style/borderValues';\nexport { isPunctuation, isSpace, normalizeText } from './domUtils/stringUtil';\nexport { parseTableCells } from './domUtils/table/parseTableCells';\nexport { readFile } from './domUtils/readFile';\nexport { retrieveDocumentMetadata } from './domUtils/retrieveDocumentMetadata';\nexport { transformColor } from './domUtils/style/transformColor';\nexport { normalizeFontFamily } from './domUtils/style/normalizeFontFamily';\nexport { extractClipboardItems } from './domUtils/event/extractClipboardItems';\nexport { cacheGetEventData } from './domUtils/event/cacheGetEventData';\nexport {\n setParagraphMarker,\n getParagraphMarker,\n} from './domUtils/hiddenProperties/paragraphMarker';\nexport { setImageState, getImageState } from './domUtils/hiddenProperties/imageState';\nexport { getRangesByText } from './domUtils/getRangesByText';\n\nexport { isBlockGroupOfType } from './modelApi/typeCheck/isBlockGroupOfType';\n\nexport { iterateSelections } from './modelApi/selection/iterateSelections';\nexport {\n getFirstSelectedListItem,\n getFirstSelectedTable,\n getOperationalBlocks,\n getSelectedParagraphs,\n getSelectedSegments,\n getSelectedSegmentsAndParagraphs,\n} from './modelApi/selection/collectSelections';\nexport { getSelectedCells } from './modelApi/selection/getSelectedCells';\nexport { hasSelectionInBlock } from './modelApi/selection/hasSelectionInBlock';\nexport { hasSelectionInSegment } from './modelApi/selection/hasSelectionInSegment';\nexport { hasSelectionInBlockGroup } from './modelApi/selection/hasSelectionInBlockGroup';\nexport { setSelection } from './modelApi/selection/setSelection';\n\nexport { cloneModel } from './modelApi/editing/cloneModel';\nexport { mergeModel } from './modelApi/editing/mergeModel';\nexport { deleteSelection } from './modelApi/editing/deleteSelection';\nexport { deleteSegment } from './modelApi/editing/deleteSegment';\nexport { deleteBlock } from './modelApi/editing/deleteBlock';\nexport { applyTableFormat, setFirstColumnFormatBorders } from './modelApi/editing/applyTableFormat';\nexport {\n normalizeTable,\n MIN_ALLOWED_TABLE_CELL_WIDTH,\n MIN_ALLOWED_TABLE_CELL_HEIGHT,\n} from './modelApi/editing/normalizeTable';\nexport { setTableCellBackgroundColor } from './modelApi/editing/setTableCellBackgroundColor';\nexport { retrieveModelFormatState } from './modelApi/editing/retrieveModelFormatState';\nexport { getListStyleTypeFromString } from './modelApi/editing/getListStyleTypeFromString';\nexport { getSegmentTextFormat } from './modelApi/editing/getSegmentTextFormat';\nexport { getClosestAncestorBlockGroupIndex } from './modelApi/editing/getClosestAncestorBlockGroupIndex';\nexport { runEditSteps } from './modelApi/editing/runEditSteps';\n\nexport { updateImageMetadata, getImageMetadata } from './modelApi/metadata/updateImageMetadata';\nexport {\n updateTableCellMetadata,\n getTableCellMetadata,\n} from './modelApi/metadata/updateTableCellMetadata';\nexport { updateTableMetadata, getTableMetadata } from './modelApi/metadata/updateTableMetadata';\nexport {\n updateListMetadata,\n getListMetadata,\n ListMetadataDefinition,\n} from './modelApi/metadata/updateListMetadata';\n\nexport { ChangeSource } from './constants/ChangeSource';\nexport { BulletListType } from './constants/BulletListType';\nexport { NumberingListType } from './constants/NumberingListType';\nexport { TableBorderFormat } from './constants/TableBorderFormat';\nexport { OrderedListStyleMap } from './constants/OrderedListStyleMap';\nexport { UnorderedListStyleMap } from './constants/UnorderedListStyleMap';\nexport { EmptySegmentFormat } from './constants/EmptySegmentFormat';\n"]}
@@ -1,12 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.handleBlockGroupChildren = void 0;
4
- var isNodeOfType_1 = require("../../domUtils/isNodeOfType");
4
+ var cleanUpRestNodes_1 = require("../utils/cleanUpRestNodes");
5
5
  /**
6
6
  * @internal
7
7
  */
8
8
  var handleBlockGroupChildren = function (doc, parent, group, context) {
9
- var _a;
10
9
  var listFormat = context.listFormat;
11
10
  var nodeStack = listFormat.nodeStack;
12
11
  var refNode = parent.firstChild;
@@ -20,26 +19,33 @@ var handleBlockGroupChildren = function (doc, parent, group, context) {
20
19
  if (index == 0 ||
21
20
  childBlock.blockType != 'BlockGroup' ||
22
21
  childBlock.blockGroupType != 'ListItem') {
23
- listFormat.nodeStack = [];
22
+ cleanUpNodeStack(listFormat.nodeStack, context);
23
+ if (listFormat.nodeStack.length > 0) {
24
+ listFormat.nodeStack = [];
25
+ }
24
26
  }
25
27
  refNode = context.modelHandlers.block(doc, parent, childBlock, context, refNode);
26
28
  if (childBlock.blockType == 'Entity') {
27
29
  (_a = context.domIndexer) === null || _a === void 0 ? void 0 : _a.onBlockEntity(childBlock, group);
28
30
  }
29
31
  });
32
+ cleanUpNodeStack(listFormat.nodeStack, context);
30
33
  // Remove all rest node if any since they don't appear in content model
31
- while (refNode) {
32
- var next = refNode.nextSibling;
33
- if ((0, isNodeOfType_1.isNodeOfType)(refNode, 'ELEMENT_NODE')) {
34
- context.rewriteFromModel.removedBlockElements.push(refNode);
35
- }
36
- (_a = refNode.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(refNode);
37
- refNode = next;
38
- }
34
+ (0, cleanUpRestNodes_1.cleanUpRestNodes)(refNode, context.rewriteFromModel);
39
35
  }
40
36
  finally {
41
37
  listFormat.nodeStack = nodeStack;
42
38
  }
43
39
  };
44
40
  exports.handleBlockGroupChildren = handleBlockGroupChildren;
41
+ function cleanUpNodeStack(nodeStack, context) {
42
+ var _a, _b;
43
+ if (context.allowCacheListItem && nodeStack.length > 0) {
44
+ // Clear list stack, only run to nodeStack[1] because nodeStack[0] is the parent node
45
+ for (var i = nodeStack.length - 1; i > 0; i--) {
46
+ var node = (_b = (_a = nodeStack.pop()) === null || _a === void 0 ? void 0 : _a.refNode) !== null && _b !== void 0 ? _b : null;
47
+ (0, cleanUpRestNodes_1.cleanUpRestNodes)(node, context.rewriteFromModel);
48
+ }
49
+ }
50
+ }
45
51
  //# sourceMappingURL=handleBlockGroupChildren.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"handleBlockGroupChildren.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/handlers/handleBlockGroupChildren.ts"],"names":[],"mappings":";;;AAAA,4DAA2D;AAO3D;;GAEG;AACI,IAAM,wBAAwB,GAAgD,UACjF,GAAa,EACb,MAAY,EACZ,KAA6B,EAC7B,OAA0B;;IAElB,IAAA,UAAU,GAAK,OAAO,WAAZ,CAAa;IAC/B,IAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;IACvC,IAAI,OAAO,GAAgB,MAAM,CAAC,UAAU,CAAC;IAE7C,IAAI;QACA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,UAAC,UAAU,EAAE,KAAK;;YACnC,2CAA2C;YAC3C,wEAAwE;YACxE,sFAAsF;YACtF,+FAA+F;YAC/F,IACI,KAAK,IAAI,CAAC;gBACV,UAAU,CAAC,SAAS,IAAI,YAAY;gBACpC,UAAU,CAAC,cAAc,IAAI,UAAU,EACzC;gBACE,UAAU,CAAC,SAAS,GAAG,EAAE,CAAC;aAC7B;YAED,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAEjF,IAAI,UAAU,CAAC,SAAS,IAAI,QAAQ,EAAE;gBAClC,MAAA,OAAO,CAAC,UAAU,0CAAE,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;aACxD;QACL,CAAC,CAAC,CAAC;QAEH,uEAAuE;QACvE,OAAO,OAAO,EAAE;YACZ,IAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC;YAEjC,IAAI,IAAA,2BAAY,EAAC,OAAO,EAAE,cAAc,CAAC,EAAE;gBACvC,OAAO,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aAC/D;YAED,MAAA,OAAO,CAAC,UAAU,0CAAE,WAAW,CAAC,OAAO,CAAC,CAAC;YACzC,OAAO,GAAG,IAAI,CAAC;SAClB;KACJ;YAAS;QACN,UAAU,CAAC,SAAS,GAAG,SAAS,CAAC;KACpC;AACL,CAAC,CAAC;AA7CW,QAAA,wBAAwB,4BA6CnC","sourcesContent":["import { isNodeOfType } from '../../domUtils/isNodeOfType';\nimport type {\n ContentModelBlockGroup,\n ContentModelHandler,\n ModelToDomContext,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const handleBlockGroupChildren: ContentModelHandler<ContentModelBlockGroup> = (\n doc: Document,\n parent: Node,\n group: ContentModelBlockGroup,\n context: ModelToDomContext\n) => {\n const { listFormat } = context;\n const nodeStack = listFormat.nodeStack;\n let refNode: Node | null = parent.firstChild;\n\n try {\n group.blocks.forEach((childBlock, index) => {\n // When process list, we need a node stack.\n // When there are two continuous lists, they should share the same stack\n // so that list items with same type/threadId can be merged into the same list element\n // In other cases, clear the stack so that two separate lists won't share the same list element\n if (\n index == 0 ||\n childBlock.blockType != 'BlockGroup' ||\n childBlock.blockGroupType != 'ListItem'\n ) {\n listFormat.nodeStack = [];\n }\n\n refNode = context.modelHandlers.block(doc, parent, childBlock, context, refNode);\n\n if (childBlock.blockType == 'Entity') {\n context.domIndexer?.onBlockEntity(childBlock, group);\n }\n });\n\n // Remove all rest node if any since they don't appear in content model\n while (refNode) {\n const next = refNode.nextSibling;\n\n if (isNodeOfType(refNode, 'ELEMENT_NODE')) {\n context.rewriteFromModel.removedBlockElements.push(refNode);\n }\n\n refNode.parentNode?.removeChild(refNode);\n refNode = next;\n }\n } finally {\n listFormat.nodeStack = nodeStack;\n }\n};\n"]}
1
+ {"version":3,"file":"handleBlockGroupChildren.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/handlers/handleBlockGroupChildren.ts"],"names":[],"mappings":";;;AAAA,8DAA6D;AAQ7D;;GAEG;AACI,IAAM,wBAAwB,GAAgD,UACjF,GAAa,EACb,MAAY,EACZ,KAA6B,EAC7B,OAA0B;IAElB,IAAA,UAAU,GAAK,OAAO,WAAZ,CAAa;IAC/B,IAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;IACvC,IAAI,OAAO,GAAgB,MAAM,CAAC,UAAU,CAAC;IAE7C,IAAI;QACA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,UAAC,UAAU,EAAE,KAAK;;YACnC,2CAA2C;YAC3C,wEAAwE;YACxE,sFAAsF;YACtF,+FAA+F;YAC/F,IACI,KAAK,IAAI,CAAC;gBACV,UAAU,CAAC,SAAS,IAAI,YAAY;gBACpC,UAAU,CAAC,cAAc,IAAI,UAAU,EACzC;gBACE,gBAAgB,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBAEhD,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;oBACjC,UAAU,CAAC,SAAS,GAAG,EAAE,CAAC;iBAC7B;aACJ;YAED,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAEjF,IAAI,UAAU,CAAC,SAAS,IAAI,QAAQ,EAAE;gBAClC,MAAA,OAAO,CAAC,UAAU,0CAAE,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;aACxD;QACL,CAAC,CAAC,CAAC;QAEH,gBAAgB,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAEhD,uEAAuE;QACvE,IAAA,mCAAgB,EAAC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;KACvD;YAAS;QACN,UAAU,CAAC,SAAS,GAAG,SAAS,CAAC;KACpC;AACL,CAAC,CAAC;AA1CW,QAAA,wBAAwB,4BA0CnC;AAEF,SAAS,gBAAgB,CAAC,SAAoC,EAAE,OAA0B;;IACtF,IAAI,OAAO,CAAC,kBAAkB,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;QACpD,qFAAqF;QACrF,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC3C,IAAM,IAAI,GAAG,MAAA,MAAA,SAAS,CAAC,GAAG,EAAE,0CAAE,OAAO,mCAAI,IAAI,CAAC;YAE9C,IAAA,mCAAgB,EAAC,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;SACpD;KACJ;AACL,CAAC","sourcesContent":["import { cleanUpRestNodes } from '../utils/cleanUpRestNodes';\nimport type {\n ContentModelBlockGroup,\n ContentModelHandler,\n ModelToDomContext,\n ModelToDomListStackItem,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const handleBlockGroupChildren: ContentModelHandler<ContentModelBlockGroup> = (\n doc: Document,\n parent: Node,\n group: ContentModelBlockGroup,\n context: ModelToDomContext\n) => {\n const { listFormat } = context;\n const nodeStack = listFormat.nodeStack;\n let refNode: Node | null = parent.firstChild;\n\n try {\n group.blocks.forEach((childBlock, index) => {\n // When process list, we need a node stack.\n // When there are two continuous lists, they should share the same stack\n // so that list items with same type/threadId can be merged into the same list element\n // In other cases, clear the stack so that two separate lists won't share the same list element\n if (\n index == 0 ||\n childBlock.blockType != 'BlockGroup' ||\n childBlock.blockGroupType != 'ListItem'\n ) {\n cleanUpNodeStack(listFormat.nodeStack, context);\n\n if (listFormat.nodeStack.length > 0) {\n listFormat.nodeStack = [];\n }\n }\n\n refNode = context.modelHandlers.block(doc, parent, childBlock, context, refNode);\n\n if (childBlock.blockType == 'Entity') {\n context.domIndexer?.onBlockEntity(childBlock, group);\n }\n });\n\n cleanUpNodeStack(listFormat.nodeStack, context);\n\n // Remove all rest node if any since they don't appear in content model\n cleanUpRestNodes(refNode, context.rewriteFromModel);\n } finally {\n listFormat.nodeStack = nodeStack;\n }\n};\n\nfunction cleanUpNodeStack(nodeStack: ModelToDomListStackItem[], context: ModelToDomContext) {\n if (context.allowCacheListItem && nodeStack.length > 0) {\n // Clear list stack, only run to nodeStack[1] because nodeStack[0] is the parent node\n for (let i = nodeStack.length - 1; i > 0; i--) {\n const node = nodeStack.pop()?.refNode ?? null;\n\n cleanUpRestNodes(node, context.rewriteFromModel);\n }\n }\n}\n"]}
@@ -4,20 +4,24 @@ exports.handleList = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  var applyFormat_1 = require("../utils/applyFormat");
6
6
  var applyMetadata_1 = require("../utils/applyMetadata");
7
+ var cleanUpRestNodes_1 = require("../utils/cleanUpRestNodes");
8
+ var reuseCachedElement_1 = require("../../domUtils/reuseCachedElement");
7
9
  /**
8
10
  * @internal
9
11
  */
10
12
  var handleList = function (doc, parent, listItem, context, refNode) {
11
- var _a, _b, _c;
13
+ var _a, _b, _c, _d;
12
14
  var layer = 0;
13
15
  var nodeStack = context.listFormat.nodeStack;
14
16
  if (nodeStack.length == 0) {
15
17
  nodeStack.push({
16
18
  node: parent,
19
+ refNode: refNode,
17
20
  });
18
21
  }
19
22
  // Skip existing list levels that has same properties so we can reuse them
20
23
  for (; layer < listItem.levels.length && layer + 1 < nodeStack.length; layer++) {
24
+ var parentLevel = nodeStack[layer];
21
25
  var stackLevel = nodeStack[layer + 1];
22
26
  var itemLevel = listItem.levels[layer];
23
27
  if (stackLevel.listType != itemLevel.listType ||
@@ -28,30 +32,66 @@ var handleList = function (doc, parent, listItem, context, refNode) {
28
32
  itemLevel.format.listStyleType != ((_b = stackLevel.format) === null || _b === void 0 ? void 0 : _b.listStyleType))) {
29
33
  break;
30
34
  }
35
+ if (context.allowCacheListItem &&
36
+ parentLevel.refNode &&
37
+ itemLevel.cachedElement == parentLevel.refNode) {
38
+ // Move refNode to next node since we are reusing this cached element
39
+ parentLevel.refNode = parentLevel.refNode.nextSibling;
40
+ }
31
41
  }
32
42
  // Cut off remained list levels that we can't reuse
43
+ if (context.allowCacheListItem) {
44
+ // Clean up all rest nodes in the reused list levels
45
+ for (var i = layer + 1; i < nodeStack.length; i++) {
46
+ var stackLevel = nodeStack[i];
47
+ (0, cleanUpRestNodes_1.cleanUpRestNodes)(stackLevel.refNode, context.rewriteFromModel);
48
+ }
49
+ }
33
50
  nodeStack.splice(layer + 1);
34
51
  // Create new list levels that are after reused ones
35
52
  for (; layer < listItem.levels.length; layer++) {
36
53
  var level = listItem.levels[layer];
37
- var newList = doc.createElement(level.listType || 'UL');
38
54
  var lastParent = nodeStack[nodeStack.length - 1].node;
39
- lastParent.insertBefore(newList, layer == 0 ? refNode : null);
40
- nodeStack.push({
41
- node: newList,
42
- listType: level.listType,
43
- format: (0, tslib_1.__assign)({}, level.format),
44
- dataset: (0, tslib_1.__assign)({}, level.dataset),
45
- });
55
+ var newList = void 0;
56
+ var isNewlyCreated = false;
57
+ var levelRefNode = (_c = nodeStack[layer].refNode) !== null && _c !== void 0 ? _c : null;
58
+ if (context.allowCacheListItem && level.cachedElement) {
59
+ newList = level.cachedElement;
60
+ nodeStack[layer].refNode = (0, reuseCachedElement_1.reuseCachedElement)(lastParent, level.cachedElement, levelRefNode, context.rewriteFromModel);
61
+ nodeStack.push({
62
+ node: newList,
63
+ refNode: newList.firstChild,
64
+ listType: level.listType,
65
+ format: (0, tslib_1.__assign)({}, level.format),
66
+ dataset: (0, tslib_1.__assign)({}, level.dataset),
67
+ });
68
+ }
69
+ else {
70
+ newList = doc.createElement(level.listType == 'OL' ? 'ol' : 'ul');
71
+ isNewlyCreated = true;
72
+ lastParent.insertBefore(newList, levelRefNode);
73
+ nodeStack.push({
74
+ node: newList,
75
+ refNode: null,
76
+ listType: level.listType,
77
+ format: (0, tslib_1.__assign)({}, level.format),
78
+ dataset: (0, tslib_1.__assign)({}, level.dataset),
79
+ });
80
+ if (context.allowCacheListItem) {
81
+ level.cachedElement = newList;
82
+ }
83
+ }
46
84
  (0, applyFormat_1.applyFormat)(newList, context.formatAppliers.listLevelThread, level.format, context);
47
85
  // Need to apply metadata after applying list level format since the list numbers value relies on the result of list thread handling
48
86
  (0, applyMetadata_1.applyMetadata)(level, context.metadataAppliers.listLevel, level.format, context);
49
87
  // Need to apply listItemElement formats after applying metadata since the list numbers value relies on the result of metadata handling
50
88
  (0, applyFormat_1.applyFormat)(newList, context.formatAppliers.listLevel, level.format, context);
51
89
  (0, applyFormat_1.applyFormat)(newList, context.formatAppliers.dataset, level.dataset, context);
52
- (_c = context.onNodeCreated) === null || _c === void 0 ? void 0 : _c.call(context, level, newList);
90
+ if (isNewlyCreated) {
91
+ (_d = context.onNodeCreated) === null || _d === void 0 ? void 0 : _d.call(context, level, newList);
92
+ }
53
93
  }
54
- return refNode;
94
+ return nodeStack[0].refNode;
55
95
  };
56
96
  exports.handleList = handleList;
57
97
  //# sourceMappingURL=handleList.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"handleList.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/handlers/handleList.ts"],"names":[],"mappings":"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","sourcesContent":["import { applyFormat } from '../utils/applyFormat';\nimport { applyMetadata } from '../utils/applyMetadata';\nimport type {\n ContentModelBlockHandler,\n ContentModelListItem,\n ModelToDomContext,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const handleList: ContentModelBlockHandler<ContentModelListItem> = (\n doc: Document,\n parent: Node,\n listItem: ContentModelListItem,\n context: ModelToDomContext,\n refNode: Node | null\n) => {\n let layer = 0;\n const { nodeStack } = context.listFormat;\n\n if (nodeStack.length == 0) {\n nodeStack.push({\n node: parent,\n });\n }\n\n // Skip existing list levels that has same properties so we can reuse them\n for (; layer < listItem.levels.length && layer + 1 < nodeStack.length; layer++) {\n const stackLevel = nodeStack[layer + 1];\n const itemLevel = listItem.levels[layer];\n\n if (\n stackLevel.listType != itemLevel.listType ||\n stackLevel.dataset?.editingInfo != itemLevel.dataset.editingInfo ||\n (itemLevel.listType == 'OL' &&\n typeof itemLevel.format.startNumberOverride === 'number') ||\n (itemLevel.listType == 'UL' &&\n itemLevel.format.listStyleType != stackLevel.format?.listStyleType)\n ) {\n break;\n }\n }\n\n // Cut off remained list levels that we can't reuse\n nodeStack.splice(layer + 1);\n\n // Create new list levels that are after reused ones\n for (; layer < listItem.levels.length; layer++) {\n const level = listItem.levels[layer];\n const newList = doc.createElement(level.listType || 'UL');\n const lastParent = nodeStack[nodeStack.length - 1].node;\n\n lastParent.insertBefore(newList, layer == 0 ? refNode : null);\n nodeStack.push({\n node: newList,\n listType: level.listType,\n format: { ...level.format },\n dataset: { ...level.dataset },\n });\n\n applyFormat(newList, context.formatAppliers.listLevelThread, level.format, context);\n\n // Need to apply metadata after applying list level format since the list numbers value relies on the result of list thread handling\n applyMetadata(level, context.metadataAppliers.listLevel, level.format, context);\n\n // Need to apply listItemElement formats after applying metadata since the list numbers value relies on the result of metadata handling\n applyFormat(newList, context.formatAppliers.listLevel, level.format, context);\n applyFormat(newList, context.formatAppliers.dataset, level.dataset, context);\n\n context.onNodeCreated?.(level, newList);\n }\n\n return refNode;\n};\n"]}
1
+ {"version":3,"file":"handleList.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/handlers/handleList.ts"],"names":[],"mappings":"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","sourcesContent":["import { applyFormat } from '../utils/applyFormat';\nimport { applyMetadata } from '../utils/applyMetadata';\nimport { cleanUpRestNodes } from '../utils/cleanUpRestNodes';\nimport { reuseCachedElement } from '../../domUtils/reuseCachedElement';\nimport type {\n ContentModelBlockHandler,\n ContentModelListItem,\n ModelToDomContext,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const handleList: ContentModelBlockHandler<ContentModelListItem> = (\n doc: Document,\n parent: Node,\n listItem: ContentModelListItem,\n context: ModelToDomContext,\n refNode: Node | null\n) => {\n let layer = 0;\n const { nodeStack } = context.listFormat;\n\n if (nodeStack.length == 0) {\n nodeStack.push({\n node: parent,\n refNode,\n });\n }\n\n // Skip existing list levels that has same properties so we can reuse them\n for (; layer < listItem.levels.length && layer + 1 < nodeStack.length; layer++) {\n const parentLevel = nodeStack[layer];\n const stackLevel = nodeStack[layer + 1];\n const itemLevel = listItem.levels[layer];\n\n if (\n stackLevel.listType != itemLevel.listType ||\n stackLevel.dataset?.editingInfo != itemLevel.dataset.editingInfo ||\n (itemLevel.listType == 'OL' &&\n typeof itemLevel.format.startNumberOverride === 'number') ||\n (itemLevel.listType == 'UL' &&\n itemLevel.format.listStyleType != stackLevel.format?.listStyleType)\n ) {\n break;\n }\n\n if (\n context.allowCacheListItem &&\n parentLevel.refNode &&\n itemLevel.cachedElement == parentLevel.refNode\n ) {\n // Move refNode to next node since we are reusing this cached element\n parentLevel.refNode = parentLevel.refNode.nextSibling;\n }\n }\n\n // Cut off remained list levels that we can't reuse\n if (context.allowCacheListItem) {\n // Clean up all rest nodes in the reused list levels\n for (let i = layer + 1; i < nodeStack.length; i++) {\n const stackLevel = nodeStack[i];\n\n cleanUpRestNodes(stackLevel.refNode, context.rewriteFromModel);\n }\n }\n\n nodeStack.splice(layer + 1);\n\n // Create new list levels that are after reused ones\n for (; layer < listItem.levels.length; layer++) {\n const level = listItem.levels[layer];\n const lastParent = nodeStack[nodeStack.length - 1].node;\n\n let newList: HTMLOListElement | HTMLUListElement;\n let isNewlyCreated = false;\n const levelRefNode = nodeStack[layer].refNode ?? null;\n\n if (context.allowCacheListItem && level.cachedElement) {\n newList = level.cachedElement;\n\n nodeStack[layer].refNode = reuseCachedElement(\n lastParent,\n level.cachedElement,\n levelRefNode,\n context.rewriteFromModel\n );\n nodeStack.push({\n node: newList,\n refNode: newList.firstChild,\n listType: level.listType,\n format: { ...level.format },\n dataset: { ...level.dataset },\n });\n } else {\n newList = doc.createElement(level.listType == 'OL' ? 'ol' : 'ul');\n isNewlyCreated = true;\n\n lastParent.insertBefore(newList, levelRefNode);\n nodeStack.push({\n node: newList,\n refNode: null,\n listType: level.listType,\n format: { ...level.format },\n dataset: { ...level.dataset },\n });\n\n if (context.allowCacheListItem) {\n level.cachedElement = newList;\n }\n }\n\n applyFormat(newList, context.formatAppliers.listLevelThread, level.format, context);\n\n // Need to apply metadata after applying list level format since the list numbers value relies on the result of list thread handling\n applyMetadata(level, context.metadataAppliers.listLevel, level.format, context);\n\n // Need to apply listItemElement formats after applying metadata since the list numbers value relies on the result of metadata handling\n applyFormat(newList, context.formatAppliers.listLevel, level.format, context);\n applyFormat(newList, context.formatAppliers.dataset, level.dataset, context);\n\n if (isNewlyCreated) {\n context.onNodeCreated?.(level, newList);\n }\n }\n\n return nodeStack[0].refNode;\n};\n"]}
@@ -4,6 +4,7 @@ exports.handleListItem = void 0;
4
4
  var applyFormat_1 = require("../utils/applyFormat");
5
5
  var applyMetadata_1 = require("../utils/applyMetadata");
6
6
  var isGenericRoleElement_1 = require("../../domUtils/isGenericRoleElement");
7
+ var reuseCachedElement_1 = require("../../domUtils/reuseCachedElement");
7
8
  var setParagraphNotImplicit_1 = require("../../modelApi/block/setParagraphNotImplicit");
8
9
  var stackFormat_1 = require("../utils/stackFormat");
9
10
  var unwrap_1 = require("../../domUtils/unwrap");
@@ -16,13 +17,35 @@ var handleListItem = function (doc, parent, listItem, context, refNode) {
16
17
  var _a, _b;
17
18
  refNode = context.modelHandlers.list(doc, parent, listItem, context, refNode);
18
19
  var nodeStack = context.listFormat.nodeStack;
19
- var listParent = ((_a = nodeStack === null || nodeStack === void 0 ? void 0 : nodeStack[(nodeStack === null || nodeStack === void 0 ? void 0 : nodeStack.length) - 1]) === null || _a === void 0 ? void 0 : _a.node) || parent;
20
- var li = doc.createElement('li');
20
+ var leafLevel = (_a = nodeStack === null || nodeStack === void 0 ? void 0 : nodeStack[nodeStack.length - 1]) !== null && _a !== void 0 ? _a : {};
21
+ var itemRefNode = leafLevel.refNode || null;
22
+ var listParent = leafLevel.node || parent;
21
23
  var level = listItem.levels[listItem.levels.length - 1];
22
- // It is possible listParent is the same with parent param.
23
- // This happens when outdent a list item to cause it has no list level
24
- listParent.insertBefore(li, (refNode === null || refNode === void 0 ? void 0 : refNode.parentNode) == listParent ? refNode : null);
25
- context.rewriteFromModel.addedBlockElements.push(li);
24
+ var li;
25
+ var isNewlyCreated = false;
26
+ if (context.allowCacheListItem && listItem.cachedElement) {
27
+ li = listItem.cachedElement;
28
+ // Check if the cached LI is used as refNode under another list level,
29
+ // since we know we are going to move it under the current listParent,
30
+ // we need to update the refNode of the previous list level to avoid removing it later
31
+ for (var i = 0; i < nodeStack.length - 1; i++) {
32
+ if (nodeStack[i].refNode === li) {
33
+ nodeStack[i].refNode = li.nextSibling;
34
+ }
35
+ }
36
+ leafLevel.refNode = (0, reuseCachedElement_1.reuseCachedElement)(listParent, li, itemRefNode, context.rewriteFromModel);
37
+ }
38
+ else {
39
+ li = doc.createElement('li');
40
+ isNewlyCreated = true;
41
+ // It is possible listParent is the same with parent param.
42
+ // This happens when outdent a list item to cause it has no list level
43
+ listParent.insertBefore(li, (itemRefNode === null || itemRefNode === void 0 ? void 0 : itemRefNode.parentNode) == listParent ? itemRefNode : null);
44
+ context.rewriteFromModel.addedBlockElements.push(li);
45
+ if (context.allowCacheListItem) {
46
+ listItem.cachedElement = li;
47
+ }
48
+ }
26
49
  if (level) {
27
50
  (0, applyFormat_1.applyFormat)(li, context.formatAppliers.segment, listItem.formatHolder.format, context);
28
51
  (0, applyFormat_1.applyFormat)(li, context.formatAppliers.listItemThread, level.format, context);
@@ -50,7 +73,9 @@ var handleListItem = function (doc, parent, listItem, context, refNode) {
50
73
  element.setAttribute(HtmlRoleAttribute, PresentationRoleValue);
51
74
  }
52
75
  }
53
- (_b = context.onNodeCreated) === null || _b === void 0 ? void 0 : _b.call(context, listItem, li);
76
+ if (isNewlyCreated) {
77
+ (_b = context.onNodeCreated) === null || _b === void 0 ? void 0 : _b.call(context, listItem, li);
78
+ }
54
79
  return refNode;
55
80
  };
56
81
  exports.handleListItem = handleListItem;
@@ -1 +1 @@
1
- {"version":3,"file":"handleListItem.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/handlers/handleListItem.ts"],"names":[],"mappings":"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","sourcesContent":["import { applyFormat } from '../utils/applyFormat';\nimport { applyMetadata } from '../utils/applyMetadata';\nimport { isGenericRoleElement } from '../../domUtils/isGenericRoleElement';\nimport { setParagraphNotImplicit } from '../../modelApi/block/setParagraphNotImplicit';\nimport { stackFormat } from '../utils/stackFormat';\nimport { unwrap } from '../../domUtils/unwrap';\nimport type {\n ContentModelBlockHandler,\n ContentModelListItem,\n ModelToDomContext,\n} from 'roosterjs-content-model-types';\n\nconst HtmlRoleAttribute = 'role';\nconst PresentationRoleValue = 'presentation';\n\n/**\n * @internal\n */\nexport const handleListItem: ContentModelBlockHandler<ContentModelListItem> = (\n doc: Document,\n parent: Node,\n listItem: ContentModelListItem,\n context: ModelToDomContext,\n refNode: Node | null\n) => {\n refNode = context.modelHandlers.list(doc, parent, listItem, context, refNode);\n\n const { nodeStack } = context.listFormat;\n\n const listParent = nodeStack?.[nodeStack?.length - 1]?.node || parent;\n const li = doc.createElement('li');\n const level = listItem.levels[listItem.levels.length - 1];\n\n // It is possible listParent is the same with parent param.\n // This happens when outdent a list item to cause it has no list level\n listParent.insertBefore(li, refNode?.parentNode == listParent ? refNode : null);\n context.rewriteFromModel.addedBlockElements.push(li);\n\n if (level) {\n applyFormat(li, context.formatAppliers.segment, listItem.formatHolder.format, context);\n applyFormat(li, context.formatAppliers.listItemThread, level.format, context);\n\n // Need to apply metadata after applying listItem format since the list numbers value relies on the result of list thread handling\n applyMetadata(level, context.metadataAppliers.listItem, listItem.format, context);\n\n // Need to apply listItemElement formats after applying metadata since the list numbers value relies on the result of metadata handling\n applyFormat(li, context.formatAppliers.listItemElement, listItem.format, context);\n\n stackFormat(context, listItem.formatHolder.format, () => {\n context.modelHandlers.blockGroupChildren(doc, li, listItem, context);\n });\n } else {\n // There is no level for this list item, that means it should be moved out of the list\n // For each paragraph, make it not implicit so it will have a DIV around it, to avoid more paragraphs connected together\n listItem.blocks.forEach(setParagraphNotImplicit);\n\n context.modelHandlers.blockGroupChildren(doc, li, listItem, context);\n\n unwrap(li);\n }\n\n // Add role=\"presentation\" to all generic role elements inside the LI element\n // This is to make sure the elements are announced correctly by screen readers\n // when using arrow keys to navigate the list.\n for (let index = 0; index < li.children.length; index++) {\n const element = li.children.item(index);\n if (isGenericRoleElement(element)) {\n element.setAttribute(HtmlRoleAttribute, PresentationRoleValue);\n }\n }\n\n context.onNodeCreated?.(listItem, li);\n\n return refNode;\n};\n"]}
1
+ {"version":3,"file":"handleListItem.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/handlers/handleListItem.ts"],"names":[],"mappings":"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","sourcesContent":["import { applyFormat } from '../utils/applyFormat';\nimport { applyMetadata } from '../utils/applyMetadata';\nimport { isGenericRoleElement } from '../../domUtils/isGenericRoleElement';\nimport { reuseCachedElement } from '../../domUtils/reuseCachedElement';\nimport { setParagraphNotImplicit } from '../../modelApi/block/setParagraphNotImplicit';\nimport { stackFormat } from '../utils/stackFormat';\nimport { unwrap } from '../../domUtils/unwrap';\nimport type {\n ContentModelBlockHandler,\n ContentModelListItem,\n ModelToDomContext,\n ModelToDomListStackItem,\n} from 'roosterjs-content-model-types';\n\nconst HtmlRoleAttribute = 'role';\nconst PresentationRoleValue = 'presentation';\n\n/**\n * @internal\n */\nexport const handleListItem: ContentModelBlockHandler<ContentModelListItem> = (\n doc: Document,\n parent: Node,\n listItem: ContentModelListItem,\n context: ModelToDomContext,\n refNode: Node | null\n) => {\n refNode = context.modelHandlers.list(doc, parent, listItem, context, refNode);\n\n const { nodeStack } = context.listFormat;\n const leafLevel: Partial<ModelToDomListStackItem> = nodeStack?.[nodeStack.length - 1] ?? {};\n const itemRefNode = leafLevel.refNode || null;\n const listParent = leafLevel.node || parent;\n const level = listItem.levels[listItem.levels.length - 1];\n\n let li: HTMLLIElement;\n let isNewlyCreated = false;\n\n if (context.allowCacheListItem && listItem.cachedElement) {\n li = listItem.cachedElement;\n\n // Check if the cached LI is used as refNode under another list level,\n // since we know we are going to move it under the current listParent,\n // we need to update the refNode of the previous list level to avoid removing it later\n for (let i = 0; i < nodeStack.length - 1; i++) {\n if (nodeStack[i].refNode === li) {\n nodeStack[i].refNode = li.nextSibling;\n }\n }\n\n leafLevel.refNode = reuseCachedElement(\n listParent,\n li,\n itemRefNode,\n context.rewriteFromModel\n );\n } else {\n li = doc.createElement('li');\n isNewlyCreated = true;\n\n // It is possible listParent is the same with parent param.\n // This happens when outdent a list item to cause it has no list level\n listParent.insertBefore(li, itemRefNode?.parentNode == listParent ? itemRefNode : null);\n context.rewriteFromModel.addedBlockElements.push(li);\n\n if (context.allowCacheListItem) {\n listItem.cachedElement = li;\n }\n }\n\n if (level) {\n applyFormat(li, context.formatAppliers.segment, listItem.formatHolder.format, context);\n applyFormat(li, context.formatAppliers.listItemThread, level.format, context);\n\n // Need to apply metadata after applying listItem format since the list numbers value relies on the result of list thread handling\n applyMetadata(level, context.metadataAppliers.listItem, listItem.format, context);\n\n // Need to apply listItemElement formats after applying metadata since the list numbers value relies on the result of metadata handling\n applyFormat(li, context.formatAppliers.listItemElement, listItem.format, context);\n\n stackFormat(context, listItem.formatHolder.format, () => {\n context.modelHandlers.blockGroupChildren(doc, li, listItem, context);\n });\n } else {\n // There is no level for this list item, that means it should be moved out of the list\n // For each paragraph, make it not implicit so it will have a DIV around it, to avoid more paragraphs connected together\n listItem.blocks.forEach(setParagraphNotImplicit);\n\n context.modelHandlers.blockGroupChildren(doc, li, listItem, context);\n\n unwrap(li);\n }\n\n // Add role=\"presentation\" to all generic role elements inside the LI element\n // This is to make sure the elements are announced correctly by screen readers\n // when using arrow keys to navigate the list.\n for (let index = 0; index < li.children.length; index++) {\n const element = li.children.item(index);\n if (isGenericRoleElement(element)) {\n element.setAttribute(HtmlRoleAttribute, PresentationRoleValue);\n }\n }\n\n if (isNewlyCreated) {\n context.onNodeCreated?.(listItem, li);\n }\n\n return refNode;\n};\n"]}
@@ -0,0 +1,8 @@
1
+ import type { RewriteFromModel } from 'roosterjs-content-model-types';
2
+ /**
3
+ * @internal
4
+ * Cleans up all rest nodes starting from refNode
5
+ * @param refNode The reference node to start cleaning up
6
+ * @param rewriteContext The context for rewrite process
7
+ */
8
+ export declare function cleanUpRestNodes(refNode: Node | null, rewriteContext: RewriteFromModel): void;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cleanUpRestNodes = void 0;
4
+ var isNodeOfType_1 = require("../../domUtils/isNodeOfType");
5
+ /**
6
+ * @internal
7
+ * Cleans up all rest nodes starting from refNode
8
+ * @param refNode The reference node to start cleaning up
9
+ * @param rewriteContext The context for rewrite process
10
+ */
11
+ function cleanUpRestNodes(refNode, rewriteContext) {
12
+ while (refNode) {
13
+ var next = refNode.nextSibling;
14
+ if (refNode.parentNode) {
15
+ if ((0, isNodeOfType_1.isNodeOfType)(refNode, 'ELEMENT_NODE')) {
16
+ rewriteContext.removedBlockElements.push(refNode);
17
+ }
18
+ refNode.parentNode.removeChild(refNode);
19
+ }
20
+ refNode = next;
21
+ }
22
+ }
23
+ exports.cleanUpRestNodes = cleanUpRestNodes;
24
+ //# sourceMappingURL=cleanUpRestNodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanUpRestNodes.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/utils/cleanUpRestNodes.ts"],"names":[],"mappings":";;;AAAA,4DAA2D;AAG3D;;;;;GAKG;AACH,SAAgB,gBAAgB,CAAC,OAAoB,EAAE,cAAgC;IACnF,OAAO,OAAO,EAAE;QACZ,IAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC;QAEjC,IAAI,OAAO,CAAC,UAAU,EAAE;YACpB,IAAI,IAAA,2BAAY,EAAC,OAAO,EAAE,cAAc,CAAC,EAAE;gBACvC,cAAc,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aACrD;YAED,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;SAC3C;QAED,OAAO,GAAG,IAAI,CAAC;KAClB;AACL,CAAC;AAdD,4CAcC","sourcesContent":["import { isNodeOfType } from '../../domUtils/isNodeOfType';\nimport type { RewriteFromModel } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Cleans up all rest nodes starting from refNode\n * @param refNode The reference node to start cleaning up\n * @param rewriteContext The context for rewrite process\n */\nexport function cleanUpRestNodes(refNode: Node | null, rewriteContext: RewriteFromModel) {\n while (refNode) {\n const next = refNode.nextSibling;\n\n if (refNode.parentNode) {\n if (isNodeOfType(refNode, 'ELEMENT_NODE')) {\n rewriteContext.removedBlockElements.push(refNode);\n }\n\n refNode.parentNode.removeChild(refNode);\n }\n\n refNode = next;\n }\n}\n"]}
@@ -11,12 +11,15 @@ function stackFormat(context, tagNameOrFormat, callback) {
11
11
  : tagNameOrFormat;
12
12
  if (newFormat) {
13
13
  var implicitFormat = context.implicitFormat;
14
+ var nodeStack = context.listFormat.nodeStack;
14
15
  try {
15
16
  context.implicitFormat = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, implicitFormat), newFormat);
17
+ context.listFormat.nodeStack = [];
16
18
  callback();
17
19
  }
18
20
  finally {
19
21
  context.implicitFormat = implicitFormat;
22
+ context.listFormat.nodeStack = nodeStack;
20
23
  }
21
24
  }
22
25
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"stackFormat.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/utils/stackFormat.ts"],"names":[],"mappings":";;;;AAMA;;GAEG;AACH,SAAgB,WAAW,CACvB,OAA0B,EAC1B,eAAsF,EACtF,QAAoB;IAEpB,IAAM,SAAS,GACX,OAAO,eAAe,KAAK,QAAQ;QAC/B,CAAC,CAAC,OAAO,CAAC,4BAA4B,CAAC,eAAe,CAAC;QACvD,CAAC,CAAC,eAAe,CAAC;IAE1B,IAAI,SAAS,EAAE;QACX,IAAM,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;QAE9C,IAAI;YACA,OAAO,CAAC,cAAc,mDACf,cAAc,GACd,SAAS,CACf,CAAC;YAEF,QAAQ,EAAE,CAAC;SACd;gBAAS;YACN,OAAO,CAAC,cAAc,GAAG,cAAc,CAAC;SAC3C;KACJ;SAAM;QACH,QAAQ,EAAE,CAAC;KACd;AACL,CAAC;AA1BD,kCA0BC","sourcesContent":["import type {\n ContentModelBlockFormat,\n ContentModelSegmentFormat,\n ModelToDomContext,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function stackFormat(\n context: ModelToDomContext,\n tagNameOrFormat: string | (ContentModelSegmentFormat & ContentModelBlockFormat) | null,\n callback: () => void\n) {\n const newFormat =\n typeof tagNameOrFormat === 'string'\n ? context.defaultContentModelFormatMap[tagNameOrFormat]\n : tagNameOrFormat;\n\n if (newFormat) {\n const implicitFormat = context.implicitFormat;\n\n try {\n context.implicitFormat = {\n ...implicitFormat,\n ...newFormat,\n };\n\n callback();\n } finally {\n context.implicitFormat = implicitFormat;\n }\n } else {\n callback();\n }\n}\n"]}
1
+ {"version":3,"file":"stackFormat.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/utils/stackFormat.ts"],"names":[],"mappings":";;;;AAMA;;GAEG;AACH,SAAgB,WAAW,CACvB,OAA0B,EAC1B,eAAsF,EACtF,QAAoB;IAEpB,IAAM,SAAS,GACX,OAAO,eAAe,KAAK,QAAQ;QAC/B,CAAC,CAAC,OAAO,CAAC,4BAA4B,CAAC,eAAe,CAAC;QACvD,CAAC,CAAC,eAAe,CAAC;IAE1B,IAAI,SAAS,EAAE;QACX,IAAM,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;QAC9C,IAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC;QAE/C,IAAI;YACA,OAAO,CAAC,cAAc,mDACf,cAAc,GACd,SAAS,CACf,CAAC;YACF,OAAO,CAAC,UAAU,CAAC,SAAS,GAAG,EAAE,CAAC;YAElC,QAAQ,EAAE,CAAC;SACd;gBAAS;YACN,OAAO,CAAC,cAAc,GAAG,cAAc,CAAC;YACxC,OAAO,CAAC,UAAU,CAAC,SAAS,GAAG,SAAS,CAAC;SAC5C;KACJ;SAAM;QACH,QAAQ,EAAE,CAAC;KACd;AACL,CAAC;AA7BD,kCA6BC","sourcesContent":["import type {\n ContentModelBlockFormat,\n ContentModelSegmentFormat,\n ModelToDomContext,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function stackFormat(\n context: ModelToDomContext,\n tagNameOrFormat: string | (ContentModelSegmentFormat & ContentModelBlockFormat) | null,\n callback: () => void\n) {\n const newFormat =\n typeof tagNameOrFormat === 'string'\n ? context.defaultContentModelFormatMap[tagNameOrFormat]\n : tagNameOrFormat;\n\n if (newFormat) {\n const implicitFormat = context.implicitFormat;\n const nodeStack = context.listFormat.nodeStack;\n\n try {\n context.implicitFormat = {\n ...implicitFormat,\n ...newFormat,\n };\n context.listFormat.nodeStack = [];\n\n callback();\n } finally {\n context.implicitFormat = implicitFormat;\n context.listFormat.nodeStack = nodeStack;\n }\n } else {\n callback();\n }\n}\n"]}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Retrieves metadata from the given document, including HTML attributes and meta tags.
3
+ * @param doc The document from which to retrieve metadata.
4
+ * @returns A record containing metadata key-value pairs.
5
+ */
6
+ export declare function retrieveDocumentMetadata(doc: Document): Record<string, string>;
@@ -0,0 +1,24 @@
1
+ define(["require", "exports", "./toArray"], function (require, exports, toArray_1) {
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.retrieveDocumentMetadata = void 0;
5
+ /**
6
+ * Retrieves metadata from the given document, including HTML attributes and meta tags.
7
+ * @param doc The document from which to retrieve metadata.
8
+ * @returns A record containing metadata key-value pairs.
9
+ */
10
+ function retrieveDocumentMetadata(doc) {
11
+ var _a;
12
+ var result = {};
13
+ var attributes = (_a = doc.querySelector('html')) === null || _a === void 0 ? void 0 : _a.attributes;
14
+ (attributes ? (0, toArray_1.toArray)(attributes) : []).forEach(function (attr) {
15
+ result[attr.name] = attr.value;
16
+ });
17
+ (0, toArray_1.toArray)(doc.querySelectorAll('meta')).forEach(function (meta) {
18
+ result[meta.name] = meta.content;
19
+ });
20
+ return result;
21
+ }
22
+ exports.retrieveDocumentMetadata = retrieveDocumentMetadata;
23
+ });
24
+ //# sourceMappingURL=retrieveDocumentMetadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retrieveDocumentMetadata.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-dom/lib/domUtils/retrieveDocumentMetadata.ts"],"names":[],"mappings":";;;;IAEA;;;;OAIG;IACH,SAAgB,wBAAwB,CAAC,GAAa;;QAClD,IAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,IAAM,UAAU,GAAG,MAAA,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,0CAAE,UAAU,CAAC;QAEzD,CAAC,UAAU,CAAC,CAAC,CAAC,IAAA,iBAAO,EAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,UAAA,IAAI;YAChD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,IAAA,iBAAO,EAAC,GAAG,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,UAAA,IAAI;YAC9C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAClB,CAAC;IAbD,4DAaC","sourcesContent":["import { toArray } from './toArray';\n\n/**\n * Retrieves metadata from the given document, including HTML attributes and meta tags.\n * @param doc The document from which to retrieve metadata.\n * @returns A record containing metadata key-value pairs.\n */\nexport function retrieveDocumentMetadata(doc: Document): Record<string, string> {\n const result: Record<string, string> = {};\n const attributes = doc.querySelector('html')?.attributes;\n\n (attributes ? toArray(attributes) : []).forEach(attr => {\n result[attr.name] = attr.value;\n });\n\n toArray(doc.querySelectorAll('meta')).forEach(meta => {\n result[meta.name] = meta.content;\n });\n\n return result;\n}\n"]}
@@ -73,6 +73,7 @@ export { combineBorderValue, extractBorderValues } from './domUtils/style/border
73
73
  export { isPunctuation, isSpace, normalizeText } from './domUtils/stringUtil';
74
74
  export { parseTableCells } from './domUtils/table/parseTableCells';
75
75
  export { readFile } from './domUtils/readFile';
76
+ export { retrieveDocumentMetadata } from './domUtils/retrieveDocumentMetadata';
76
77
  export { transformColor } from './domUtils/style/transformColor';
77
78
  export { normalizeFontFamily } from './domUtils/style/normalizeFontFamily';
78
79
  export { extractClipboardItems } from './domUtils/event/extractClipboardItems';