55 lines
1.2 KiB
JavaScript
55 lines
1.2 KiB
JavaScript
'use strict'
|
|
|
|
module.exports = factory
|
|
|
|
function factory(file) {
|
|
var value = String(file)
|
|
var indices = []
|
|
var search = /\r?\n|\r/g
|
|
|
|
while (search.exec(value)) {
|
|
indices.push(search.lastIndex)
|
|
}
|
|
|
|
indices.push(value.length + 1)
|
|
|
|
return {
|
|
toPoint: offsetToPoint,
|
|
toPosition: offsetToPoint,
|
|
toOffset: pointToOffset
|
|
}
|
|
|
|
// Get the line and column-based `point` for `offset` in the bound indices.
|
|
function offsetToPoint(offset) {
|
|
var index = -1
|
|
|
|
if (offset > -1 && offset < indices[indices.length - 1]) {
|
|
while (++index < indices.length) {
|
|
if (indices[index] > offset) {
|
|
return {
|
|
line: index + 1,
|
|
column: offset - (indices[index - 1] || 0) + 1,
|
|
offset: offset
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return {}
|
|
}
|
|
|
|
// Get the `offset` for a line and column-based `point` in the bound
|
|
// indices.
|
|
function pointToOffset(point) {
|
|
var line = point && point.line
|
|
var column = point && point.column
|
|
var offset
|
|
|
|
if (!isNaN(line) && !isNaN(column) && line - 1 in indices) {
|
|
offset = (indices[line - 2] || 0) + column - 1 || 0
|
|
}
|
|
|
|
return offset > -1 && offset < indices[indices.length - 1] ? offset : -1
|
|
}
|
|
}
|