diff options
Diffstat (limited to 'render.js')
-rw-r--r-- | render.js | 62 |
1 files changed, 58 insertions, 4 deletions
@@ -10,7 +10,7 @@ const log = process.env.VERBOSE ? console.log : unit const walk = async (path, filename) => { log('[walk]', path) const type = await fs.lstat(path) - if (type.isFile()) return {type: 'file', path: path, name: filename || path} + if (type.isFile()) return {type: 'file', path: path, name: filename || path, tags:[]} if (!type.isDirectory()) return null const files = await fs.readdir(path) @@ -18,6 +18,7 @@ const walk = async (path, filename) => { type: 'folder', path: path, name: filename || path, + tags: [], children: await Promise.all(files.map(file => walk(`${path}/${file}`, file))) } } @@ -32,6 +33,7 @@ const is_static = suffixl(...ext_static) const is_md = suffixl(...ext_md) const is_pug = suffixl(...ext_pug) const is_templated = f => is_md(f) /* || is_rst(f) */ +const is_document = f => is_templated(f) || is_pug(f) const prefix = file => ext => file.substring(0, ext.length) == ext ? ext : null const prefixl = (...l) => file => l.find(prefix(file)) @@ -54,12 +56,41 @@ const propagate_md_layout = (tree, markdown_template) => { const elagate = tree => { if (tree.type != 'folder') return tree - const lh = e => log('[elegate]', e.path) && false + const lh = e => log('[elagate]', e.path) && false tree.children = tree.children.filter(e => !(e.name[0] == '_') || lh(e)) tree.children.forEach(elagate) return tree } +const tag_document = tree => { + if (tree.type == 'file' && is_document(tree.name)) { + tree.tags.push('document_leaf', 'document') + log('[tag_document]', tree.path, 'document_leaf') + } else if (tree.type == 'folder') { + tree.children.forEach(tag_document) + if(tree.children.some(c => c.tags.includes('document'))) { + tree.tags.push('document_branch', 'document') + log('[tag_document]', tree.path, 'document_branch') + } + } + return tree +} + +const reference_index = indexes => tree => { + if (tree.type != 'folder') return tree; + + const index = tree.children.find(e => indexes.includes(e.name)) + if (index) { + tree.index = index + tree.tags.push('has_index') + log('[reference_index]', tree.path, index.name) + index.tags.push('is_index') + } + tree.children.forEach(reference_index(indexes)) + + return tree; +} + const propagate_nice_name = prefix => tree => { const without_prefix = tree.path.substring(prefix.length) const splitted = without_prefix.split('/').filter(v => v.length > 0) @@ -90,10 +121,12 @@ const prepare_copy = (old_prefix, new_prefix, exts) => tree => { const prepare_pug = (old_prefix, new_prefix) => tree => { if (tree.type == 'file' && is_pug(tree.name)) { + tree.old_url = tree.url + tree.url = rm_prefix(old_prefix)(rm_suffix(...ext_pug)(tree.path)) + '.html' tree.generate = { cmd: 'pug', src: tree.path, - out: new_prefix + rm_prefix(old_prefix)(rm_suffix(...ext_pug)(tree.path)) + '.html' + out: new_prefix + tree.url } log('[prepare_pug]',tree.generate.src,'->',tree.generate.out) } @@ -106,11 +139,13 @@ const prepare_pug = (old_prefix, new_prefix) => tree => { const prepare_md = (old_prefix, new_prefix) => tree => { if (tree.type == 'file' && is_md(tree.name)) { + tree.old_url = tree.url + tree.url = rm_prefix(old_prefix)(rm_suffix(...ext_md)(tree.path)) + '.html' tree.generate = { cmd: 'pug', src: tree.template.path, markdown: tree.path, - out: new_prefix + rm_prefix(old_prefix)(rm_suffix(...ext_md)(tree.path)) + '.html' + out: new_prefix + tree.url } log('[prepare_md]',tree.generate.markdown,'+',tree.generate.src,'->',tree.generate.out) } @@ -170,16 +205,35 @@ const do_pug = (prt, root) => async tree => { return tree } +const rm_tree = t => { + if (t.type == 'file') { + log('[do_clean] file', t.path) + return fs.unlink(t.path) + } + + return Promise + .all(t.children.map(rm_tree)) + .then(_ => { + log('[do_clean] path', t.path) + return fs.rmdir(t.path) + }) +} + +const do_clean = path => tree => walk(path).then(rm_tree).then(_ => tree) const conf = { src: './src', dest: './static'} walk(conf.src) .then(propagate_md_layout) .then(elagate) + .then(tag_document) + .then(reference_index(['index.md', 'index.pug'])) .then(propagate_nice_name(conf.src)) .then(prepare_copy(conf.src, conf.dest)) .then(prepare_pug(conf.src, conf.dest)) .then(prepare_md(conf.src, conf.dest)) .then(prepare_folder(conf.src, conf.dest)) + //.then(v => {log(v) ; return v}) + .then(do_clean(conf.dest)) .then(do_folder) .then(do_copy) .then(do_pug()) |