doc.silverstripe.org/gatsby-node.js

112 lines
2.5 KiB
JavaScript

const path = require('path');
const { createFilePath } = require(`gatsby-source-filesystem`);
const fileToTitle = require('./src/utils/fileToTitle');
const crypto = require('crypto');
const createSlug = (filePath, version) => {
const parts = filePath.split('/');
const langIndex = parts.indexOf('en');
parts.splice(langIndex + 1, 0, version);
return parts
.map(part => part.replace(/^\d+_/, ''))
.join('/')
.toLowerCase()
};
exports.onCreateNode = async ({ node, getNode, actions }) => {
if (node.internal.type !== 'MarkdownRemark') {
return;
}
const { createNode } = actions;
const fileNode = getNode(node.parent);
const version = fileNode.sourceInstanceName;
const filePath = createFilePath({
node,
getNode,
basePath: `docs`
});
let fileTitle = path.basename(node.fileAbsolutePath, '.md');
const isIndex = fileTitle === 'index';
if (isIndex) {
fileTitle = path.basename(path.dirname(node.fileAbsolutePath));
}
const docTitle = fileToTitle(fileTitle);
const slug = createSlug(filePath, version);
const parentSlug = `${path.resolve(slug, '../')}/`;
const docData = {
isIndex,
filePath,
fileTitle,
slug,
parentSlug,
...node.frontmatter,
};
if (!docData.title || docData.title === '') {
docData.title = docTitle;
}
const docInternal = {
type: `SilverstripeDocument`,
contentDigest: crypto
.createHash(`md5`)
.update(JSON.stringify(docData))
.digest(`hex`),
};
const nodeData = {
...node,
id: `ss-doc-${node.id}`,
...docData,
parent: node.id,
internal: docInternal,
}
createNode(nodeData);
};
exports.createPages = async ({ actions, graphql }) => {
const { createPage } = actions;
const docTemplate = path.resolve(`src/templates/docs-template.tsx`);
const result = await graphql(`
{
allSilverstripeDocument {
nodes {
slug
parent {
... on MarkdownRemark {
parent {
... on File {
gitRemote {
sourceInstanceName
ref
webLink
}
}
}
}
}
}
}
}`);
if (result.errors) {
throw new Error(result.errors);
}
result.data.allSilverstripeDocument.nodes
.forEach(node => {
createPage({
path: node.slug,
component: docTemplate,
context: {
slug: node.slug,
}
});
})
};