Nunjucks:如何使用自定义扩展绕过自动转义?
Nunjucks : How to bypass autoescape with custom extension?
我设法在 Nunjucks.js 中制作了异步自定义扩展,但我还有一些未解决的问题。下面的就是其中之一。
你如何配置你的扩展不转义它的输出。
我的代码看起来像那样。
var nunjucks = require('nunjucks');
module.exports = function CustomExtension() {
this.tags = ['docs'];
this.parse = function(parser, nodes, lexer) {
// parse the args and move after the block end. passing true
// as the second arg is required if there are no parentheses
var args = parser.parseSignature(null, true);
parser.nextToken();
// parse the content until end block
var body = parser.parseUntilBlocks('enddocs');
parser.advanceAfterBlockEnd();
return new nodes.CallExtensionAsync(this, 'run', args, [body]);
};
this.run = function(context, arguments, body, callback) {
var id = body();
somAsyncMagic(id, function(html) {
callback(null, html);
});
};
}
顺便在node中使用了这段代码。如果这可能会给某人带来一些想法。
谢谢
您可以访问所有内部过滤器,所以答案是 cb(null, nunjucks.filters.safe(html));
。
var nunjucks = require('nunjucks');
var MyLoader = nunjucks.Loader.extend({
async: true,
getSource: function(name, callback) {
var res = '...';
callback(err, res);
}
});
var env = new nunjucks.Environment(new MyLoader(), {autoescape: true}); // !
function CustomExtension(cb) {
this.tags = ['docs'];
this.parse = function(parser, nodes, lexer) {
var tok = parser.nextToken();
var args = parser.parseSignature(null, true);
parser.nextToken();
var body = parser.parseUntilBlocks('enddocs');
parser.advanceAfterBlockEnd();
return new nodes.CallExtensionAsync(this, 'run', args, [body], cb);
};
this.run = function(context, args, body, cb) {
var res = env.filters.safe(args + ':' + body()); // prevent escape
cb(null, res);
};
}
env.addExtension('CustomExtension', new CustomExtension());
env.renderString('{% docs "<TEST>" %}"OK"{% enddocs %}', console.log);
我设法在 Nunjucks.js 中制作了异步自定义扩展,但我还有一些未解决的问题。下面的就是其中之一。
你如何配置你的扩展不转义它的输出。 我的代码看起来像那样。
var nunjucks = require('nunjucks');
module.exports = function CustomExtension() {
this.tags = ['docs'];
this.parse = function(parser, nodes, lexer) {
// parse the args and move after the block end. passing true
// as the second arg is required if there are no parentheses
var args = parser.parseSignature(null, true);
parser.nextToken();
// parse the content until end block
var body = parser.parseUntilBlocks('enddocs');
parser.advanceAfterBlockEnd();
return new nodes.CallExtensionAsync(this, 'run', args, [body]);
};
this.run = function(context, arguments, body, callback) {
var id = body();
somAsyncMagic(id, function(html) {
callback(null, html);
});
};
}
顺便在node中使用了这段代码。如果这可能会给某人带来一些想法。
谢谢
您可以访问所有内部过滤器,所以答案是 cb(null, nunjucks.filters.safe(html));
。
var nunjucks = require('nunjucks');
var MyLoader = nunjucks.Loader.extend({
async: true,
getSource: function(name, callback) {
var res = '...';
callback(err, res);
}
});
var env = new nunjucks.Environment(new MyLoader(), {autoescape: true}); // !
function CustomExtension(cb) {
this.tags = ['docs'];
this.parse = function(parser, nodes, lexer) {
var tok = parser.nextToken();
var args = parser.parseSignature(null, true);
parser.nextToken();
var body = parser.parseUntilBlocks('enddocs');
parser.advanceAfterBlockEnd();
return new nodes.CallExtensionAsync(this, 'run', args, [body], cb);
};
this.run = function(context, args, body, cb) {
var res = env.filters.safe(args + ':' + body()); // prevent escape
cb(null, res);
};
}
env.addExtension('CustomExtension', new CustomExtension());
env.renderString('{% docs "<TEST>" %}"OK"{% enddocs %}', console.log);