Build all apps from Markdown content; Compose Desktop replaces GTK on Linux and Windows

- content/ + scripts/build-content.py produce content.json for every app
- stable lesson IDs with one-time progress migration (Swift, Kotlin)
- shared answer-check tests (tests/answers.json) for Kotlin and Swift
- android/desktop: Compose app with updater, speech and GTK progress import
- CI packages AppImage and Windows zip with ProGuard, runs the tests

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
pepaskopec-blip 2026-10-09 20:40:37 +02:00
commit c3bc32113b
964 changed files with 57285 additions and 1156 deletions

319
content/README.md Normal file
View file

@ -0,0 +1,319 @@
# Obsah aplikace
Všechny texty lekcí, cvičení, kvízů a knih jsou tady v Markdownu. Aplikace pro
Android, iOS, macOS, Linux i Windows z nich při sestavení vyrobí jeden soubor
`content.json` (skript `scripts/build-content.py`). Na kód se kvůli obsahu sahat
nemusí.
Kontrola po úpravě:
```sh
python3 scripts/build-content.py
```
Skript vypíše počet lekcí, nebo chyby s cestou a číslem řádku
(`content/fyzika/1-rocnik/02-pohyb.md:41: …`). Při chybě se aplikace nesestaví.
## Kde co je
| Složka | Obsah |
|---|---|
| `pocitacove-site/`, `technicke-vybaveni/`, `obcanska-nauka/`, `fyzika/` | `N-rocnik/`, v nich lekce |
| `prirodni-vedy/chemie`, `prirodni-vedy/biologie` | lekce |
| `cestina/literatura/N-rocnik` | lekce literatury |
| `cestina/mluvnice` | cvičení z mluvnice |
| `cestina/cetba` | knihy k maturitní četbě |
| `matematika/0-opakovani`, `matematika/N-rocnik` | lekce s příklady |
| `anglictina/N-rocnik`, `nemcina/N-rocnik` | lekce s výkladem, čtením, poslechem, psaním |
| `nemcina/ucebnice` | učebnice němčiny po kapitolách |
| `aplikace/texty.md` | texty rozhraní (tlačítka, nadpisy obrazovek) |
| `aplikace/predmety.md` | dlaždice předmětů na úvodní obrazovce |
| `aplikace/novinky.txt` | seznam změn zobrazovaný v aplikaci |
Jedna lekce je jeden soubor `NN-nazev.md`. Pořadí v aplikaci určuje číslo na
začátku názvu. Soubory, které začínají `_`, nejsou lekce (např. `_lekce.md`
v učebnici popisuje kapitolu).
## Angličtina
Anglická verze leží vedle české jako `NN-nazev.en.md`. Co v ní chybí, zobrazí
se česky. Obsahuje:
- hlavičku se stejnými poli jako česká (`nazev`, `popis`, …), ale anglicky,
- volitelně tabulku `# Překlady`, kde je každý český text z lekce přeložený:
```md
---
nazev: Physical quantities
popis: SI, scalar and vector, measurement error.
---
# Překlady
| Česky | Anglicky |
|---|---|
| Fyzikální veličina má číselnou hodnotu a jednotku. | A physical quantity has a value and a unit. |
```
Český text musí v tabulce sedět přesně (včetně interpunkce). Pole `id`
a `puvodni` do `.en.md` nepatří.
## Společná pravidla zápisu
Hlavička mezi `---` obsahuje pole `klíč: hodnota`. Pak následují oddíly `#`,
položky `##` a podle potřeby `###`.
| Zápis | Význam |
|---|---|
| `- text` | odrážka; v kvízu možnost |
| `- [x] text` | správná možnost |
| `1. text` | číslovaná položka (např. části děje) |
| `> text` | vysvětlení, nápověda, tip nebo význam (podle oddílu) |
| `= odpověď` | správná odpověď; více variant odděluje `\|`: `= hasn't\|has not` |
| `[odpověď]` | mezera k doplnění uvnitř věty: `Ich [bin\|heiße] Anna.` |
| `\| a \| b \|` | tabulka; v buňce se píše `\|` jako `\\|` a nový řádek jako `\n` |
| `<!-- … -->` | poznámka, do aplikace se nedostane |
Hranaté závorky, které nemají být mezerou, se píšou `\[` a `\]`. Řádek, který
by jinak vypadal jako značka (začíná `-`, `>`, `=` …), se uvede zpětným
lomítkem: `\- tohle je obyčejný text`.
## ID a postup žáků
```md
id: fyzika-1-fyzikalni-veliciny
puvodni: fyz.1
```
- **`id`** je trvalé jméno lekce. Pod ním se ukládá, co má žák hotové. Musí být
v celém obsahu jedinečné. **Po vydání ho neměňte**, jinak se žákům postup
v lekci ztratí. Název souboru, číslo pořadí i nadpis měnit lze.
- **`puvodni`** je adresa lekce ze starších verzí aplikace. Podle ní se při
prvním spuštění nové verze převede starý postup. Neměňte ji a u nových lekcí
ji nepište.
Nová lekce: zkopírujte podobný soubor, dejte mu číslo podle pořadí, nové `id`
a smažte `puvodni`.
## Běžná lekce
Sítě, hardware, občanka, literatura, chemie, biologie, fyzika.
```md
---
id: fyzika-1-fyzikalni-veliciny
nazev: Fyzikální veličiny
popis: SI, skalár a vektor, chyba měření.
nazev_cviceni: Kvíz: veličiny
nadpis_kvizu: Ověřte si jednotky a chyby
---
# Výklad
## Veličina a jednotka
*Měření*
- Fyzikální veličina má číselnou hodnotu a jednotku.
- Soustava SI má sedm základních jednotek.
> Tip: základní jednotka hmotnosti je kilogram, ne gram.
# Kvíz
## Která jednotka je základní jednotka SI pro hmotnost?
- Gram
- [x] Kilogram
- Newton
> Gram je tisícina kilogramu. Newton je jednotka síly.
```
Každá `##` ve výkladu je jeden snímek. Řádek `*Měření*` je štítek snímku,
počítadlo „1 / 3“ doplní aplikace sama.
V první lekci sítí je navíc oddíl `# Úlohy na podsítě`: `## Úloha N` se
zadáním, `### Řešení` s textem řešení a `### Kontrola` s tabulkou
`Prefix | Síť | Broadcast | První adresa | Poslední adresa`.
## Matematika
Stejná hlavička a `# Výklad` jako běžná lekce, místo kvízu `# Příklady`:
```md
# Příklady
## Jaký je největší společný dělitel čísel 24 a 36?
= num:12
> Společní dělitelé jsou 1, 2, 3, 4, 6 a 12.
```
Druhy odpovědí:
| Odpověď | Kdy je správně |
|---|---|
| `num:12`, `num:1/2` | číslo nebo výraz (zlomek, odmocnina, π); stačí stejná hodnota v jakémkoli tvaru |
| `set:2;3` | všechna čísla v libovolném pořadí |
| `pair:2;-1` | čísla v daném pořadí (např. x; y) |
| `word:ano\|yes` | jedno ze slov |
| `square:2,3;5,3`, `right:…`, `mid:…`, `para:…`, `points:1,4;fix:1,1` | rýsování do mřížky 10 × 8; `fix:` jsou body předem zakreslené |
## Angličtina a němčina po ročnících
```md
---
id: anglictina-1-ja-a-moje-rodina
nazev: Já a moje rodina
popis: Sloveso be, have got. Doplňování a kvíz.
---
# Výklad
(snímky jako u běžné lekce)
# Čtení
Text článku jedním odstavcem.
## The bus is ___ than the train.
- faster
- [x] slower
> cheaper, but slower.
# Poslech
Přepis nahrávky, pak otázky stejně jako u čtení.
# Doplňování
## My sister ___ sixteen.
= is
> Věk: be, ne have.
# Psaní
Zadání.
## Vzorová odpověď
Text.
## Musí obsahovat
- would
- because
## Minimum slov
35
# Kvíz
(jako u běžné lekce)
```
Oddíly, které lekce nepotřebuje, se vynechají.
## Mluvnice (`cestina/mluvnice`)
Hlavička: `id`, `typ`, `zkratka` (krátký název na mapě), `nazev`, `popis`,
volitelně `poznamka`. Úlohy jsou v oddílu `# Úlohy`, podle typu:
```md
typ: doplnovani
## Stará bab_čka sed_la na lav_čce.
- i/í/y/ý = babička
- i/í/y/ý = seděla|sedla
> babička, seděla, lavičce
```
Každá odrážka je jedno políčko: vlevo nápověda, za `=` správné odpovědi.
```md
typ: vyber
## Narodil se v ______ v malé vesnici.
- [x] Čechách
- čechách
```
```md
typ: reseni
## napsali
= na- / ps- / -a- / -li
```
U `reseni` si žák řešení jen odkryje.
## Četba (`cestina/cetba`)
```md
---
id: 1984
autor: George Orwell
nazev: 1984
zanr: Próza
preklad: Šimečková
---
# O knize
- Autor: George Orwell
# Postavy
- Winston Smith – hlavní hrdina.
# Kvíz
## Kdo je hlavní hrdina?
- [x] Winston Smith
- O'Brien
> Vysvětlení.
# Děj
## Přetáhněte části příběhu do správného pořadí:
1. První část děje.
2. Druhá část děje.
> Volitelně význam celého děje.
```
Všechny oddíly kromě `Kvíz` a `Děj` jsou poznámky ke knize, zobrazí se
v uvedeném pořadí. Kvíz i děj jsou nepovinné. Volitelná pole v hlavičce:
`popis`, `kviz_nadpis`, `kviz_popis`, `dej_nadpis`, `dej_popis` (jinak se
použijí obecné texty) a `stranka`/`plna` pro knihy s vlastní obrazovkou.
## Učebnice němčiny (`nemcina/ucebnice`)
Každá kapitola je složka `NN-nazev/` se souborem `_lekce.md`:
```md
---
id: ucebnice-1
nazev: Neue Freunde
popis: Vyberte cvičení a dokončete je.
zamceno: ano
---
```
(`zamceno: ano` kapitolu v aplikaci zamkne.) V kapitole jsou cvičení
`NN-nazev.md` a slovíčka `slovicka.md`. Každé cvičení má v hlavičce `typ`.
Nejčastější typy:
| Typ | Oddíly |
|---|---|
| `choice` | `# Otázky` jako kvíz |
| `typed` | `# Úlohy`: tabulka `Zadání \| Odpověď \| Význam` |
| `verb`, `fill` | `# Nabídka` (odrážky slov), `# Úlohy`: tabulka s větami a mezerami `[…]` |
| `dialog` | `# Nabídka`, `# Rozhovory` s `## názvem` a tabulkou `Kdo \| Věta` |
| `assign` | `# Skupiny` (odrážky), `# Slova`: tabulka `Obrázek \| Slovo \| Skupina` |
| `free` | `# Otázky`: tabulka `Otázka \| Překlad otázky \| Vzorová odpověď \| Překlad odpovědi` |
| `vocab` | `# Slovíčka`, `## Strana N` a tabulka `Německy \| Odpověď \| Význam` |
Další typy (`assembly`, `number`, `count`, `seq`, `verbclue`, `profile`,
`hangman`, `ordne`, `letters`, `ex2`, `table`, `kw` …) mají vždy aspoň jeden
vzor v existujících kapitolách; nejjednodušší je zkopírovat ho. Oddíl
`# Překlad` obsahuje české překlady položek ve stejném pořadí.
Volitelná pole hlavičky cvičení: `tip`, `ukazka` (vzorový příklad),
`vyznam_predem`, `preklad_predem`, `odhalit_nemcinu`, `ukazat_nemcinu`
(`ano`/`ne`) a `poznamka_k_odpovedim`.
## Texty rozhraní a předměty
`aplikace/texty.md` obsahuje tabulky `Klíč | Česky | Anglicky`. Klíč používá
kód aplikace, neměňte ho; texty ve sloupcích měnit lze. `%s` a `%d` jsou místa,
kam aplikace doplní hodnotu.
`aplikace/predmety.md` má tabulku
`Klíč | Česky | Anglicky | Ikona | Cíl | Otevřeno`. `Cíl` je obrazovka, která se
otevře, `Otevřeno: ne` dlaždici zamkne.