redraft
Version:
Renders the result of Draft.js convertToRaw using provided callbacks, works well with React
122 lines (106 loc) • 4.71 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
// eslint-disable-next-line import/no-extraneous-dependencies
var DELIMITER = '.';
/**
* Determine whether we can occupy the specified slice of the decorations
* array.
*/
// eslint-disable-next-line import/no-extraneous-dependencies
/**
* This is only slighly modified version of draft-js CompositeDraftDecorator
* https://github.com/facebook/draft-js/blob/dc27624caaaede4dad9d182ff9918a5da8f83c99/src/model/decorators/CompositeDraftDecorator.js
*
* Basicly it just swaps the Immutable.js List with own ListStub
*
*
*/
// eslint-disable-next-line import/no-extraneous-dependencies
function canOccupySlice(decorations, start, end) {
// eslint-disable-next-line no-plusplus
for (var ii = start; ii < end; ii++) {
if (decorations[ii] != null) {
return false;
}
}
return true;
}
/**
* Splice the specified component into our decoration array at the desired
* range.
*/
function occupySlice(targetArr, start, end, componentKey) {
// eslint-disable-next-line no-plusplus
for (var ii = start; ii < end; ii++) {
// eslint-disable-next-line no-param-reassign
targetArr[ii] = componentKey;
}
}
/**
* A CompositeDraftDecorator traverses through a list of DraftDecorator
* instances to identify sections of a ContentBlock that should be rendered
* in a "decorated" manner. For example, hashtags, mentions, and links may
* be intended to stand out visually, be rendered as anchors, etc.
*
* The list of decorators supplied to the constructor will be used in the
* order they are provided. This allows the caller to specify a priority for
* string matching, in case of match collisions among decorators.
*
* For instance, I may have a link with a `#` in its text. Though this section
* of text may match our hashtag decorator, it should not be treated as a
* hashtag. I should therefore list my link DraftDecorator
* before my hashtag DraftDecorator when constructing this composite
* decorator instance.
*
* Thus, when a collision like this is encountered, the earlier match is
* preserved and the new match is discarded.
*/
var CompositeDraftDecorator = function () {
function CompositeDraftDecorator(decorators) {
_classCallCheck(this, CompositeDraftDecorator);
// Copy the decorator array, since we use this array order to determine
// precedence of decoration matching. If the array is mutated externally,
// we don't want to be affected here.
this.decorators = decorators.slice();
}
_createClass(CompositeDraftDecorator, [{
key: 'getDecorations',
value: function getDecorations(block, contentState) {
var decorations = Array(block.getText().length).fill(null);
this.decorators.forEach(function ( /* object*/decorator, /* number*/ii) {
var counter = 0;
var strategy = decorator.strategy;
var callback = function callback( /* number*/start, /* number*/end) {
// Find out if any of our matching range is already occupied
// by another decorator. If so, discard the match. Otherwise, store
// the component key for rendering.
if (canOccupySlice(decorations, start, end)) {
occupySlice(decorations, start, end, ii + DELIMITER + counter);
// eslint-disable-next-line no-plusplus
counter++;
}
};
strategy(block, callback, contentState);
});
return decorations;
}
}, {
key: 'getComponentForKey',
value: function getComponentForKey(key) {
var componentKey = parseInt(key.split(DELIMITER)[0], 10);
return this.decorators[componentKey].component;
}
}, {
key: 'getPropsForKey',
value: function getPropsForKey(key) {
var componentKey = parseInt(key.split(DELIMITER)[0], 10);
return this.decorators[componentKey].props;
}
}]);
return CompositeDraftDecorator;
}();
exports.default = CompositeDraftDecorator;