AbstractTextElement.js

59 lines | 1.57 kB Blame History Raw Download
module.exports = AbstractTextElement;

function AbstractTextElement( container, backgroundColor ){
  var textBlock = container.append("text")
    .classed("text", true)
    .style("fill", this._getTextColor(backgroundColor))
    .attr("text-anchor", "middle");
  
  this._textBlock = function (){
    return textBlock;
  };
}

AbstractTextElement.prototype.LINE_DISTANCE = 1;
AbstractTextElement.prototype.CSS_CLASSES = {
  default: "text",
  subtext: "subtext",
  instanceCount: "instance-count"
};
AbstractTextElement.prototype.DARK_TEXT_COLOR = "#000";
AbstractTextElement.prototype.LIGHT_TEXT_COLOR = "#fff";

AbstractTextElement.prototype.translation = function ( x, y ){
  this._textBlock().attr("transform", "translate(" + x + ", " + y + ")");
  return this;
};

AbstractTextElement.prototype.remove = function (){
  this._textBlock().remove();
  return this;
};

AbstractTextElement.prototype._applyPreAndPostFix = function ( text, prefix, postfix ){
  if ( prefix ) {
    text = prefix + text;
  }
  if ( postfix ) {
    text += postfix;
  }
  return text;
};

AbstractTextElement.prototype._getTextColor = function ( rawBackgroundColor ){
  if ( !rawBackgroundColor ) {
    return AbstractTextElement.prototype.DARK_TEXT_COLOR;
  }
  
  var backgroundColor = d3.rgb(rawBackgroundColor);
  if ( calculateLuminance(backgroundColor) > 0.5 ) {
    return AbstractTextElement.prototype.DARK_TEXT_COLOR;
  } else {
    return AbstractTextElement.prototype.LIGHT_TEXT_COLOR;
  }
};

function calculateLuminance( color ){
  return 0.3 * (color.r / 255) + 0.59 * (color.g / 255) + 0.11 * (color.b / 255);
}