Spaces:
Running
Running
| // https://github.com/1wheel/roadtolarissa Copyright 2018 Adam Pearce | |
| var fs = require('fs') | |
| var {exec, execSync} = require('child_process') | |
| var source = `${__dirname}/../../source` | |
| var public = `${__dirname}/../../public` | |
| if (!fs.existsSync(public)) fs.mkdirSync(public) | |
| function rsyncSource(){ | |
| exec(`rsync -a --exclude _posts --exclude _templates ${source}/ ${public}/`) | |
| } | |
| rsyncSource() | |
| var hljs = require('highlight.js') | |
| var marked = require('marked') | |
| marked.setOptions({ | |
| highlight: (code, lang) => hljs.highlight(lang || 'html', code).value, | |
| smartypants: true | |
| }) | |
| var templates = {} | |
| readdirAbs(`${source}/_templates`).forEach(path => { | |
| var str = fs.readFileSync(path, 'utf8') | |
| var templateName = path.split('_templates/')[1] | |
| templates[templateName] = d => eval('`' + str + '`') | |
| }) | |
| function readdirAbs(dir){ return fs.readdirSync(dir).map(d => dir + '/' + d) } | |
| var posts = readdirAbs(`${source}/_posts`) | |
| .filter(d => !d.includes('.DS_Store')) | |
| .map(parsePost) | |
| fs.writeFileSync(public + '/rss.xml', templates['rss.xml'](posts)) | |
| fs.writeFileSync(public + '/sitemap.xml', templates['sitemap.xml'](posts)) | |
| function parsePost(path){ | |
| var str = fs.readFileSync(path, 'utf8') | |
| if (str[0] == '<') str = str.split('License.\n-->')[1] | |
| var [top, body] = str | |
| .replace('---\n', '') | |
| .split('\n---\n') | |
| console.log(path) | |
| var post = {html: path.includes('.html') ? body : marked(body)} | |
| top.split('\n').forEach(line => { | |
| var [key, val] = line.split(/: (.+)/) | |
| post[key] = val | |
| }) | |
| return post | |
| } | |
| function writePost(post){ | |
| var dir = public + post.permalink | |
| if (!fs.existsSync(dir)) execSync(`mkdir -p ${dir}`) | |
| fs.writeFileSync(`${dir}/index.html`, templates[post.template](post)) | |
| var outposts = JSON.parse(JSON.stringify(posts)) | |
| outposts.forEach(d => delete d.html) | |
| fs.writeFileSync(public + '/posts.json', JSON.stringify(outposts, null, 2)) | |
| } | |
| posts.forEach(writePost) | |
| if (process.argv.includes('--watch')){ | |
| require('chokidar').watch(source).on('change', path => { | |
| rsyncSource() | |
| if (path.includes('_posts/')) writePost(parsePost(path)) | |
| }) | |
| } | |