Skip to content

Commit

Permalink
perf(processor/post): improve processing speed when `config.post_asse…
Browse files Browse the repository at this point in the history
…t_folder` is enabled (#5473)
  • Loading branch information
yoshinorin authored Apr 23, 2024
1 parent 093dc2d commit cc8c520
Showing 1 changed file with 24 additions and 11 deletions.
35 changes: 24 additions & 11 deletions lib/plugins/processor/post.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
import { toDate, timezone, isExcludedFile, isTmpFile, isHiddenFile, isMatch } from './common';
import Promise from 'bluebird';
import { parse as yfm } from 'hexo-front-matter';
import { extname, join } from 'path';
import { extname, join, posix, sep } from 'path';
import { stat, listDir } from 'hexo-fs';
import { slugize, Pattern, Permalink } from 'hexo-util';
import { magenta } from 'picocolors';
import type { _File } from '../../box';
import type Hexo from '../../hexo';
import type { Stats } from 'fs';
import { PostSchema } from '../../types';

const postDir = '_posts/';
const draftDir = '_drafts/';
Expand Down Expand Up @@ -268,29 +269,41 @@ function processAsset(ctx: Hexo, file: _File) {
const PostAsset = ctx.model('PostAsset');
const Post = ctx.model('Post');
const id = file.source.substring(ctx.base_dir.length);
const doc = PostAsset.findById(id);
const postAsset = PostAsset.findById(id);

if (file.type === 'delete') {
if (doc) {
return doc.remove();
if (file.type === 'delete' || Post.length === 0) {
if (postAsset) {
return postAsset.remove();
}

return;
}

// TODO: Better post searching
const post = Post.toArray().find(post => file.source.startsWith(post.asset_dir));
if (post != null && (post.published || ctx._showDrafts())) {
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 (postAsset) {
// `postAsset.post` is `Post.id`.
const post = Post.findById(postAsset.post);
if (post != null && (post.published || ctx._showDrafts())) {
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();
// NOTE: Probably, unreachable.
if (postAsset) {
return postAsset.remove();
}
}

0 comments on commit cc8c520

Please sign in to comment.