From 4f9675b5f1409785c5f7d929411819b00774c908 Mon Sep 17 00:00:00 2001 From: Jackson Tian Date: Wed, 26 Feb 2014 12:12:31 +0800 Subject: [PATCH] Fix #5, when ejs refererences is differences, setting tag will fails --- README.md | 2 ++ lib/render.js | 18 +++++++++++---- test/render_tag.test.js | 49 ++++++++++++++++++++++++++++++++++++++++ test/views/mustache.html | 1 + 4 files changed, 65 insertions(+), 5 deletions(-) create mode 100644 test/render_tag.test.js create mode 100644 test/views/mustache.html diff --git a/README.md b/README.md index 8b05bf0..ae5423c 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,8 @@ app.listen(8080); * root: __dirname + '/views', * cache: true, // must set `true` in production env * layout: 'layout.html', // or false for no layout + * open: "<%", // ejs open tag, default is '<%' + * close: "%>", // ejs close tag, default is '%>' * helpers: { * config: config, * sitename: 'NodeBlog Engine', diff --git a/lib/render.js b/lib/render.js index f5a8443..09a7dfc 100644 --- a/lib/render.js +++ b/lib/render.js @@ -20,6 +20,8 @@ var settings = { layout: 'layout.html', viewExt: '', // view default extname _filters: {}, + open: ejs.open || "<%", + close: ejs.close || "%>" }; for (var k in filters) { @@ -39,10 +41,8 @@ function _render_tpl(fn, options, callback) { } var reg_meta = /[\\\^$*+?{}.()|\[\]]/g; -var open = ejs.open || "<%"; -var close = ejs.close || "%>"; -var PARTIAL_PATTERN_RE = new RegExp(open.replace(reg_meta, "\\$&") + - "[-=]\\s*partial\\((.+)\\)\\s*" + close.replace(reg_meta, "\\$&"), 'g'); +var PARTIAL_PATTERN_RE; + /** * add support for <%- partial('view') %> function * rather than realtime compiling, this implemention simply statically 'include' the partial view file @@ -90,7 +90,12 @@ function _render(view, options, callback) { } var tpl = partial(data); // fn = ejs.compile(tpl, {filename: viewpath, compileDebug: true, debug: true, _with: settings._with}); - fn = ejs.compile(tpl, {filename: viewpath, _with: settings._with}); + fn = ejs.compile(tpl, { + filename: viewpath, + _with: settings._with, + open: settings.open, + close: settings.close + }); if (settings.cache) { cache[view] = fn; } @@ -210,6 +215,9 @@ function middleware(options) { for (var k in options) { settings[k] = options[k]; } + // set the tag format + PARTIAL_PATTERN_RE = new RegExp(settings.open.replace(reg_meta, "\\$&") + + "[-=]\\s*partial\\((.+)\\)\\s*" + settings.close.replace(reg_meta, "\\$&"), 'g'); return function (req, res, next) { req.next = next; if (!res.req) { diff --git a/test/render_tag.test.js b/test/render_tag.test.js new file mode 100644 index 0000000..5729fbf --- /dev/null +++ b/test/render_tag.test.js @@ -0,0 +1,49 @@ +/*! + * connect-render - test/render_tag.test.js + * Copyright(c) 2013 JacksonTian + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var path = require('path'); +var fs = require('fs'); +var connect = require('connect'); +var request = require('supertest'); +var render = require('../lib/render'); +var should = require('should'); + +var options = { + root: path.join(__dirname, 'views'), + layout: false, + open: '{{', + close: '}}', + cache: true // `false` for debug +}; + +var app = connect(render(options)); + +app.use(function (req, res) { + if (req.url === '/mustache') { + return res.render('mustache.html', { name: 'fengmk2' }); + } + + res.render('index.html', { name: 'fengmk2' }); +}); + +app.use(function (err, req, res, next) { + console.log(err.stack); + next(err); +}); + +describe('render', function () { + describe('tag open/close', function () { + it('should ok with {{}}', function (done) { + request(app).get('/mustache') + .expect(200) + .expect('Hello, I am fengmk2.\n', done); + }); + }); +}); diff --git a/test/views/mustache.html b/test/views/mustache.html new file mode 100644 index 0000000..3c43356 --- /dev/null +++ b/test/views/mustache.html @@ -0,0 +1 @@ +Hello, I am {{=name}}.