draft-js
Version:
A React framework for building text editors.
234 lines (183 loc) • 7.96 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; }
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
var BlockMapBuilder = require("./BlockMapBuilder");
var CharacterMetadata = require("./CharacterMetadata");
var ContentBlock = require("./ContentBlock");
var ContentBlockNode = require("./ContentBlockNode");
var DraftEntity = require("./DraftEntity");
var SelectionState = require("./SelectionState");
var generateRandomKey = require("./generateRandomKey");
var getOwnObjectValues = require("./getOwnObjectValues");
var gkx = require("./gkx");
var Immutable = require("immutable");
var sanitizeDraftText = require("./sanitizeDraftText");
var List = Immutable.List,
Record = Immutable.Record,
Repeat = Immutable.Repeat,
ImmutableMap = Immutable.Map,
OrderedMap = Immutable.OrderedMap;
var defaultRecord = {
entityMap: null,
blockMap: null,
selectionBefore: null,
selectionAfter: null
};
var ContentStateRecord = Record(defaultRecord);
/* $FlowFixMe[signature-verification-failure] Supressing a `signature-
* verification-failure` error here. TODO: T65949050 Clean up the branch for
* this GK */
var ContentBlockNodeRecord = gkx('draft_tree_data_support') ? ContentBlockNode : ContentBlock;
var ContentState = /*#__PURE__*/function (_ContentStateRecord) {
_inheritsLoose(ContentState, _ContentStateRecord);
function ContentState() {
return _ContentStateRecord.apply(this, arguments) || this;
}
var _proto = ContentState.prototype;
_proto.getEntityMap = function getEntityMap() {
// TODO: update this when we fully remove DraftEntity
return DraftEntity;
};
_proto.getBlockMap = function getBlockMap() {
return this.get('blockMap');
};
_proto.getSelectionBefore = function getSelectionBefore() {
return this.get('selectionBefore');
};
_proto.getSelectionAfter = function getSelectionAfter() {
return this.get('selectionAfter');
};
_proto.getBlockForKey = function getBlockForKey(key) {
var block = this.getBlockMap().get(key);
return block;
};
_proto.getKeyBefore = function getKeyBefore(key) {
return this.getBlockMap().reverse().keySeq().skipUntil(function (v) {
return v === key;
}).skip(1).first();
};
_proto.getKeyAfter = function getKeyAfter(key) {
return this.getBlockMap().keySeq().skipUntil(function (v) {
return v === key;
}).skip(1).first();
};
_proto.getBlockAfter = function getBlockAfter(key) {
return this.getBlockMap().skipUntil(function (_, k) {
return k === key;
}).skip(1).first();
};
_proto.getBlockBefore = function getBlockBefore(key) {
return this.getBlockMap().reverse().skipUntil(function (_, k) {
return k === key;
}).skip(1).first();
};
_proto.getBlocksAsArray = function getBlocksAsArray() {
return this.getBlockMap().toArray();
};
_proto.getFirstBlock = function getFirstBlock() {
return this.getBlockMap().first();
};
_proto.getLastBlock = function getLastBlock() {
return this.getBlockMap().last();
};
_proto.getPlainText = function getPlainText(delimiter) {
return this.getBlockMap().map(function (block) {
return block ? block.getText() : '';
}).join(delimiter || '\n');
};
_proto.getLastCreatedEntityKey = function getLastCreatedEntityKey() {
// TODO: update this when we fully remove DraftEntity
return DraftEntity.__getLastCreatedEntityKey();
};
_proto.hasText = function hasText() {
var blockMap = this.getBlockMap();
return blockMap.size > 1 || // make sure that there are no zero width space chars
escape(blockMap.first().getText()).replace(/%u200B/g, '').length > 0;
};
_proto.createEntity = function createEntity(type, mutability, data) {
// TODO: update this when we fully remove DraftEntity
DraftEntity.__create(type, mutability, data);
return this;
};
_proto.mergeEntityData = function mergeEntityData(key, toMerge) {
// TODO: update this when we fully remove DraftEntity
DraftEntity.__mergeData(key, toMerge);
return this;
};
_proto.replaceEntityData = function replaceEntityData(key, newData) {
// TODO: update this when we fully remove DraftEntity
DraftEntity.__replaceData(key, newData);
return this;
};
_proto.addEntity = function addEntity(instance) {
// TODO: update this when we fully remove DraftEntity
DraftEntity.__add(instance);
return this;
};
_proto.getEntity = function getEntity(key) {
// TODO: update this when we fully remove DraftEntity
return DraftEntity.__get(key);
};
_proto.getAllEntities = function getAllEntities() {
return DraftEntity.__getAll();
};
_proto.loadWithEntities = function loadWithEntities(entities) {
return DraftEntity.__loadWithEntities(entities);
};
ContentState.createFromBlockArray = function createFromBlockArray( // TODO: update flow type when we completely deprecate the old entity API
blocks, entityMap) {
// TODO: remove this when we completely deprecate the old entity API
var theBlocks = Array.isArray(blocks) ? blocks : blocks.contentBlocks;
var blockMap = BlockMapBuilder.createFromArray(theBlocks);
var selectionState = blockMap.isEmpty() ? new SelectionState() : SelectionState.createEmpty(blockMap.first().getKey());
return new ContentState({
blockMap: blockMap,
entityMap: entityMap || DraftEntity,
selectionBefore: selectionState,
selectionAfter: selectionState
});
};
ContentState.createFromText = function createFromText(text) {
var delimiter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : /\r\n?|\n/g;
var strings = text.split(delimiter);
var blocks = strings.map(function (block) {
block = sanitizeDraftText(block);
return new ContentBlockNodeRecord({
key: generateRandomKey(),
text: block,
type: 'unstyled',
characterList: List(Repeat(CharacterMetadata.EMPTY, block.length))
});
});
return ContentState.createFromBlockArray(blocks);
};
ContentState.fromJS = function fromJS(state) {
return new ContentState(_objectSpread({}, state, {
blockMap: OrderedMap(state.blockMap).map(ContentState.createContentBlockFromJS),
selectionBefore: new SelectionState(state.selectionBefore),
selectionAfter: new SelectionState(state.selectionAfter)
}));
};
ContentState.createContentBlockFromJS = function createContentBlockFromJS(block) {
var characterList = block.characterList;
return new ContentBlockNodeRecord(_objectSpread({}, block, {
data: ImmutableMap(block.data),
characterList: characterList != null ? List((Array.isArray(characterList) ? characterList : getOwnObjectValues(characterList)).map(function (c) {
return CharacterMetadata.fromJS(c);
})) : undefined
}));
};
return ContentState;
}(ContentStateRecord);
module.exports = ContentState;