Rework website structure

This commit is contained in:
Quentin 2020-04-18 17:17:54 +02:00
parent ef35a40059
commit 2ea473d3bd
23 changed files with 132 additions and 87 deletions

1
.gitignore vendored
View file

@ -1,2 +1,3 @@
static/ static/
node_modules/ node_modules/
*.swp

View file

@ -1,4 +1,3 @@
#!/bin/bash #!/bin/bash
rm -rf static/
npm install npm install
node render.js node render.js

View file

@ -10,7 +10,7 @@ const log = process.env.VERBOSE ? console.log : unit
const walk = async (path, filename) => { const walk = async (path, filename) => {
log('[walk]', path) log('[walk]', path)
const type = await fs.lstat(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 if (!type.isDirectory()) return null
const files = await fs.readdir(path) const files = await fs.readdir(path)
@ -18,6 +18,7 @@ const walk = async (path, filename) => {
type: 'folder', type: 'folder',
path: path, path: path,
name: filename || path, name: filename || path,
tags: [],
children: await Promise.all(files.map(file => walk(`${path}/${file}`, file))) 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_md = suffixl(...ext_md)
const is_pug = suffixl(...ext_pug) const is_pug = suffixl(...ext_pug)
const is_templated = f => is_md(f) /* || is_rst(f) */ 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 prefix = file => ext => file.substring(0, ext.length) == ext ? ext : null
const prefixl = (...l) => file => l.find(prefix(file)) const prefixl = (...l) => file => l.find(prefix(file))
@ -54,12 +56,41 @@ const propagate_md_layout = (tree, markdown_template) => {
const elagate = tree => { const elagate = tree => {
if (tree.type != 'folder') return 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 = tree.children.filter(e => !(e.name[0] == '_') || lh(e))
tree.children.forEach(elagate) tree.children.forEach(elagate)
return tree 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 propagate_nice_name = prefix => tree => {
const without_prefix = tree.path.substring(prefix.length) const without_prefix = tree.path.substring(prefix.length)
const splitted = without_prefix.split('/').filter(v => v.length > 0) 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 => { const prepare_pug = (old_prefix, new_prefix) => tree => {
if (tree.type == 'file' && is_pug(tree.name)) { 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 = { tree.generate = {
cmd: 'pug', cmd: 'pug',
src: tree.path, 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) 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 => { const prepare_md = (old_prefix, new_prefix) => tree => {
if (tree.type == 'file' && is_md(tree.name)) { 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 = { tree.generate = {
cmd: 'pug', cmd: 'pug',
src: tree.template.path, src: tree.template.path,
markdown: tree.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) 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 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'} const conf = { src: './src', dest: './static'}
walk(conf.src) walk(conf.src)
.then(propagate_md_layout) .then(propagate_md_layout)
.then(elagate) .then(elagate)
.then(tag_document)
.then(reference_index(['index.md', 'index.pug']))
.then(propagate_nice_name(conf.src)) .then(propagate_nice_name(conf.src))
.then(prepare_copy(conf.src, conf.dest)) .then(prepare_copy(conf.src, conf.dest))
.then(prepare_pug(conf.src, conf.dest)) .then(prepare_pug(conf.src, conf.dest))
.then(prepare_md(conf.src, conf.dest)) .then(prepare_md(conf.src, conf.dest))
.then(prepare_folder(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_folder)
.then(do_copy) .then(do_copy)
.then(do_pug()) .then(do_pug())

View file

@ -1,11 +0,0 @@
### Statuts de l'association
Depuis janvier 2020, Deuxfleurs est constitué en association loi 1901.
Vous trouverez [ici](/Documentation/Association/Statuts/) les statuts de l'association.
### Comptes rendus d'AG
Les comptes-rendus d'AG sont disponibles aux liens suivants:
- [13 janvier 2020 (AG constitutive)](/Documentation/Association/AG1/)

View file

@ -1,14 +0,0 @@
extends ../_layout.pug
prepend root
- title = element.nice_path[element.nice_path.length - 1]
block content
.container.spacing
nav
strong
a(href="/Documentation") Documentation
+menu(root.children.find(e => e.nice_name == "Documentation"))
main.spacing
!= markdown

View file

@ -37,7 +37,7 @@ Voilà les conclusions que nous avons tirées de nos tests :
Nous avons donc demandé à Adrien quels étaient les ports ouverts par défaut dans le mode élevé de sa box : Nous avons donc demandé à Adrien quels étaient les ports ouverts par défaut dans le mode élevé de sa box :
![Livebox Parefeu Personnalisé](livebox_parefeu_personnalise.png) ![Livebox Parefeu Personnalisé](Assets/livebox_parefeu_personnalise.png)
Nous avons dans un premier temps retenu le port `995/tcp` pour Jitsi, le port UDP ne pouvant être changé (limitation de Jitsi). Nous avons dans un premier temps retenu le port `995/tcp` pour Jitsi, le port UDP ne pouvant être changé (limitation de Jitsi).
Cependant, pour des raisons de sécurité, les navigateurs ne peuvent pas utiliser les ports en dessous de `1024/*`, à l'exception des ports `80/tcp` et `443/tcp` comme l'indique ;'issue [#3583](https://bugs.chromium.org/p/webrtc/issues/detail?id=3583) de Chromium. Cependant, pour des raisons de sécurité, les navigateurs ne peuvent pas utiliser les ports en dessous de `1024/*`, à l'exception des ports `80/tcp` et `443/tcp` comme l'indique ;'issue [#3583](https://bugs.chromium.org/p/webrtc/issues/detail?id=3583) de Chromium.
@ -76,7 +76,7 @@ WebRTC fonctionne en deux étapes :
Le serveur de signaling Jitsi n'est autre que le serveur de chat prosody. Le serveur de signaling Jitsi n'est autre que le serveur de chat prosody.
Pour ça, prosody est exposé à travers HTTP grâce au protocole BOSH (XMPP overs HTTPS). Pour ça, prosody est exposé à travers HTTP grâce au protocole BOSH (XMPP overs HTTPS).
Une fois l'offre reçue ([exemple](exemple_offre.txt)), elle est enregistrée dans le navigateur à l'aide de `setRemoteDescription` pour initialiser le data plane. Une fois l'offre reçue ([exemple](Assets/exemple_offre.txt)), elle est enregistrée dans le navigateur à l'aide de `setRemoteDescription` pour initialiser le data plane.
On peut débugger le signaling WebRTC sous Chromium avec [chrome://webrtc-internarls](chrome://webrtc-internals/). On peut débugger le signaling WebRTC sous Chromium avec [chrome://webrtc-internarls](chrome://webrtc-internals/).
Quand plus de deux participants sont connectés dans la conversation, Jitsi n'envoie pas les offres de chaque participant aux autres participants. À la place, elle envoie qu'une seule offre, celle de son VideoBridge. Quand plus de deux participants sont connectés dans la conversation, Jitsi n'envoie pas les offres de chaque participant aux autres participants. À la place, elle envoie qu'une seule offre, celle de son VideoBridge.

View file

@ -16,9 +16,12 @@ block root
.menu-item .menu-item
a(href='https://guichet.deuxfleurs.fr') compte a(href='https://guichet.deuxfleurs.fr') compte
span  |  span  | 
.menu-item
a(href='/Documentation') doc
span  | 
h1 #{title} h1 #{title}
main block main
block content main
.container.spacing
nav
strong
a(href="/") Accueil
+menu(root)
block content

7
src/_markdown.pug Normal file
View file

@ -0,0 +1,7 @@
extends ./_layout.pug
prepend root
- title = element.nice_path[element.nice_path.length - 1]
block content
!= markdown

View file

@ -1,7 +1,13 @@
mixin menu(o) mixin menu(o)
ul ul
each val in o.children each val in o.children
- if (val.type == 'folder') - if (val.type == 'folder' && val.tags.includes('document'))
li
- if (val.tags.includes('has_index'))
a(href=val.url)= val.nice_name
- else
span= val.nice_name
+menu(val)
- else if (val.type == 'file' && val.tags.includes('document') && !val.tags.includes('is_index'))
li li
a(href=val.url)= val.nice_name a(href=val.url)= val.nice_name
+menu(val)

View file

@ -67,7 +67,7 @@ header > .container > .menu-item > img {
vertical-align: -9px; vertical-align: -9px;
} }
header > .container > .menu-item > a,span { header > .container > .menu-item > a, header > .container > .menu-item > span {
font-size: 30px; font-size: 30px;
color: white; color: white;
text-decoration: none; text-decoration: none;

View file

@ -4,55 +4,55 @@ prepend root
- title = "deuxfleurs" - title = "deuxfleurs"
block content block content
.container.spacing .chapeau ⇨ protège votre vie privée
.chapeau ⇨ protège votre vie privée .chapeau ⇨ défend vos libertés et vos droits
.chapeau ⇨ défend vos libertés et vos droits .chapeau ⇨ ne vous manipule pas
.chapeau ⇨ ne vous manipule pas .chapeau ⇨ promeut la sobriété numérique
.chapeau ⇨ promeut la sobriété numérique
section.spacing
h2 nos services permettent de
.list
a.service-box.spacing(href='https://riot.deuxfleurs.fr')
div(style='font-size: 80px; height: 120px') 💬
h3 discuter
a.service-box.spacing(href='https://jitsi.deuxfleurs.fr')
div(style='font-size: 80px; height: 120px') 📞
h3 s'appeler
a.service-box.spacing(href='https://cloud.deuxfleurs.fr')
div(style='font-size: 80px; height: 120px') 🔒
h3 sauvegarder vos documents
a.service-box.spacing(href='https://sogo.deuxfleurs.fr')
div(style='font-size: 80px; height: 120px') 📨
h3 envoyer des emails
a.service-box.spacing(href='https://p.adnab.me')
div(style='font-size: 80px; height: 120px') 📄
h3 collaborer
a.service-box.spacing(href='documentation.html#site')
div(style='font-size: 80px; height: 120px') 🌐
h3 créer votre site
a.service-box.spacing(href='https://git.deuxfleurs.fr')
div(style='font-size: 80px; height: 120px') 💻
h3 coder
br
p.spacing ⚠️ Vous devez être membre pour utiliser ces services.  section.spacing
a(href="#nous-rejoindre") Nous rejoindre. h2 nos services permettent de
.list
a.service-box.spacing(href='https://riot.deuxfleurs.fr')
div(style='font-size: 80px; height: 120px') 💬
h3 discuter
a.service-box.spacing(href='https://jitsi.deuxfleurs.fr')
div(style='font-size: 80px; height: 120px') 📞
h3 s'appeler
a.service-box.spacing(href='https://cloud.deuxfleurs.fr')
div(style='font-size: 80px; height: 120px') 🔒
h3 sauvegarder vos documents
a.service-box.spacing(href='https://sogo.deuxfleurs.fr')
div(style='font-size: 80px; height: 120px') 📨
h3 envoyer des emails
a.service-box.spacing(href='https://p.adnab.me')
div(style='font-size: 80px; height: 120px') 📄
h3 collaborer
a.service-box.spacing(href='documentation.html#site')
div(style='font-size: 80px; height: 120px') 🌐
h3 créer votre site
a.service-box.spacing(href='https://git.deuxfleurs.fr')
div(style='font-size: 80px; height: 120px') 💻
h3 coder
br
section.spacing p.spacing ⚠️ Vous devez être membre pour utiliser ces services. 
h2 internet est politique a(href="#nous-rejoindre") Nous rejoindre.
:markdown-it(linkify)
L'IETF, l'organisme en charge de la standardisation d'internet, reconnait que les choix technologiques ont un impact sur les droits de l'homme [[RFC8280]](https://trac.tools.ietf.org/html/rfc8280).
section.spacing section.spacing
h2 notre réponse h2 internet est politique
em à venir :markdown-it(linkify)
L'IETF, l'organisme en charge de la standardisation d'internet, reconnait que les choix technologiques ont un impact sur les droits de l'homme [[RFC8280]](https://trac.tools.ietf.org/html/rfc8280).
section.spacing section.spacing
h2(id="nous-rejoindre") nous rejoindre h2 notre réponse
p.spacing Nous fonctionnons actuellement selon un mode de cooptation qui nous permet d'une part de mieux contrôler l'utilisation des ressources et éviter les abus, et d'autre part de créer et garder un contact humain avec nos utilisateurs. em à venir
p.spacing
| Si vous connaissez un membre de l'association, contactez le directement pour qu'il vous créer un compte. section.spacing
br h2(id="nous-rejoindre") nous rejoindre
| Sinon, vous pouvez nous écrire à coucou<img src="img/arobase.png" height="15"/>deuxfleurs.fr. p.spacing Nous fonctionnons actuellement selon un mode de cooptation qui nous permet d'une part de mieux contrôler l'utilisation des ressources et éviter les abus, et d'autre part de créer et garder un contact humain avec nos utilisateurs.
p.spacing
| Si vous connaissez un membre de l'association, contactez le directement pour qu'il vous créer un compte.
br
| Sinon, vous pouvez nous écrire à coucou<img src="img/arobase.png" height="15"/>deuxfleurs.fr.