CartoDB/cartodb20

View on GitHub
lib/assets/javascripts/deep-insights/formatter.js

Summary

Maintainability
A
3 hrs
Test Coverage
var _ = require('underscore');
var d3 = require('d3');
var moment = require('moment');

var AGGREGATION_FORMATS = {
  second: {
    display: 'HH:mm:ss',
    unit: 's'
  },
  minute: {
    display: 'HH:mm - MMM Do, YYYY',
    unit: 'm'
  },
  hour: {
    display: 'HH:00 - MMM Do, YYYY',
    unit: 'h'
  },
  day: {
    display: 'MMM Do, YYYY',
    unit: 'd'
  },
  week: {
    display: 'MMM Do, YYYY',
    unit: 'w'
  },
  month: {
    display: 'MMM YYYY',
    unit: 'M'
  },
  quarter: {
    display: '[Q]Q YYYY',
    unit: 'Q'
  },
  year: {
    display: 'YYYY',
    unit: 'y'
  },
  decade: {
    display: 'YYYY',
    unit: 'y'
  }
};

var format = {};

format.formatNumber = function (value, unit) {
  if (!_.isNumber(value) || value === 0) {
    return value;
  }

  var format = d3.format('.2s');
  var p = 0;
  var absV = Math.abs(value);

  if (value > 1000) {
    value = format(value) + (unit ? ' ' + unit : '');
    return value;
  }

  if (absV > 100) {
    p = 0;
  } else if (absV > 10) {
    p = 1;
  } else if (absV > 1) {
    p = 2;
  } else if (absV > 0) {
    p = Math.max(Math.ceil(Math.abs(Math.log(absV) / Math.log(10))) + 2, 3);
  }

  value = value.toFixed(p);
  var m = value.match(/(\.0+)$/);
  if (m) {
    value = value.replace(m[0], '');
  }

  return value;
};

format.formatDate = function (value) {
  return d3.time.format('%Y-%m-%d')(value);
};

format.formatTime = function (value) {
  return d3.time.format('%H:%M:%S %d/%m/%Y')(value);
};

format.timeFactory = function (format) {
  return d3.time.format(format);
};

format.formatValue = function (value) {
  if (_.isNumber(value)) {
    return format.formatNumber(value);
  }
  if (_.isDate(value)) {
    return format.formatDate(value);
  }
  return value;
};

format.timestampFactory = function (aggregation, offset) {
  return function (timestamp) {
    if (!_.has(AGGREGATION_FORMATS, aggregation)) {
      return '-';
    }
    var format = AGGREGATION_FORMATS[aggregation];
    var date = moment.unix(timestamp).utc();
    if (_.isFinite(offset)) {
      date.utcOffset(offset / 60);
    }
    var formatted = date.format(format.display);
    return formatted;
  };
};

module.exports = format;