position-algerbra.js 1.69 KB
/*
 * MIT License http://opensource.org/licenses/MIT
 * Author: Ben Holloway @bholloway
 */
'use strict';

/**
 * Given a sourcemap position create a new maybeObject with only line and column properties.
 *
 * @param {*|{line: number, column: number}} maybeObj Possible location hash
 * @returns {{line: number, column: number}} Location hash with possible NaN values
 */
function sanitise(maybeObj) {
  var obj = !!maybeObj && typeof maybeObj === 'object' && maybeObj || {};
  return {
    line: isNaN(obj.line) ? NaN : obj.line,
    column: isNaN(obj.column) ? NaN : obj.column
  };
}

exports.sanitise = sanitise;

/**
 * Infer a line and position delta based on the linebreaks in the given string.
 *
 * @param candidate {string} A string with possible linebreaks
 * @returns {{line: number, column: number}} A position object where line and column are deltas
 */
function strToOffset(candidate) {
  var split = candidate.split(/\r\n|\n/g);
  var last  = split[split.length - 1];
  return {
    line: split.length - 1,
    column: last.length
  };
}

exports.strToOffset = strToOffset;

/**
 * Add together a list of position elements.
 *
 * Lines are added. If the new line is zero the column is added otherwise it is overwritten.
 *
 * @param {{line: number, column: number}[]} list One or more sourcemap position elements to add
 * @returns {{line: number, column: number}} Resultant position element
 */
function add(list) {
  return list
    .slice(1)
    .reduce(
      function (accumulator, element) {
        return {
          line: accumulator.line + element.line,
          column: element.line > 0 ? element.column : accumulator.column + element.column,
        };
      },
      list[0]
    );
}

exports.add = add;