From 40bdd7e94af97a94ccd1c0c94279cf1ac662e293 Mon Sep 17 00:00:00 2001 From: harttle Date: Wed, 16 Nov 2016 01:06:37 +0800 Subject: [PATCH] refactor: move file to token property --- index.js | 12 ++++-------- src/tokenizer.js | 5 +++-- src/util/error.js | 20 +++++++++++++++++--- test/util/error.js | 6 ++---- 4 files changed, 26 insertions(+), 17 deletions(-) diff --git a/index.js b/index.js index b9094eddf..601deeea5 100644 --- a/index.js +++ b/index.js @@ -33,8 +33,8 @@ var _engine = { return this; }, - parse: function(html) { - var tokens = tokenizer.parse(html); + parse: function(html, filepath) { + var tokens = tokenizer.parse(html, filepath); return this.parser.parse(tokens); }, render: function(tpl, ctx, opts) { @@ -56,11 +56,7 @@ var _engine = { renderFile: function(filepath, ctx, opts) { opts = _.assign({}, opts); return this.getTemplate(filepath, opts.root) - .then(templates => this.render(templates, ctx, opts)) - .catch(e => { - e.file = filepath; - throw e; - }); + .then(templates => this.render(templates, ctx, opts)); }, evalOutput: function(str, scope) { var tpl = this.parser.parseOutput(str.trim()); @@ -100,7 +96,7 @@ var _engine = { .then(str => this.parse(str)) .then(tpl => this.cache[filepath] = tpl); } else { - return readFileAsync(filepath).then(str => this.parse(str)); + return readFileAsync(filepath).then(str => this.parse(str, filepath)); } }); }, diff --git a/src/tokenizer.js b/src/tokenizer.js index 8cba24bee..33a4057c7 100644 --- a/src/tokenizer.js +++ b/src/tokenizer.js @@ -3,7 +3,7 @@ const TokenizationError = require('./util/error.js').TokenizationError; const _ = require('./util/underscore.js'); const assert = require('../src/util/assert.js'); -function parse(html) { +function parse(html, filepath) { assert(_.isString(html), 'illegal input type'); var tokens = []; @@ -58,7 +58,8 @@ function parse(html) { raw: match[offset], value: match[offset + 1].trim(), line: getLineNum(match), - input: html + input: html, + file: filepath }; } diff --git a/src/util/error.js b/src/util/error.js index e68526a0b..bc54ca1c0 100644 --- a/src/util/error.js +++ b/src/util/error.js @@ -8,9 +8,10 @@ function TokenizationError(message, token) { this.input = token.input; this.line = token.line; + this.file = token.file; var context = mkContext(token.input, token.line); - this.message = message + ', line:' + token.line; + this.message = mkMessage(message, token); this.stack = context + '\n' + (this.stack || ''); } TokenizationError.prototype = Object.create(Error.prototype); @@ -22,9 +23,10 @@ function ParseError(e, token) { this.input = token.input; this.line = token.line; + this.file = token.file; var context = mkContext(token.input, token.line); - this.message = e.message + ', line:' + token.line; + this.message = mkMessage(e.message, token); this.stack = context + '\n' + (this.stack || ''); } ParseError.prototype = Object.create(Error.prototype); @@ -40,9 +42,10 @@ function RenderError(e, tpl) { this.input = tpl.token.input; this.line = tpl.token.line; + this.file = tpl.token.file; var context = mkContext(tpl.token.input, tpl.token.line); - this.message = e.message + ', line:' + tpl.token.line; + this.message = mkMessage(e.message, tpl.token); this.stack = context + '\n' + (e.stack || ''); } RenderError.prototype = Object.create(Error.prototype); @@ -93,6 +96,17 @@ function align(n, max) { return blank + str; } +function mkMessage(msg, token){ + msg = msg || ''; + if(token.file){ + msg += ', file:' + token.file; + } + if(token.line){ + msg += ', line:' + token.line; + } + return msg; +} + module.exports = { TokenizationError, ParseError, diff --git a/test/util/error.js b/test/util/error.js index 0a92bf61b..1aeb3819f 100644 --- a/test/util/error.js +++ b/test/util/error.js @@ -155,7 +155,7 @@ describe('error', function() { expect(err.name).to.equal('RenderError'); }); }); - it.only('should contain original template context in err.stack', function() { + it('should contain original template context in err.stack', function() { var origin = ['1st', '2nd', '3rd', 'X{%throwingTag%} Y', '5th', '6th', '7th']; mock({ '/throwing-tag.html': origin.join('\n') @@ -173,9 +173,7 @@ describe('error', function() { return expect(engine.parseAndRender(html)).to.eventually .be.rejected .then(function(err) { - console.log(err.message); - console.log(err.stack); - expect(err.message).to.equal('intended render error, line:4'); + expect(err.message).to.equal('intended render error, file:/throwing-tag.html, line:4'); expect(err.stack).to.contain(message.join('\n')); expect(err.name).to.equal('RenderError'); });