Skip to content

Commit 81315c8

Browse files
committed
Merge pull request #1794 from akfish/fix/after_render
Execute 'after_render' filter when rendering with precompiled renderer
2 parents abf23ab + b9d3f0d commit 81315c8

File tree

2 files changed

+69
-3
lines changed

2 files changed

+69
-3
lines changed

lib/theme/view.js

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,15 +95,40 @@ View.prototype._resolveLayout = function(name) {
9595

9696
View.prototype._precompile = function() {
9797
var render = this._render;
98-
var renderer = render.getRenderer(pathFn.extname(this.path));
98+
var ctx = render.context;
99+
var ext = pathFn.extname(this.path);
100+
var renderer = render.getRenderer(ext);
99101
var data = {
100102
path: this.source,
101103
text: this.data._content
102104
};
103105

106+
function buildFilterArguments(result) {
107+
var output = render.getOutput(ext) || ext;
108+
return [
109+
'after_render:' + output,
110+
result,
111+
{
112+
context: ctx,
113+
args: [data]
114+
}
115+
];
116+
}
117+
104118
if (typeof renderer.compile === 'function') {
105-
var compiled = this._compiledSync = renderer.compile(data);
106-
this._compiled = Promise.method(compiled);
119+
var compiled = renderer.compile(data);
120+
121+
this._compiledSync = function(locals) {
122+
var result = compiled(locals);
123+
return ctx.execFilterSync.apply(ctx, buildFilterArguments(result));
124+
};
125+
126+
this._compiled = (function(locals) {
127+
return Promise.resolve(compiled(locals))
128+
.then(function(result) {
129+
return ctx.execFilter.apply(ctx, buildFilterArguments(result));
130+
});
131+
});
107132
} else {
108133
this._compiledSync = function(locals) {
109134
return render.renderSync(data, locals);

test/scripts/theme/view.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ var pathFn = require('path');
55
var fs = require('hexo-fs');
66
var Promise = require('bluebird');
77
var moment = require('moment');
8+
var sinon = require('sinon');
89

910
describe('View', function() {
1011
var Hexo = require('../../../lib/hexo');
@@ -201,6 +202,29 @@ describe('View', function() {
201202
});
202203
});
203204

205+
it('render() - execute after_render:html', function() {
206+
var body = [
207+
'{{ test }}'
208+
].join('\n');
209+
210+
var view = newView('index.swig', body);
211+
212+
var filter = sinon.spy(function(result) {
213+
result.should.eql('foo');
214+
return 'bar';
215+
});
216+
217+
hexo.extend.filter.register('after_render:html', filter);
218+
219+
return view.render({
220+
test: 'foo'
221+
}).then(function(content) {
222+
content.should.eql('bar');
223+
}).finally(function() {
224+
hexo.extend.filter.unregister('after_render:html', filter);
225+
});
226+
});
227+
204228
it('renderSync()', function() {
205229
var body = [
206230
'{{ test }}'
@@ -258,6 +282,23 @@ describe('View', function() {
258282
}).should.eql(body);
259283
});
260284

285+
it('renderSync() - execute after_render:html', function() {
286+
var body = [
287+
'{{ test }}'
288+
].join('\n');
289+
290+
var view = newView('index.swig', body);
291+
292+
var filter = sinon.spy(function(result) {
293+
result.should.eql('foo');
294+
return 'bar';
295+
});
296+
297+
hexo.extend.filter.register('after_render:html', filter);
298+
view.renderSync({test: 'foo'}).should.eql('bar');
299+
hexo.extend.filter.unregister('after_render:html', filter);
300+
});
301+
261302
it('_resolveLayout()', function() {
262303
var view = newView('partials/header.swig', 'header');
263304

0 commit comments

Comments
 (0)