You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

93 lines
2.6 KiB

/**
* Copyright (c) 2013-present, Facebook, Inc.
*
* @emails react-core
*/
'use strict';
const path = require('path');
// Parse date information out of blog post filename.
const BLOG_POST_FILENAME_REGEX = /([0-9]+)\-([0-9]+)\-([0-9]+)\-(.+)\.md$/;
function buildRedirectString(permalink, redirect_from) {
if (!permalink || !permalink.endsWith('.html')) {
return redirect_from ? JSON.stringify(redirect_from) : '';
}
let basePath = permalink.slice(0, -'.html'.length);
let redirects = [basePath, basePath + '/'];
if (Array.isArray(redirect_from)) {
redirects = redirects.concat(redirect_from);
}
return JSON.stringify(redirects);
}
// Add custom fields to MarkdownRemark nodes.
module.exports = exports.onCreateNode = ({node, actions, getNode}) => {
const {createNodeField} = actions;
switch (node.internal.type) {
case 'MarkdownRemark':
const {permalink, redirect_from} = node.frontmatter;
const {relativePath, sourceInstanceName} = getNode(node.parent);
let slug = permalink;
if (!slug) {
if (relativePath.includes('blog')) {
// Blog posts don't have embedded permalinks.
// Their slugs follow a pattern: /blog/<year>/<month>/<day>/<slug>.html
// The date portion comes from the file name: <date>-<title>.md
const match = BLOG_POST_FILENAME_REGEX.exec(relativePath);
const year = match[1];
const month = match[2];
const day = match[3];
const filename = match[4];
slug = `/blog/${year}/${month}/${day}/${filename}.html`;
const date = new Date(year, month - 1, day);
// Blog posts are sorted by date and display the date in their header.
createNodeField({
node,
name: 'date',
value: date.toJSON(),
});
}
}
if (!slug) {
// This will likely only happen for the partials in /content/home.
slug = `/${relativePath.replace('.md', '.html')}`;
}
// Used to generate URL to view this content.
createNodeField({
node,
name: 'slug',
value: slug,
});
// Used to generate a GitHub edit link.
// this presumes that the name in gastby-config.js refers to parent folder
createNodeField({
node,
name: 'path',
value: path.join(sourceInstanceName, relativePath),
});
// Used by createPages() above to register redirects.
createNodeField({
node,
name: 'redirect',
value: buildRedirectString(permalink, redirect_from),
});
return;
}
};