summaryrefslogtreecommitdiff
path: root/tools/eslint/node_modules/vfile-location/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'tools/eslint/node_modules/vfile-location/index.js')
-rw-r--r--tools/eslint/node_modules/vfile-location/index.js123
1 files changed, 123 insertions, 0 deletions
diff --git a/tools/eslint/node_modules/vfile-location/index.js b/tools/eslint/node_modules/vfile-location/index.js
new file mode 100644
index 0000000000..0f85b86290
--- /dev/null
+++ b/tools/eslint/node_modules/vfile-location/index.js
@@ -0,0 +1,123 @@
+/**
+ * @author Titus Wormer
+ * @copyright 2016 Titus Wormer
+ * @license MIT
+ * @module vfile-location
+ * @fileoverview Convert between positions (line and column-based)
+ * and offsets (range-based) locations in a virtual file.
+ */
+
+'use strict';
+
+/* Expose. */
+module.exports = factory;
+
+/**
+ * Factory.
+ *
+ * @param {VFile|string|Buffer} file - Virtual file or document.
+ */
+function factory(file) {
+ var contents = indices(String(file));
+
+ return {
+ toPosition: offsetToPositionFactory(contents),
+ toOffset: positionToOffsetFactory(contents)
+ };
+}
+
+/**
+ * Factory to get the line and column-based `position` for
+ * `offset` in the bound indices.
+ *
+ * @param {Array.<number>} indices - Indices of
+ * line-breaks in `value`.
+ * @return {Function} - Bound method.
+ */
+function offsetToPositionFactory(indices) {
+ return offsetToPosition;
+
+ /**
+ * Get the line and column-based `position` for
+ * `offset` in the bound indices.
+ *
+ * @param {number} offset - Offset.
+ * @return {Position} - Object with `line`, `column`,
+ * and `offset` properties based on the bound
+ * `indices`. An empty object when given invalid
+ * or out of bounds input.
+ */
+ function offsetToPosition(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
+ * `position` in the bound indices.
+ *
+ * @param {Array.<number>} indices - Indices of
+ * line-breaks in `value`.
+ * @return {Function} - Bound method.
+ */
+function positionToOffsetFactory(indices) {
+ return positionToOffset;
+
+ /**
+ * Get the `offset` for a line and column-based
+ * `position` in the bound indices.
+ *
+ * @param {Position} position - Object with `line` and
+ * `column` properties.
+ * @return {number} - Offset. `-1` when given invalid
+ * or out of bounds input.
+ */
+ function positionToOffset(position) {
+ var line = position && position.line;
+ var column = position && position.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`.
+ *
+ * @param {string} value - Value.
+ * @return {Array.<number>} - List of indices of
+ * line-breaks.
+ */
+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;
+}