From a641251062cd0b6f15ecbdfdea216569087e9d29 Mon Sep 17 00:00:00 2001 From: Tcha-Tcho Date: Sun, 26 Jan 2014 03:06:17 -0200 Subject: [PATCH 1/4] includes now accept nested/paths or "absolute/.../paths" --- Readme.md | 11 +++++++++++ lib/ejs.js | 6 +++++- test/ejs.js | 2 +- test/fixtures/menu.ejs | 6 +++++- test/fixtures/menu.html | 3 ++- 5 files changed, 24 insertions(+), 4 deletions(-) diff --git a/Readme.md b/Readme.md index ab0a3dd1..f0363360 100644 --- a/Readme.md +++ b/Readme.md @@ -65,6 +65,17 @@ Embedded JavaScript templates. <% include user/show %> <% }) %> +``` + + You can use absolute paths using string "my/path". the path will be relative + to the app folder. + +``` + ``` ## Custom delimiters diff --git a/lib/ejs.js b/lib/ejs.js index f36944fb..d73bbcdf 100644 --- a/lib/ejs.js +++ b/lib/ejs.js @@ -328,7 +328,11 @@ exports.renderFile = function(path, options, fn){ */ function resolveInclude(name, filename) { - var path = join(dirname(filename), name); + if (name[0].match(/(\'|\")/)) { //use absolute path if "path/" + name = name.replace(/(\'|\")/ig,""); + var dir = process.cwd(); + }; + var path = join((dir || dirname(filename)), name); var ext = extname(name); if (!ext) path += '.ejs'; return path; diff --git a/test/ejs.js b/test/ejs.js index 7df7ace9..f7893762 100644 --- a/test/ejs.js +++ b/test/ejs.js @@ -264,7 +264,7 @@ describe('includes', function(){ .should.equal(fixture('include.html')); }) - it('should work when nested', function(){ + it('should work when nested or absolute', function(){ var file = 'test/fixtures/menu.ejs'; ejs.render(fixture('menu.ejs'), { filename: file, pets: users }) .should.equal(fixture('menu.html')); diff --git a/test/fixtures/menu.ejs b/test/fixtures/menu.ejs index 61fad418..177d62f7 100644 --- a/test/fixtures/menu.ejs +++ b/test/fixtures/menu.ejs @@ -8,4 +8,8 @@ <% var url = '/baz' -%> <% var title = 'Baz' -%> -<% include includes/menu-item -%> \ No newline at end of file +<% include includes/menu-item -%> + +<% var url = '/boz' -%> +<% var title = 'Boz' -%> +<% include "test/fixtures/includes/menu-item" -%> \ No newline at end of file diff --git a/test/fixtures/menu.html b/test/fixtures/menu.html index 1f9e45fd..68c305ab 100644 --- a/test/fixtures/menu.html +++ b/test/fixtures/menu.html @@ -1,3 +1,4 @@
  • Foo
  • Bar
  • -
  • Baz
  • \ No newline at end of file +
  • Baz
  • +
  • Boz
  • \ No newline at end of file From 89eccc8c21f90338410dcea1f2e1f8b213090d36 Mon Sep 17 00:00:00 2001 From: Tcha-Tcho Date: Sun, 26 Jan 2014 04:42:26 -0200 Subject: [PATCH 2/4] including change on ejs.js file --- ejs.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ejs.js b/ejs.js index ab44a80c..3e13a495 100644 --- a/ejs.js +++ b/ejs.js @@ -380,7 +380,11 @@ exports.renderFile = function(path, options, fn){ */ function resolveInclude(name, filename) { - var path = join(dirname(filename), name); + if (name[0].match(/(\'|\")/)) { //use absolute path if "path/" + name = name.replace(/(\'|\")/ig,""); + var dir = process.cwd(); + }; + var path = join((dir || dirname(filename)), name); var ext = extname(name); if (!ext) path += '.ejs'; return path; From ff69ddb943e6bb08ed66766a52b589a60b0843aa Mon Sep 17 00:00:00 2001 From: Tcha-Tcho Date: Mon, 27 Jan 2014 16:37:10 -0200 Subject: [PATCH 3/4] includes that start with '/' will use absolute path --- Readme.md | 5 ++--- ejs.js | 6 ++---- lib/ejs.js | 6 ++---- test/fixtures/menu.ejs | 2 +- 4 files changed, 7 insertions(+), 12 deletions(-) diff --git a/Readme.md b/Readme.md index f0363360..077bd4ec 100644 --- a/Readme.md +++ b/Readme.md @@ -67,13 +67,12 @@ Embedded JavaScript templates. ``` - You can use absolute paths using string "my/path". the path will be relative - to the app folder. + Starting with "/" will drive you to the absolute path. ```
      <% users.forEach(function(user){ %> - <% include "views/user/show" %> + <% include /views/user/show %> <% }) %>
    ``` diff --git a/ejs.js b/ejs.js index 3e13a495..739ce7eb 100644 --- a/ejs.js +++ b/ejs.js @@ -380,10 +380,8 @@ exports.renderFile = function(path, options, fn){ */ function resolveInclude(name, filename) { - if (name[0].match(/(\'|\")/)) { //use absolute path if "path/" - name = name.replace(/(\'|\")/ig,""); - var dir = process.cwd(); - }; + name = name.replace(/(\'|\")/ig,""); + if (name[0].match(/(\/)/)) var dir = process.cwd(); //absolute path var path = join((dir || dirname(filename)), name); var ext = extname(name); if (!ext) path += '.ejs'; diff --git a/lib/ejs.js b/lib/ejs.js index d73bbcdf..a0d30f2c 100644 --- a/lib/ejs.js +++ b/lib/ejs.js @@ -328,10 +328,8 @@ exports.renderFile = function(path, options, fn){ */ function resolveInclude(name, filename) { - if (name[0].match(/(\'|\")/)) { //use absolute path if "path/" - name = name.replace(/(\'|\")/ig,""); - var dir = process.cwd(); - }; + name = name.replace(/(\'|\")/ig,""); + if (name[0].match(/(\/)/)) var dir = process.cwd(); //absolute path var path = join((dir || dirname(filename)), name); var ext = extname(name); if (!ext) path += '.ejs'; diff --git a/test/fixtures/menu.ejs b/test/fixtures/menu.ejs index 177d62f7..7fbc4c41 100644 --- a/test/fixtures/menu.ejs +++ b/test/fixtures/menu.ejs @@ -12,4 +12,4 @@ <% var url = '/boz' -%> <% var title = 'Boz' -%> -<% include "test/fixtures/includes/menu-item" -%> \ No newline at end of file +<% include "/test/fixtures/includes/menu-item" -%> From a819ed25887979e45c6e5e22b816fcbd9e31ec8a Mon Sep 17 00:00:00 2001 From: Tcha-Tcho Date: Mon, 27 Jan 2014 23:03:51 -0200 Subject: [PATCH 4/4] 'includes' with absolute path will accept a baseDir option for those in different path of current working directory of the process - jade pattern. --- ejs.js | 9 +++++---- lib/ejs.js | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/ejs.js b/ejs.js index 739ce7eb..146da7cb 100644 --- a/ejs.js +++ b/ejs.js @@ -207,7 +207,7 @@ var parse = exports.parse = function(str, options){ if (0 == js.trim().indexOf('include')) { var name = js.trim().slice(7).trim(); if (!filename) throw new Error('filename option is required for includes'); - var path = resolveInclude(name, filename); + var path = resolveInclude(name, filename, options.baseDir); include = read(path, 'utf8'); include = exports.parse(include, { filename: path, _with: false, open: open, close: close, compileDebug: compileDebug }); buf += "' + (function(){" + include + "})() + '"; @@ -311,6 +311,7 @@ var compile = exports.compile = function(str, options){ * - `locals` Local variables object * - `cache` Compiled functions are cached, requires `filename` * - `filename` Used by `cache` to key caches + * - `baseDir` Used by `resolveInclude` to absolute paths * - `scope` Function execution context * - `debug` Output generated function body * - `open` Open tag, defaulting to "<%" @@ -379,10 +380,10 @@ exports.renderFile = function(path, options, fn){ * @api private */ -function resolveInclude(name, filename) { +function resolveInclude(name, filename, baseDir) { name = name.replace(/(\'|\")/ig,""); - if (name[0].match(/(\/)/)) var dir = process.cwd(); //absolute path - var path = join((dir || dirname(filename)), name); + if (name[0] === '/') var absolute = (baseDir || process.cwd()); + var path = join((absolute || dirname(filename)), name); var ext = extname(name); if (!ext) path += '.ejs'; return path; diff --git a/lib/ejs.js b/lib/ejs.js index a0d30f2c..2901e5f2 100644 --- a/lib/ejs.js +++ b/lib/ejs.js @@ -155,7 +155,7 @@ var parse = exports.parse = function(str, options){ if (0 == js.trim().indexOf('include')) { var name = js.trim().slice(7).trim(); if (!filename) throw new Error('filename option is required for includes'); - var path = resolveInclude(name, filename); + var path = resolveInclude(name, filename, options.baseDir); include = read(path, 'utf8'); include = exports.parse(include, { filename: path, _with: false, open: open, close: close, compileDebug: compileDebug }); buf += "' + (function(){" + include + "})() + '"; @@ -259,6 +259,7 @@ var compile = exports.compile = function(str, options){ * - `locals` Local variables object * - `cache` Compiled functions are cached, requires `filename` * - `filename` Used by `cache` to key caches + * - `baseDir` Used by `resolveInclude` to absolute paths * - `scope` Function execution context * - `debug` Output generated function body * - `open` Open tag, defaulting to "<%" @@ -327,10 +328,10 @@ exports.renderFile = function(path, options, fn){ * @api private */ -function resolveInclude(name, filename) { +function resolveInclude(name, filename, baseDir) { name = name.replace(/(\'|\")/ig,""); - if (name[0].match(/(\/)/)) var dir = process.cwd(); //absolute path - var path = join((dir || dirname(filename)), name); + if (name[0] === '/') var absolute = (baseDir || process.cwd()); + var path = join((absolute || dirname(filename)), name); var ext = extname(name); if (!ext) path += '.ejs'; return path;