diff --git a/lib/plugins/processor/post.ts b/lib/plugins/processor/post.ts index 03fe91060d..06bbe013ac 100644 --- a/lib/plugins/processor/post.ts +++ b/lib/plugins/processor/post.ts @@ -8,6 +8,8 @@ import { magenta } from 'picocolors'; import type { _File } from '../../box'; import type Hexo from '../../hexo'; import type { Stats } from 'fs'; +import { PostSchema } from '../../types'; +import { sep } from 'path/posix'; const postDir = '_posts/'; const draftDir = '_drafts/'; @@ -270,28 +272,37 @@ function processAsset(ctx: Hexo, file: _File) { const id = file.source.substring(ctx.base_dir.length); const doc = PostAsset.findById(id); - if (file.type === 'delete') { + if (file.type === 'delete' || Post.length === 0) { if (doc) { return doc.remove(); } - return; } - if (Post.length > 0) { - const assetDir = id.slice(0, id.lastIndexOf('/')); - const post = Post.findOne(p => p.asset_dir.endsWith(posix.join(assetDir, '/'))); + const savePostAsset = (post: PostSchema) => { + return PostAsset.save({ + _id: id, + slug: file.source.substring(post.asset_dir.length), + post: post._id, + modified: file.type !== 'skip', + renderable: file.params.renderable + }); + } + + if (doc) { + // `doc.post` is `Post.id`. + const post = Post.findById(doc.post); if (post != null && (post.published || ctx._showDrafts())) { - return PostAsset.save({ - _id: id, - slug: file.source.substring(post.asset_dir.length), - post: post._id, - modified: file.type !== 'skip', - renderable: file.params.renderable - }); + return savePostAsset(post); } } + const assetDir = id.slice(0, id.lastIndexOf(sep)); + const post = Post.findOne(p => p.asset_dir.endsWith(posix.join(assetDir, '/'))); + if (post != null && (post.published || ctx._showDrafts())) { + return savePostAsset(post); + } + if (doc) { return doc.remove(); }