draft-js
Version:
A React framework for building text editors.
64 lines (54 loc) • 1.76 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
*/
;
var UnicodeUtils = require("fbjs/lib/UnicodeUtils");
var findRangesImmutable = require("./findRangesImmutable");
var areEqual = function areEqual(a, b) {
return a === b;
};
var isTruthy = function isTruthy(a) {
return !!a;
};
var EMPTY_ARRAY = [];
/**
* Helper function for getting encoded styles for each inline style. Convert
* to UTF-8 character counts for storage.
*/
function getEncodedInlinesForType(block, styleList, styleToEncode) {
var ranges = []; // Obtain an array with ranges for only the specified style.
var filteredInlines = styleList.map(function (style) {
return style.has(styleToEncode);
}).toList();
findRangesImmutable(filteredInlines, areEqual, // We only want to keep ranges with nonzero style values.
isTruthy, function (start, end) {
var text = block.getText();
ranges.push({
offset: UnicodeUtils.strlen(text.slice(0, start)),
length: UnicodeUtils.strlen(text.slice(start, end)),
style: styleToEncode
});
});
return ranges;
}
/*
* Retrieve the encoded arrays of inline styles, with each individual style
* treated separately.
*/
function encodeInlineStyleRanges(block) {
var styleList = block.getCharacterList().map(function (c) {
return c.getStyle();
}).toList();
var ranges = styleList.flatten().toSet().map(function (style) {
return getEncodedInlinesForType(block, styleList, style);
});
return Array.prototype.concat.apply(EMPTY_ARRAY, ranges.toJS());
}
module.exports = encodeInlineStyleRanges;