77 lines
1.5 KiB
JavaScript
77 lines
1.5 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
|
||
|
var common = require('./common');
|
||
|
|
||
|
|
||
|
function Mark(name, buffer, position, line, column) {
|
||
|
this.name = name;
|
||
|
this.buffer = buffer;
|
||
|
this.position = position;
|
||
|
this.line = line;
|
||
|
this.column = column;
|
||
|
}
|
||
|
|
||
|
|
||
|
Mark.prototype.getSnippet = function getSnippet(indent, maxLength) {
|
||
|
var head, start, tail, end, snippet;
|
||
|
|
||
|
if (!this.buffer) return null;
|
||
|
|
||
|
indent = indent || 4;
|
||
|
maxLength = maxLength || 75;
|
||
|
|
||
|
head = '';
|
||
|
start = this.position;
|
||
|
|
||
|
while (start > 0 && '\x00\r\n\x85\u2028\u2029'.indexOf(this.buffer.charAt(start - 1)) === -1) {
|
||
|
start -= 1;
|
||
|
if (this.position - start > (maxLength / 2 - 1)) {
|
||
|
head = ' ... ';
|
||
|
start += 5;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
tail = '';
|
||
|
end = this.position;
|
||
|
|
||
|
while (end < this.buffer.length && '\x00\r\n\x85\u2028\u2029'.indexOf(this.buffer.charAt(end)) === -1) {
|
||
|
end += 1;
|
||
|
if (end - this.position > (maxLength / 2 - 1)) {
|
||
|
tail = ' ... ';
|
||
|
end -= 5;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
snippet = this.buffer.slice(start, end);
|
||
|
|
||
|
return common.repeat(' ', indent) + head + snippet + tail + '\n' +
|
||
|
common.repeat(' ', indent + this.position - start + head.length) + '^';
|
||
|
};
|
||
|
|
||
|
|
||
|
Mark.prototype.toString = function toString(compact) {
|
||
|
var snippet, where = '';
|
||
|
|
||
|
if (this.name) {
|
||
|
where += 'in "' + this.name + '" ';
|
||
|
}
|
||
|
|
||
|
where += 'at line ' + (this.line + 1) + ', column ' + (this.column + 1);
|
||
|
|
||
|
if (!compact) {
|
||
|
snippet = this.getSnippet();
|
||
|
|
||
|
if (snippet) {
|
||
|
where += ':\n' + snippet;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return where;
|
||
|
};
|
||
|
|
||
|
|
||
|
module.exports = Mark;
|