aboutsummaryrefslogtreecommitdiff
path: root/render.js
diff options
context:
space:
mode:
authorQuentin Dufour <quentin@deuxfleurs.fr>2020-04-18 17:17:54 +0200
committerQuentin Dufour <quentin@deuxfleurs.fr>2020-04-18 17:17:54 +0200
commit2ea473d3bd2d8bd8323c31f2355b5d427852e164 (patch)
tree648d9f212fe5badd061923524720f4c959578b11 /render.js
parentef35a40059be533bfc66c39bfdfb6ba22c0a672f (diff)
downloadsite-2ea473d3bd2d8bd8323c31f2355b5d427852e164.tar.gz
site-2ea473d3bd2d8bd8323c31f2355b5d427852e164.zip
Rework website structure
Diffstat (limited to 'render.js')
-rw-r--r--render.js62
1 files changed, 58 insertions, 4 deletions
diff --git a/render.js b/render.js
index 8fb7545..352fe7f 100644
--- a/render.js
+++ b/render.js
@@ -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())