diff --git a/lib/compiler.js b/lib/compiler.js index dd5259e..ca12e61 100644 --- a/lib/compiler.js +++ b/lib/compiler.js @@ -8,7 +8,7 @@ script = CoffeeScript.compile(preprocess(source), { noWrap: true }); - return "function(__obj) {\n if (!__obj) __obj = {};\n var __out = [], __capture = function(callback) {\n var out = __out, result;\n __out = [];\n callback.call(this);\n result = __out.join('');\n __out = out;\n return __safe(result);\n }, __sanitize = function(value) {\n if (value && value.ecoSafe) {\n return value;\n } else if (typeof value !== 'undefined' && value != null) {\n return __escape(value);\n } else {\n return '';\n }\n }, __safe, __objSafe = __obj.safe, __escape = __obj.escape;\n __safe = __obj.safe = function(value) {\n if (value && value.ecoSafe) {\n return value;\n } else {\n if (!(typeof value !== 'undefined' && value != null)) value = '';\n var result = new String(value);\n result.ecoSafe = true;\n return result;\n }\n };\n if (!__escape) {\n __escape = __obj.escape = function(value) {\n return ('' + value)\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\x22/g, '"');\n };\n }\n (function() {\n" + (indent(script, 4)) + "\n }).call(__obj);\n __obj.safe = __objSafe, __obj.escape = __escape;\n return __out.join('');\n}"; + return "function(__obj) {\n if (!__obj) __obj = {};\n if (Object.prototype.toString.call(__obj) == '[object Array]') {\n var result = [];\n for (var i = 0; i < __obj.length; i++)\n result.push(arguments.callee.call(this, __obj[i]));\n return result.join('');\n } \n var __out = [], __capture = function(callback) {\n var out = __out, result;\n __out = [];\n callback.call(this);\n result = __out.join('');\n __out = out;\n return __safe(result);\n }, __sanitize = function(value) {\n if (value && value.ecoSafe) {\n return value;\n } else if (typeof value !== 'undefined' && value != null) {\n return __escape(value);\n } else {\n return '';\n }\n }, __safe, __objSafe = __obj.safe, __escape = __obj.escape;\n __safe = __obj.safe = function(value) {\n if (value && value.ecoSafe) {\n return value;\n } else {\n if (!(typeof value !== 'undefined' && value != null)) value = '';\n var result = new String(value);\n result.ecoSafe = true;\n return result;\n }\n };\n if (!__escape) {\n __escape = __obj.escape = function(value) {\n return ('' + value)\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\x22/g, '"');\n };\n }\n (function() {\n" + (indent(script, 4)) + "\n }).call(__obj);\n __obj.safe = __objSafe, __obj.escape = __escape;\n return __out.join('');\n}"; }; exports.compile = function(source) { return new Function("return " + (precompile(source)))(); diff --git a/src/compiler.coffee b/src/compiler.coffee index 9a5fc0b..17f62dc 100644 --- a/src/compiler.coffee +++ b/src/compiler.coffee @@ -8,6 +8,12 @@ exports.precompile = precompile = (source) -> """ function(__obj) { if (!__obj) __obj = {}; + if (Object.prototype.toString.call(__obj) == '[object Array]') { + var result = []; + for (var i = 0; i < __obj.length; i++) + result.push(arguments.callee.call(this, __obj[i])); + return result.join(''); + } var __out = [], __capture = function(callback) { var out = __out, result; __out = []; diff --git a/test/fixtures/project.eco b/test/fixtures/project.eco new file mode 100644 index 0000000..ddb1dd3 --- /dev/null +++ b/test/fixtures/project.eco @@ -0,0 +1,2 @@ +<%= @name %> +<%- @description %> diff --git a/test/fixtures/project.out.1 b/test/fixtures/project.out.1 new file mode 100644 index 0000000..f5c1915 --- /dev/null +++ b/test/fixtures/project.out.1 @@ -0,0 +1,6 @@ +PowerTMS Active Shipments Page Redesign + +SCU Intranet +

On hold

+Sales Template + diff --git a/test/test_eco.coffee b/test/test_eco.coffee index 296aad9..ceccdbe 100644 --- a/test/test_eco.coffee +++ b/test/test_eco.coffee @@ -75,6 +75,15 @@ module.exports = ] test.same fixture("projects.out.2"), output test.done() + + "rendering project.eco with an array": (test) -> + output = eco.render fixture("project.eco"), [ + { name: "PowerTMS Active Shipments Page Redesign", url: "/projects/1" }, + { name: "SCU Intranet", url: "/projects/2", description: "

On hold

" }, + { name: "Sales Template", url: "/projects/3" } + ] + test.same fixture("project.out.1"), output + test.done() "rendering helpers.eco": (test) -> output = eco.render fixture("helpers.eco"),