UNPKG

react-bootstrap

Version:

Bootstrap 3 components build with React

83 lines (62 loc) 2.01 kB
"use strict"; // https://www.npmjs.org/package/react-interpolate-component 'use strict'; var React = require("./react-es6")["default"]; var invariant = require("./react-es6/lib/invariant")["default"]; var utils = require("./utils")["default"]; function isString(object) { return Object.prototype.toString.call(object) === '[object String]'; } var REGEXP = /\%\((.+?)\)s/; var Interpolate = React.createClass({ displayName: 'Interpolate', getDefaultProps: function() { return { component: React.DOM.span }; }, render: function() { var format = this.props.children || this.props.format; var parent = this.props.component; var unsafe = this.props.unsafe === true; var props = utils.extend({}, this.props); delete props.children; delete props.format; delete props.component; delete props.unsafe; invariant(isString(format), 'Interpolate expects either a format string as only child or a `format` prop with a string value'); if (unsafe) { var content = format.split(REGEXP).reduce(function(memo, match, index) { var html; if (index % 2 === 0) { html = match; } else { html = props[match]; delete props[match]; } if (React.isValidComponent(html)) { throw new Error('cannot interpolate a React component into unsafe text'); } memo += html; return memo; }, ''); props.dangerouslySetInnerHTML = { __html: content }; return parent(props); } else { var args = format.split(REGEXP).reduce(function(memo, match, index) { var child; if (index % 2 === 0) { if (match.length === 0) { return memo; } child = match; } else { child = props[match]; delete props[match]; } memo.push(child); return memo; }, [props]); return parent.apply(null, args); } } }); exports["default"] = Interpolate;