UNPKG

snakeskin

Version:

Компилятор блочных шаблонов c поддержкой наследования.

124 lines (96 loc) 2.48 kB
/*! * 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}`); } };