blear.classes.template
Version:
97 lines (79 loc) • 2.61 kB
JavaScript
/**
* 意外处理
* @author ydr.me
* @create 2018-04-18 08:33
* @update 2018-04-18 08:33
*/
'use strict';
var string = require('blear.utils.string');
var path = require('blear.utils.path');
var roster = require('./roster');
var more = '...';
var lineNoSeparator = '| ';
var errorLine = '>> ';
var eachLineMaxLength = 30;
var filterNameRE = new RegExp(string.escapeRegExp(roster.filters + '.'));
var errorFlag = roster.error;
var lineRE = /[\n\r]/;
/**
* 意外处理
* @param err
* @param snippetIndex
* @returns {*}
*/
module.exports = function (err, snippetIndex) {
// 已经是修正过的 error,因为嵌套 try catch 会层层捕获的
if (err[errorFlag]) {
return err;
}
var compiled = this;
var snippet = compiled.snippets[snippetIndex];
var lines = compiled.lines;
var msg = err.message;
var line = snippet.line;
var min = Math.max(line - 2, 0);
var max = Math.min(line + 2, lines.length - 1);
var lineNoLength = (max + 1 + '').length + 1;
var msgList = [];
var eachLinePadLength = errorLine.length + lineNoLength;
msg = (err.type || err.name) + ': ' + msg.replace(filterNameRE, 'filter ');
for (; min <= max; min++) {
var content = lines[min];
var contentLength = content.length;
var lineNo = min + 1 + '';
// 当前行
if (line === min) {
lineNo = errorLine + lineNo;
var valueInThisLine = snippet.value.split(lineRE)[0];
var begin = snippet.begin;
var errContent = content.slice(begin, begin + valueInThisLine.length);
var remainLength = eachLineMaxLength - errContent.length;
var prefixStart = begin - remainLength;
var prefix = content.slice(Math.max(prefixStart, 0), begin);
content = (prefixStart < 0 ? '' : more) + prefix + content.slice(begin, begin + valueInThisLine.length)
} else if (contentLength > eachLineMaxLength) {
content = content.slice(0, eachLineMaxLength) + more;
}
msgList.push(
// 行号
string.padStart(lineNo, eachLinePadLength) +
// 分隔线
lineNoSeparator +
// 行内容
content
);
}
msgList.push(
'',
msg
);
var file = snippet.file;
var dirname = snippet.dirname;
if (file) {
var filename = dirname ? path.relative(dirname, file) : file;
msgList.push('file: ' + filename);
}
err[errorFlag] = true;
err.message = msgList.join('\n');
return err;
};