Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@
- [ ] La base è `dev`
- [ ] `npm run lint` passa
- [ ] `npm run build` passa
- [ ] Se aggiungi o cambi una lezione: il suo mazzo in `slides/decks/` è aggiornato e `npm run slides:check` e `npm run slides:verifica` passano (vedi `slides/README.md`)
7 changes: 7 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,16 @@ jobs:
with:
node-version: 22
cache: npm
cache-dependency-path: |
package-lock.json
slides/package-lock.json

- name: Install dependencies
run: npm ci
- name: Install slides dependencies
run: npm ci --prefix slides
- name: Build slides
run: npm run slides:build
- name: Build website
run: npm run build

Expand Down
11 changes: 11 additions & 0 deletions .github/workflows/test-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,20 @@ jobs:
with:
node-version: 22
cache: npm
cache-dependency-path: |
package-lock.json
slides/package-lock.json

- name: Install dependencies
run: npm ci
- name: Install slides dependencies
run: npm ci --prefix slides
- name: Install Chromium for the slide verification
run: npx --prefix slides playwright install --with-deps chromium
- name: Build slides
run: npm run slides:build
- name: Verify slides (nessuna slide che straborda)
run: npm run slides:verifica
- name: Guardia manifest percorsi (append-only)
run: npm run curriculum:check
- name: Lint
Expand Down
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,8 @@ AGENTS.md

# Foto e rapporti di verifica delle figure (npm run figure:foto)
.figure-foto/

# Presentazioni costruite (npm run slides:build): le genera la CI
static/slides/
slides/.slidev/
slides/.provino/
4 changes: 4 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ Una pull request verso `main` che non arriva da `dev` viene bloccata da un contr
- Una descrizione che dica che cosa cambia e perché.
- Per le lezioni, il contenuto in italiano e le regole di tono del progetto. Se hai dubbi, apri prima una issue.

## Lezioni e presentazioni

Ogni lezione ha la sua presentazione in `slides/decks/` (vedi `slides/README.md`), e le due cambiano insieme: chi modifica o crea una lezione, persona o assistente IA, aggiorna o crea nello stesso commit anche il suo mazzo, poi lancia `npm run slides:check`, `npm run slides:build`, `npm run slides:verifica` e `npm run slides:provino` e corregge finché passano. `slides:check` segnala una lezione cambiata dopo il suo mazzo, e la CI si ferma.

## Sostenitori

Il nome di un sostenitore compare nell’elenco (`src/lib/v4vData.ts`) solo dopo che il maintainer ha verificato la donazione. Non modificare quel file in una pull request: scrivi a marco.farina@jcmaxwell.it.
Expand Down
1 change: 1 addition & 0 deletions docusaurus.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ export default async function createConfig(): Promise<Config> {
'./plugins/llms-txt/index.js',
'./plugins/curriculum/index.js',
'./plugins/archivio/index.js',
'./plugins/presentazioni/index.js',
[
'@docusaurus/plugin-content-docs',
{
Expand Down
9 changes: 8 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,14 @@
"curriculum:new-epoch": "node scripts/curriculum-new-epoch.js",
"curriculum:check": "node scripts/check-manifest-append-only.js",
"version": "node scripts/sync-pm-version.mjs",
"figure:foto": "node scripts/figure-foto.mjs"
"figure:foto": "node scripts/figure-foto.mjs",
"slides:install": "npm ci --prefix slides",
"slides:dev": "node slides/scripts/slides.mjs dev",
"slides:build": "node slides/scripts/slides.mjs build",
"slides:pdf": "node slides/scripts/slides.mjs pdf",
"slides:check": "node slides/scripts/slides.mjs check",
"slides:verifica": "node slides/scripts/slides.mjs verifica",
"slides:provino": "node slides/scripts/slides.mjs provino"
},
"dependencies": {
"@codemirror/commands": "^6.10.3",
Expand Down
45 changes: 45 additions & 0 deletions plugins/presentazioni/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// Presentazioni delle lezioni (slides/, vedi slides/README.md).
//
// Un mazzo slides/decks/<volume>/<slug>.md appartiene alla lezione
// volumes/<volume>/<slug>.mdx e, una volta costruito (npm run slides:build),
// è servito a /slides/<volume>/<slug>/. Il plugin dice al pulsante «Presenta»
// (src/components/PresentaButton) quali lezioni ne hanno uno: legge i sorgenti, non static/slides/, così in sviluppo il
// pulsante c'è anche prima della build (e porta a una 404 finché non la fai).
const path = require('path');
const fs = require('fs');

const PLUGIN_NAME = 'presentazioni';
const DECKS_DIR = path.join('slides', 'decks');

module.exports = function presentazioniPlugin(context) {
const decksAbs = path.join(context.siteDir, DECKS_DIR);

return {
name: PLUGIN_NAME,

getPathsToWatch() {
return [path.join(decksAbs, '*', '*.md')];
},

async loadContent() {
const presentazioni = {};
if (!fs.existsSync(decksAbs)) return { presentazioni };
for (const volume of fs.readdirSync(decksAbs, { withFileTypes: true })) {
if (!volume.isDirectory() || volume.name.startsWith('_')) continue;
for (const file of fs.readdirSync(path.join(decksAbs, volume.name))) {
if (!file.endsWith('.md') || file.startsWith('_')) continue;
const slug = file.replace(/\.md$/, '');
// Chiave: `<pluginId>/<docId>`, come il campo `lezione:` del mazzo.
presentazioni[`${volume.name}/${slug}`] = {
url: `/slides/${volume.name}/${slug}/`,
};
}
}
return { presentazioni };
},

async contentLoaded({ content, actions }) {
actions.setGlobalData(content);
},
};
};
Loading