This commit is contained in:
finalnode
2026-05-16 19:36:35 +02:00
parent ecdd107350
commit 08bcb91b5c
14 changed files with 117 additions and 12 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@ -35,12 +35,12 @@ Den Ordner `generator/` musst du im normalen Alltag nicht anfassen.
2. Schreibe deine Startseite in `havelseite/index.md`. 2. Schreibe deine Startseite in `havelseite/index.md`.
3. Lege weitere Seiten als Markdown-Dateien in `havelseite/` an. 3. Lege weitere Seiten als Markdown-Dateien in `havelseite/` an.
4. Lege Bilder in `havelseite/medien/`. 4. Lege Bilder in `havelseite/medien/`.
5. Baue die Website mit `python3 generator/havelseiten.py`. 5. Baue die Website mit `python3 havelseiten build`.
## Seite bauen ## Seite bauen
```sh ```sh
python3 generator/havelseiten.py python3 havelseiten build
``` ```
Vor dem Bauen wird `havelseite/einstellungen.md` automatisch formatiert und danach geprueft. Aus `- [] Wald` wird zum Beispiel `- [ ] Wald`. Vor dem Bauen wird `havelseite/einstellungen.md` automatisch formatiert und danach geprueft. Aus `- [] Wald` wird zum Beispiel `- [ ] Wald`.
@ -52,11 +52,19 @@ Die fertigen Seiten liegen danach in `ausgabe/`.
## Vorher pruefen ## Vorher pruefen
```sh ```sh
python3 generator/validate.py python3 havelseiten validate
``` ```
Der Validator sagt in normalen Worten, wenn zum Beispiel ein Bild fehlt, ein Galerieordner falsch geschrieben ist oder ein unbekannter Block wie `@galry` benutzt wurde. Der Validator sagt in normalen Worten, wenn zum Beispiel ein Bild fehlt, ein Galerieordner falsch geschrieben ist oder ein unbekannter Block wie `@galry` benutzt wurde.
## Einstellungen formatieren
```sh
python3 havelseiten format
```
Der Formatter bringt `havelseite/einstellungen.md` in eine saubere Form. Aus `- [] Wald` wird zum Beispiel `- [ ] Wald`.
## Projektstruktur ## Projektstruktur
```text ```text

Binary file not shown.

Binary file not shown.

78
generator/cli.py Normal file
View File

@ -0,0 +1,78 @@
from __future__ import annotations
import argparse
from pathlib import Path
import sys
import havelseiten as builder
import settings_config
import validate
ROOT_DIR = Path(__file__).resolve().parent.parent
def format_command() -> int:
changed = settings_config.format_settings_file()
settings_file = settings_config.active_settings_file()
if not settings_file:
print("Keine Einstellungsdatei gefunden.")
return 1
path = settings_file.relative_to(ROOT_DIR)
if changed:
print(f"formatiert: {path}")
else:
print(f"bereits formatiert: {path}")
return 0
def validate_command() -> int:
return validate.main()
def build_command() -> int:
builder.build_site(format_settings=True)
return 0
def main(argv: list[str] | None = None) -> int:
parser = argparse.ArgumentParser(
prog="havelseiten",
description="Havelseiten formatieren, pruefen und bauen."
)
subparsers = parser.add_subparsers(dest="command", required=True)
subparsers.add_parser(
"format",
help="havelseite/einstellungen.md formatieren"
)
subparsers.add_parser(
"validate",
help="Einstellungen und Markdown-Dateien pruefen"
)
subparsers.add_parser(
"build",
help="Website nach ausgabe/ bauen"
)
args = parser.parse_args(argv)
if args.command == "format":
return format_command()
if args.command == "validate":
return validate_command()
if args.command == "build":
return build_command()
parser.print_help()
return 1
if __name__ == "__main__":
raise SystemExit(main(sys.argv[1:]))

View File

@ -94,9 +94,8 @@ def load_settings() -> dict:
SETTINGS = DEFAULT_SETTINGS SETTINGS = DEFAULT_SETTINGS
def run_validation(): def run_validation(format_settings: bool = True):
settings_config.format_settings_file() messages, language = validate.collect_messages(format_settings=format_settings)
messages, language = validate.collect_messages()
if not messages: if not messages:
print(validate.tr(language, "ok")) print(validate.tr(language, "ok"))
@ -1643,10 +1642,10 @@ def copy_content_media():
) )
def build_site(): def build_site(format_settings: bool = True):
global SETTINGS global SETTINGS
run_validation() run_validation(format_settings=format_settings)
SETTINGS = load_settings() SETTINGS = load_settings()
if OUTPUT_DIR.exists(): if OUTPUT_DIR.exists():

View File

@ -793,9 +793,12 @@ def validate_media_parameter(
)) ))
def collect_messages() -> tuple[list[str], str]: def collect_messages(format_settings: bool = True) -> tuple[list[str], str]:
messages: list[str] = [] messages: list[str] = []
if format_settings:
settings_config.format_settings_file() settings_config.format_settings_file()
language = language_from_settings() language = language_from_settings()
validate_settings(messages, language) validate_settings(messages, language)

View File

@ -8,10 +8,10 @@ Titel: Havelseiten
- [ ] Englisch - [ ] Englisch
@einstellung:farbpalette @einstellung:farbpalette
- [] Havel - [x] Havel
- [ ] Wasser - [ ] Wasser
- [ ] Wald - [ ] Wald
- [x ] Sonnenuntergang - [ ] Sonnenuntergang
- [ ] Dunkel - [ ] Dunkel
- [ ] Küste - [ ] Küste
- [ ] Segel - [ ] Segel

17
havelseiten Executable file
View File

@ -0,0 +1,17 @@
#!/usr/bin/env python3
from __future__ import annotations
from pathlib import Path
import sys
ROOT_DIR = Path(__file__).resolve().parent
GENERATOR_DIR = ROOT_DIR / "generator"
sys.path.insert(0, str(GENERATOR_DIR))
from cli import main
if __name__ == "__main__":
raise SystemExit(main(sys.argv[1:]))