mirror of
https://github.com/facebook/docusaurus.git
synced 2025-05-12 08:37:25 +02:00
feat(v2): implement blog (#1062)
* feat(v2): implement blog * expect flat blog structure * \n * blogpage can import many posts
This commit is contained in:
parent
a2d3f26722
commit
12fd204840
22 changed files with 736 additions and 16 deletions
73
v2/lib/load/blog.js
Normal file
73
v2/lib/load/blog.js
Normal file
|
@ -0,0 +1,73 @@
|
|||
const globby = require('globby');
|
||||
const path = require('path');
|
||||
const fs = require('fs-extra');
|
||||
const {parse, idx} = require('./utils');
|
||||
|
||||
function fileToUrl(fileName) {
|
||||
return fileName
|
||||
.replace('-', '/')
|
||||
.replace('-', '/')
|
||||
.replace('-', '/')
|
||||
.replace(/\.md$/, '');
|
||||
}
|
||||
|
||||
async function loadBlog({blogDir, env, siteConfig}) {
|
||||
const blogFiles = await globby(['*.md'], {
|
||||
cwd: blogDir,
|
||||
});
|
||||
|
||||
const {baseUrl} = siteConfig;
|
||||
|
||||
/* Prepare metadata container */
|
||||
const blogMetadatas = [];
|
||||
|
||||
/* the language for each blog page */
|
||||
const defaultLangTag = idx(env, ['translation', 'defaultLanguage', 'tag']);
|
||||
|
||||
await Promise.all(
|
||||
blogFiles.map(async relativeSource => {
|
||||
const source = path.join(blogDir, relativeSource);
|
||||
|
||||
const blogFileName = path.basename(relativeSource);
|
||||
// Extract, YYYY, MM, DD from the file name
|
||||
const filePathDateArr = blogFileName.split('-');
|
||||
const date = new Date(
|
||||
`${filePathDateArr[0]}-${filePathDateArr[1]}-${
|
||||
filePathDateArr[2]
|
||||
}T06:00:00.000Z`,
|
||||
);
|
||||
|
||||
const fileString = await fs.readFile(source, 'utf-8');
|
||||
const {metadata: rawMetadata} = parse(fileString);
|
||||
const metadata = {
|
||||
permalink: path.join(baseUrl, `blog`, fileToUrl(blogFileName)),
|
||||
source,
|
||||
...rawMetadata,
|
||||
date,
|
||||
language: defaultLangTag,
|
||||
};
|
||||
blogMetadatas.push(metadata);
|
||||
}),
|
||||
);
|
||||
blogMetadatas.sort((a, b) => a.date - b.date);
|
||||
|
||||
// blogpage handling. Example: `/blog`, `/blog/page1`, `/blog/page2`
|
||||
const perPage = 10;
|
||||
const numOfBlog = blogMetadatas.length;
|
||||
const numberOfPage = Math.ceil(numOfBlog / perPage);
|
||||
const basePageUrl = path.join(baseUrl, 'blog');
|
||||
|
||||
/* eslint-disable */
|
||||
for (let page = 0; page < numberOfPage; page++) {
|
||||
blogMetadatas.push({
|
||||
permalink: path.join(basePageUrl, `${page > 0 ? `page${page + 1}` : ''}`),
|
||||
language: defaultLangTag,
|
||||
isBlogPage: true,
|
||||
posts: blogMetadatas.slice(page * perPage, (page + 1) * perPage),
|
||||
});
|
||||
}
|
||||
|
||||
return blogMetadatas;
|
||||
}
|
||||
|
||||
module.exports = loadBlog;
|
Loading…
Add table
Add a link
Reference in a new issue