Compare commits
3 Commits
3d6cbdef7b
...
179bb0a850
Author | SHA1 | Date |
---|---|---|
David Soulayrol | 179bb0a850 | |
Fx | 89223cbf2b | |
David Soulayrol | 0447ef964b |
18
README.md
18
README.md
|
@ -9,13 +9,11 @@ Le site est créé à l'aide du logiciel libre [MetalSmith](http://www.metalsmit
|
|||
|
||||
### Préparation des sources
|
||||
|
||||
**Metalsmith** requiert la disponibilité de **NodeJS** et **npm**. L'installation de ces logiciels dépend du système d'exploitation utilisé.
|
||||
|
||||
Les sources peuvent être téléchargées depuis le dépôt **Gitea** ou bien copiées localement à l'aide de **git** avec la commande suivante.
|
||||
Les sources du site peuvent être téléchargées depuis le dépôt **Gitea** ou bien copiées localement à l'aide de **git** avec la commande suivante.
|
||||
|
||||
git clone https://apps.ti-nuage.fr/gitea/ti-nuage/site.git
|
||||
|
||||
Le projet s'appuie sur un certain nombre de dépendances, utiles au développement ou à la génération du site lui-même. Pour installer ces dépendances :
|
||||
Le projet s'appuie sur un certain nombre de dépendances, utiles au développement ou à la génération du site lui-même. Il est tout d'abord nécessaire d'installer **NodeJS** et **npm**. L'installation de ces logiciels dépend du système d'exploitation utilisé. Le reste des dépendances peut alors être assemblé avec la commande suivante.
|
||||
|
||||
npm install
|
||||
|
||||
|
@ -32,9 +30,17 @@ La liste des commandes existantes est disponible avec `npm run`. Il est possible
|
|||
|
||||
## Structure
|
||||
|
||||
Le site de l'association est essentiellement composé de pages statiques. Les billets d'actualité et les comptes-rendus de réunion sont eux-mêmes générés ou assemblés avec le reste des pages du site.
|
||||
Sauf les exceptions détaillées plus bas, l'ensemble du site de l'association est composé de pages statiques dont les sources figurent dans ce projet. Les billets d'actualité et les comptes-rendus de réunion sont eux-mêmes générés ou assemblés avec le reste des pages du site.
|
||||
|
||||
Cependant, afin d'être réactif, l'affichage des événements du calendrier partagé de l'association est effectué depuis le navigateur. Si le navigateur dispose d'un support Javascript actif, alors :
|
||||
### Supports de conférences
|
||||
|
||||
Les documents hébergés dans le projet [ti-nuage/talks](https://forge.ti-nuage.fr/gitea/ti-nuage/talks) peuvent être publiés sur la page /rencontres. Pour ce faire, il faut renseigner la variable d'environnement PATH_TALKS. Par exemple :
|
||||
|
||||
PATH_TALKS=../tinuage-talks/documents npm run server
|
||||
|
||||
### Intégration du calendrier
|
||||
|
||||
Afin d'être réactif, l'affichage des événements du calendrier partagé de l'association est effectué depuis le navigateur. Si le navigateur dispose d'un support Javascript actif, alors :
|
||||
|
||||
- les événements à venir sont mixés avec les billets récents du blog dans la rubrique Actualité de la page d'accueil ;
|
||||
- le menu propose une entrée « Calendrier » à la suite de « Actualité ». Cette nouvelle page présente plus largement les événements récents ou à venir.
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
---
|
||||
title: Libre en fête
|
||||
date: 2024-03-10
|
||||
author: David Soulayrol
|
||||
---
|
||||
|
||||
L'édition 2024 de [Libre en fête](https://libre-en-fete.net/2024/) a commencé hier et va durer un mois. Ainsi, une nouvelle fois encore, des événements de découverte du Logiciel Libre et de la culture libre vont accompagner l'arrivée du printemps.
|
||||
|
||||
Nous participons à cet événement de deux manières. D'abord dès samedi 16 mars en proposant une nouvelle discussion au [café Théodore](http://www.cafetheodore.fr) autour, cette fois, des Conditions Générales d'Utilisation (CGU), ces petites lignes que l'on est censé lire quand on veut s'abonner à un service, et qui sont les plus courtes possible [chez nous](https://www.ti-nuage.fr/cgu.html). Cette rencontre est encore une fois à l'initiative de l'association [Tohu-Bohu](https://www.tohu.eu/) et est également annoncé sur le [programme du café](https://www.cafetheodore.fr/agenda/rencontres-autour-du-numerique-3/).
|
||||
|
||||
Ensuite, nous serons présents pour accompagner Nourdine qui propose le 24 mars, dès 9 heures à la salle Victor Hugo de Vieux-Marché, un *Repair Café* éphémère, c'est à dire un lieu ou il est possible d'apporter votre sèche-cheveux ou votre grille-pain récalcitrant pour le remettre en état plutôt que d'en changer. Ce café sera aussi le moment pour une *install party*, c'est à dire un atelier de discussion et d'installation de systèmes libres sur votre ordinateur (si vous prévoyez d'installer linux sur un ordinateur, veillez à sauvegarder vos données sur un disque dur externe).
|
||||
|
||||
## Prochains jeudis
|
||||
|
||||
Ce 7 mars se tenait notre troisième réunion de l'année. Une réunion à l'affluence surprenante et mémorable. Le compte-rendu est [disponible ici](/cr/2024/cr-20240307.pdf).
|
||||
|
||||
Notre prochaine rencontre régulière aura lieu le **4 avril**, toujours à la Hutte. L'ordre du jour se construit sur [ce pad](https://apps.ti-nuage.fr/pad/p/2024-04-reunion-mensuelle). Vous pouvez à tout moment y indiquer votre présence et proposer les sujets que vous voulez voir aborder.
|
|
@ -0,0 +1,84 @@
|
|||
.ND 07/03/2024
|
||||
.TL
|
||||
Compte-rendu de Réunion
|
||||
.br
|
||||
Jeudi 7 mars 2024 à Vieux-Marché
|
||||
.AU "David"
|
||||
.AST "Résumé"
|
||||
.AS
|
||||
Cette réunion fut un petit événement dans la vie de l'association, avec dix (10 !) personnes présentes, dont plusieurs membres de l'association Tohu-Bohu, un potentiel nouvel administrateur, une personne ayant envie d'essayer un système libre sur son ordinateur.
|
||||
Avec pour bilan plein d'idées et d'informations intéressantes, deux nouvelles adhésions et au moins une troisième sans doute pour bientôt...
|
||||
.AE
|
||||
.MT 4
|
||||
.hl
|
||||
.PRESENT "Benoît, David, Dominique, Félix, Fx, Léna, Mathias, Michelle, Nourdine, Thierry"
|
||||
.HU "Tohu-bohu et associations voisines"
|
||||
Une partie du bureau et des animateurs des ateliers numériques de l'association Tohu-Bohu\*F
|
||||
.FS
|
||||
.URL https://www.tohu.eu/
|
||||
.FE
|
||||
nous a rendu visite.
|
||||
L'occasion de discuter de la seconde conférence que nous proposerons au café Théodore le 16 mars prochain, à leur invitation, et aussi de faire davantage connaissance de leurs activités et de leurs besoins, à titre collectif ou individuel.
|
||||
.P
|
||||
Claire aurait dû être des nôtres ce soir aussi mais a eu un empêchement.
|
||||
Outre ses besoins personnels d'hébergement Web, elle participe au Kafe\*F
|
||||
.FS
|
||||
.URL https://lekafe.fr/
|
||||
.FE
|
||||
à Pleumeur-Bodou, espace associatif où sont organisés de manière collégiale des ateliers divers ; réparations, terre cuite...
|
||||
Elle imagine organiser un week-end autour du numérique, dont la forme et le contenu restent à inventer.
|
||||
.P
|
||||
Enfin, Ploum Informatik, mentionnée lors de notre dernière réunion, a été contactée mais n'a pas répondu à notre sollicitation.
|
||||
.HU "Discussions diverses"
|
||||
Parmi les sujets abordés, ce compte-rendu doit absolument mentionner le jeu Network & Magic\*F
|
||||
.FS
|
||||
.URL https://atelier.aquilenet.fr/projects/communication/wiki/Network_and_Magic
|
||||
.FE
|
||||
cité par Fx, nouveau membre enthousiaste déjà très investi dans le libre.
|
||||
Il s'agit de représenter le parcours d'une requête pour une page Web sur le réseau, chaque joueur interprétant un serveur ; le DNS, Google, Facebook, etc.
|
||||
Le résultat, très visuel et vivant, est certainement très instructif.
|
||||
.P
|
||||
Par ailleurs, les présents ont été invités à questionner le fonctionnement de l'association.
|
||||
Et ont aussi été abordés l'événement Libre en Fête, le principe du
|
||||
.I "repair café" ,
|
||||
les systèmes d'exploitation, les besoins des associations, ... et l'IA.
|
||||
.HU "Journée d'interconnaissance"
|
||||
Nous avons été invités à participer à une journée de
|
||||
.I "rencontre, d'interconnaissance et d'échange entre acteurs du territoire de Lannion-Trégor Communauté" .
|
||||
Organisée par Lannion-Trégor Communauté en partenariat avec le Hub Bretagne\*F
|
||||
.FS
|
||||
.URL https://hub-bretagne.net
|
||||
.FE
|
||||
dans le cadre de la démarche PorTReA, laquelle cherche à identifier les besoins et ressources du territoire en matière d'accompagnement au numérique et de mettre en réseau les acteurs locaux.
|
||||
David ou Nourdine devraient répondre favorablement à l'invitation.
|
||||
.HU "Accès à Internet"
|
||||
Nous avions opté il y a un an pour le fournisseur Free, d'une part pour profiter du tarif préférentiel la première année, et d'autre part parce que son offre nous apportait les services réseaux dont nous avions besoin.
|
||||
L'offre tarifaire est maintenant terminée, et nous envisageons de rejoindre l'association FDN\*F
|
||||
.FS
|
||||
.URL https://www.fdn.fr/
|
||||
.FE
|
||||
\&.
|
||||
FDN fournit un accès à Internet nu, mais
|
||||
.I "propre, neutre et militant" .
|
||||
David et Nourdine doivent vérifier le coût exact avant très certainement d'adhérer à cette offre.
|
||||
.HU "Services"
|
||||
Le logiciel Forgejo\*F
|
||||
.FS
|
||||
.URL https://forgejo.org
|
||||
.FE
|
||||
a été créé afin de développer une forge similaire à Gitea, que nous utilisons, mais débarrassée de tout contrôle de la part d'une société commerciale.
|
||||
David propose d'envisager la migration de notre service pour utiliser ce nouvel outil.
|
||||
Une telle migration est normalement encore assez simple, les deux projets n'ayant pas trop fortement divergé encore.
|
||||
.HU "Install Party"
|
||||
Léna nous rendait visite ce soir pour évaluer la possibilité de remplacer le système d'exploitation, et chiffer le disque sur son ordinateur.
|
||||
Devant l'affluence inattendue, nous avons seulement répondu à quelques questions et l'avons invité à revenir le 24 mars pour le
|
||||
.I "repair café"
|
||||
éphémère que propose Nourdine ce jour-là, et qui s'accompagnera d'une
|
||||
.I "install party"
|
||||
avec l'aide de membres de l'association.
|
||||
Cela se déroulera dès 9 heures à la salle Victor Hugo (à la mairie).
|
||||
.HU "Administration"
|
||||
Le changement de banque est acté !
|
||||
Ou presque.
|
||||
Nous quittons donc le Crédit Coopératif, pour lequel nous avions une préférence mais qui s'est avéré peu... coopératif justement, et très onéreux pour une structure comme la notre.
|
||||
Nos comptes seront hébergés très bientôt au Crédit Mutuel de Bretagne.
|
|
@ -0,0 +1,7 @@
|
|||
---
|
||||
permalink: false
|
||||
title: Rencontres
|
||||
---
|
||||
Outre l'accueil offert par l'association le premier jeudi de chaque mois, Ti Nuage va aussi à la rencontre d'autres lieux pour présenter et discuter les thèmes qui lui sont chers : la liberté de l'utilisateur de services numériques et la protection de ses données.
|
||||
|
||||
Voici les documents utilisés comme support lors des rencontres, conférences et autres causeries faites par l'association. Tous sont disponibles selon la licence [CC-BY-SA version 2.0 ou ultérieure](https://creativecommons.org/licenses/by-sa/2.0/fr/). Leurs fichiers sources sont disponibles sur notre [forge logicielle](https://forge.ti-nuage.fr/gitea/ti-nuage/talks).
|
|
@ -21,6 +21,7 @@
|
|||
<ul id="menu-association">
|
||||
<li><a href="/association.html">Découvrir l'association</a></li>
|
||||
<li><a href="/blog">Actualités</a></li>
|
||||
<li><a href="/rencontres">Rencontres</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
<section>
|
||||
|
|
|
@ -6,9 +6,9 @@
|
|||
"main": "",
|
||||
"scripts": {
|
||||
"build": "npm run clean && npm run build:metalsmith",
|
||||
"build:prod": "NODE_ENV=production npm run build",
|
||||
"build:metalsmith": "node scripts/run.js build",
|
||||
"clean": "rimraf dist",
|
||||
"build:prod": "NODE_ENV=production npm run build",
|
||||
"clean": "rimraf dist && rm -rf content/talks",
|
||||
"dev": "npm run build && nodemon scripts/run.js serve",
|
||||
"server": "npm run build && http-server dist",
|
||||
"deploy": "npm run build:prod && cd dist && rsync -v -rlptz --relative -e \"ssh -p $SERVER_PORT\" ./ $SERVER_PATH",
|
||||
|
|
|
@ -9,6 +9,7 @@ module.exports = {
|
|||
hostname,
|
||||
paths: {
|
||||
projectRoot,
|
||||
talksRoot: process.env.PATH_TALKS,
|
||||
/* Nodes */
|
||||
leaflet: join(projectRoot, 'node_modules', 'leaflet', 'dist'),
|
||||
/* Metalsmith */
|
||||
|
|
|
@ -10,10 +10,9 @@ function plugin (options) {
|
|||
|
||||
return function (files, metalsmith, done) {
|
||||
const dest = options.destination
|
||||
const items = options.files.length
|
||||
const promises = []
|
||||
|
||||
const addTask = function (promise) {
|
||||
const addTask = function (items, promise) {
|
||||
promises.push(promise)
|
||||
if (items === promises.length) {
|
||||
debug('Waiting for ' + items + 'copy operations.')
|
||||
|
@ -27,8 +26,19 @@ function plugin (options) {
|
|||
}
|
||||
}
|
||||
|
||||
options.files.forEach((filename) => {
|
||||
addTask(new Promise(function (resolve, reject) {
|
||||
const iterateFiles = function (options, action) {
|
||||
if (options.files != null) {
|
||||
options.files.forEach((filename) => action(filename, options.files.length))
|
||||
}
|
||||
if (options.generator != null) {
|
||||
options.generator(documents => {
|
||||
documents.forEach((filename) => action(filename, documents.length))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
iterateFiles(options, (filename, items) => {
|
||||
addTask(items, new Promise(function (resolve, reject) {
|
||||
fs.stat(filename, function (err, stats) {
|
||||
if (err) return reject(err)
|
||||
fs.readFile(filename, function (err, buffer) {
|
||||
|
|
|
@ -0,0 +1,97 @@
|
|||
const { Buffer } = require('node:buffer')
|
||||
const config = require('./config.js')
|
||||
const debug = require('debug')('metalsmith-tinuage-talks')
|
||||
const path = require('path')
|
||||
|
||||
module.exports = plugin
|
||||
|
||||
/**
|
||||
* Un plugin pour Metalsmith qui lit une collection de fichiers PDF la section
|
||||
* rencontres du site.
|
||||
*
|
||||
* @return {Function}
|
||||
*/
|
||||
function plugin () {
|
||||
const IndexCreator = {
|
||||
setup: function (page) {
|
||||
this.page = page
|
||||
this.talks = []
|
||||
},
|
||||
|
||||
add: function (filename) {
|
||||
const basename = path.basename(filename)
|
||||
const names = basename.substring(0, basename.lastIndexOf('.')).split('__')
|
||||
|
||||
if (names.length >= 2) {
|
||||
const name = names[0].replaceAll('_', ' ')
|
||||
const location = names[1].substring(0, names[1].lastIndexOf('_')).replaceAll('_', ' ')
|
||||
const year = names[1].substring(names[1].lastIndexOf('_') + 1)
|
||||
|
||||
const talk = this.getEntry(year, location, name)
|
||||
|
||||
if (names.length === 3 && names[2] === ('notes')) {
|
||||
talk.notes = filename
|
||||
} else {
|
||||
talk.doc = filename
|
||||
}
|
||||
} else {
|
||||
console.log('Ignoring talk ' + filename)
|
||||
}
|
||||
},
|
||||
|
||||
fill: function (files) {
|
||||
let html = ''
|
||||
|
||||
this.talks
|
||||
.reduce(
|
||||
(map, talk) => {
|
||||
(map.get(talk.year) || map.set(talk.year, []).get(talk.year)).push(talk)
|
||||
return map
|
||||
},
|
||||
new Map())
|
||||
.forEach((talks, year) => {
|
||||
html += '<h2>' + year + '</h2>\n'
|
||||
talks
|
||||
.sort((a, b) => a.year - b.year || a.title - b.title)
|
||||
.forEach(talk => {
|
||||
html += '<p>' + talk.title + ', ' + talk.location + ' : <a href="/' + talk.doc + '">Présentation</a>, <a href="/' + talk.notes + '">Notes</a></p>\n'
|
||||
})
|
||||
})
|
||||
|
||||
this.page.contents = Buffer.concat([
|
||||
this.page.contents,
|
||||
Buffer.from(html)
|
||||
])
|
||||
},
|
||||
|
||||
getEntry: function (year, location, title) {
|
||||
let talk = this.talks.find(t => t.year === year && t.location === location && t.title === title)
|
||||
|
||||
if (talk == null) {
|
||||
talk = { location, title, year }
|
||||
this.talks.push(talk)
|
||||
}
|
||||
|
||||
return talk
|
||||
}
|
||||
}
|
||||
|
||||
return function (files, metalsmith, done) {
|
||||
if (config.paths.talksRoot) {
|
||||
const creator = Object.create(IndexCreator)
|
||||
|
||||
creator.setup(files['rencontres/index.html'])
|
||||
|
||||
Object.keys(files).forEach(filename => {
|
||||
if (/^rencontres\/.*\.pdf$/.test(filename)) {
|
||||
debug('Handling', filename)
|
||||
creator.add(filename)
|
||||
}
|
||||
})
|
||||
|
||||
creator.fill()
|
||||
}
|
||||
|
||||
done()
|
||||
}
|
||||
}
|
|
@ -7,6 +7,7 @@ const config = require('./config.js')
|
|||
const collections = require('@metalsmith/collections')
|
||||
const copy = require('./metalsmith-copy')
|
||||
const excerpts = require('@metalsmith/excerpts')
|
||||
const fs = require('node:fs')
|
||||
const groff = require('metalsmith-groff')
|
||||
const layouts = require('@metalsmith/layouts')
|
||||
const Metalsmith = require('metalsmith')
|
||||
|
@ -15,6 +16,7 @@ const marked = require('marked')
|
|||
const permalinks = require('@metalsmith/permalinks')
|
||||
const rename = require('metalsmith-rename')
|
||||
const services = require('./metalsmith-tinuage-services')
|
||||
const talks = require('./metalsmith-tinuage-talks')
|
||||
const sitemap = require('metalsmith-sitemap')
|
||||
const slug = require('slug')
|
||||
const statistics = require('./metalsmith-statistics-plugin')
|
||||
|
@ -77,6 +79,26 @@ module.exports = new Metalsmith(config.paths.projectRoot)
|
|||
files: [join(config.paths.leaflet, 'leaflet.css')],
|
||||
destination: './css'
|
||||
}))
|
||||
.use(copy({
|
||||
generator: (callback) => {
|
||||
if (config.paths.talksRoot != null) {
|
||||
return fs.readdir(config.paths.talksRoot, (err, filenames) => {
|
||||
let documents = []
|
||||
|
||||
if (err) {
|
||||
console.error('%s: %s', config.paths.talksRoot, err)
|
||||
} else {
|
||||
documents = filenames
|
||||
.filter(f => { return f.indexOf('.pdf') !== -1 })
|
||||
.map(f => { return join(config.paths.talksRoot, f) })
|
||||
}
|
||||
|
||||
callback(documents)
|
||||
})
|
||||
}
|
||||
},
|
||||
destination: './rencontres'
|
||||
}))
|
||||
.use(copy({
|
||||
files: [
|
||||
join(config.paths.leaflet, 'images', 'marker-icon.png'),
|
||||
|
@ -106,6 +128,7 @@ module.exports = new Metalsmith(config.paths.projectRoot)
|
|||
}))
|
||||
.use(chatons())
|
||||
.use(services())
|
||||
.use(talks())
|
||||
.use(excerpts())
|
||||
.use(permalinks({
|
||||
pattern: 'blog/:date/:title',
|
||||
|
|
Loading…
Reference in New Issue