diff --git a/lib/hexo/default_config.ts b/lib/hexo/default_config.ts index 390b8f32f5..e9331ececa 100644 --- a/lib/hexo/default_config.ts +++ b/lib/hexo/default_config.ts @@ -36,6 +36,7 @@ export = { filename_case: 0, render_drafts: false, post_asset_folder: false, + post_extensions: [], relative_link: false, future: true, syntax_highlighter: 'highlight.js', diff --git a/lib/plugins/processor/post.ts b/lib/plugins/processor/post.ts index 856fff5ba2..83880ee39a 100644 --- a/lib/plugins/processor/post.ts +++ b/lib/plugins/processor/post.ts @@ -48,9 +48,13 @@ export = (ctx: Hexo) => { // checks only if there is a renderer for the file type or if is included in skip_render result.renderable = ctx.render.isRenderable(path) && !isMatch(path, ctx.config.skip_render); - // if post_asset_folder is set, restrict renderable files to default file extension + // if post_asset_folder is set, restrict renderable files to post_extensions or the default file extension if (result.renderable && ctx.config.post_asset_folder) { - result.renderable = (extname(ctx.config.new_post_name) === extname(path)); + if (!Array.isArray(ctx.config.post_extensions) || ctx.config.post_extensions.length === 0) { + result.renderable = (extname(ctx.config.new_post_name) === extname(path)); + } else { + result.renderable = ctx.config.post_extensions.includes(extname(path).slice(1)); + } } return result; diff --git a/test/scripts/processors/post.ts b/test/scripts/processors/post.ts index e3f1ff54c0..8b95806a50 100644 --- a/test/scripts/processors/post.ts +++ b/test/scripts/processors/post.ts @@ -1359,4 +1359,42 @@ describe('post', () => { PostAsset.removeById(id) ]); }); + + it('post - post_extensions', async () => { + function fooRenderer() { + return ''; + } + + hexo.extend.renderer.register('md', 'html', fooRenderer, true); + hexo.extend.renderer.register('adoc', 'html', fooRenderer, true); + hexo.extend.renderer.register('ejs', 'html', fooRenderer, true); + + hexo.config.post_asset_folder = true; + hexo.config.new_post_name = ':title.md'; + + hexo.config.post_extensions = null; + pattern.match('_posts/foo.md').should.have.property('renderable', true); + pattern.match('_posts/foo.adoc').should.have.property('renderable', false); + pattern.match('_posts/foo.ejs').should.have.property('renderable', false); + + hexo.config.post_extensions = []; + pattern.match('_posts/foo.md').should.have.property('renderable', true); + pattern.match('_posts/foo.adoc').should.have.property('renderable', false); + pattern.match('_posts/foo.ejs').should.have.property('renderable', false); + + hexo.config.post_extensions = ['adoc']; + pattern.match('_posts/foo.md').should.have.property('renderable', false); + pattern.match('_posts/foo.adoc').should.have.property('renderable', true); + pattern.match('_posts/foo.ejs').should.have.property('renderable', false); + + hexo.config.post_extensions = ['md', 'adoc']; + pattern.match('_posts/foo.md').should.have.property('renderable', true); + pattern.match('_posts/foo.adoc').should.have.property('renderable', true); + pattern.match('_posts/foo.ejs').should.have.property('renderable', false); + + hexo.config.post_extensions = ['md', 'adoc', 'ejs']; + pattern.match('_posts/foo.md').should.have.property('renderable', true); + pattern.match('_posts/foo.adoc').should.have.property('renderable', true); + pattern.match('_posts/foo.ejs').should.have.property('renderable', true); + }); });