- Editions replaced by INSTEG, HAREC and UPPGRADERING (Instegscertifikat -> HAREC) - Question pool optional; simulator, homework tool and solutions switch off without one - All UI strings, templates, renderers and project JS localised to sv-SE (decimal comma, Swedish non-breaking-space rules, Å/Ä/Ö in Morse table) - DARC branding, membership CTA and German links removed; attribution footer added - Page names centralised in src/pages.py - README and docs rewritten in Swedish Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
129 lines
6.0 KiB
Markdown
129 lines
6.0 KiB
Markdown
# 50Ω – svensk adaption
|
||
|
||
Generator för en svensk webbplats för självstudier inför **Instegscertifikatet** och **HAREC**. Projektet är en oberoende svensk adaption av [50ohm.de](https://50ohm.de) och drivs varken av DARC e.V. eller av SSA.
|
||
|
||
## Licens, attribution och ändringsmeddelande
|
||
|
||
Det här repot är baserat på generatorn bakom [50ohm.de](https://50ohm.de) (DARC e.V.), originalet finns i repot [DARC-e-V/50ohm](https://github.com/DARC-e-V/50ohm) (grenen `main`). Generatorns kod är licensierad under AGPL-3.0 (se [`LICENSE`](LICENSE)); innehållet på 50ohm.de är licensierat under CC BY 4.0 och måste tillskrivas DARC e.V. Licensfilerna ska behållas.
|
||
|
||
**Ändringar:** Generatorn har översatts till svenska (gränssnitt, bildtexter, LaTeX, enhets- och typografiregler enligt svensk praxis), kurserna har ersatts av Instegscertifikat, HAREC och uppgradering från Instegscertifikat till HAREC, den tyska frågebanken är valfri, och all DARC-/tysk branding och alla länkar till tyska tjänster har tagits bort.
|
||
|
||
Detta är en oberoende adaption. Den är **inte godkänd av DARC eller SSA**.
|
||
|
||
## Översikt
|
||
|
||
Utbildningsmaterialet skrivs i ett utökat markdown-format, internt kallat DARCdown. Kärnan i generatorn är en parser baserad på [mistletoe](https://github.com/miyuchina/mistletoe) som har utökats med extra syntax och utdataformat. Formatet beskrivs i `README-FORMAT.md` i innehållsrepot.
|
||
|
||
Utdataformat:
|
||
- HTML: [`fifty_ohm_html_renderer.py`](renderer/fifty_ohm_html_renderer.py)
|
||
- LaTeX: [`fifty_ohm_latex_renderer.py`](renderer/fifty_ohm_latex_renderer.py)
|
||
- HTML för presentationer med reveal.js: [`fifty_ohm_html_slide_renderer.py`](renderer/fifty_ohm_html_slide_renderer.py)
|
||
|
||
Själva generatorn finns i `src`, framför allt skriptet [`build.py`](src/build.py). Namnen på webbplatsens sidor definieras på ett ställe: [`src/pages.py`](src/pages.py).
|
||
|
||
## Kurser (Edition)
|
||
|
||
Tre kurser byggs. Varje kurs har en innehållsförteckning (toc) i innehållsrepot:
|
||
|
||
| Edition (`--edition`) | Kurs | Fil |
|
||
|---|---|---|
|
||
| `INSTEG` | Instegscertifikat | `toc/INSTEG.json` |
|
||
| `HAREC` | HAREC | `toc/HAREC.json` |
|
||
| `UPPGRADERING` | Uppgradering: Instegscertifikat till HAREC | `toc/UPPGRADERING.json` |
|
||
|
||
Utan `--edition` byggs alla tre. Alternativet kan anges flera gånger:
|
||
|
||
```console
|
||
$ python main.py --edition INSTEG --edition HAREC
|
||
```
|
||
|
||
## Innehållsrepot
|
||
|
||
Generatorn läser sitt innehåll från ett separat repo med följande struktur:
|
||
|
||
```
|
||
toc/<EDITION>.json innehållsförteckning per kurs
|
||
contents/sections/<ident>.md text för ett avsnitt
|
||
contents/slides/<ident>.md presentation för ett avsnitt (valfri)
|
||
contents/snippets/*.md korta texter för startsidan
|
||
contents/static/<sida>.html statiska sidor (+ <sida>_sidebar.html, valfri)
|
||
contents/drawings, photos, html bilder, foton och inbäddad HTML
|
||
contents/questions/question_pool.json frågebank (valfri, se nedan)
|
||
contents/questions/metadata.json bildmetadata för frågorna (valfri)
|
||
contents/solutions/<frågenummer>.md lösningsvägar (valfria)
|
||
```
|
||
|
||
### Statiska sidor och snippets
|
||
|
||
Följande sidnamn används (se `src/pages.py`): `prov`, `info`, `sok`, `kurser_karta`, `kurser_lista`, `mentorer`. För de tre sista används en generell mall om innehållsrepot saknar motsvarande statiska sida. Saknade snippets ger tom text, bygget misslyckas inte.
|
||
|
||
Snippets som används på startsidan: `index_title`, `index_teaser`, `index_content`, `index_btn_start`, `index_btn_vad_ar_amatorradio`, `lernen_selbst_title`, `lernen_selbst_teaser`, `lernen_selbst_btn_instegs`, `lernen_selbst_btn_harec`, `lernen_selbst_btn_uppgradering`, `lernen_kurs_*` och `lernen_mentor_*` (`title`, `teaser`, `btn`).
|
||
|
||
### Frågebank (valfri)
|
||
|
||
Det finns ingen svensk frågebank. Om `contents/questions/question_pool.json` saknas hoppar generatorn över provsimulatorn, övningsverktyget, lösningssidorna och `question_index.json`, och alla länkar dit döljs i mallarna (Jinja-variabeln `has_question_pool`). Finns frågebanken byggs allt som förut. `metadata.json` är valfri; saknas en fråga där används standardvärden.
|
||
|
||
## Kom igång
|
||
|
||
### Installera Python och beroenden
|
||
|
||
Projektet är uppsatt med [`uv`](https://docs.astral.sh/uv/) men fungerar lika bra med `pip` och `venv`. Använd Python-versionen i `.python-version`.
|
||
|
||
```console
|
||
$ uv venv
|
||
$ source .venv/bin/activate
|
||
$ uv pip sync requirements.txt
|
||
```
|
||
|
||
Med `venv` och `pip`:
|
||
|
||
```console
|
||
$ python3 -m venv .venv
|
||
$ source .venv/bin/activate
|
||
$ pip install -r requirements.txt
|
||
```
|
||
|
||
### Bygga
|
||
|
||
Ange sökvägen till ett utcheckat innehållsrepo, antingen i `config/config.json` (se `config/config.json.example`), som miljövariabel `OHM_INPUT` eller på kommandoraden:
|
||
|
||
```console
|
||
$ python main.py -i ../50ohm-contents-dl -o build
|
||
```
|
||
|
||
Flaggor: `--input/-i` (innehåll), `--output/-o` (målkatalog, standard `./build`), `--edition` (kurs, se ovan), `--no-render-editions`, `--no-render-solutions`, `--build-zip`. `python build.py` bygger allt och packar `build/build.zip`.
|
||
|
||
### Testa lokalt
|
||
|
||
Startsidan är `build/index.html`. För att sökfunktionen ska fungera krävs en lokal webbserver:
|
||
|
||
```console
|
||
$ cd build/
|
||
$ python3 -m http.server 8000
|
||
```
|
||
|
||
Öppna sedan [`http://localhost:8000/index.html`](http://localhost:8000/index.html).
|
||
|
||
### Hosting
|
||
|
||
Resultatet är rent statiska filer. Kopiera innehållet i `build/` till valfri webbserver (nginx, Apache, GitHub Pages, ...). Alla länkar är relativa. Ett Docker-bygge finns i `docker/Dockerfile`:
|
||
|
||
```console
|
||
$ docker build -f docker/Dockerfile -t 50ohm-sv .
|
||
$ docker run --rm -v ../50ohm-contents-dl:/content -v $PWD/build:/build 50ohm-sv -i /content -o /build
|
||
```
|
||
|
||
Webbplatsens sidfot innehåller en platshållare för driftansvarigs egna utgivar-/kontaktuppgifter och integritetspolicy (`templates/html/page.html`, markerad med `TODO`). Den måste fyllas i innan webbplatsen publiceras.
|
||
|
||
### Tester och kodstil
|
||
|
||
```console
|
||
$ pip install pytest ruff
|
||
$ python -m pytest
|
||
$ ruff check . && ruff format --check .
|
||
```
|
||
|
||
## Presentationer
|
||
|
||
Se [`doc/Slides.md`](doc/Slides.md).
|