function render() {
	/* eslint-disable no-invalid-this */
	var blocks;
	var range;
	var str;
	var min;
	var max;
	var len;
	var idx;
	var d;
	var v;
	var n;
	var i;

	len = this._data.length;
	if ( len === 0 ) {
		return '';
	}
	min = this.yMin;
	max = this.yMax;
	range = abs( max-min );

	// Check if data is constant...
	if ( range === 0.0 ) {
		// If `max` is `0`, encode each finite datum as the smallest block glyph...
		if ( max === 0.0 ) {
			blocks = [ UNICODE_BLOCK_ELEMENTS[ 0 ] ];
		}
		// Otherwise, encode each finite datum as a mid-sized block glyph...
		else {
			blocks = [ UNICODE_BLOCK_ELEMENTS[ 3 ] ];
		}
	} else {
		blocks = UNICODE_BLOCK_ELEMENTS;
	}
	// Generate the sparkline chart, assigning a glyph to each datum...
	n = blocks.length - 1;
	str = '';

	// TODO: color encoding: one color for both pos and neg or two colors for separate colors

	// TODO: negative values diff color (red)

	for ( i = 0; i < len; i++ ) {
		d = this._data[ i ];
		if ( this._infinities && ( d === PINF || d === NINF ) ) {
			str += UNICODE_INF;
			continue;
		}
		if ( !this._isDefined( d, i ) || d === PINF || d === NINF ) {
			str += MISSING_VALUE;
			continue;
		}
		// Normalize the datum (aka feature scaling):
		if ( range ) {
			v = ( d-min ) / range;
		} else {
			v = 0.0;
		}
		// Determine the glyph index:
		idx = round( v*n );
		if ( idx < 0 ) {
			idx = 0;
		} else if ( idx > n ) {
			idx = n;
		}
		// Add the glyph to the chart:
		str += blocks[ idx ];
	}
	return str;
}
Renders a chart.

@private
@returns {string} rendered chart