Skip to content

Commit

Permalink
Merge pull request #1794 from akfish/fix/after_render
Browse files Browse the repository at this point in the history
Execute 'after_render' filter when rendering with precompiled renderer
  • Loading branch information
tommy351 committed Mar 5, 2016
2 parents abf23ab + b9d3f0d commit 81315c8
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 3 deletions.
31 changes: 28 additions & 3 deletions lib/theme/view.js
Original file line number Diff line number Diff line change
Expand Up @@ -95,15 +95,40 @@ View.prototype._resolveLayout = function(name) {

View.prototype._precompile = function() {
var render = this._render;
var renderer = render.getRenderer(pathFn.extname(this.path));
var ctx = render.context;
var ext = pathFn.extname(this.path);
var renderer = render.getRenderer(ext);
var data = {
path: this.source,
text: this.data._content
};

function buildFilterArguments(result) {
var output = render.getOutput(ext) || ext;
return [
'after_render:' + output,
result,
{
context: ctx,
args: [data]
}
];
}

if (typeof renderer.compile === 'function') {
var compiled = this._compiledSync = renderer.compile(data);
this._compiled = Promise.method(compiled);
var compiled = renderer.compile(data);

this._compiledSync = function(locals) {
var result = compiled(locals);
return ctx.execFilterSync.apply(ctx, buildFilterArguments(result));
};

this._compiled = (function(locals) {
return Promise.resolve(compiled(locals))
.then(function(result) {
return ctx.execFilter.apply(ctx, buildFilterArguments(result));
});
});
} else {
this._compiledSync = function(locals) {
return render.renderSync(data, locals);
Expand Down
41 changes: 41 additions & 0 deletions test/scripts/theme/view.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ var pathFn = require('path');
var fs = require('hexo-fs');
var Promise = require('bluebird');
var moment = require('moment');
var sinon = require('sinon');

describe('View', function() {
var Hexo = require('../../../lib/hexo');
Expand Down Expand Up @@ -201,6 +202,29 @@ describe('View', function() {
});
});

it('render() - execute after_render:html', function() {
var body = [
'{{ test }}'
].join('\n');

var view = newView('index.swig', body);

var filter = sinon.spy(function(result) {
result.should.eql('foo');
return 'bar';
});

hexo.extend.filter.register('after_render:html', filter);

return view.render({
test: 'foo'
}).then(function(content) {
content.should.eql('bar');
}).finally(function() {
hexo.extend.filter.unregister('after_render:html', filter);
});
});

it('renderSync()', function() {
var body = [
'{{ test }}'
Expand Down Expand Up @@ -258,6 +282,23 @@ describe('View', function() {
}).should.eql(body);
});

it('renderSync() - execute after_render:html', function() {
var body = [
'{{ test }}'
].join('\n');

var view = newView('index.swig', body);

var filter = sinon.spy(function(result) {
result.should.eql('foo');
return 'bar';
});

hexo.extend.filter.register('after_render:html', filter);
view.renderSync({test: 'foo'}).should.eql('bar');
hexo.extend.filter.unregister('after_render:html', filter);
});

it('_resolveLayout()', function() {
var view = newView('partials/header.swig', 'header');

Expand Down

0 comments on commit 81315c8

Please sign in to comment.