diff --git a/.gitignore b/.gitignore
index ca3909a..dba3668 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,9 @@ ___pycache__
*.pyc
.DS_Store
+# Ignore Claude configuration
+.claude/
+
# Test coverage
.coverage
htmlcov/
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..0dd9664
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,112 @@
+# Bidra till sfs-processor
+
+Tack för ditt intresse att bidra till sfs-processor! Det här dokumentet beskriver hur du kan hjälpa till.
+
+## Snabbstart
+
+1. **Forka och klona** repositoryt
+2. **Installera**: `pip install -r requirements.txt`
+3. **Testa**: `python -m pytest test/ -v`
+4. **Läs**: [DEVELOPMENT.md](DEVELOPMENT.md) för teknisk dokumentation
+
+För detaljerad setup och utvecklingsmiljö, se [DEVELOPMENT.md](DEVELOPMENT.md).
+
+## Bidra med kod
+
+### Arbetsflöde
+
+1. Skapa en feature branch från `main`:
+ ```bash
+ git checkout -b feature/min-funktion
+ ```
+
+ Använd beskrivande branch-namn:
+ - `feature/` för nya funktioner
+ - `fix/` för buggfixar
+
+2. Gör dina ändringar och commit:
+ ```bash
+ git add .
+ git commit -m "Beskrivande commit-meddelande"
+ ```
+
+ Skriv tydliga commit-meddelanden som förklarar *vad* och *varför*.
+
+3. Pusha till din fork:
+ ```bash
+ git push origin feature/min-funktion
+ ```
+
+4. Öppna en Pull Request på GitHub
+
+### Pull Request-process
+
+När du öppnar en Pull Request:
+
+- **Beskriv dina ändringar**: Förklara vad din PR gör och varför ändringen behövs
+- **Referera till issues**: Om din PR löser ett issue, länka till det (t.ex. "Fixes #123")
+- **Inkludera tester**: Lägg till tester för nya funktioner eller buggfixar
+- **Se till att tester passerar**: Alla befintliga tester måste fortfarande fungera
+- **Uppdatera dokumentation**: Om du ändrar funktionalitet, uppdatera README eller andra relevanta dokument
+
+Vi kommer att granska din PR och ge feedback. Var beredd på att göra ändringar baserat på code review.
+
+## Rapportera buggar
+
+Hittat en bugg? Hjälp oss att fixa den!
+
+1. **Kontrollera befintliga issues**: Kolla om någon redan rapporterat samma problem
+2. **Öppna ett nytt issue** med följande information:
+ - **Tydlig titel**: Sammanfatta problemet kortfattat
+ - **Beskrivning**: Beskriv vad som händer och vad du förväntade dig
+ - **Reproducerbarhet**: Steg för att återskapa problemet
+ - **Miljö**: Python-version, operativsystem
+ - **Exempel**: Minimal kod eller kommando som visar problemet
+ - **Felmeddelanden**: Inkludera fullständiga stack traces om tillämpligt
+
+### Exempel på buggrapport
+
+```markdown
+## Titel: Fel vid parsing av dokument med tomma kapitel
+
+**Beskrivning:**
+När sfs_processor.py försöker processa ett SFS-dokument som innehåller tomma kapitel
+kraschar programmet med ValueError.
+
+**Steg för att reproducera:**
+1. Ladda ner SFS 2023:123
+2. Kör: `python sfs_processor.py sfs_json/2023/sfs-2023-123.json --output md`
+
+**Förväntat resultat:**
+Dokumentet processas korrekt och tomma kapitel ignoreras.
+
+**Faktiskt resultat:**
+```
+ValueError: Cannot process empty chapter
+```
+
+**Miljö:**
+- Python 3.11.4
+- macOS Sonoma 14.2
+- sfs-processor version 1.0.0
+```
+
+## Kodstandard
+
+Projektet följer **PEP 8-standarden**. Huvudriktlinjer:
+
+- 4 mellanslag för indentering
+- Max 100 tecken per rad
+- Beskrivande variabelnamn
+- Docstrings för alla publika funktioner
+
+För fullständiga kodkonventioner, se [DEVELOPMENT.md](DEVELOPMENT.md#kodkonventioner).
+
+## Frågor?
+
+Om du har frågor som inte täcks här:
+
+- Öppna ett issue med etiketten "question"
+- Kontakta Martin Rimskog via [e-post](mailto:martin@marca.se) [LinkedIn](https://www.linkedin.com/in/martinrimskog/)
+
+Tack för ditt bidrag! 🙏
diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md
new file mode 100644
index 0000000..a9c5b02
--- /dev/null
+++ b/DEVELOPMENT.md
@@ -0,0 +1,455 @@
+# Utvecklardokumentation
+
+Det här dokumentet ger en djupare översikt över projektets arkitektur, kodstruktur och utvecklingsworkflow.
+
+## Projektöversikt
+
+`sfs-processor` är ett verktyg för att konvertera svensk lagstiftningsdata (Svensk författningssamling) från JSON-format till olika output-format inklusive Markdown-filer, HTML-filer och Git-commits.
+
+### Huvudfunktioner
+
+- Hämta SFS-dokument från RK (Regeringskansliet)
+- Konvertera JSON till välformaterad Markdown
+- Generera HTML med temporal hantering av ändringar
+- Exportera till Git-repository med historik
+- Hantera temporala aspekter av lagstiftning (giltighetstider, ändringar)
+
+## Kom igång
+
+### Installation för bidragsgivare
+
+Om du vill bidra till projektet:
+
+1. **Forka repositoryt** på GitHub
+2. **Klona din fork** lokalt:
+ ```bash
+ git clone https://github.com/se-lex/sfs-processor.git
+ cd sfs-processor
+ ```
+3. **Skapa virtuell miljö** (rekommenderat):
+ ```bash
+ python -m venv venv
+ source venv/bin/activate # På Windows: venv\Scripts\activate
+ ```
+4. **Installera dependencies**:
+ ```bash
+ pip install -r requirements.txt
+ ```
+
+För bidragsprocess, se [CONTRIBUTING.md](CONTRIBUTING.md).
+
+### Köra tester
+
+**Alla tester**:
+```bash
+python -m pytest test/ -v
+```
+
+**Enskilda testfiler**:
+```bash
+python test/test_title_temporal.py
+```
+
+**Med coverage**:
+```bash
+pip install pytest-cov
+python -m pytest test/ --cov=. --cov-report=html
+```
+
+### Köra lokalt
+
+**Processa ett dokument**:
+```bash
+python sfs_processor.py data/test_docs/sfs-2023-123.json --output md
+```
+
+**Ladda ner testdokument**:
+```bash
+python downloaders/download_sfs_docs.py --year 2023 --number 123
+```
+
+**Verbose mode** för detaljerad loggning:
+```bash
+python sfs_processor.py input.json --output md --verbose
+```
+
+### Miljövariabler
+
+Skapa en `.env`-fil för lokal utveckling:
+
+```bash
+# GitHub (för Git-export)
+GIT_GITHUB_PAT=ghp_your_personal_access_token
+
+# Cloudflare R2 (för HTML-export)
+CLOUDFLARE_R2_ACCESS_KEY_ID=your_access_key
+CLOUDFLARE_R2_SECRET_ACCESS_KEY=your_secret_key
+CLOUDFLARE_R2_BUCKET_NAME=your_bucket
+CLOUDFLARE_R2_ACCOUNT_ID=your_account_id
+
+# HTML (ELI) konfiguration
+ELI_HOST=selex.se
+INTERNAL_LINKS_BASE_URL=https://selex.se/eli
+```
+
+**OBS**: `.env`-filen är listad i `.gitignore` och ska ALDRIG committas.
+
+## Arkitektur
+
+### Dataflöde
+
+```
+RK API → JSON → Parser → Formatters → Exporters → Output
+ ↓
+ Temporal Processing
+```
+
+1. **Nedladdning**: Hämta rådata från Regeringskansliet
+2. **Parsing**: Validera och strukturera JSON-data
+3. **Formatering**: Konvertera till Markdown/HTML
+4. **Temporal processing**: Hantera tidsbaserade aspekter
+5. **Export**: Skriv till fil, Git eller cloud storage
+
+## Katalogstruktur
+
+```
+sfs-processor/
+├── sfs_processor.py # Huvudskript och entry point
+├── downloaders/ # Hämta data från externa källor
+│ ├── download_sfs_docs.py # Ladda ner SFS-dokument
+│ ├── fetch_new_sfs_docs.py # Hämta nya dokument (scheduled)
+│ └── download_from_gov_api.py # Direkt API-integration
+├── formatters/ # Konvertera data till olika format
+│ ├── format_sfs_text.py # JSON → Markdown-konvertering
+│ ├── apply_links.py # Lägg till interna/externa länkar
+│ ├── format_html.py # Markdown → HTML
+│ └── format_htmldiff.py # Generera HTML-diff views
+├── exporters/ # Export till olika destinationer
+│ ├── git/ # Git repository export
+│ │ ├── export_to_git.py
+│ │ ├── git_utils.py
+│ │ └── batch_export_to_git.py
+│ └── html/ # HTML export och upload
+│ ├── export_to_html.py
+│ ├── upload_to_r2.py
+│ └── eli_utils.py
+├── temporal/ # Temporal hantering
+│ ├── title_temporal.py # Temporal titel-processing
+│ ├── integrated_title_temporal.py
+│ └── apply_temporal.py # Tillämpa temporala regler
+├── data/ # Konfiguration och patterns
+│ ├── document_patterns/ # Regex-patterns för parsing
+│ └── test_docs/ # Test-dokument
+├── test/ # Tester
+│ ├── test_title_temporal.py
+│ ├── test_integrated_title_temporal.py
+│ ├── test_predocs.py
+│ └── test_linking.py
+├── scripts/ # Hjälpskript
+└── .github/workflows/ # CI/CD workflows
+```
+
+## Moduler och deras ansvar
+
+### `sfs_processor.py` (Huvudmodul)
+
+**Ansvar**: Orkestrering av hela processen från input till output.
+
+**Viktiga funktioner**:
+
+- `process_sfs_document()`: Huvudfunktion som processar ett dokument
+- `determine_output_path()`: Bestämmer output-sökväg baserat på beteckning
+- `should_exclude_file()`: Filtrering baserat på konfiguration
+
+**Workflow**:
+
+1. Läs JSON-fil
+2. Validera dokumentdata
+3. Konvertera till Markdown
+4. Applicera temporal processing
+5. Exportera till valda format
+
+### `downloaders/` (Nedladdning)
+
+**`download_sfs_docs.py`**:
+- Ladda ner specifika SFS-dokument från Regeringskansliets rättsdatabas
+- Hantera paginering och rate limiting
+- Cacha nedladdad data
+
+**`fetch_new_sfs_docs.py`**:
+- Schemalagd hämtning av nya dokument
+- Används i GitHub Actions workflow
+- Detekterar nya/ändrade dokument
+
+### `formatters/` (Formatering)
+
+**`format_sfs_text.py`**:
+- Kärnan i Markdown-konverteringen
+- Funktioner:
+ - `convert_json_to_markdown()`: Huvudkonvertering
+ - `format_stycke()`: Formatera paragrafstycken
+ - `format_tabell()`: Hantera tabeller
+ - `normalize_heading_levels()`: Normalisera rubriknivåer
+
+**`apply_links.py`**:
+- Lägg till interna länkar mellan lagar
+- Externa länkar till EU-direktiv via EUR-Lex
+- ELI (European Legislation Identifier) URI:er
+
+**`format_html.py`**:
+- Konvertera Markdown till HTML med Python Markdown-biblioteket
+- Lägg till CSS och navigation
+- Hantera YAML frontmatter
+
+### `exporters/` (Export)
+
+**`git/`**:
+- Exportera till Git-repository med commits per författning
+- Hantera branches för olika tidpunkter
+- GitHub integration via Personal Access Token
+
+**`html/`**:
+- Generera HTML-filer
+- Ladda upp till Cloudflare R2 (S3-kompatibel storage)
+- ELI URI-hantering för permalänkar
+
+### `temporal/` (Temporal Processing)
+
+**Temporal hantering** hanterar att lagtext förändras över tid:
+
+**`title_temporal.py`**:
+- Extrahera temporal information från titlar
+- Patterns för "upphör att gälla", "träder i kraft"
+- Regex-baserad parsing av datum och referenser
+
+**`apply_temporal.py`**:
+- Applicera temporala regler på dokument
+- Filtrera innehåll baserat på target_date
+- Hantera `selex:...` attribut för temporal information
+
+**Exempel på temporal attribut**:
+```markdown
+
+Denna text gäller från 2024-01-01 till 2024-12-31
+
+
+
+```
+
+## Arbetsflöde för utveckling
+
+### Lägga till ny funktionalitet
+
+1. **Planera**: Diskutera i ett GitHub Issue först
+2. **Branching**: Skapa feature branch
+3. **Implementera**: Skriv kod + tester
+4. **Testa**: Kör alla tester lokalt
+5. **Dokumentera**: Uppdatera README/DEVELOPMENT.md
+6. **PR**: Öppna Pull Request med beskrivning
+
+### Lägga till nytt output-format
+
+Om du vill lägga till support för ett nytt format (t.ex. PDF):
+
+1. **Skapa formatter**: `formatters/format_pdf.py`
+2. **Implementera konvertering**: Funktion som tar Markdown → PDF
+3. **Lägg till i main**: Uppdatera `sfs_processor.py` för att hantera `--output pdf`
+4. **Tester**: Lägg till test i `test/test_pdf.py`
+5. **Dokumentation**: Uppdatera README.md
+
+### Lägga till ny datakälla
+
+För att integrera en ny källa (t.ex. annan myndighet):
+
+1. **Skapa downloader**: `downloaders/download_.py`
+2. **Mappa till JSON**: Konvertera till samma JSON-schema som RK
+3. **Testa**: Verifiera att befintliga formatters fungerar
+4. **Dokumentera**: Uppdatera dokumentation
+
+## Debugging
+
+### Verbose mode
+
+Använd `--verbose` för detaljerad loggning:
+```bash
+python sfs_processor.py input.json --output md --verbose
+```
+
+### Temporala problem
+
+Om temporal processing ger oväntat resultat:
+
+1. Kontrollera YAML frontmatter i output
+2. Kör utan temporal: `--preserve-selex-tags`
+3. Testa med specifikt datum: `--target-date 2024-01-01`
+
+### Git export-problem
+
+Om Git-export inte fungerar:
+
+1. Verifiera `GIT_GITHUB_PAT` är satt
+2. Kontrollera behörigheter på target repository
+3. Kör med `--verbose` för detaljerad logg
+4. Testa GitHub-anslutning: `git ls-remote `
+
+## Testing
+
+### Testfilosofi
+
+- **Unit tests**: Testa enskilda funktioner isolerat
+- **Integration tests**: Testa fullständigt dataflöde
+- **Fixture data**: Använd riktiga (men små) SFS-dokument
+
+### Skriva tester
+
+Exempel på test:
+
+```python
+def test_parse_beteckning():
+ """Test parsing av SFS-beteckning."""
+ from formatters.format_sfs_text import parse_beteckning
+
+ result = parse_beteckning("SFS 2023:123")
+ assert result["year"] == 2023
+ assert result["number"] == 123
+```
+
+### Test coverage
+
+Kör tester med coverage:
+```bash
+pip install pytest-cov
+python -m pytest test/ --cov=. --cov-report=html
+```
+
+## CI/CD Workflows
+
+### `.github/workflows/`
+
+**`testdocs-workflow.yml`**:
+- Triggas på varje push/PR
+- Processar test-dokument
+- Verifierar att processing fungerar
+
+**`fetch-sfs-workflow.yml`**:
+- Schemalagd (nightly)
+- Hämtar nya SFS-dokument
+- Skapar branch med ändringar
+- Triggar HTML-export
+
+**`html-export-workflow.yml`**:
+- Genererar HTML från Markdown
+- Laddar upp till Cloudflare R2
+- Kräver R2-credentials i GitHub Secrets
+
+**`upcoming-changes-workflow.yml`**:
+- Processar kommande ändringar
+- Temporal förhandsvisning
+
+## Kodkonventioner
+
+### Allmänna riktlinjer
+
+Projektet följer **PEP 8-standarden** för Python-kod:
+
+- **Indentering**: 4 mellanslag (inga tabs)
+- **Radlängd**: Max 100 tecken (flexibelt för långa strängar)
+- **Variabelnamn**: Använd beskrivande namn (`document_data` istället för `dd`)
+- **Svenska termer**: OK för domänspecifika begrepp (t.ex. `beteckning`, `författning`, `paragraf`)
+- **Kommentarer**: Kommentera komplex logik, inte uppenbar kod
+- **Docstrings**: Alla publika funktioner måste ha docstrings som beskriver:
+ - Vad funktionen gör
+ - Parametrar och deras typer
+ - Returvärde
+ - Eventuella exceptions som kastas
+
+### Namngivning
+
+- **Filer**: snake_case (t.ex. `format_sfs_text.py`)
+- **Funktioner**: snake_case (t.ex. `convert_json_to_markdown()`)
+- **Klasser**: PascalCase (t.ex. `SFSDocument`)
+- **Konstanter**: UPPER_CASE (t.ex. `DEFAULT_DATE`)
+
+### Imports
+
+Gruppera imports:
+```python
+# Standard library
+import os
+import json
+from typing import Dict, List
+
+# Third-party
+import requests
+import yaml
+
+# Local imports
+from formatters.format_sfs_text import convert_json_to_markdown
+```
+
+### Error handling
+
+```python
+try:
+ result = risky_operation()
+except ValueError as e:
+ print(f"Fel vid operation: {e}")
+ return None
+except Exception as e:
+ print(f"Oväntat fel: {e}")
+ raise
+```
+
+## Vanliga problem och lösningar
+
+### Problem: Git push misslyckas
+
+**Orsak**: Token saknar rätt behörigheter
+
+**Lösning**: Verifiera att `GIT_GITHUB_PAT` har `repo`-scope
+
+### Problem: Temporal processing tar bort allt innehåll
+
+**Orsak**: `target_date` är före dokumentets ikraftträdande
+
+**Lösning**: Kontrollera `target_date` och jämför med `ikraft_datum` i YAML frontmatter
+
+## Säkerhet
+
+### Secrets management
+
+- Använd **miljövariabler** för alla credentials
+- **Aldrig** committa `.env`-filer
+- GitHub Secrets för CI/CD
+
+### API rate limiting
+
+- Regeringskansliet rättsdatabas & Riksdagens API: Respektera rate limits
+- Implementera exponential backoff vid 429-svar
+- Cacha data lokalt när möjligt
+
+## Resurser
+
+### Externa APIer
+
+- [Riksdagens öppna data](https://data.riksdagen.se)
+- [Regieringskansliets rättsdatabas](https://beta.rkrattsbaser.gov.se)
+- [EUR-Lex](https://eur-lex.europa.eu)
+
+### Dokumentation
+
+- [Markdown spec](https://commonmark.org)
+- [Python Markdown](https://python-markdown.github.io)
+- [ELI standard](https://eur-lex.europa.eu/eli-register/about.html)
+
+## Support
+
+Vid frågor eller problem:
+
+1. Kolla [README.md](README.md) för grundläggande användning
+2. Läs [CONTRIBUTING.md](CONTRIBUTING.md) för bidragsriktlinjer
+3. Sök i [GitHub Issues](https://github.com/se-lex/sfs-processor/issues)
+4. Öppna ett nytt issue om problemet kvarstår
+
diff --git a/README.md b/README.md
index ab59389..93661b2 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,15 @@
-# Svensk författningssamling (SFS) till Markdown-filer
+# sfs-processor - Verktyg för konvertering av Svensk författningssamling
-Detta repository innehåller Python-script för att konvertera SFS-författningar (Svensk författningssamling) från JSON-format till välformaterade Markdown-filer och andra format.
+Detta repository innehåller Python-script för att konvertera SFS-författningar (Svensk författningssamling) från JSON-format till Markdown med temporala taggar, HTML, Git och andra format.
+
+> [!NOTE]
+> **Detta är en del av [SE-Lex](https://github.com/se-lex)**, läs mer om [projektet här](https://github.com/se-lex).
+>
+> SFS-författningar exporteras till [https://github.com/se-lex/sfs](https://github.com/se-lex/sfs) och publiceras också som HTML på [https://selex.se](https://selex.se) med stöd för EU:s juridiska identifieringsstandard (ELI).
## Installation
-1. Se till att du har Python 3.6+ installerat
+1. Se till att du har Python 3.11 eller senare installerat
2. Installera nödvändiga beroenden:
```bash
@@ -16,7 +21,31 @@ pip install -r requirements.txt
Konvertera JSON-filer med författningar till Markdown:
```bash
-python sfs_processor.py --input sfs_json --output SFS --formats md
+python sfs_processor.py --input sfs_json --output SFS --formats md-markers
+```
+
+## Output-format
+
+Verktyget kan generera författningar i flera olika format, beroende på användningsområde:
+
+### Markdown-format
+
+- **`md-markers`** (standard): Markdown med semantiska ``-taggar och selex-attribut för juridisk status och temporal hantering
+- **`md`**: Rena Markdown-filer med normaliserade rubriknivåer, lämpliga för visning och läsning
+
+### Git-format
+
+- **`git`**: Exporterar författningar som Git-commits med historiska datum, vilket skapar en versionshistorik av lagstiftningen
+
+### HTML-format
+
+- **`html`**: Genererar HTML-filer i ELI-struktur (`/eli/sfs/{år}/{nummer}/index.html`) för webbpublicering
+- **`htmldiff`**: Som HTML men inkluderar även separata versioner för varje ändringsförfattning
+
+Exempel på att kombinera flera format:
+
+```bash
+python sfs_processor.py --input sfs_json --output output --formats md,html,git
```
## Hämta källdata
@@ -44,32 +73,14 @@ Nedladdade filer sparas som standard i katalogen `sfs_docs`. Du kan ange annan k
Konvertera alla JSON-filer i en katalog till Markdown:
```bash
-python sfs_processor.py --input sfs_json --output SFS --formats md
+python sfs_processor.py --input sfs_json --output SFS --formats md-markers
```
### Struktur av genererade Markdown-filer
Beroende på vilket format du väljer får du olika strukturer:
-#### Format: `md` (standard)
-
-Rena Markdown-filer med normaliserade rubriknivåer:
-
-```markdown
-# Lag (2024:123) om exempel
-
-## Inledande bestämmelser
-
-### 1 §
-
-Innehållet i paragrafen...
-
-### 2 §
-
-Mer innehåll...
-```
-
-#### Format: `md-markers`
+#### Format: `md-markers` (standard)
Markdown-filer med bevarad semantisk struktur genom ``-taggar:
@@ -88,6 +99,26 @@ Innehållet i paragrafen...
Denna semantiska struktur bevarar dokumentets logiska uppbyggnad och möjliggör automatisk bearbetning, analys, och navigation av författningstexten. Section-taggarna kan även användas för CSS-styling och JavaScript-funktionalitet.
+#### Format: `md`
+
+Rena Markdown-filer med normaliserade rubriknivåer, utan section-taggar:
+
+```markdown
+# Lag (2024:123) om exempel
+
+## Inledande bestämmelser
+
+### 1 §
+
+Innehållet i paragrafen...
+
+### 2 §
+
+Mer innehåll...
+```
+
+Detta format är lämpligt för enkel visning och läsning, utan metadata eller temporal hantering.
+
### Selex-attribut för juridisk status och datum
Förutom CSS-klasser använder ``-taggarna även `selex:`-attribut för att hantera juridisk status och datum. Dessa attribut möjliggör filtrering av innehåll baserat på ikraftträdande- och upphörandedatum:
@@ -125,33 +156,18 @@ Dessa attribut används automatiskt av systemets datumfiltrering för att skapa
Systemet hanterar temporal processing (tidsbaserad filtrering) olika beroende på vilket format som används:
-- **`md` format**: Tillämpar temporal processing med dagens datum som målpunkt. Selex-taggar tas bort efter filtrering.
-- **`md-markers` format**: Bevarar selex-taggar och hoppar över temporal processing. Detta gör att alla temporal attribut behålls för senare bearbetning.
-- **`git` format**: Hoppar över temporal processing i huvudbearbetningen. Temporal hantering sköts separat i git-arbetsflödet för att skapa historiska commits.
-- **`html` format**: Tillämpar temporal processing med dagens datum innan HTML-generering.
-- **`htmldiff` format**: Tillämpar temporal processing med dagens datum innan HTML-generering.
-
-### Konvertering till HTML med ELI-struktur
-
-```bash
-python sfs_processor.py --input sfs_json --output output --formats html
-```
-
-Detta skapar HTML-filer i ELI-strukturen: `/eli/sfs/{artal}/{lopnummer}/index.html`
-
-### HTML med ändringsversioner
+- **`md-markers`** (standard): Bevarar selex-taggar och hoppar över temporal processing. Detta gör att alla temporal attribut behålls för senare bearbetning. Rekommenderas för att bevara all juridisk metadata.
-För att inkludera separata versioner för varje ändringsförfattning:
+- **`md`**: Tillämpar temporal processing med **dagens datum som målpunkt**. Detta är viktigt att förstå:
+ - Upphävda bestämmelser (med `selex:upphor_datum` före dagens datum) tas bort
+ - Bestämmelser som ännu inte trätt i kraft (med `selex:ikraft_datum` efter dagens datum) tas bort
+ - Selex-taggar tas bort efter filtrering
+ - Resultatet blir en "ren" Markdown-vy av hur lagen ser ut idag
+ - **Obs:** Eftersom temporal filtrering används automatiskt, kan innehåll försvinna om det är upphävt eller ej ikraftträtt
-```bash
-python sfs_processor.py --input sfs_json --output output --formats htmldiff
-```
+- **`git`**: Hoppar över temporal processing i huvudbearbetningen. Temporal hantering sköts separat i git-arbetsflödet för att skapa historiska commits.
-### Kombinera flera format
-
-```bash
-python sfs_processor.py --input sfs_json --output output --formats md,html,htmldiff
-```
+- **`html`** och **`htmldiff`**: Tillämpar temporal processing med dagens datum innan HTML-generering, liknande `md`-format.
## Kommandoradsalternativ
@@ -163,7 +179,7 @@ python sfs_processor.py [--input INPUT] [--output OUTPUT] [--formats FORMATS] [-
- `--input`: Input-katalog med JSON-filer (default: "sfs_json")
- `--output`: Output-katalog för konverterade filer (default: "SFS")
-- `--formats`: Utdataformat att generera, kommaseparerat. Stödjer: md, md-markers, git, html, htmldiff (default: "md")
+- `--formats`: Utdataformat att generera, kommaseparerat. Stödjer: md-markers, md, git, html, htmldiff (default: "md-markers")
- `md`: Generera rena markdown-filer utan section-taggar
- `md-markers`: Generera markdown-filer med section-taggar bevarade
- `git`: Aktivera Git-commits med historiska datum
@@ -173,7 +189,10 @@ python sfs_processor.py [--input INPUT] [--output OUTPUT] [--formats FORMATS] [-
- `--no-year-folder`: Skapa inte årbaserade undermappar för dokument
- `--verbose`: Visa detaljerad information om bearbetningen
-## Licens
+## Bidra
-Detta projekt är licensierat under Business Source License 1.1 (BSL 1.1) - se [LICENSE](LICENSE) filen för detaljer. Efter 2 år övergår licensen för aktuell version automatiskt till MIT.
+Vi välkomnar bidrag från communityn! 🙌
+- Läs [CONTRIBUTING.md](CONTRIBUTING.md) för riktlinjer om hur du bidrar
+- Se [DEVELOPMENT.md](DEVELOPMENT.md) för utvecklardokumentation och arkitekturöversikt
+- Kontakt: Martin Rimskog via [e-post](mailto:martin@marca.se) eller [LinkedIn](https://www.linkedin.com/in/martinrimskog/)
diff --git a/sfs_processor.py b/sfs_processor.py
index ecaf650..2606930 100644
--- a/sfs_processor.py
+++ b/sfs_processor.py
@@ -125,7 +125,7 @@ def make_document(data: Dict[str, Any], output_dir: Path, output_modes: List[str
Args:
data: JSON data for the document
output_dir: Directory where output files should be saved
- output_modes: List of formats/modes to use (e.g., ["md", "git"]). If None, defaults to ["md"]
+ output_modes: List of formats/modes to use (e.g., ["md-markers", "git"]). If None, defaults to ["md-markers"]
Note: "git" mode requires "md" mode to be included as it modifies markdown processing
"md" generates clean markdown (section tags removed), "md-markers" preserves section tags
"html" generates base document only, "htmldiff" includes amendment versions
@@ -221,12 +221,6 @@ def _create_markdown_document(data: Dict[str, Any], output_path: Path, git_mode:
if not beteckning:
raise ValueError("Beteckning saknas i dokumentdata")
- # Process amendments
- # TODO: markdown_content = process_markdown_amendments(markdown_content, data, git_branch, verbose, output_file)
-
- # Convert table-like structures to proper Markdown tables
- # TODO: markdown_content = convert_tables_in_markdown(markdown_content, verbose)
-
# Apply temporal processing to handle selex attributes (only if not in git mode and not preserving selex tags)
if not git_mode and not preserve_selex_tags and target_date:
markdown_content = apply_temporal(markdown_content, target_date, verbose=verbose)
@@ -565,8 +559,8 @@ def main():
help='Do not create year-based subdirectories for documents')
parser.add_argument('--verbose', action='store_true',
help='Show detailed diff output for each amendment processing')
- parser.add_argument('--formats', dest='output_modes', default='md',
- help='Output formats to generate (comma-separated). Currently supported: md, md-markers, git, html, htmldiff. Default: md. Use "md-markers" to preserve section tags. Use "git" to enable Git commits with historical dates. HTML creates documents in ELI directory structure (/eli/sfs/{YEAR}/{lopnummer}). HTMLDIFF includes amendment versions with diff view.')
+ parser.add_argument('--formats', dest='output_modes', default='md-markers',
+ help='Output formats to generate (comma-separated). Currently supported: md-markers, md, git, html, htmldiff. Default: md-markers. Use "md-markers" to preserve section tags with temporal attributes (standard). Use "md" for clean markdown without section tags. Use "git" to enable Git commits with historical dates. HTML creates documents in ELI directory structure (/eli/sfs/{YEAR}/{lopnummer}). HTMLDIFF includes amendment versions with diff view.')
parser.add_argument('--predocs-fetch', action='store_true', dest='predocs_fetch',
help='Fetch detailed information about förarbeten from Riksdagen API. Parsing of förarbeten always happens. This will make processing slower.')
parser.add_argument('--apply-links', action='store_true', default=True,