aboutsummaryrefslogtreecommitdiffstats
path: root/vanilla/node_modules/css-tree/cjs/tokenizer/OffsetToLocation.cjs
diff options
context:
space:
mode:
Diffstat (limited to 'vanilla/node_modules/css-tree/cjs/tokenizer/OffsetToLocation.cjs')
-rw-r--r--vanilla/node_modules/css-tree/cjs/tokenizer/OffsetToLocation.cjs91
1 files changed, 91 insertions, 0 deletions
diff --git a/vanilla/node_modules/css-tree/cjs/tokenizer/OffsetToLocation.cjs b/vanilla/node_modules/css-tree/cjs/tokenizer/OffsetToLocation.cjs
new file mode 100644
index 0000000..18b7f7c
--- /dev/null
+++ b/vanilla/node_modules/css-tree/cjs/tokenizer/OffsetToLocation.cjs
@@ -0,0 +1,91 @@
+'use strict';
+
+const adoptBuffer = require('./adopt-buffer.cjs');
+const charCodeDefinitions = require('./char-code-definitions.cjs');
+
+const N = 10;
+const F = 12;
+const R = 13;
+
+function computeLinesAndColumns(host) {
+ const source = host.source;
+ const sourceLength = source.length;
+ const startOffset = source.length > 0 ? charCodeDefinitions.isBOM(source.charCodeAt(0)) : 0;
+ const lines = adoptBuffer.adoptBuffer(host.lines, sourceLength);
+ const columns = adoptBuffer.adoptBuffer(host.columns, sourceLength);
+ let line = host.startLine;
+ let column = host.startColumn;
+
+ for (let i = startOffset; i < sourceLength; i++) {
+ const code = source.charCodeAt(i);
+
+ lines[i] = line;
+ columns[i] = column++;
+
+ if (code === N || code === R || code === F) {
+ if (code === R && i + 1 < sourceLength && source.charCodeAt(i + 1) === N) {
+ i++;
+ lines[i] = line;
+ columns[i] = column;
+ }
+
+ line++;
+ column = 1;
+ }
+ }
+
+ lines[sourceLength] = line;
+ columns[sourceLength] = column;
+
+ host.lines = lines;
+ host.columns = columns;
+ host.computed = true;
+}
+
+class OffsetToLocation {
+ constructor(source, startOffset, startLine, startColumn) {
+ this.setSource(source, startOffset, startLine, startColumn);
+ this.lines = null;
+ this.columns = null;
+ }
+ setSource(source = '', startOffset = 0, startLine = 1, startColumn = 1) {
+ this.source = source;
+ this.startOffset = startOffset;
+ this.startLine = startLine;
+ this.startColumn = startColumn;
+ this.computed = false;
+ }
+ getLocation(offset, filename) {
+ if (!this.computed) {
+ computeLinesAndColumns(this);
+ }
+
+ return {
+ source: filename,
+ offset: this.startOffset + offset,
+ line: this.lines[offset],
+ column: this.columns[offset]
+ };
+ }
+ getLocationRange(start, end, filename) {
+ if (!this.computed) {
+ computeLinesAndColumns(this);
+ }
+
+ return {
+ source: filename,
+ start: {
+ offset: this.startOffset + start,
+ line: this.lines[start],
+ column: this.columns[start]
+ },
+ end: {
+ offset: this.startOffset + end,
+ line: this.lines[end],
+ column: this.columns[end]
+ }
+ };
+ }
+}
+
+exports.OffsetToLocation = OffsetToLocation;