77 lines
1.6 KiB
JavaScript
77 lines
1.6 KiB
JavaScript
'use strict'
|
|
|
|
module.exports = factory
|
|
|
|
function factory(file) {
|
|
var contents = indices(String(file))
|
|
var toPoint = offsetToPointFactory(contents)
|
|
|
|
return {
|
|
toPoint: toPoint,
|
|
toPosition: toPoint,
|
|
toOffset: pointToOffsetFactory(contents)
|
|
}
|
|
}
|
|
|
|
// Factory to get the line and column-based `point` for `offset` in the bound
|
|
// indices.
|
|
function offsetToPointFactory(indices) {
|
|
return offsetToPoint
|
|
|
|
// Get the line and column-based `point` for `offset` in the bound indices.
|
|
function offsetToPoint(offset) {
|
|
var index = -1
|
|
var length = indices.length
|
|
|
|
if (offset < 0) {
|
|
return {}
|
|
}
|
|
|
|
while (++index < length) {
|
|
if (indices[index] > offset) {
|
|
return {
|
|
line: index + 1,
|
|
column: offset - (indices[index - 1] || 0) + 1,
|
|
offset: offset
|
|
}
|
|
}
|
|
}
|
|
|
|
return {}
|
|
}
|
|
}
|
|
|
|
// Factory to get the `offset` for a line and column-based `point` in the
|
|
// bound indices.
|
|
function pointToOffsetFactory(indices) {
|
|
return pointToOffset
|
|
|
|
// 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
|
|
|
|
if (!isNaN(line) && !isNaN(column) && line - 1 in indices) {
|
|
return (indices[line - 2] || 0) + column - 1 || 0
|
|
}
|
|
|
|
return -1
|
|
}
|
|
}
|
|
|
|
// Get indices of line-breaks in `value`.
|
|
function indices(value) {
|
|
var result = []
|
|
var index = value.indexOf('\n')
|
|
|
|
while (index !== -1) {
|
|
result.push(index + 1)
|
|
index = value.indexOf('\n', index + 1)
|
|
}
|
|
|
|
result.push(value.length + 1)
|
|
|
|
return result
|
|
}
|