/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @format * * @emails oncall+draft_js */ 'use strict'; function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var ContentBlock = require("./ContentBlock"); var ContentBlockNode = require("./ContentBlockNode"); var DraftStringKey = require("./DraftStringKey"); var encodeEntityRanges = require("./encodeEntityRanges"); var encodeInlineStyleRanges = require("./encodeInlineStyleRanges"); var invariant = require("fbjs/lib/invariant"); var createRawBlock = function createRawBlock(block, entityStorageMap) { return { key: block.getKey(), text: block.getText(), type: block.getType(), depth: block.getDepth(), inlineStyleRanges: encodeInlineStyleRanges(block), entityRanges: encodeEntityRanges(block, entityStorageMap), data: block.getData().toObject() }; }; var insertRawBlock = function insertRawBlock(block, entityMap, rawBlocks, blockCacheRef) { if (block instanceof ContentBlock) { rawBlocks.push(createRawBlock(block, entityMap)); return; } !(block instanceof ContentBlockNode) ? process.env.NODE_ENV !== "production" ? invariant(false, 'block is not a BlockNode') : invariant(false) : void 0; var parentKey = block.getParentKey(); var rawBlock = blockCacheRef[block.getKey()] = _objectSpread({}, createRawBlock(block, entityMap), { children: [] }); if (parentKey) { blockCacheRef[parentKey].children.push(rawBlock); return; } rawBlocks.push(rawBlock); }; var encodeRawBlocks = function encodeRawBlocks(contentState, rawState) { var entityMap = rawState.entityMap; var rawBlocks = []; var blockCacheRef = {}; var entityCacheRef = {}; var entityStorageKey = 0; contentState.getBlockMap().forEach(function (block) { block.findEntityRanges(function (character) { return character.getEntity() !== null; }, function (start) { var entityKey = block.getEntityAt(start); // Stringify to maintain order of otherwise numeric keys. var stringifiedEntityKey = DraftStringKey.stringify(entityKey); // This makes this function resilient to two entities // erroneously having the same key if (entityCacheRef[stringifiedEntityKey]) { return; } entityCacheRef[stringifiedEntityKey] = entityKey; // we need the `any` casting here since this is a temporary state // where we will later on flip the entity map and populate it with // real entity, at this stage we just need to map back the entity // key used by the BlockNode entityMap[stringifiedEntityKey] = "".concat(entityStorageKey); entityStorageKey++; }); insertRawBlock(block, entityMap, rawBlocks, blockCacheRef); }); return { blocks: rawBlocks, entityMap: entityMap }; }; // Flip storage map so that our storage keys map to global // DraftEntity keys. var encodeRawEntityMap = function encodeRawEntityMap(contentState, rawState) { var blocks = rawState.blocks, entityMap = rawState.entityMap; var rawEntityMap = {}; Object.keys(entityMap).forEach(function (key, index) { var entity = contentState.getEntity(DraftStringKey.unstringify(key)); rawEntityMap[index] = { type: entity.getType(), mutability: entity.getMutability(), data: entity.getData() }; }); return { blocks: blocks, entityMap: rawEntityMap }; }; var convertFromDraftStateToRaw = function convertFromDraftStateToRaw(contentState) { var rawDraftContentState = { entityMap: {}, blocks: [] }; // add blocks rawDraftContentState = encodeRawBlocks(contentState, rawDraftContentState); // add entities rawDraftContentState = encodeRawEntityMap(contentState, rawDraftContentState); return rawDraftContentState; }; module.exports = convertFromDraftStateToRaw;