Skip to content

Commit 9058e8b

Browse files
authored
Merge pull request #173 from curbengh/postasset-subfolder
fix(postAsset): post may be in a subfolder
2 parents 731e68d + d5c2ed1 commit 9058e8b

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

lib/renderer.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ const { escape } = require('marked/src/helpers');
55
const { encodeURL, slugize, stripHTML, url_for, isExternalLink } = require('hexo-util');
66
const MarkedRenderer = marked.Renderer;
77
const MarkedTokenizer = marked.Tokenizer;
8+
const { basename, dirname, extname, join } = require('path').posix;
89

910
const anchorId = (str, transformOption) => {
1011
return slugize(str.trim(), {transform: transformOption});
@@ -103,7 +104,7 @@ class Renderer extends MarkedRenderer {
103104
if (!href.startsWith('/') && !href.startsWith('\\') && postPath) {
104105
const PostAsset = hexo.model('PostAsset');
105106
// findById requires forward slash
106-
const asset = PostAsset.findById(postPath + href.replace(/\\/g, '/'));
107+
const asset = PostAsset.findById(join(postPath, href.replace(/\\/g, '/')));
107108
// asset.path is backward slash in Windows
108109
if (asset) href = asset.path.replace(/\\/g, '/');
109110
}
@@ -234,7 +235,10 @@ module.exports = function(data, options) {
234235
// Windows compatibility, Post.findOne() requires forward slash
235236
const source = path.substring(this.source_dir.length).replace(/\\/g, '/');
236237
const post = Post.findOne({ source });
237-
postPath = post ? source_dir + '/_posts/' + post.slug + '/' : '';
238+
if (post) {
239+
const { source: postSource } = post;
240+
postPath = join(source_dir, dirname(postSource), basename(postSource, extname(postSource)));
241+
}
238242
}
239243

240244
return marked(text, Object.assign({

test/index.js

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -756,7 +756,7 @@ describe('Marked renderer', () => {
756756
};
757757
});
758758

759-
it('should prepend post path', async () => {
759+
it('default', async () => {
760760
const asset = 'img/bar.svg';
761761
const slug = asset.replace(/\//g, sep);
762762
const content = `![](${asset})`;
@@ -806,6 +806,29 @@ describe('Marked renderer', () => {
806806
await PostAsset.removeById(postasset._id);
807807
await Post.removeById(post._id);
808808
});
809+
810+
// #170
811+
it('post located in subfolder', async () => {
812+
const asset = 'img/bar.svg';
813+
const slug = asset.replace(/\//g, sep);
814+
const content = `![](${asset})`;
815+
const post = await Post.insert({
816+
source: '_posts/lorem/foo.md',
817+
slug: 'foo'
818+
});
819+
const postasset = await PostAsset.insert({
820+
_id: `source/_posts/lorem/foo/${asset}`,
821+
slug,
822+
post: post._id
823+
});
824+
825+
const expected = url_for.call(hexo, join(post.path, asset));
826+
const result = r({ text: content, path: post.full_source });
827+
result.should.eql(`<p><img src="${expected}"></p>\n`);
828+
829+
await PostAsset.removeById(postasset._id);
830+
await Post.removeById(post._id);
831+
});
809832
});
810833

811834
describe('exec filter to extend', () => {

0 commit comments

Comments
 (0)