diff --git a/lib/jsmd/rewriter.js b/lib/jsmd/rewriter.js index 3977a20..be68971 100644 --- a/lib/jsmd/rewriter.js +++ b/lib/jsmd/rewriter.js @@ -60,7 +60,7 @@ Rewriter.prototype.compile = function(fn) { Rewriter.prototype.build = function(code, fn) { var tree = this.parse(code); - var ast = this.buildAst(tree); + var ast = this.buildAst(tree, code); ast.body.unshift(this.header); fn(generate(tree)); }; @@ -94,11 +94,12 @@ Rewriter.prototype.parse = function(code) { * Build the new ast. * * @param {Object} ast + * @param {String} input * @returns {Object} new ast * @api private */ -Rewriter.prototype.buildAst = function(ast) { +Rewriter.prototype.buildAst = function(ast, input) { var assertions = this.assertions; var self = this; @@ -106,6 +107,8 @@ Rewriter.prototype.buildAst = function(ast) { leave: function(node) { if (node.type !== EXPRESSION) return node; var line = node.loc.end.line; + var newlines = input.substring(node.range[0], node.range[1]).match(/\n(?=\s*$)/g) || []; + line -= newlines.length; if (!assertions.hasOwnProperty(line)) return node; return self.assertion(assertions[line], node.expression); } diff --git a/test/compile.test.js b/test/compile.test.js new file mode 100644 index 0000000..5ec5b27 --- /dev/null +++ b/test/compile.test.js @@ -0,0 +1,17 @@ +var fs = require('fs'); +var Rewriter = require('../lib/jsmd/rewriter'); + +describe('jsmd', function() { + it('compiles files as expected', function() { + var base = __dirname + '/compile/'; + + fs.readdirSync(base).forEach(function(file) { + if (!/\.md$/.test(file)) return; + var md = fs.readFileSync(base + file, 'utf8'); + new Rewriter(md).compile(function(compiled) { + var expected = fs.readFileSync(base + file.replace(/md$/, 'js'), 'utf8'); + compiled.should.eq(expected.trim()); + }); + }); + }); +}); diff --git a/test/compile/ASI.js b/test/compile/ASI.js new file mode 100644 index 0000000..ac0b8f7 --- /dev/null +++ b/test/compile/ASI.js @@ -0,0 +1,6 @@ +var __jsmd__ = require('assert').deepEqual; +__jsmd__(1, Math.min(1, 2)); +__jsmd__(2, Math.min(2, 3)); +__jsmd__(3, Math.min(3, 4)); +foo(); +__jsmd__(4, bar()); diff --git a/test/compile/ASI.md b/test/compile/ASI.md new file mode 100644 index 0000000..cb13e13 --- /dev/null +++ b/test/compile/ASI.md @@ -0,0 +1,11 @@ +```js +Math.min(1, 2) // => 1 +Math.min(2, 3) // => 2 + +Math.min(3, 4) + + // => 3 +foo() + +bar() // => 4 +``` diff --git a/test/compile/multi-line.js b/test/compile/multi-line.js new file mode 100644 index 0000000..e25bf8e --- /dev/null +++ b/test/compile/multi-line.js @@ -0,0 +1,3 @@ +var __jsmd__ = require('assert').deepEqual; +__jsmd__(2, Math.min(3, 2)); +__jsmd__(4, Math.min(5, 4)); diff --git a/test/fixtures/multi-line.md b/test/compile/multi-line.md similarity index 93% rename from test/fixtures/multi-line.md rename to test/compile/multi-line.md index 92fc0d4..7cfbd5e 100644 --- a/test/fixtures/multi-line.md +++ b/test/compile/multi-line.md @@ -3,4 +3,4 @@ Math .min(3, 2); // => 2 Math .min(5, 4); // => 4 -``` \ No newline at end of file +``` diff --git a/test/compile/simple.js b/test/compile/simple.js new file mode 100644 index 0000000..bc94953 --- /dev/null +++ b/test/compile/simple.js @@ -0,0 +1,4 @@ +var __jsmd__ = require('assert').deepEqual; +__jsmd__(1, Math.min(1, 2)); +__jsmd__(2, Math.min(1, 2)); +__jsmd__(3, Math.min(1, 2)); diff --git a/test/compile/simple.md b/test/compile/simple.md new file mode 100644 index 0000000..1c81848 --- /dev/null +++ b/test/compile/simple.md @@ -0,0 +1,10 @@ +```js +Math.min(1, 2) // => 1 + + +Math.min(1, 2); // => 2 + + + +Math.min(1, 2) // => 3 +``` diff --git a/test/fixtures/ASI.md b/test/fixtures/ASI.md deleted file mode 100644 index 4a0eeaa..0000000 --- a/test/fixtures/ASI.md +++ /dev/null @@ -1,4 +0,0 @@ -```js -Math.min(1, 2) // => 1 -Math.min(2, 3) // => 2 -``` \ No newline at end of file diff --git a/test/jsmd.test.js b/test/jsmd.test.js index 3ac321e..7e08620 100644 --- a/test/jsmd.test.js +++ b/test/jsmd.test.js @@ -3,11 +3,6 @@ var verifyFile = require('..').verifyFile; var run = function run(file, fn) { verifyFile(fixture(file), fn); }; -var compile = function(file, fn){ - var path = fixture(file); - var md = require('fs').readFileSync(path, 'utf8'); - new Rewriter(md).compile(fn); -}; describe('jsmd', function() { it('ignores code different than javascript', function(done) { @@ -44,19 +39,4 @@ describe('jsmd', function() { done(); }); }); - - it('can handle multi-line expressions', function(done) { - run('multi-line', function(err) { - should.not.exist(err); - done(); - }); - }); - - it.skip('supports automatic semicolon insertion (ASI)', function(done) { - compile('ASI', function(js) { - js.should.match(/__jsmd__\(1,/); - js.should.match(/__jsmd__\(2,/); - done(); - }); - }); }); diff --git a/test/support/bootstrap.js b/test/support/bootstrap.js index b0d7bac..13d5390 100644 --- a/test/support/bootstrap.js +++ b/test/support/bootstrap.js @@ -3,6 +3,7 @@ */ var join = require('path').join; +var fs = require('fs'); /** * External dependencies.