Hack around absence of String.codePointAt on PhantomJS

I've been trying to get some tests working under PhantomJS, which appears not
to support String.codePointAt (which is, to be fair, an ES6 addition). For our
limited usecase, it's easier to implement the functionality from first
principles than to try to polyfill support.
This commit is contained in:
Richard van der Hoff 2016-04-13 10:19:16 +01:00
parent f9785f68af
commit 5706a879d0

View File

@ -99,15 +99,36 @@ module.exports = React.createClass({
} }
}, },
_getInitialLetter: function() { /**
var name = this.props.name; * returns the first (non-sigil) character of 'name',
//For large characters (exceeding 2 bytes), this function will get the correct character. * converted to uppercase
//However, this does NOT get the second character correctly if a large character is before it. */
var initial = String.fromCodePoint(name.codePointAt(0)); _getInitialLetter: function(name) {
if ((initial === '@' || initial === '#') && name[1]) { if (name.length < 1) {
initial = String.fromCodePoint(name.codePointAt(1)); return undefined;
} }
return initial.toUpperCase();
var idx = 0;
var initial = name[0];
if ((initial === '@' || initial === '#') && name[1]) {
idx++;
}
// string.codePointAt(0) would do this, but that isn't supported by
// some browsers (notably PhantomJS).
var chars = 1;
var first = name.charCodeAt(idx);
// check if its the start of a surrogate pair
if (first >= 0xD800 && first <= 0xDBFF && name[idx+1]) {
var second = name.charCodeAt(idx+1);
if (second >= 0xDC00 && second <= 0xDFFF) {
chars++;
}
}
var firstChar = name.substring(idx, idx+chars);
return firstChar.toUpperCase();
}, },
render: function() { render: function() {
@ -116,7 +137,7 @@ module.exports = React.createClass({
var imageUrl = this.state.imageUrls[this.state.urlsIndex]; var imageUrl = this.state.imageUrls[this.state.urlsIndex];
if (imageUrl === this.state.defaultImageUrl) { if (imageUrl === this.state.defaultImageUrl) {
var initialLetter = this._getInitialLetter(); var initialLetter = this._getInitialLetter(this.props.name);
return ( return (
<span className="mx_BaseAvatar" {...this.props}> <span className="mx_BaseAvatar" {...this.props}>
<span className="mx_BaseAvatar_initial" aria-hidden="true" <span className="mx_BaseAvatar_initial" aria-hidden="true"