You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
144 lines
4.6 KiB
144 lines
4.6 KiB
'use strict';
|
|
|
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
|
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
|
|
;(function (window, React, linkify) {
|
|
var linkifyReact = function (React, linkify) {
|
|
'use strict';
|
|
|
|
React = 'default' in React ? React['default'] : React;
|
|
|
|
var options = linkify.options;
|
|
var Options = options.Options;
|
|
|
|
// Given a string, converts to an array of valid React components
|
|
// (which may include strings)
|
|
|
|
function stringToElements(str, opts) {
|
|
|
|
var tokens = linkify.tokenize(str);
|
|
var elements = [];
|
|
var linkId = 0;
|
|
|
|
for (var i = 0; i < tokens.length; i++) {
|
|
var token = tokens[i];
|
|
|
|
if (token.type === 'nl' && opts.nl2br) {
|
|
elements.push(React.createElement('br', { key: 'linkified-' + ++linkId }));
|
|
continue;
|
|
} else if (!token.isLink || !opts.check(token)) {
|
|
// Regular text
|
|
elements.push(token.toString());
|
|
continue;
|
|
}
|
|
|
|
var _opts$resolve = opts.resolve(token),
|
|
formatted = _opts$resolve.formatted,
|
|
formattedHref = _opts$resolve.formattedHref,
|
|
tagName = _opts$resolve.tagName,
|
|
className = _opts$resolve.className,
|
|
target = _opts$resolve.target,
|
|
attributes = _opts$resolve.attributes;
|
|
|
|
var props = {
|
|
key: 'linkified-' + ++linkId,
|
|
href: formattedHref
|
|
};
|
|
|
|
if (className) {
|
|
props.className = className;
|
|
}
|
|
|
|
if (target) {
|
|
props.target = target;
|
|
}
|
|
|
|
// Build up additional attributes
|
|
// Support for events via attributes hash
|
|
if (attributes) {
|
|
for (var attr in attributes) {
|
|
props[attr] = attributes[attr];
|
|
}
|
|
}
|
|
|
|
elements.push(React.createElement(tagName, props, formatted));
|
|
}
|
|
|
|
return elements;
|
|
}
|
|
|
|
// Recursively linkify the contents of the given React Element instance
|
|
function linkifyReactElement(element, opts) {
|
|
var elementId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
|
|
|
|
if (React.Children.count(element.props.children) === 0) {
|
|
// No need to clone if the element had no children
|
|
return element;
|
|
}
|
|
|
|
var children = [];
|
|
|
|
React.Children.forEach(element.props.children, function (child) {
|
|
if (typeof child === 'string') {
|
|
// ensure that we always generate unique element IDs for keys
|
|
elementId = elementId + 1;
|
|
children.push.apply(children, stringToElements(child, opts));
|
|
} else if (React.isValidElement(child)) {
|
|
if (typeof child.type === 'string' && options.contains(opts.ignoreTags, child.type.toUpperCase())) {
|
|
// Don't linkify this element
|
|
children.push(child);
|
|
} else {
|
|
children.push(linkifyReactElement(child, opts, ++elementId));
|
|
}
|
|
} else {
|
|
// Unknown element type, just push
|
|
children.push(child);
|
|
}
|
|
});
|
|
|
|
// Set a default unique key, copy over remaining props
|
|
var newProps = { key: 'linkified-element-' + elementId };
|
|
for (var prop in element.props) {
|
|
newProps[prop] = element.props[prop];
|
|
}
|
|
|
|
return React.cloneElement(element, newProps, children);
|
|
}
|
|
|
|
var Linkify = function (_React$Component) {
|
|
_inherits(Linkify, _React$Component);
|
|
|
|
function Linkify() {
|
|
_classCallCheck(this, Linkify);
|
|
|
|
return _possibleConstructorReturn(this, _React$Component.apply(this, arguments));
|
|
}
|
|
|
|
Linkify.prototype.render = function render() {
|
|
// Copy over all non-linkify-specific props
|
|
var newProps = { key: 'linkified-element-0' };
|
|
for (var prop in this.props) {
|
|
if (prop !== 'options' && prop !== 'tagName') {
|
|
newProps[prop] = this.props[prop];
|
|
}
|
|
}
|
|
|
|
var opts = new Options(this.props.options);
|
|
var tagName = this.props.tagName || 'span';
|
|
var element = React.createElement(tagName, newProps);
|
|
|
|
return linkifyReactElement(element, opts, 0);
|
|
};
|
|
|
|
return Linkify;
|
|
}(React.Component);
|
|
|
|
return Linkify;
|
|
}(React, linkify);
|
|
|
|
window.Linkify = window.LinkifyReact = linkifyReact;
|
|
})(window, React, linkify); |