| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 | // pos-to-linecolumn.js// MIT licensed, see LICENSE file// Copyright (c) 2014-2015 Olov Lassus <olov.lassus@gmail.com>"use strict";const assert = require("assert");module.exports = PosToLineColumn;function PosToLineColumn(str) {    if (!(this instanceof PosToLineColumn)) {        throw new Error("PosToLineColumn requires new");    }    str = String(str);    const newlines = [];    let pos = -1;    while ((pos = str.indexOf("\n", pos + 1)) >= 0) {        newlines.push(pos);    }    let line = 1;    let column = 0;    const columns = [];    const lines = [];    let i;    let j = 0;    for (i = 0; i < str.length; i++) {        columns[i] = column;        lines[i] = line;        if (i === newlines[j]) {            ++j;            ++line;            column = 0;        } else {            ++column;        }    }    // add extra entry to support pos === str.length    columns[i] = column;    lines[i] = line;    this.len = str.length;    this.columns = columns;    this.lines = lines;}PosToLineColumn.prototype.toLine = function(pos) {    assert(pos >= 0 && pos <= this.len);    return this.lines[pos];};PosToLineColumn.prototype.toColumn = function(pos) {    assert(pos >= 0 && pos <= this.len);    return this.columns[pos];};PosToLineColumn.prototype.toLineColumn = function(pos) {    return {        line: this.toLine(pos),        column: this.toColumn(pos),    };};/*const tst = "asdf\n" +    "abc\n" +    "d\n" +    "\n\n" +    "efghi a\r\n" +    "x";const instance = new PosToLineColumn(tst);console.dir(instance.toLineColumn(0));console.dir(instance.toLineColumn(tst.length));*/
 |