- Editorial web platform built with Node.js, Express, EJS, and Vanilla CSS - Markdown content engine with YAML frontmatter, bilingual variants, and hot-reload watcher - Unified SQLite with FTS5 search indexing, query logging, and schema filters - Centered editorial post layout with margin-docked left TOC and mobile bottom sheet - WordPress-grade comment system with moderation dashboard and bulk operations under /guanli - Complete SEO suite (JSON-LD structured data, RSS/Atom feeds, XML sitemap, robots.txt) - CI/CD workflows for linting, security audits (Gitleaks), automated tests, and Docker releases
19 lines
718 B
JavaScript
19 lines
718 B
JavaScript
module.exports = {
|
|
onPostLoad({ post }) {
|
|
const wordCount = (post.rawContent || '').trim().split(/\s+/).length;
|
|
// Assume average 200 words per minute
|
|
const minutes = Math.max(1, Math.round(wordCount / 200));
|
|
post.readingTime = `${minutes} min read`;
|
|
post.wordCount = wordCount;
|
|
},
|
|
|
|
injectPostEnd({ post }) {
|
|
if (post && post.readingTime) {
|
|
return `<div style="font-family: var(--font-sans); font-size: 0.85rem; color: var(--color-text-muted); margin-top: 2rem; padding: 0.75rem 1rem; background: var(--color-surface-soft); border-radius: var(--radius-sm);">
|
|
Article statistics: ~${post.wordCount} words • ${post.readingTime}
|
|
</div>`;
|
|
}
|
|
return '';
|
|
}
|
|
};
|