| const _ = require('lodash') |
| const path = require('path') |
| const { createFilePath } = require('gatsby-source-filesystem') |
| const { fmImagesToRelative } = require('gatsby-remark-relative-images') |
| |
| exports.createPages = ({ actions, graphql }) => { |
| const { createPage } = actions |
| |
| return graphql(` |
| { |
| allMarkdownRemark(limit: 1000) { |
| edges { |
| node { |
| id |
| fields { |
| slug |
| } |
| frontmatter { |
| tags |
| templateKey |
| } |
| } |
| } |
| } |
| } |
| `).then((result) => { |
| if (result.errors) { |
| result.errors.forEach((e) => console.error(e.toString())) |
| return Promise.reject(result.errors) |
| } |
| |
| const posts = result.data.allMarkdownRemark.edges |
| |
| posts.forEach((edge) => { |
| const id = edge.node.id |
| createPage({ |
| path: edge.node.fields.slug, |
| tags: edge.node.frontmatter.tags, |
| component: path.resolve( |
| `src/templates/${String(edge.node.frontmatter.templateKey)}.js` |
| ), |
| // additional data can be passed via context |
| context: { |
| id, |
| }, |
| }) |
| }) |
| |
| // Tag pages: |
| let tags = [] |
| // Iterate through each post, putting all found tags into `tags` |
| posts.forEach((edge) => { |
| if (_.get(edge, `node.frontmatter.tags`)) { |
| tags = tags.concat(edge.node.frontmatter.tags) |
| } |
| }) |
| // Eliminate duplicate tags |
| tags = _.uniq(tags) |
| |
| // Make tag pages |
| tags.forEach((tag) => { |
| const tagPath = `/tags/${_.kebabCase(tag)}/` |
| |
| createPage({ |
| path: tagPath, |
| component: path.resolve(`src/templates/tags.js`), |
| context: { |
| tag, |
| }, |
| }) |
| }) |
| }) |
| } |
| |
| exports.onCreateNode = ({ node, actions, getNode }) => { |
| const { createNodeField } = actions |
| fmImagesToRelative(node) // convert image paths for gatsby images |
| |
| if (node.internal.type === `MarkdownRemark`) { |
| const value = createFilePath({ node, getNode }) |
| createNodeField({ |
| name: `slug`, |
| node, |
| value, |
| }) |
| } |
| } |