UNPKG

3.63 kBJavaScriptView Raw
1/**
2 * Copyright (c) Facebook, Inc. and its affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 *
7 * @format
8 *
9 * @emails oncall+draft_js
10 */
11'use strict';
12
13function _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; }
14
15function _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; }
16
17function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
18
19var findRangesImmutable = require("./findRangesImmutable");
20
21var getOwnObjectValues = require("./getOwnObjectValues");
22
23var Immutable = require("immutable");
24
25var List = Immutable.List,
26 Repeat = Immutable.Repeat,
27 Record = Immutable.Record;
28
29var returnTrue = function returnTrue() {
30 return true;
31};
32
33var defaultLeafRange = {
34 start: null,
35 end: null
36};
37var LeafRange = Record(defaultLeafRange);
38var defaultDecoratorRange = {
39 start: null,
40 end: null,
41 decoratorKey: null,
42 leaves: null
43};
44var DecoratorRange = Record(defaultDecoratorRange);
45var BlockTree = {
46 /**
47 * Generate a block tree for a given ContentBlock/decorator pair.
48 */
49 generate: function generate(contentState, block, decorator) {
50 var textLength = block.getLength();
51
52 if (!textLength) {
53 return List.of(new DecoratorRange({
54 start: 0,
55 end: 0,
56 decoratorKey: null,
57 leaves: List.of(new LeafRange({
58 start: 0,
59 end: 0
60 }))
61 }));
62 }
63
64 var leafSets = [];
65 var decorations = decorator ? decorator.getDecorations(block, contentState) : List(Repeat(null, textLength));
66 var chars = block.getCharacterList();
67 findRangesImmutable(decorations, areEqual, returnTrue, function (start, end) {
68 leafSets.push(new DecoratorRange({
69 start: start,
70 end: end,
71 decoratorKey: decorations.get(start),
72 leaves: generateLeaves(chars.slice(start, end).toList(), start)
73 }));
74 });
75 return List(leafSets);
76 },
77 fromJS: function fromJS(_ref) {
78 var leaves = _ref.leaves,
79 other = _objectWithoutPropertiesLoose(_ref, ["leaves"]);
80
81 return new DecoratorRange(_objectSpread({}, other, {
82 leaves: leaves != null ? List(Array.isArray(leaves) ? leaves : getOwnObjectValues(leaves)).map(function (leaf) {
83 return LeafRange(leaf);
84 }) : null
85 }));
86 }
87};
88/**
89 * Generate LeafRange records for a given character list.
90 */
91
92function generateLeaves(characters, offset) {
93 var leaves = [];
94 var inlineStyles = characters.map(function (c) {
95 return c.getStyle();
96 }).toList();
97 findRangesImmutable(inlineStyles, areEqual, returnTrue, function (start, end) {
98 leaves.push(new LeafRange({
99 start: start + offset,
100 end: end + offset
101 }));
102 });
103 return List(leaves);
104}
105
106function areEqual(a, b) {
107 return a === b;
108}
109
110module.exports = BlockTree;
\No newline at end of file