diff --git a/README.md b/README.md new file mode 100644 index 0000000..ea62c9e --- /dev/null +++ b/README.md @@ -0,0 +1,83 @@ +# buildbroken-blog-archive + +Statisches Archiv des ehemaligen ".NET/build broken"-Blogs (`aztec-project.org/blog/`), +aufgebaut mit [Hugo](https://gohugo.io). Alle Inhalte stammen aus web.archive.org +Downloads und werden lokal gehostet (Bilder, CSS, Content). + +## URL-Struktur + +| Bereich | Alte URL (Wayback) | Neue lokale URL | +|---|---|---| +| Startseite | `blog/blog.html` | `/` | +| About | `blog/about.html` | `/about/` | +| Blogartikel | `blog/.html` | `/posts//` | +| Bilder | extern/beliebig | `/images//` | +| CSS | Theme-CSS | `/css/style.css` | + +`` ist der ursprüngliche Dateiname ohne `.html`, durch `python-slugify` +normalisiert (Kleinschreibung, Bindestriche). Beispiel: +`dotnet-openspace-leipzig-2009-buchung.html` -> `/posts/dotnet-openspace-leipzig-2009-buchung/`. + +Interne Links zwischen Artikeln werden vom Parser automatisch von +`https://aztec-project.org/blog/xyz.html` auf `/posts/xyz/` umgeschrieben. + +## Voraussetzungen + +- [Hugo](https://gohugo.io/installation/) (extended oder normal reicht, kein Node nötig) +- Python 3.10+ +- `pip install -r scripts/requirements.txt` + +## Ordnerstruktur + +``` +buildbroken-blog-archive/ +├── hugo.toml # Hugo-Konfiguration +├── content/ +│ ├── _index.md # Startseite +│ ├── about.md # wird vom Parser aus about.html befüllt +│ └── posts/ # wird vom Parser mit *.md befüllt +├── layouts/ # eigenes Theme, angelehnt an das Original-Design +│ ├── _default/baseof.html +│ ├── _default/single.html +│ ├── _default/list.html +│ └── index.html +├── static/ +│ ├── css/style.css +│ └── images//... # wird vom Parser befüllt +├── archive/ +│ └── wayback-html/ # HIER die heruntergeladenen Wayback-HTML-Dateien ablegen +├── scripts/ +│ ├── parse_buildbroken_archive.py +│ └── requirements.txt +├── URLS.md # Liste aller zu parsenden Quell-URLs/Dateien +└── TODO.md # Arbeitsauftrag für die lokale KI +``` + +## Ablauf + +1. Alle Dateien aus `URLS.md` als HTML von web.archive.org herunterladen und + unter `archive/wayback-html/.html` ablegen (exakt gleicher Name). +2. Parser laufen lassen: + ```bash + cd scripts + pip install -r requirements.txt + python parse_buildbroken_archive.py --source ../archive/wayback-html --output .. --download-images + ``` +3. Lokale Vorschau: + ```bash + cd .. + hugo server -D --bind 0.0.0.0 --baseURL http://:1313/ + ``` + `` durch den Hostnamen des Rechners ersetzen (z. B. `xubuntu-dev.lan`). +4. Produktions-Build: + ```bash + hugo --minify + ``` + Ergebnis liegt in `public/` und kann auf beliebigem statischen Hosting + (nginx-Container, Gitea Pages, GitHub Pages) deployt werden. + +## Layout anpassen + +Alle Design-Änderungen passieren zentral in `layouts/_default/*.html` und +`static/css/style.css`. Nach einer Änderung reicht `hugo --minify`, um alle +Artikel neu zu bauen — der Content in `content/posts/*.md` bleibt unangetastet. diff --git a/URLS.md b/URLS.md new file mode 100644 index 0000000..8825bc2 --- /dev/null +++ b/URLS.md @@ -0,0 +1,44 @@ +# Quell-URLs (web.archive.org Downloads) + +Alle Dateien liegen als HTML unter `https://aztec-project.org/blog/.html` und wurden von web.archive.org heruntergeladen. Lege die lokalen Kopien 1:1 mit gleichem Dateinamen unter `archive/wayback-html/` ab, bevor der Parser laeuft. + +> **Hinweis Tippfehler im Live-Blog:** `async.html` hat KEINEN Wayback-Capture. Der Blogbetreiber hatte den Artikel im echten Blog fehlerhaft als `aync.html` gespeichert (Tippfehler, kein Parser-/Downloader-Bug). Der Downloader laedt deshalb `aync.html` (einzig verfuegbarer Capture mit Status 200 und echtem Content) und der Parser vergibt trotzdem den sauberen Slug `async`. `archive_url` verweist auf den tatsaechlichen Snapshot von `aync.html`, `original_url` auf die historische Original-URL `.../blog/aync.html`. + +| Dateiname | Titel | Ziel | +|---|---|---| +| `blog.html` | Aztec Project Build Broken Blog Startseite | index (wird nicht als Post geparst) | +| `about.html` | Aztec Project Build Broken About Us | content/about.md | +| `dotnet-openspace-leipzig-2009-buchung.html` | .NET Open Space 2009 | post | +| `dotnet-openspace-leipzig-2009.html` | .NET Open Space 2009 in Leipzig (Bericht) | post | +| `dotnet-openspace-sued-2009-buchung.html` | .NET Open Space Süd 2009 | post | +| `dotnet-openspace-sued-2009.html` | .NET Open Space Süd 2009 (Bericht) | post | +| `webservice-mit-asp-classic.html` | .NET-Webservice mit ASP-Classic ansprechen | post | +| `asp-mvc-2.html` | ASP.MVC 2 - Vortrag von Albert bei münchener UserGroup | post | +| `anonyme-datentypen.html` | Anonyme Datentypen | post | +| `aync.html` | Asynchrone Kommunikation mit dem Async-Pattern | post (Slug `async`, Tippfehler im Live-Blog) | +| `async-refactored.html` | Asynchrone Kommunikation mit dem Async-Pattern (Refactored) | post | +| `barcamp-bodensee-2010.html` | BarCamp Bodensee 2010 | post | +| `clean-code-developer.html` | Clean-Code-Developer | entfällt → siehe `clean-code-developer-yellow-brick-road.html` | +| `clean-code-developer-yellow-brick-road.html` | Clean Code Developer - The Yellow Brick Road of the Coder | post | +| `cleancode1.html` | Clean Code Teil 1 | post | +| `cleancode2.html` | Clean Code Teil 2 | post | +| `design-by-contract.html` | Design by Contract - jetzt auch mit C# | post | +| `design-by-contract-teil2.html` | Design by Contract - jetzt auch mit C# - Teil 2 | post | +| `dime-casts.html` | Dime Casts WebCasts | post | +| `dynamic-load.html` | Dynamisches Laden von Assemblies | post | +| `alt-net-energien.html` | Gibt es negative Energien in der deutschen ALT.NET Bewegung? | post | +| `mvp-winforms-teil1.html` | MVP mit WinForms | entfällt → siehe `mvp-winforms.html` | +| `mvp-winforms.html` | MVP mit WinForms - Beispiel Model-View-Presenter mit WinForms | post | +| `prio-conference-2009.html` | prio.conference 2009 München | post | +| `refaktorisierung.html` | Refaktorisierung - mal anders erklärt | post | +| `scrumbut.html` | scrumbut | post | +| `softwarezellen.html` | Softwarezellen - eine Lösung um die Komplexität zu beherrschen | post | +| `stupiddb1.html` | StupidDB – object-persistence-framework | post | +| `stupiddb2.html` | NoSQL mit StupidDB | post | +| `test-public-methods.html` | Testen von nicht öffentlichen Methoden | post | +| `plugin-pattern.html` | Umsetzung des Plug-In-Patterns | post | +| `unittests-webforms.html` | Unit-Tests für WebForms | post | +| `code-to-html.html` | Visual Studio Code in HTML umwandeln | post | +| `webcamps.html` | Webcamps München | post | +| `reflection.html` | Wozu dient Reflection | post | +| `programmierer.html` | (Spreu + Weizen).Select(Programmierer) | post |