81 lines
2.3 KiB
JavaScript
81 lines
2.3 KiB
JavaScript
const { createFilePath } = require(`gatsby-source-filesystem`);
|
|
const slugify = require("slug");
|
|
const path = require(`path`);
|
|
|
|
exports.onCreateNode = ({ node, getNode, actions }) => {
|
|
const { createNodeField } = actions;
|
|
if (node.internal.type === `Mdx`) {
|
|
const fileNode = getNode(node.parent);
|
|
|
|
if (fileNode.dir.includes("markdown/posts/")) {
|
|
const filename = createFilePath({ node, getNode, basePath: `posts` });
|
|
|
|
const postName = filename;
|
|
const [, date, title] = postName
|
|
.split("/")[1]
|
|
.match(/^([\d]{4}-[\d]{2}-[\d]{2})-{1}(.+)$/);
|
|
|
|
const slug = `/${slugify([date].join("-"), "/")}/${title}/`;
|
|
|
|
createNodeField({ node, name: `type`, value: "blog-post" });
|
|
createNodeField({ node, name: `slug`, value: slug });
|
|
createNodeField({ node, name: `date`, value: date });
|
|
createNodeField({ node, name: `path`, value: fileNode.relativePath });
|
|
} else {
|
|
const filename = createFilePath({ node, getNode });
|
|
createNodeField({ node, name: `slug`, value: filename });
|
|
}
|
|
}
|
|
};
|
|
|
|
exports.createPages = ({ graphql, actions }) => {
|
|
const { createPage } = actions;
|
|
return graphql(
|
|
`
|
|
{
|
|
allMdx(
|
|
filter: { fields: { type: { eq: "blog-post" } } }
|
|
sort: { order: DESC, fields: [fields___date] }
|
|
) {
|
|
edges {
|
|
node {
|
|
fields {
|
|
slug
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
`
|
|
).then(result => {
|
|
const posts = result.data.allMdx.edges;
|
|
const postsPerPage = 10;
|
|
const numPages = Math.ceil(posts.length / postsPerPage);
|
|
|
|
// Create blog lists
|
|
Array.from({ length: numPages }).forEach((_, i) => {
|
|
createPage({
|
|
path: i === 0 ? `/blog` : `/blog/${i + 1}`,
|
|
component: path.resolve("./src/templates/blog-list.jsx"),
|
|
context: {
|
|
limit: postsPerPage,
|
|
skip: i * postsPerPage,
|
|
numPages,
|
|
currentPage: i + 1
|
|
}
|
|
});
|
|
});
|
|
|
|
// Create blog posts
|
|
result.data.allMdx.edges.forEach(({ node }, index) => {
|
|
createPage({
|
|
path: node.fields.slug,
|
|
component: path.resolve(`./src/templates/blog-post.jsx`),
|
|
context: {
|
|
slug: node.fields.slug
|
|
}
|
|
});
|
|
});
|
|
});
|
|
};
|