2021-12-11 18:19:20 +01:00
|
|
|
import path from 'path'
|
|
|
|
import fs from 'fs'
|
2021-12-12 12:04:38 +01:00
|
|
|
import { languages, strapiHost } from '../config/freesewing.mjs'
|
2021-12-11 18:19:20 +01:00
|
|
|
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'
|
2021-12-17 17:51:20 +01:00
|
|
|
import remarkMdx from 'remark-mdx'
|
2021-12-11 18:19:20 +01:00
|
|
|
import vfileReporter from 'vfile-reporter'
|
|
|
|
import { readSync } from 'to-vfile'
|
2021-12-17 17:51:20 +01:00
|
|
|
import yaml from 'js-yaml'
|
2021-12-11 18:19:20 +01:00
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* 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
|
2021-12-31 08:27:13 +01:00
|
|
|
*
|
|
|
|
* Exported because it's also used by the Algolia index script
|
2021-12-11 18:19:20 +01:00
|
|
|
*/
|
2021-12-31 08:27:13 +01:00
|
|
|
export const getMdxFileList = async (folder, lang) => {
|
2021-12-11 18:19:20 +01:00
|
|
|
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
|
|
|
|
|
|
|
|
/*
|
2021-12-28 20:01:59 +01:00
|
|
|
* Helper method to get the title and meta data from an MDX file
|
2021-12-11 18:19:20 +01:00
|
|
|
*
|
|
|
|
* 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()
|
2021-12-28 20:01:59 +01:00
|
|
|
//.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
|
|
|
|
}
|
2021-12-11 18:19:20 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Main method that does what needs doing
|
|
|
|
*/
|
2021-12-12 12:04:38 +01:00
|
|
|
export const prebuildMdx = async(site) => {
|
2021-12-11 18:19:20 +01:00
|
|
|
|
|
|
|
// Say hi
|
|
|
|
console.log()
|
2021-12-12 12:04:38 +01:00
|
|
|
console.log(`Prebuilding MDX for freesewing.${site}`)
|
2021-12-11 18:19:20 +01:00
|
|
|
|
|
|
|
// Setup MDX root path
|
|
|
|
const mdxRoot = path.resolve('..', '..', 'markdown', site)
|
|
|
|
|
2021-12-12 12:04:38 +01:00
|
|
|
// Loop over languages
|
2021-12-12 18:00:08 +01:00
|
|
|
const pages = {}
|
2021-12-12 12:04:38 +01:00
|
|
|
for (const lang of (site === 'dev' ? ['en'] : languages)) {
|
2021-12-11 18:19:20 +01:00
|
|
|
|
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
|
2021-12-12 18:00:08 +01:00
|
|
|
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)
|
2021-12-17 17:51:20 +01:00
|
|
|
if (meta?.data?.title && meta?.data?.title) {
|
2021-12-12 18:00:08 +01:00
|
|
|
pages[lang][slug] = {
|
2021-12-17 17:51:20 +01:00
|
|
|
title: meta.data.title,
|
|
|
|
order: meta.data.order
|
|
|
|
? meta.data.order+meta.data.title
|
|
|
|
: meta.data.title,
|
2021-12-12 12:04:38 +01:00
|
|
|
slug,
|
|
|
|
order: meta?.data?.order
|
|
|
|
? `${meta.data.order}${meta.data.title}`
|
|
|
|
: meta.data.title
|
|
|
|
}
|
2021-12-17 17:51:20 +01:00
|
|
|
} else {
|
2021-12-28 20:01:59 +01:00
|
|
|
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-11 18:19:20 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-12-12 12:04:38 +01:00
|
|
|
fs.writeFileSync(
|
|
|
|
path.resolve('..', `freesewing.${site}`, 'prebuild', `mdx.${lang}.js`),
|
2021-12-12 18:00:08 +01:00
|
|
|
`export default ${JSON.stringify(pages[lang], null ,2)}`
|
2021-12-12 12:04:38 +01:00
|
|
|
)
|
|
|
|
}
|
2021-12-12 18:00:08 +01:00
|
|
|
|
|
|
|
return pages
|
2021-12-11 18:19:20 +01:00
|
|
|
}
|
|
|
|
|