1
0
Fork 0
blog/gatsby-node.js

210 lines
5.0 KiB
JavaScript
Raw Normal View History

2018-07-17 23:33:55 +02:00
const path = require('path')
2018-09-06 22:28:28 +02:00
const fs = require('fs')
const yaml = require('js-yaml')
2018-07-17 23:33:55 +02:00
const { createFilePath } = require('gatsby-source-filesystem')
2018-09-04 02:57:39 +02:00
const { paginate } = require('gatsby-awesome-pagination')
2018-09-07 13:08:01 +02:00
const fastExif = require('fast-exif')
2018-07-17 23:33:55 +02:00
2018-09-06 22:28:28 +02:00
const meta = yaml.load(fs.readFileSync('./content/meta.yml', 'utf8'))
const { itemsPerPage } = meta
2018-07-19 00:22:06 +02:00
// Create slug & date for posts from file path values
2018-07-17 23:33:55 +02:00
exports.onCreateNode = ({ node, actions, getNode }) => {
const { createNodeField } = actions
if (node.internal.type === 'MarkdownRemark') {
const fileNode = getNode(node.parent)
const parsedFilePath = path.parse(fileNode.relativePath)
2018-07-19 00:22:06 +02:00
const slugOriginal = createFilePath({ node, getNode })
2018-07-17 23:33:55 +02:00
// slug
2018-07-19 00:22:06 +02:00
let slug
if (parsedFilePath.name === 'index') {
slug = `/${parsedFilePath.dir.substring(11)}` // remove date from file dir
} else {
slug = `/${slugOriginal.substring(12)}` // remove first slash & date from file path
}
2018-07-17 23:33:55 +02:00
createNodeField({
node,
name: 'slug',
value: slug
})
// date
let date
if (node.frontmatter.date) {
date = `${node.frontmatter.date}`
} else {
2018-07-19 00:22:06 +02:00
date = `${slugOriginal.substring(1, 10)}` // grab date from file path
2018-07-17 23:33:55 +02:00
}
createNodeField({
node,
name: 'date',
value: date
})
}
2018-09-07 13:08:01 +02:00
// exif
if (node.internal.mediaType === 'image/jpeg') {
fastExif
.read(node.absolutePath)
.then(exifData => {
2018-09-09 21:20:19 +02:00
generateExif(exifData, createNodeField, node)
2018-09-07 13:08:01 +02:00
})
.catch(() => null) // just silently fail when exif can't be extracted
}
2018-07-17 23:33:55 +02:00
}
2018-09-09 21:20:19 +02:00
const generateExif = (exifData, createNodeField, node) => {
const iso = exifData.exif.ISO || null
const model = exifData.image.Model || null
const fstop = exifData.exif.FNumber || null
const shutterspeed = exifData.exif.ExposureTime || null
const focalLength = exifData.exif.FocalLength || null
const exposure = exifData.exif.ExposureBiasValue || null
// add exif fields to type File
createNodeField({
node,
name: 'exif',
value: {
iso,
model,
fstop,
shutterspeed,
focalLength,
exposure
}
})
}
2018-07-17 23:33:55 +02:00
exports.createPages = ({ graphql, actions }) => {
const { createPage } = actions
return new Promise((resolve, reject) => {
resolve(
graphql(
`
{
2018-08-30 22:50:09 +02:00
allMarkdownRemark(sort: { fields: [fields___date], order: DESC }) {
2018-07-17 23:33:55 +02:00
edges {
node {
fields {
slug
2018-07-19 00:22:06 +02:00
date
2018-07-17 23:33:55 +02:00
}
2018-07-19 23:04:41 +02:00
frontmatter {
2018-08-30 22:50:09 +02:00
type
2018-07-19 23:04:41 +02:00
tags
}
2018-07-17 23:33:55 +02:00
}
}
}
}
`
).then(result => {
if (result.errors) {
/* eslint no-console: "off" */
console.log(result.errors)
reject(result.errors)
}
2018-07-19 00:22:06 +02:00
const posts = result.data.allMarkdownRemark.edges
2018-09-04 02:57:39 +02:00
// Generate posts & posts index
generateContent(createPage, posts)
2018-07-19 23:04:41 +02:00
2018-09-04 02:57:39 +02:00
// Generate Tag Pages
2018-09-09 21:20:19 +02:00
generateTagPages(createPage, posts)
2018-07-19 23:04:41 +02:00
2018-07-17 23:33:55 +02:00
resolve()
})
)
})
}
2018-09-04 02:57:39 +02:00
2018-09-07 00:36:08 +02:00
const postsTemplate = path.resolve('src/templates/Posts.jsx')
2018-09-04 02:57:39 +02:00
const generateContent = (createPage, posts) => {
const postTemplate = path.resolve('src/templates/Post.jsx')
// Create Post pages
posts.forEach(post => {
createPage({
path: `${post.node.fields.slug}`,
component: postTemplate,
context: {
slug: post.node.fields.slug
}
})
})
// Create paginated front page
paginate({
createPage,
items: posts,
2018-09-06 22:28:28 +02:00
itemsPerPage: itemsPerPage,
2018-09-04 02:57:39 +02:00
pathPrefix: '/',
component: postsTemplate
})
}
2018-09-09 21:20:19 +02:00
const generateTagPages = (createPage, posts) => {
2018-09-04 02:57:39 +02:00
const tagSet = new Set()
const tagMap = new Map()
posts.forEach(post => {
if (post.node.frontmatter.tags) {
post.node.frontmatter.tags.forEach(tag => {
tagSet.add(tag)
const array = tagMap.has(tag) ? tagMap.get(tag) : []
array.push(post)
tagMap.set(tag, array)
})
}
})
const tagList = Array.from(tagSet)
tagList.forEach(tag => {
2018-09-07 00:36:08 +02:00
// Create tag pages
2018-09-04 02:57:39 +02:00
createPage({
path: `/tag/${tag}/`,
2018-09-07 00:36:08 +02:00
component: postsTemplate,
2018-09-04 02:57:39 +02:00
context: { tag }
})
})
// Object.keys(posts).forEach(tagName => {
// const pageSize = 5
// const pagesSum = Math.ceil(posts[tagName].length / pageSize)
// for (let page = 1; page <= pagesSum; page++) {
// createPage({
// path:
// page === 1
// ? `/tag/${tagName.toLowerCase()}`
// : `/tag/${tagName.toLowerCase()}/page/${page}`,
2018-09-07 00:36:08 +02:00
// component: postsTemplate,
2018-09-04 02:57:39 +02:00
// context: {
// posts: paginate(posts[tagName], pageSize, page),
// tag: tagName,
// pagesSum,
// page
// }
// })
// }
// })
}
// function paginate(array, page_size, page_number) {
// return array
// .slice(0)
// .slice((page_number - 1) * page_size, page_number * page_size)
// }