Spaces:
Running
Running
File size: 2,108 Bytes
d8760c5 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
// 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))
})
}
|