61 lines
1.6 KiB
JavaScript
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()
|