1
0
Fork 0
freesewing/packages/freesewing.shared/prebuild/mdx.mjs

131 lines
3.2 KiB
JavaScript
Raw Normal View History

import path from 'path'
import fs from 'fs'
import i18nConfig from '../config/i18n.config.mjs'
import rdir from 'recursive-readdir'
import { unified } from 'unified'
import remarkParser from 'remark-parse'
import remarkCompiler from 'remark-stringify'
import remarkFrontmatter from 'remark-frontmatter'
import remarkFrontmatterExtractor from 'remark-extract-frontmatter'
import { readSync } from 'to-vfile'
2021-12-17 17:51:20 +01:00
import yaml from 'js-yaml'
/*
* Helper method to get a list of MDX files in a folder.
* Will traverse recursively to get all files from a given root folder.
*
* Parameters:
*
* - folder: the root folder to look in
* - lang: the language files to looks for
*
* Exported because it's also used by the Algolia index script
*/
export const getMdxFileList = async (folder, lang) => {
let allFiles
try {
allFiles = await rdir(folder)
}
catch (err) {
console.log(err)
return false
}
// Filter out all that's not a language-specific markdown file
// and avoid including the 'ui' files
const files = []
for (const file of allFiles) {
if (
file.slice(-5) === `${lang}.md` &&
file.indexOf('/ui/') === -1
) files.push(file)
}
return files.sort()
}
/*
* Helper method to get the website slug (path) from the file path
*/
const fileToSlug = (file, site, lang) => (file.slice(-6) === `/${lang}.md`)
? file.split(`/markdown/${site}/`).pop().slice(0, -6)
: false
/*
* Helper method to get the title and meta data from an MDX file
*
* Parameters:
*
* - file: the full path to the file
*/
2021-12-17 17:51:20 +01:00
const mdxMetaInfo = async file => {
let result
try {
result = await unified()
//.use(remarkMdx)
2021-12-17 17:51:20 +01:00
.use(remarkParser)
.use(remarkCompiler)
.use(remarkFrontmatter)
.use(remarkFrontmatterExtractor, { yaml: yaml.load })
.process(readSync(file))
}
catch (err) {
console.log(err)
}
return result
}
/*
* Main method that does what needs doing
*/
2021-12-12 12:04:38 +01:00
export const prebuildMdx = async(site) => {
// Say hi
console.log()
2021-12-12 12:04:38 +01:00
console.log(`Prebuilding MDX for freesewing.${site}`)
// Setup MDX root path
const mdxRoot = path.resolve('..', '..', 'markdown', site)
// Loop over locales
const pages = {}
for (const lang of (site === 'dev' ? ['en'] : i18nConfig.locales)) {
2021-12-12 12:04:38 +01:00
console.log(` - Language: ${lang}`)
// Get list of filenames
const list = await getMdxFileList(mdxRoot, lang)
// Parse them for title and intro
pages[lang] = {}
2021-12-12 12:04:38 +01:00
for (const file of list) {
const slug = fileToSlug(file, site, lang)
if (slug) {
const meta = await mdxMetaInfo(file)
2022-01-20 09:07:38 +01:00
if (meta.data?.title && meta.data?.title) {
pages[lang][slug] = {
2021-12-17 17:51:20 +01:00
title: meta.data.title,
2021-12-12 12:04:38 +01:00
slug,
2022-01-20 09:14:20 +01:00
order: meta.data.order
2021-12-12 12:04:38 +01:00
? `${meta.data.order}${meta.data.title}`
: meta.data.title
}
2021-12-17 17:51:20 +01:00
} else {
console.log('Failed to extract meta info from:', slug)
2022-01-19 16:25:00 +01:00
if (meta.messages.length > 0) console.log(meta.messages)
}
}
}
2021-12-12 12:04:38 +01:00
fs.writeFileSync(
path.resolve('..', `freesewing.${site}`, 'prebuild', `mdx.${lang}.js`),
`export default ${JSON.stringify(pages[lang], null ,2)}`
2021-12-12 12:04:38 +01:00
)
}
return pages
}