Skip to content

Commit

Permalink
experimental pragma support
Browse files Browse the repository at this point in the history
{%esc:j}{foo}{/esc}
  • Loading branch information
akdubya committed Jan 26, 2011
1 parent 17bc895 commit 98ce166
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 28 deletions.
57 changes: 48 additions & 9 deletions lib/compiler.js
Expand Up @@ -26,6 +26,7 @@ dust.optimizers = {
"<": visit, "<": visit,
"+": visit, "+": visit,
"@": visit, "@": visit,
"%": visit,
partial: visit, partial: visit,
context: visit, context: visit,
params: visit, params: visit,
Expand All @@ -38,6 +39,17 @@ dust.optimizers = {
comment: nullify comment: nullify
} }


dust.pragmas = {
esc: function(compiler, context, bodies, params) {
var old = compiler.auto;
if (!context) context = 'h';
compiler.auto = (context === 's') ? '' : context;
var out = compileParts(compiler, bodies.block);
compiler.auto = old;
return out;
}
}

function visit(context, node) { function visit(context, node) {
var out = [node[0]]; var out = [node[0]];
for (var i=1, len=node.length; i<len; i++) { for (var i=1, len=node.length; i<len; i++) {
Expand Down Expand Up @@ -126,20 +138,22 @@ function compileBodies(context) {
return out.join(''); return out.join('');
} }


function compileParts(context, body) {
var parts = '';
for (var i=1, len=body.length; i<len; i++) {
parts += dust.compileNode(context, body[i]);
}
return parts;
}

dust.compileNode = function(context, node) { dust.compileNode = function(context, node) {
return dust.nodes[node[0]](context, node); return dust.nodes[node[0]](context, node);
} }


dust.nodes = { dust.nodes = {
body: function(context, node) { body: function(context, node) {
var id = context.index++, var id = context.index++, name = "body_" + id;
name = "body_" + id, context.bodies[id] = compileParts(context, node);
parts = '';

for (var i=1, len=node.length; i<len; i++) {
parts += dust.compileNode(context, node[i]);
}
context.bodies[id] = parts;
return name; return name;
}, },


Expand Down Expand Up @@ -199,6 +213,30 @@ dust.nodes = {
+ ")"; + ")";
}, },


"%": function(context, node) {
// TODO: Move these hacks into pragma precompiler
var name = node[1][1];
if (!dust.pragmas[name]) return '';

var rawBodies = node[4];
var bodies = {};
for (var i=1, len=rawBodies.length; i<len; i++) {
var b = rawBodies[i];
bodies[b[1][1]] = b[2];
}

var rawParams = node[3];
var params = {};
for (var i=1, len=rawParams.length; i<len; i++) {
var p = rawParams[i];
params[p[1][1]] = p[2][1];
}

var ctx = node[2][1] ? node[2][1].text : null;

return dust.pragmas[name](context, ctx, bodies, params);
},

partial: function(context, node) { partial: function(context, node) {
return ".partial(" return ".partial("
+ dust.compileNode(context, node[1]) + dust.compileNode(context, node[1])
Expand Down Expand Up @@ -241,7 +279,8 @@ dust.nodes = {
var filter = node[i]; var filter = node[i];
list.push("\"" + filter + "\""); list.push("\"" + filter + "\"");
} }
return "\"" + context.auto + "\",[" + list.join(',') + "]"; return "\"" + context.auto + "\""
+ (list.length ? ",[" + list.join(',') + "]" : '');
}, },


key: function(context, node) { key: function(context, node) {
Expand Down
27 changes: 10 additions & 17 deletions lib/dust.js
Expand Up @@ -78,14 +78,14 @@ dust.isEmpty = function(value) {
}; };


dust.filter = function(string, auto, filters) { dust.filter = function(string, auto, filters) {
var len = filters.length; if (filters) {

for (var i=0, len=filters.length; i<len; i++) {
for (var i=0; i<len; i++) { var name = filters[i];
var name = filters[i]; if (name === "s") {
if (name === "s") { auto = null;
auto = null; } else {
} else { string = dust.filters[name](string);
string = dust.filters[name](string); }
} }
} }
if (auto) { if (auto) {
Expand All @@ -95,16 +95,9 @@ dust.filter = function(string, auto, filters) {
}; };


dust.filters = { dust.filters = {
h: function(value) { h: function(value) { return dust.escapeHtml(value); },
return dust.escapeHtml(value); j: function(value) { return dust.escapeJs(value); },
},

j: function(value) {
return dust.escapeJs(value);
},

u: encodeURI, u: encodeURI,

uc: encodeURIComponent uc: encodeURIComponent
} }


Expand Down
4 changes: 2 additions & 2 deletions src/dust.pegjs
Expand Up @@ -22,7 +22,7 @@ section "section"
{ t.push(["bodies"]); return t } { t.push(["bodies"]); return t }


sec_tag_start sec_tag_start
= ld t:[#?^<+@] n:identifier c:context p:params = ld t:[#?^<+@%] n:identifier c:context p:params
{ return [t, n, c, p] } { return [t, n, c, p] }


end_tag "end tag" end_tag "end tag"
Expand Down Expand Up @@ -98,7 +98,7 @@ comment "comment"
{ return ["comment", c.join('')] } { return ["comment", c.join('')] }


tag tag
= ld [#?^><+%:@/~] (!rd !eol .)+ rd = ld [#?^><+%:@/~%] (!rd !eol .)+ rd
/ reference / reference


ld ld
Expand Down

0 comments on commit 98ce166

Please sign in to comment.