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