Skip to content
Snippets Groups Projects
compile-pug.js 1.6 KiB
Newer Older
const path = require('path')
const fs = require('fs').promises
const objectAssignDeep = require(`object-assign-deep`)
const yaml = require('js-yaml')
const pug = require('pug')
const chokidar = require('chokidar')

const default_lang = 'en'

const pugFile = './src/index.pug'
const dataDir = './translation'
const outDir = './www'

async function compile() {
  const langs = (await fs.readdir(dataDir))
    .filter(f => path.extname(f) === '.yml')
    .map(f => path.basename(f, '.yml'))

  const langData = {}

  await Promise.all(
    langs.map(lang =>
      fs
        .readFile(`${dataDir}/${lang}.yml`, 'utf8')
        .then(text => (langData[lang] = yaml.safeLoad(text))),
    ),
  )

  for (const lang in langData) {
    if (lang === default_lang) continue
    langData[lang] = objectAssignDeep(
      {},
      langData[default_lang],
      langData[lang],
    )
  }

  const options = JSON.parse(await fs.readFile('./src/config.json', 'utf-8'))
  const pugFct = pug.compileFile(pugFile)

  await fs.mkdir(outDir, { recursive: true })

  await Promise.all(
    Object.entries(langData).map(([lang, data]) => {
      options.lang=lang
      options.data=data

      const html = pugFct(options)
      const filename = `${outDir}/index-${lang}.html`
      console.log(`write ${filename}`)
      return fs.writeFile(filename, html)
    }),
  )
}

compile().then(() => {
  if (!process.argv.includes('-w') && !process.argv.includes('--watch')) return
  console.log('watching for changes…')
  chokidar.watch([pugFile, dataDir]).on('change', editedFilePath => {
    console.log(`\nchanged: ${editedFilePath}`)
    compile()
  })
})