AbsoluteTextElement.js

57 lines | 2.006 kB Blame History Raw Download
var textTools = require("./textTools")();
var AbstractTextElement = require("./AbstractTextElement");

module.exports = AbsoluteTextElement;
function AbsoluteTextElement( container, backgroundColor ){
  AbstractTextElement.apply(this, arguments);
}

AbsoluteTextElement.prototype = Object.create(AbstractTextElement.prototype);
AbsoluteTextElement.prototype.constructor = AbsoluteTextElement;

AbsoluteTextElement.prototype.addText = function ( text, yShift, prefix, suffix ){
  if ( text ) {
    this.addTextline(text, this.CSS_CLASSES.default, yShift, prefix, suffix);
  }
};

AbsoluteTextElement.prototype.addSubText = function ( text, yShift ){
  if ( text ) {
    this.addTextline(text, this.CSS_CLASSES.subtext, yShift, "(", ")");
  }
};

AbsoluteTextElement.prototype.addEquivalents = function ( text, yShift ){
  if ( text ) {
    this.addTextline(text, this.CSS_CLASSES.default, yShift);
  }
};

AbsoluteTextElement.prototype.addInstanceCount = function ( instanceCount, yShift ){
  if ( instanceCount ) {
    this.addTextline(instanceCount.toString(), this.CSS_CLASSES.instanceCount, yShift);
  }
};


AbsoluteTextElement.prototype.addTextline = function ( text, style, yShift, prefix, postfix ){
  var truncatedText = textTools.truncate(text, this._textBlock().datum().textWidth(yShift), style);
  
  var tspan = this._textBlock().append("tspan")
    .classed(this.CSS_CLASSES.default, true)
    .classed(style, true)
    .text(this._applyPreAndPostFix(truncatedText, prefix, postfix))
    .attr("x", 0);
  this._repositionTextLine(tspan, yShift);
};

AbsoluteTextElement.prototype._repositionTextLine = function ( tspan, yShift ){
  var fontSizeProperty = window.getComputedStyle(tspan.node()).getPropertyValue("font-size");
  var fontSize = parseFloat(fontSizeProperty);
  
  /* BBox height is not supported in Firefox for tspans and dominant-baseline doesn't work in some SVG editors */
  var approximatedShiftForVerticalCentering = (1 / 3) * fontSize;
  
  tspan.attr("y", approximatedShiftForVerticalCentering + (yShift || 0) + "px");
};