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)) | |
}) | |
} | |