snakeskin
Version:
Компилятор блочных шаблонов c поддержкой наследования.
124 lines (96 loc) • 2.48 kB
JavaScript
/*!
* API для обработки ошибок трансляции
*/
/**
* Вывести дополнительную информацию об ошибке
* @return {string}
*/
DirObj.prototype.genErrorAdvInfo = function () {
var nl = this.lineSeparator;
var info = this.info,
str = '';
if (!info) {
return str;
}
forIn(info, (el, key) => {
if (el == null) {
return;
}
if (el.innerHTML) {
str += `${key}: (class: ${el.className || 'undefined'}, id: ${el.id || 'undefined'}), `;
} else {
str += `${key}: ${el}, `;
}
});
str = str.replace(/, $/, '');
var line = info['line'];
var cutRgxp = /\/\*!!= (.*?) =\*\//g,
privateRgxp = new RegExp(`${ADV_LEFT_BLOCK}?${LEFT_BLOCK}__.*?__.*?${RIGHT_BLOCK}`, 'g'),
styleRgxp = /\t|[ ]{4}/g;
if (line) {
let prfx = '',
max = 0;
for (let i = 8; i--;) {
let pos = line - i - 2,
prev = this.lines[pos];
let space = new Array(String(line - 1).length - String(pos).length + 1)
.join(' ');
if (prev != null) {
prev = prev
.replace(styleRgxp, ' ')
.replace(privateRgxp, '')
.replace(cutRgxp, '$1');
let part;
if (prev.trim()) {
part = `${nl} ${pos + 1} ${space}${prev}`;
} else {
part = `${nl} ...`;
}
prfx += part;
if (max < part.length) {
max = part.length;
}
}
}
let current = this.lines[line - 1]
.replace(styleRgxp, ' ')
.replace(privateRgxp, '')
.replace(cutRgxp, '$1');
let part = `> ${line} ${current}`;
let sep = new Array(
Math.max(max, part.length) || 5
).join('-');
str += nl + sep + prfx + nl + part + nl + sep;
}
return str;
};
/**
* @private
* @type {?boolean}
*/
DirObj.prototype._error = null;
/**
* Генерировать заданную ошибку
* @param {string} msg - сообщение ошибки
*/
DirObj.prototype.error = function (msg) {
if (this._error) {
return;
}
this._error = true;
var report = `${msg}, ${this.genErrorAdvInfo()}`,
error = new Error(report);
error.name = 'SnakeskinError';
this.brk = true;
if (this.proto) {
this.parent.brk = true;
}
if (this.onError) {
this.onError(error);
} else {
if (typeof console === 'undefined' || typeof console.error !== 'function' || this.throws) {
throw error;
}
console.error(`SnakeskinError: ${report}`);
}
};