netlify-cms-react-starter/utils/parse-markdown.js
2017-10-13 08:20:26 +10:00

61 lines
1.6 KiB
JavaScript

const fs = require('fs')
const path = require('path')
const _set = require('lodash/set')
const globCb = require('glob')
const util = require('util')
const unified = require('unified')
const parse = require('remark-parse')
const frontmatter = require('remark-frontmatter')
const vfile = require('to-vfile')
const report = require('vfile-reporter')
const html = require('remark-html')
const yaml = require('yamljs')
const glob = util.promisify(globCb)
const options = {
markdownDir: './content/',
outputFile: './src/data.json'
}
const addYamlData = () => (data, file) => {
const yamlData = data.children.find(item => item.type === 'yaml')
file.data = yaml.parse(yamlData.value)
}
const parseFile = path => new Promise((resolve, reject) => {
unified()
.use(parse)
.use(frontmatter, ['yaml'])
.use(addYamlData)
.use(html)
.process(vfile.readSync(path), (err, file) => {
if (err) reject(report(err || file))
resolve(file)
})
})
const parseFiles = async files => {
const results = await Promise.all(files.map(parseFile))
return results
}
const makeJSON = async () => {
const paths = await glob(`${options.markdownDir}/**/**.md`)
const results = await parseFiles(paths)
let data = {}
results.map(item => {
const pathParsed = path.parse(item.history[0])
const objectKey = pathParsed.dir.replace(options.markdownDir, '').replace(/\//g, '.')
const nest = `${objectKey}.${pathParsed.name}`
_set(data, nest, {...item})
})
return JSON.stringify(data, null, 2)
}
const markdownToJson = async () => {
const json = await makeJSON()
fs.writeFileSync(options.outputFile, json)
}
markdownToJson()