draft-js
Version:
A React framework for building text editors.
129 lines (104 loc) • 4.58 kB
JavaScript
/**
* 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
*/
;
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;