| Matthias Andreas Benkard | 856c097 | 2026-08-16 06:56:05 +0200 | [diff] [blame] | 1 | = ÄndGgner -- Nichtamtliche Zentralstelle für die maschinelle Fortschreibung von Stammgesetzen anhand von Änderungsvorschriften des Bundes und der Länder |
| Matthias Andreas Benkard | b291c36 | 2020-11-22 10:22:27 +0100 | [diff] [blame] | 2 | Matthias Andreas Benkard |
| 3 | // Meta |
| 4 | :experimental: |
| 5 | :data-uri: |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 6 | :sectnums!: |
| Matthias Andreas Benkard | b291c36 | 2020-11-22 10:22:27 +0100 | [diff] [blame] | 7 | :toc: |
| 8 | :stem: |
| 9 | :toclevels: 2 |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 10 | :description: Handbuch der Nichtamtlichen Zentralstelle für die maschinelle Fortschreibung von Stammgesetzen: Werkzeug, das Änderungsgesetze und Gesetzentwürfe selbsttätig auf ein Stammgesetz anwendet und das Ergebnis als Synopse ausgibt |
| Matthias Andreas Benkard | b291c36 | 2020-11-22 10:22:27 +0100 | [diff] [blame] | 11 | :keywords: mulk |
| 12 | // Settings |
| 13 | :icons: font |
| 14 | :source-highlighter: pygments |
| 15 | |
| 16 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 17 | [.lead] |
| 18 | Ein Änderungsgesetz sagt nicht, was künftig gilt. Es sagt nur, was zu tun ist: |
| 19 | „In § 4 Absatz 2 Satz 1 werden die Wörter „X“ durch die Wörter „Y“ ersetzt.“ |
| 20 | Wer wissen will, wie die Vorschrift danach lautet, muss Hunderte solcher Befehle |
| 21 | von Hand nachvollziehen — und wer wissen will, was ein Entwurf bewirken _würde_, |
| 22 | findet in keinem amtlichen Angebot eine Antwort, denn konsolidiert wird erst nach |
| 23 | der Verkündung. |
| Matthias Andreas Benkard | b291c36 | 2020-11-22 10:22:27 +0100 | [diff] [blame] | 24 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 25 | ÄndGgner nimmt diese Arbeit ab. Eingegeben werden ein Stammgesetz in geltender |
| 26 | Fassung und ein oder mehrere Änderungsdokumente — verkündete Änderungsgesetze aus |
| 27 | dem Bundesgesetzblatt und den Gesetz- und Verordnungsblättern der Länder ebenso |
| 28 | wie Referenten-, Regierungs- und Fraktionsentwürfe, Änderungsanträge und |
| 29 | Beschlussempfehlungen. Ausgegeben wird eine zweispaltige Synopse: links die |
| 30 | bisherige, rechts die künftige Fassung, die Unterschiede wortweise hervorgehoben. |
| Matthias Andreas Benkard | b291c36 | 2020-11-22 10:22:27 +0100 | [diff] [blame] | 31 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 32 | [source,shell script] |
| 33 | ---- |
| 34 | ./mvnw package |
| 35 | java -jar target/aendggner-0.1.0-SNAPSHOT.jar stammgesetz.xml aenderungsgesetz.pdf -o synopse.html |
| 36 | ---- |
| Matthias Andreas Benkard | b291c36 | 2020-11-22 10:22:27 +0100 | [diff] [blame] | 37 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 38 | Ohne Einrichtung läuft dasselbe im Browser unter |
| 39 | https://matthias.benkard.de/aendggner/; die dort angebotenen zwei |
| 40 | durchgerechneten Beispiele sind der kürzeste Weg zum ersten Ergebnis |
| 41 | (§ 14). |
| Matthias Andreas Benkard | b291c36 | 2020-11-22 10:22:27 +0100 | [diff] [blame] | 42 | |
| 43 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 44 | [[gegenstand]] |
| 45 | == § 1 Gegenstand und Zweck |
| Matthias Andreas Benkard | b291c36 | 2020-11-22 10:22:27 +0100 | [diff] [blame] | 46 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 47 | (1) Dieses Handbuch regelt Herstellung, Betrieb und Anwendung des |
| 48 | Softwareerzeugnisses „ÄndGgner“ (nachstehend: das Erzeugnis). |
| 49 | |
| 50 | (2) Das Erzeugnis dient der maschinellen Fortschreibung von Stammgesetzen anhand |
| 51 | von Änderungsvorschriften des Bundes und der Länder. Es erschließt aus einem |
| 52 | Änderungsdokument die darin enthaltenen Änderungsbefehle, wendet sie auf die |
| 53 | geltende Fassung des Stammgesetzes an und stellt beide Fassungen einander |
| 54 | gegenüber. |
| 55 | |
| 56 | (3) Das Erzeugnis ist nichtamtlich. Seine Ausgabe ist weder eine amtliche |
| 57 | Bekanntmachung noch eine Rechtsauskunft; maßgeblich bleibt allein der Wortlaut |
| 58 | des Gesetz- und Verordnungsblattes. Bei Entwürfen, Anträgen und |
| 59 | Beschlussempfehlungen zeigt die Synopse überdies nur, was gälte, wenn die Vorlage |
| 60 | so beschlossen würde; sie trägt hierauf den Hinweis *Entwurfsfassung — nicht |
| 61 | geltendes Recht*. |
| 62 | |
| 63 | (4) Es gilt der Grundsatz der Nichtverwerfung: Ein Befehl, der sich nicht |
| 64 | zweifelsfrei anwenden lässt — etwa weil er gegen eine ältere Gesetzesfassung |
| 65 | gerichtet ist, deren Zieltext nicht mehr besteht —, wird mitsamt der Begründung |
| 66 | seines Scheiterns in den Abschnitt *Manuell prüfen* der Synopse aufgenommen. Er |
| 67 | wird niemals stillschweigend übergangen. |
| 68 | |
| 69 | |
| 70 | [[begriffe]] |
| 71 | == § 2 Begriffsbestimmungen |
| 72 | |
| 73 | Im Sinne dieses Handbuchs ist |
| 74 | |
| 75 | Stammgesetz:: |
| 76 | das zu ändernde Gesetz in seiner geltenden (konsolidierten) Fassung, also |
| 77 | dasjenige Werk, dessen Fortschreibung begehrt wird. Bundesrecht wird als |
| 78 | gii-Norm-XML von https://www.gesetze-im-internet.de/[gesetze-im-internet.de] |
| 79 | angenommen, Landesrecht als konsolidierte Fassung aus dem jeweiligen |
| 80 | Landesportal (§ 5). |
| 81 | Änderungsdokument:: |
| 82 | das Werk, das die Änderung anordnet. Hierzu zählen das verkündete |
| 83 | Änderungsgesetz, der Gesetzentwurf, der Änderungsantrag und die |
| 84 | Beschlussempfehlung (§ 10). |
| 85 | Änderungsbefehl:: |
| 86 | die einzelne Anordnung innerhalb des Änderungsdokuments, gerichtet auf eine |
| 87 | bestimmte Stelle des Stammgesetzes („In § 4 Absatz 2 Satz 1 werden die Wörter |
| 88 | „X“ durch die Wörter „Y“ ersetzt“). Welche Befehlsformen erkannt werden, |
| 89 | bestimmt § 7. |
| 90 | Norm:: |
| 91 | die kleinste selbständig bezeichnete Einheit des Stammgesetzes, im Bundesrecht |
| 92 | und im Landesrecht der übrigen Länder der Paragraph, im bayerischen Landesrecht |
| 93 | der Artikel (§ 13). Auch die Inhaltsübersicht und die Gesetzesüberschrift |
| 94 | werden als Normen geführt, weil Änderungsbefehle auf sie zielen. |
| 95 | Synopse:: |
| 96 | die Ausgabe des Erzeugnisses: eine zweispaltige Gegenüberstellung der bisherigen |
| 97 | und der künftigen Fassung im Format HTML, gefolgt vom Protokoll der Anwendung |
| 98 | und dem Abschnitt *Manuell prüfen* nach § 1 Absatz 4. |
| 99 | Angewandt:: |
| 100 | gilt ein Befehl erst, wenn er im Wortlaut des Stammgesetzes gegriffen hat. Bei |
| 101 | Verbünden mehrerer Teile (§ 8 Absatz 3) gilt der Befehl nur dann als angewandt, |
| 102 | wenn jeder seiner Teile gegriffen hat. |
| 103 | |
| 104 | |
| 105 | [[bezugsquellen]] |
| 106 | == § 3 Bezugsquellen und Anschriften |
| 107 | |
| 108 | (1) Die Browserfassung wird betrieben unter |
| 109 | https://matthias.benkard.de/aendggner/. |
| 110 | |
| 111 | (2) Fortlaufende Quelltextquelle ist |
| 112 | https://gerrit.benkard.de/plugins/gitiles/aendggner. Die jeweils betriebene |
| 113 | Fassung liegt der Browserfassung überdies als `aendggner-quelltext.tar.gz` bei |
| Matthias Andreas Benkard | f3b47af | 2026-08-22 21:23:06 +0200 | [diff] [blame^] | 114 | (§ 15 Absatz 5). |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 115 | |
| 116 | (3) Das Erzeugnis steht unter der GNU Affero General Public License, Fassung 3; |
| 117 | der Lizenztext ist der Datei `COPYING` zu entnehmen. |
| 118 | |
| 119 | (4) Der Stand des Quelltextes wird nach Kalendertagen im Verzeichnis der |
| 120 | Fassungen (`FASSUNGEN.txt`) geführt. |
| 121 | |
| 122 | |
| 123 | [[herstellung]] |
| 124 | == § 4 Herstellung des Erzeugnisses |
| 125 | |
| 126 | (1) Die ausführbare Archivdatei wird durch den nachstehenden Befehl unter |
| 127 | `target/aendggner-${REVISION}.jar` erzeugt: |
| Matthias Andreas Benkard | b291c36 | 2020-11-22 10:22:27 +0100 | [diff] [blame] | 128 | |
| 129 | [source,shell script] |
| 130 | ---- |
| 131 | ./mvnw package |
| 132 | ---- |
| 133 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 134 | (2) Die Fassungsbezeichnung `${REVISION}` nach Absatz 1 lautet |
| 135 | `0.1.0-SNAPSHOT`, soweit sie nicht durch Übergabe des Schalters `-Drevision` an |
| 136 | `mvnw` abweichend bestimmt wird. |
| 137 | |
| 138 | (3) Vorausgesetzt wird ein Java-Entwicklungsbausatz der Fassung 21 oder neuer. |
| 139 | Für die Herstellung der Browserfassung gilt abweichend § 14 Absatz 3. |
| Matthias Andreas Benkard | b291c36 | 2020-11-22 10:22:27 +0100 | [diff] [blame] | 140 | |
| 141 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 142 | [[eingaben]] |
| 143 | == § 5 Zulässige Eingaben |
| Matthias Andreas Benkard | b291c36 | 2020-11-22 10:22:27 +0100 | [diff] [blame] | 144 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 145 | (1) Als Stammgesetz des Bundes wird XML im gii-norm-Format von |
| 146 | https://www.gesetze-im-internet.de/[gesetze-im-internet.de] angenommen. Das |
| 147 | Portal gibt seine Werke nur als Archiv aus (`…/<kurz>/xml.zip`); das Archiv wird |
| 148 | unmittelbar angenommen und der enthaltene XML-Eintrag daraus entpackt, ein |
| 149 | Zwischenschritt von Hand entfällt. |
| Matthias Andreas Benkard | b291c36 | 2020-11-22 10:22:27 +0100 | [diff] [blame] | 150 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 151 | (2) Als Stammgesetz eines Landes wird die konsolidierte Fassung als PDF oder als |
| 152 | kanonischer Klartext im Format der `--extract-only`-Ausgabe (§ 6 Absatz 2) |
| 153 | angenommen. Hierbei gilt: |
| 154 | |
| 155 | 1. Eine Zeile „Inhaltsübersicht“ eröffnet die gleichnamige Norm, auf die die |
| 156 | Angabe-Befehle zielen; ihre Zeilen tragen das Übersichtsformat |
| 157 | „§ N | Titel“. |
| 158 | 2. Amtliche Satznummern und Fußnotenmarker stehen als Unicode-Superskripte im |
| 159 | Text („¹Die freilebende Tierwelt …“, „Enteignung⁶)“). Ob sie erhalten bleiben, |
| 160 | ergibt sich aus der geladenen Stammfassung, nicht aus einer Länderkennung. |
| 161 | 3. Das Zitiersigel (§ oder Art.) folgt gleichfalls aus den Normköpfen der |
| 162 | Stammfassung. |
| 163 | |
| 164 | (3) Als Änderungsdokument werden PDF-Dateien des Bundesgesetzblattes, der |
| 165 | Gesetz- und Verordnungsblätter der Länder und der Drucksachen von Bundestag, |
| 166 | Bundesrat und Landtagen sowie Klartext angenommen. Die Dokumentart wird aus dem |
| 167 | Text erschlossen, nicht aus dem Dateinamen (§ 10). Änderungsanträge dürfen |
| 168 | zusammen mit demjenigen Entwurf angegeben werden, den sie ändern (§ 11). |
| Matthias Andreas Benkard | b291c36 | 2020-11-22 10:22:27 +0100 | [diff] [blame] | 169 | |
| 170 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 171 | [[betrieb]] |
| 172 | == § 6 Betrieb der Befehlszeilenfassung |
| Matthias Andreas Benkard | 58e1998 | 2026-07-13 07:09:19 +0200 | [diff] [blame] | 173 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 174 | (1) Nach der Herstellung nach § 4 wird das Erzeugnis wie folgt aufgerufen: |
| Matthias Andreas Benkard | 58e1998 | 2026-07-13 07:09:19 +0200 | [diff] [blame] | 175 | |
| 176 | [source,shell script] |
| 177 | ---- |
| 178 | java -jar target/aendggner-0.1.0-SNAPSHOT.jar \ |
| 179 | stammgesetz.xml aenderungsgesetz.pdf -o synopse.html |
| 180 | ---- |
| 181 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 182 | (2) Von den Schaltern sind die folgenden von allgemeiner Bedeutung: |
| Matthias Andreas Benkard | 58e1998 | 2026-07-13 07:09:19 +0200 | [diff] [blame] | 183 | |
| 184 | `-o, --output <file>`:: |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 185 | Ausgabedatei (Vorgabe `synopse.html`; „`-`“ bezeichnet die Standardausgabe). |
| Matthias Andreas Benkard | 58e1998 | 2026-07-13 07:09:19 +0200 | [diff] [blame] | 186 | `--vollstaendig`:: |
| 187 | Auch unveränderte Normen in die Synopse aufnehmen. |
| 188 | `--artikel <n>`:: |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 189 | Nur den bezeichneten Artikel des Änderungsgesetzes anwenden. Ohne diese Angabe |
| 190 | werden alle Artikel angewandt, deren Einleitung das Stammgesetz nennt. |
| Matthias Andreas Benkard | 58e1998 | 2026-07-13 07:09:19 +0200 | [diff] [blame] | 191 | `--extract-only`:: |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 192 | Nur den bereinigten Lineartext des Änderungsdokuments ausgeben. Dies ist |
| 193 | angezeigt, wenn die PDF-Aufbereitung (§ 9) fehlerhaft bleibt: Der Text ist zu |
| 194 | prüfen, von Hand zu berichtigen und als Klartextdatei wieder einzuspeisen. |
| Matthias Andreas Benkard | 58e1998 | 2026-07-13 07:09:19 +0200 | [diff] [blame] | 195 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 196 | (3) Ein Aufruf unmittelbar aus dem Arbeitsbaum, ohne vorherige Herstellung nach |
| 197 | § 4, ist zulässig: |
| Matthias Andreas Benkard | bac648b | 2026-07-28 07:51:09 +0200 | [diff] [blame] | 198 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 199 | [source,shell script] |
| 200 | ---- |
| 201 | ./mvnw exec:java |
| 202 | ---- |
| Matthias Andreas Benkard | 74a84c5 | 2026-08-16 06:08:42 +0200 | [diff] [blame] | 203 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 204 | (4) Die vollständige Schalterliste einschließlich der Schalter für die |
| 205 | Fehlersuche gibt `--help` aus. |
| Matthias Andreas Benkard | 74a84c5 | 2026-08-16 06:08:42 +0200 | [diff] [blame] | 206 | |
| Matthias Andreas Benkard | 58e1998 | 2026-07-13 07:09:19 +0200 | [diff] [blame] | 207 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 208 | [[befehle]] |
| 209 | == § 7 Erkannte Änderungsbefehle |
| Matthias Andreas Benkard | 65eff08 | 2026-07-18 12:24:32 +0200 | [diff] [blame] | 210 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 211 | (1) Erkannt werden die gebräuchlichsten Änderungsbefehle des Handbuchs der |
| 212 | Rechtsförmlichkeit, nämlich Ersetzen, Neufassung, Einfügen, Anfügen, Aufheben, |
| 213 | Streichen und Umnummerierung. |
| 214 | |
| 215 | (2) Von den Sonderformen sind erkannt: |
| 216 | |
| 217 | 1. Bereichs- und Koordinationsziele („Die Absätze 8 und 9 werden durch die |
| 218 | folgenden Absätze 8 bis 10 ersetzt“); |
| 219 | 2. strukturelle Streichungen ganzer Einheiten („§ 9 wird gestrichen“); |
| 220 | 3. §- und Gliederungs-Umnummerierungen („§ 9a wird zu § 9“, „Der bisherige |
| 221 | Abschnitt 2 wird zu Abschnitt 3“); |
| 222 | 4. das Einfügen und Ersetzen ganzer §-Blöcke; |
| 223 | 5. Chapeau-Lokatoren („Im Satzteil vor Nummer 1 …“); |
| 224 | 6. Änderungen an Anhängen und Anlagen („Der Anhang wird wie folgt geändert: … |
| 225 | Nach Nummer 2 wird die folgende Nummer 2a eingefügt“); |
| 226 | 7. Angabe-Befehle auf die Inhaltsübersicht (gefasst, ersetzt, eingefügt, |
| 227 | gestrichen); sie werden auf die Inhaltsübersichts-Norm angewandt; |
| 228 | 8. das Einfügen und Ersetzen von Gliederungs-Überschriften („Nach § 33 werden |
| 229 | die folgenden Überschriften zu Teil 3 … eingefügt“); |
| 230 | 9. Voranstellungen; |
| 231 | 10. Mehrfach-Ersetzungs- und -Einfügepaare; |
| 232 | 11. Einfügungen, deren Position ein Wortanker statt einer Stellenangabe bestimmt |
| 233 | („Vor den Wörtern „Aus dem Bereich Verkehr:“ wird folgender Absatz 5 |
| 234 | eingefügt“); |
| 235 | 12. Verbünde aus Umnummerierung und Folgeänderung („§ 50 wird zu § 38 und wird |
| 236 | wie folgt geändert“, „Die bisherige Nr. 7 wird Nr. 5 und das Komma wird durch |
| 237 | das Wort „und“ ersetzt“). Eine Satzzeichen-Operation meint dabei stets die |
| 238 | soeben umnummerierte Einheit, weil ihr Zieltext nichts unterscheidet; |
| 239 | 13. Verb-Rahmen, deren Unterpunkte allein die Fundstelle tragen („Es werden |
| 240 | ersetzt: … in § 35 Absatz 3 die Angabe „X“ jeweils durch die Angabe „Y“,“), |
| 241 | sowie |
| 242 | 14. die Neufassung der Gesetzesüberschrift. |
| 243 | |
| 244 | (3) Landesrechtliche Befehlsformen bestimmt ergänzend § 13. |
| 245 | |
| 246 | |
| 247 | [[reihenfolge]] |
| 248 | == § 8 Reihenfolge der Anwendung |
| 249 | |
| 250 | (1) Angewandt wird nicht stur in Dokumentreihenfolge. Umnummerierungen beziehen |
| 251 | sich stets auf die ursprüngliche Zählung, nicht auf den Stand nach den |
| 252 | vorangegangenen Punkten; wer eine Bezeichnung räumt, kommt deshalb vor den, der |
| 253 | sie neu besetzt. |
| 254 | |
| 255 | (2) Aus Absatz 1 folgt |
| 256 | |
| 257 | 1. die absteigende Abarbeitung einer aufsteigenden Kaskade („Der bisherige |
| 258 | Absatz 3 wird Absatz 4“, „Der bisherige Absatz 4 wird Absatz 5“, …) sowie |
| 259 | 2. der Vorrang einer Umnummerierung vor derjenigen Einfügung, die deren |
| 260 | Bezeichnung neu vergibt. |
| 261 | |
| 262 | Wer vorrückt, nimmt dabei seine eigenen Räumer mit: Auch eine über mehrere Punkte |
| 263 | verschränkte Kaskade („Die bisherige Nr. 15 wird Nr. 16“, „Die bisherigen Nrn. 13 |
| 264 | und 14 werden die Nrn. 14 und 15“, „Nach Nr. 12 wird folgende Nr. 13 eingefügt“) |
| 265 | tritt geschlossen vor die Einfügung, nicht bloß mit ihrem letzten Glied. |
| 266 | |
| 267 | (3) Geordnet werden nicht die Befehle, sondern die einzelnen Anwendungsschritte. |
| 268 | Ein Verbund aus Umnummerierung und Folgeänderung (§ 7 Absatz 2 Nummer 12) trägt |
| 269 | nämlich zwei gegenläufige zeitliche Ansprüche: Die Umnummerierung gehört nach |
| 270 | vorn, die Folgeänderung dagegen an ihre Dokumentstelle, weil sie die |
| 271 | vorangegangenen Punkte als vollzogen voraussetzt — „Die bisherige Nr. 11 wird |
| 272 | Nr. 12 und die Angabe „schriftliche“ wird gestrichen“ ist vorgezogen mehrdeutig, |
| 273 | weil erst ein früherer Punkt die zweite Fundstelle des Wortes beseitigt. |
| 274 | Verschoben wird stets nur nach vorn. |
| 275 | |
| 276 | (4) Das Protokoll bleibt gleichwohl befehlsweise: Ein Verbund gilt nur dann als |
| 277 | angewandt, wenn jeder seiner Teile gegriffen hat; sonst nennt die Meldung den |
| 278 | Teil und den Grund. |
| 279 | |
| 280 | |
| 281 | [[aufbereitung]] |
| 282 | == § 9 Aufbereitung der Druckwerke |
| 283 | |
| 284 | (1) Die PDF-Aufbereitung toleriert die üblichen Drucksachen-Artefakte, nämlich |
| 285 | Seitenköpfe und -füße, Vorabfassungs-Wasserzeichen, vertauschte oder gerade |
| 286 | Anführungszeichen, verklebte Wortgrenzen und zerlegt kodierte Umlaute. Die |
| 287 | Brotschrift wird seitenweise bestimmt, sodass auch Ministeriumsentwürfe mit |
| 288 | gemischten Layouts vollständig ausgelesen werden. |
| 289 | |
| 290 | (2) Fehlt im amtlichen Satz ein schließendes Anführungszeichen, so endet das |
| 291 | Zitat an der nächsten Strukturgrenze, nämlich an einer Artikel-Überschrift oder — |
| 292 | dort, wo die Anführungszeichen eines Artikels nachweislich nicht aufgehen — am |
| 293 | nächsten Aufzählungspunkt des Änderungsdokuments. Der Vorgang wird als Warnung |
| 294 | gemeldet. |
| 295 | |
| 296 | (3) Auf den Beispieldaten (§ 17 Absatz 2) werden hiernach alle Befehle der |
| 297 | Fassungen des Bundesgesetzblattes und der aktuellen Entwürfe angewandt; für |
| 298 | UWG, AGG und ProdHaftG verbleibt kein Befehl zur Prüfung von Hand. Im Übrigen |
| 299 | gilt § 1 Absatz 4. |
| 300 | |
| 301 | (4) Bleibt die Aufbereitung im Einzelfall fehlerhaft, so ist nach § 6 Absatz 2 |
| 302 | mittels des Schalters `--extract-only` zu verfahren. |
| Matthias Andreas Benkard | 2cfea00 | 2026-07-26 13:32:26 +0200 | [diff] [blame] | 303 | |
| Matthias Andreas Benkard | 58e1998 | 2026-07-13 07:09:19 +0200 | [diff] [blame] | 304 | |
| Matthias Andreas Benkard | 7235b34 | 2026-08-14 18:58:25 +0200 | [diff] [blame] | 305 | [[quellformate]] |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 306 | == § 10 Quellformate: Gesetz, Entwurf, Antrag |
| Matthias Andreas Benkard | 7235b34 | 2026-08-14 18:58:25 +0200 | [diff] [blame] | 307 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 308 | Ein Änderungsbefehl steht nicht nur im verkündeten Gesetzblatt. Dasselbe Vorhaben |
| 309 | durchläuft als Referenten-, Regierungs- und Fraktionsentwurf, als Änderungsantrag |
| 310 | und als Beschlussempfehlung mehrere Fassungen, und die Frage „was gälte, wenn das |
| 311 | durchkommt?“ stellt sich in jeder davon. Das Erzeugnis erschließt die Art eines |
| 312 | Dokuments deshalb aus seinem Kopf — nie aus dem Dateinamen, der lügen kann (im |
| 313 | Beispielkorpus heißt ein Entschließungsantrag |
| 314 | `BT-Drs-21-7071_Beschlussempfehlung.pdf`), und nie aus einer Kennung, die von |
| 315 | außen mitzugeben wäre. |
| Matthias Andreas Benkard | 7235b34 | 2026-08-14 18:58:25 +0200 | [diff] [blame] | 316 | |
| 317 | Unterschieden werden: |
| 318 | |
| 319 | Änderungsgesetz:: |
| 320 | Das verkündete Artikelgesetz aus BGBl, GVBl oder GVOBl. Der Regelfall. |
| 321 | Gesetzentwurf:: |
| 322 | Referenten-, Regierungs- und Fraktionsentwürfe, auch als Drucksache von |
| 323 | Bundestag, Bundesrat oder Landtag. Der Begründungsteil hinter dem |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 324 | Regelungstext erzeugt keine Befehle; erkannt wird er an „Begründung“ ebenso wie |
| 325 | an den Entwurfsvarianten („A. Allgemeiner Teil“, „Zu Artikel 1“). |
| Matthias Andreas Benkard | 7235b34 | 2026-08-14 18:58:25 +0200 | [diff] [blame] | 326 | Änderungsantrag:: |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 327 | Ändert nicht das Stammgesetz, sondern eine *Drucksache*; das Nähere bestimmt |
| 328 | § 11. |
| Matthias Andreas Benkard | 7235b34 | 2026-08-14 18:58:25 +0200 | [diff] [blame] | 329 | Beschlussempfehlung:: |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 330 | Trägt ihre Fassung in einer zweispaltigen Zusammenstellung, die aufgelöst wird; |
| 331 | die Synopse zeigt alsdann die vom Ausschuss beschlossene Fassung. Das Nähere |
| 332 | bestimmt § 12. |
| Matthias Andreas Benkard | 7235b34 | 2026-08-14 18:58:25 +0200 | [diff] [blame] | 333 | Dokument ohne Änderungsbefehle:: |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 334 | Entschließungs- und schlichter Antrag, Plenarprotokoll, Bericht. Sie werden |
| 335 | übergangen und gemeldet — nicht stillschweigend zu null Befehlen verarbeitet. |
| Matthias Andreas Benkard | 7235b34 | 2026-08-14 18:58:25 +0200 | [diff] [blame] | 336 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 337 | Sobald ein Entwurf, ein Antrag oder eine Beschlussempfehlung beteiligt ist, trägt |
| 338 | die Synopse den Hinweis *Entwurfsfassung — nicht geltendes Recht* (§ 1 Absatz 3); |
| 339 | die Quellenzeile nennt je Datei die erkannte Art. |
| Matthias Andreas Benkard | 7235b34 | 2026-08-14 18:58:25 +0200 | [diff] [blame] | 340 | |
| Matthias Andreas Benkard | 7235b34 | 2026-08-14 18:58:25 +0200 | [diff] [blame] | 341 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 342 | [[antraege]] |
| 343 | == § 11 Änderungsanträge |
| 344 | |
| 345 | (1) Ein Änderungsantrag ist eine Meta-Änderung: Er ändert den Entwurf, nicht das |
| 346 | Gesetz. Sein Rahmensatz adressiert deshalb zwei Ebenen zugleich — „In § 3 Nr. 22 |
| 347 | wird § 18 Nr. 1 wie folgt geändert:“ nennt erst die Stelle _in der Drucksache_ |
| 348 | (den 22. Änderungsbefehl ihres dritten Paragraphen) und dann die Stelle _in dem |
| 349 | Text, den dieser Befehl zitiert_. |
| 350 | |
| 351 | (2) Der Antrag ist zusammen mit seinem Entwurf anzugeben: |
| Matthias Andreas Benkard | 7235b34 | 2026-08-14 18:58:25 +0200 | [diff] [blame] | 352 | |
| 353 | [source,shell script] |
| 354 | ---- |
| 355 | java -jar target/aendggner-0.1.0-SNAPSHOT.jar \ |
| 356 | BayJG-alt.txt Ltg-Drs-19-9707_Gesetzentwurf.pdf \ |
| 357 | Ltg-Drs-19-10365_Aenderungsantrag-Gruene.pdf -o synopse.html |
| 358 | ---- |
| 359 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 360 | (3) Angewandt wird alsdann erst der Antrag auf den Entwurf und danach der so |
| 361 | geänderte Entwurf auf das Stammgesetz; die Synopse zeigt also, was gälte, wenn |
| 362 | Entwurf _und_ Antrag durchkämen. Welcher Entwurf gemeint ist, entscheidet die |
| 363 | Drucksachennummer, die der Antrag selbst nennt („(Drs. 19/9707)“), nicht die |
| 364 | Reihenfolge der Argumente. |
| 365 | |
| 366 | (4) Fehlt der Entwurf, so bleibt der Antrag unangewandt und wird gemeldet. Ihn |
| Matthias Andreas Benkard | 7235b34 | 2026-08-14 18:58:25 +0200 | [diff] [blame] | 367 | ersatzweise auf das Stammgesetz loszulassen wäre falsch, denn seine |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 368 | Stellenangaben zielen auf die Drucksache. |
| 369 | |
| 370 | (5) Erkannt wird auch die elliptische Antragsform, die das Hilfsverb nur einmal |
| 371 | in der Beschlussformel führt („1. In Nr. 1.29 die Angabe „,“ am Ende durch die |
| Matthias Andreas Benkard | 7235b34 | 2026-08-14 18:58:25 +0200 | [diff] [blame] | 372 | Angabe „;“ ersetzt.“). |
| 373 | |
| Matthias Andreas Benkard | 7235b34 | 2026-08-14 18:58:25 +0200 | [diff] [blame] | 374 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 375 | [[zusammenstellung]] |
| 376 | == § 12 Beschlussempfehlungen; die beschlossene Fassung |
| 377 | |
| 378 | (1) Die maßgebliche Fassung einer Beschlussempfehlung steht in einer |
| 379 | zweispaltigen Zusammenstellung: links der Entwurf, rechts die Beschlüsse des |
| 380 | Ausschusses. Anders als beim alten BGBl und beim Berliner GVBl stehen die Spalten |
| 381 | *nicht* nacheinander im Inhaltsstrom, sondern zeilenweise verschränkt; getrennt |
| 382 | werden sie deshalb über die Koordinaten (`PatchTextExtraktor.extrahiereSpalten`, |
| 383 | Schnitt an der Blattmitte, aber nur an einem tatsächlichen Spaltensteg, damit |
| Matthias Andreas Benkard | ffc553b | 2026-08-15 12:18:32 +0200 | [diff] [blame] | 384 | ganzseitenbreite Zeilen ungeschnitten bleiben). |
| Matthias Andreas Benkard | 7235b34 | 2026-08-14 18:58:25 +0200 | [diff] [blame] | 385 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 386 | (2) Die rechte Spalte für sich gelesen ist kein vollständiges Dokument: Sie druckt |
| 387 | Unverändertes nicht ab, sondern vermerkt bloß „unverändert“ — und zwar nicht nur |
| 388 | je Gliederungspunkt, sondern auch zeilenweise innerhalb zitierter Blöcke, weshalb |
| 389 | ihre Anführungszeichen nicht aufgehen. Eine Auflösung über die Gliederungspfade |
| 390 | scheitert daran nachweislich. |
| Matthias Andreas Benkard | ffc553b | 2026-08-15 12:18:32 +0200 | [diff] [blame] | 391 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 392 | (3) Maßgeblich ist stattdessen die *Grundlinie*: Beide Spalten sind zeilensynchron |
| 393 | gesetzt, jeder Vermerk steht auf der Höhe der Entwurfszeile, die er meint. Der |
| 394 | `ZusammenstellungsLeser` führt beide Spalten über Seite und Grundlinie in eine |
| 395 | gemeinsame Lesereihenfolge zusammen und entscheidet dann Zeile für Zeile: |
| 396 | „unverändert“ holt den Wortlaut aus der Entwurfsspalte, „entfällt“ streicht ihn, |
| 397 | sonst gilt die Ausschussspalte. Dabei meint „unverändert“ den Wortlaut, nicht die |
| 398 | Zählung; streicht der Ausschuss einen Punkt, so rücken die folgenden auf, und |
| 399 | seine Marke tritt an die Stelle derjenigen des Entwurfs. |
| Matthias Andreas Benkard | ffc553b | 2026-08-15 12:18:32 +0200 | [diff] [blame] | 400 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 401 | (4) Die Quellenzeile der Synopse weist die verwendete Spalte als |
| 402 | `[Beschlussempfehlung …, Ausschussfassung]` aus. |
| 403 | |
| 404 | (5) Lässt sich die Zusammenstellung nicht auflösen, so wird die Datei mit |
| 405 | Begründung übergangen, samt Hinweis auf die Drucksachennummer des Entwurfs, der |
| 406 | sich stattdessen eignet. Eine halb aufgelöste Fassung auszugeben wäre schlimmer |
| 407 | als keine. |
| 408 | |
| 409 | (6) Belegt ist beides: dass die *linke* Spalte Befehl für Befehl den |
| 410 | Regierungsentwurf ergibt, aus dem die Zusammenstellung gebaut ist, und dass die |
| 411 | aufgelöste Fassung mehr Befehle trägt als er — der Ausschuss hat der GEG-Novelle |
| 412 | zwei Artikel hinzugefügt. Zwei Beispiele stehen im Test: BT-Drs. 20/7619 (GEG) |
| 413 | und BT-Drs. 19/24334 (Drittes Bevölkerungsschutzgesetz). |
| 414 | |
| 415 | |
| 416 | [[landesrecht]] |
| 417 | == § 13 Landesrecht |
| 418 | |
| 419 | (1) Für das bayerische Landesrecht versteht das Erzeugnis die dortigen |
| 420 | Konventionen. Stammgesetze gliedern sich in Artikel („Art. 6 Abs. 2 Satz 1 |
| 421 | Nr. 2“, durchgängig abgekürzt zitiert), Änderungsgesetze dagegen in Paragraphen — |
| 422 | auch mehrere Gesetze in einem GVBl-Heft, aus denen die auf das Stammgesetz |
| 423 | zielenden §§ (einschließlich „Weitere Änderung“) anhand des Einleitungssatzes |
| 424 | ausgewählt werden. Amtliche Satznummern bleiben als Superskripte erhalten und |
| 425 | dienen als exakte Satzgrenzen. Zusätzlich erkannt werden |
| 426 | |
| 427 | 1. die bayerischen Befehlsformen („Fußnote 1 wird aufgehoben“, „In Satz 1 wird |
| 428 | die Satznummerierung „1“ gestrichen“, „Dem Wortlaut werden die folgenden |
| 429 | Abs. 1 bis 4 vorangestellt“, „Der bisherige Wortlaut wird Abs. 5“), |
| 430 | Halbsatz-Ziele und Klauselketten mit gemeinsamem Schlussverb sowie |
| 431 | 2. das Fortführungszeichen des GVBl, wonach jedes neugefasste Aufzählungsglied |
| 432 | erneut mit „ öffnet. |
| 433 | |
| 434 | Der Fall ist gegen die amtliche Nachfassung belegt: Alle 154 auf das BayJG |
| 435 | zielenden Befehle des Heftes 6/2026 werden an 54 Normen selbsttätig angewandt, |
| 436 | auch die verschränkte Neunummerierung des Bußgeldkatalogs in Art. 56. |
| 437 | |
| 438 | (2) Die übrigen Länder gliedern ihre Stammgesetze wie der Bund in Paragraphen; |
| 439 | die Unterschiede liegen im Gesetzblatt-Satz und in den Befehlsidiomen. Belegt sind |
| 440 | Sachsen (SächsBeamtVG), Niedersachsen (NEFG), Thüringen (ThürKigaFinVO) und |
| 441 | Nordrhein-Westfalen — dort alle vier ändernden Artikel eines Heftes: |
| 442 | Telemedienzuständigkeitsgesetz, Landesmediengesetz, Ausführungsgesetz zum |
| 443 | 17. Rundfunkänderungsstaatsvertrag und, mit 101 Befehlen an 31 Normen der größte |
| 444 | Fall des Heftes, das WDR-Gesetz —, jeweils mit Akzeptanztests gegen die amtlichen |
| 445 | Nachfassungen. |
| 446 | |
| 447 | (3) Für Schleswig-Holstein, Berlin und Hessen reicht die Prüfung bis zur |
| 448 | Befehlserkennung — dort vollständig, aber ohne Anwendung —, weil deren |
| 449 | Landesportale ihre Stammfassungen nur über eine anmeldepflichtige Schnittstelle |
| 450 | ausgeben. Thüringens Portal gibt sie ebensowenig aus; dort ist die konsolidierte |
| 451 | Fassung aus dem Stammheft und den drei Änderungsheften des Gesetzblattes |
| 452 | zusammengesetzt, die die Parlamentsdatenbank des Landtags frei ausgibt. |
| 453 | |
| 454 | (4) Welche Konvention welches Land beisteuert, welche Stammfassungen woher |
| 455 | stammen und was noch offen ist, verzeichnet |
| 456 | `src/test/resources/sampledata/Landesrecht-Beispiele.adoc`. |
| 457 | |
| Matthias Andreas Benkard | 7235b34 | 2026-08-14 18:58:25 +0200 | [diff] [blame] | 458 | |
| Matthias Andreas Benkard | 7b455cd | 2026-08-09 08:33:37 +0200 | [diff] [blame] | 459 | [[web]] |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 460 | == § 14 Browserfassung |
| Matthias Andreas Benkard | 7b455cd | 2026-08-09 08:33:37 +0200 | [diff] [blame] | 461 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 462 | (1) Neben der Befehlszeilenfassung besteht eine Browserfassung, die dieselbe |
| 463 | Pipeline (`eu.mulk.aendggner.Pipeline`, § 16 Absatz 1) über ein |
| 464 | Upload-Formular zugänglich macht: Stammgesetz- und Änderungsgesetz-Datei(en) |
| 465 | wählen, Synopse erhalten. |
| Matthias Andreas Benkard | 7b455cd | 2026-08-09 08:33:37 +0200 | [diff] [blame] | 466 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 467 | (2) Über dem Formular steht ein zugeklappter Einführungsblock, der zwei |
| 468 | durchgerechnete Fälle mit Verweisen auf die amtlichen Fundstellen anbietet, |
| 469 | nämlich das UWG (`gesetze-im-internet.de/uwg_2004/xml.zip`) mit dem Dritten Gesetz |
| 470 | zu seiner Änderung (BGBl. 2026 I Nr. 43) und das AGG |
| 471 | (`gesetze-im-internet.de/agg/xml.zip`) mit dem Regierungsentwurf BT-Drs. 21/6178. |
| 472 | Mitausgeliefert wird nichts; die Seite ruft die Dateien auch nicht selbst ab, sie |
| 473 | verweist nur darauf. |
| Matthias Andreas Benkard | 06da70e | 2026-08-16 07:34:12 +0200 | [diff] [blame] | 474 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 475 | (3) Ein Server ist nicht erforderlich: Die vollständige Verarbeitung — |
| 476 | PDF-Textgewinnung mit PDFBox eingeschlossen — läuft als WebAssembly-Modul im |
| 477 | Browser, übersetzt mit GraalVM Web Image aus demselben Java-Quelltext. |
| 478 | Ausgeliefert werden nur statische Dateien; die gewählten Dokumente verlassen den |
| 479 | Rechner der Nutzer:innen nicht. Die Herstellung verlangt abweichend von § 4 |
| 480 | Absatz 3 Oracle GraalVM 25.1 oder neuer, denn Web Image ist nur dort enthalten, |
| 481 | nicht in der Community Edition: |
| Matthias Andreas Benkard | 7b455cd | 2026-08-09 08:33:37 +0200 | [diff] [blame] | 482 | |
| 483 | [source,shell script] |
| 484 | ---- |
| Matthias Andreas Benkard | 2b1841e | 2026-08-15 10:51:11 +0200 | [diff] [blame] | 485 | JAVA_HOME=/pfad/zu/oracle-graalvm ./mvnw -Pwasm package |
| Matthias Andreas Benkard | 7b455cd | 2026-08-09 08:33:37 +0200 | [diff] [blame] | 486 | ---- |
| 487 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 488 | (4) Ergebnis ist `target/web/` mit `index.html`, `app.js`, `worker.js`, |
| Matthias Andreas Benkard | f3b47af | 2026-08-22 21:23:06 +0200 | [diff] [blame^] | 489 | `style.css`, `favicon.svg`, `aendggner.js` und `aendggner.js.wasm` (rund 17 MB, |
| 490 | komprimiert etwa 5 MB). Das Verzeichnis ist so, wie es dasteht, auslieferbar: |
| Matthias Andreas Benkard | 2d33bf7 | 2026-08-16 06:40:07 +0200 | [diff] [blame] | 491 | `deploy/webpaket.sh` läuft am Ende desselben Befehls, wirft den mehrere hundert |
| Matthias Andreas Benkard | f3b47af | 2026-08-22 21:23:06 +0200 | [diff] [blame^] | 492 | Megabyte großen Textzwischenschritt `aendggner.js.wat` fort, schickt das Modul |
| 493 | durch `wasm-opt -Oz` und legt den Quelltext der gebauten Fassung als |
| 494 | `aendggner-quelltext.tar.gz` samt `quelltext-fassung.txt` bei. |
| Matthias Andreas Benkard | 2b1841e | 2026-08-15 10:51:11 +0200 | [diff] [blame] | 495 | |
| Matthias Andreas Benkard | f3b47af | 2026-08-22 21:23:06 +0200 | [diff] [blame^] | 496 | (5) Die Größe des Moduls beruht auf vier Vorkehrungen; wer eine davon zurücknimmt, |
| 497 | handelt sich die Megabyte wieder ein: |
| 498 | |
| 499 | 1. `-Os` beim Übersetzen statt der auf Durchsatz gerichteten Voreinstellung; |
| 500 | 2. kein Picocli-Annotationsprozessor im Profil `wasm`. Er meldete die |
| 501 | Befehlszeilenklasse zur Reflexion an, worauf die Erreichbarkeitsanalyse die |
| 502 | gesamte Befehlszeilenfassung ins Browser-Image zog, die dort niemand aufruft; |
| 503 | 3. ein enger Ressourcen-Glob in `reachability-metadata.json`. Das frühere |
| 504 | `org/apache/fontbox/**` bettete 3,3 MB CJK-CMaps, `Scripts.txt` und — weil |
| 505 | `**` auch Klassendateien trifft — 0,7 MB `.class`-Dateien ein, von denen |
| 506 | deutsche Gesetzes-PDFs nichts brauchen. Geblieben sind die beiden |
| 507 | Identity-CMaps; `org/apache/pdfbox/resources/**` bleibt vollständig, damit die |
| 508 | Breitenberechnung bei nicht eingebetteten Schriften unangetastet ist; |
| 509 | 4. `wasm-opt -Oz` als Nachlauf. Die zugelassenen Wasm-Merkmale sind in |
| 510 | `webpaket.sh` einzeln aufgezählt und nicht als `--all-features` erteilt: Sonst |
| 511 | nutzt Binaryen auch Vorschläge, die noch kein Browser annimmt, und das Modul |
| 512 | scheitert erst beim Instanziieren. |
| 513 | |
| 514 | (6) Im Quelltextarchiv fehlt der Beispielkorpus; `.gitattributes` nimmt |
| 515 | `src/test/resources/sampledata` von `git archive` aus. Es sind Gesetzes- und |
| 516 | Drucksachentexte fremder Urheberschaft, an denen allein die Tests messen — |
| 517 | Quelltext im Sinne der AGPLv3 sind sie nicht, gebaut wird ohne sie, und sie |
| 518 | machten das Archiv dreißigmal so groß wie den Quelltext (29,7 MB statt 0,26 MB). |
| 519 | `quelltext-fassung.txt` sagt dies und verweist für den vollständigen Korpus auf |
| 520 | die Anschrift nach § 3 Absatz 2. Wächst das Archiv wieder über 8 MiB, so bricht |
| 521 | `webpaket.sh` ab; alsdann sind Massendaten ins Repository geraten, die dort nicht |
| 522 | hingehören. |
| 523 | |
| 524 | (7) Trägt der Arbeitsbaum uneingecheckte Änderungen, so bricht die Herstellung |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 525 | nach Absatz 3 ab, denn der beigelegte Quelltext wäre alsdann nicht der gebaute. |
| 526 | Für einen Probelauf hilft `QUELLTEXT_UNGEPRUEFT=1`. |
| 527 | |
| 528 | (6) Zur örtlichen Ansicht genügt `file://` nicht; Browser laden Wasm-Module und |
| 529 | Worker nur über HTTP (http://localhost:8000/): |
| Matthias Andreas Benkard | 2b1841e | 2026-08-15 10:51:11 +0200 | [diff] [blame] | 530 | |
| 531 | [source,shell script] |
| 532 | ---- |
| Matthias Andreas Benkard | 08f5307 | 2026-08-16 06:05:39 +0200 | [diff] [blame] | 533 | jwebserver -d target/web |
| Matthias Andreas Benkard | 2b1841e | 2026-08-15 10:51:11 +0200 | [diff] [blame] | 534 | ---- |
| 535 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 536 | (7) Die Befehlszeilenfassung (§ 6) bleibt hiervon unberührt und ist weiterhin der |
| 537 | Weg für Massenläufe. |
| Matthias Andreas Benkard | 2b1841e | 2026-08-15 10:51:11 +0200 | [diff] [blame] | 538 | |
| Matthias Andreas Benkard | 2d33bf7 | 2026-08-16 06:40:07 +0200 | [diff] [blame] | 539 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 540 | [[ausrollen]] |
| 541 | == § 15 Ausrollen |
| 542 | |
| Matthias Andreas Benkard | f3b47af | 2026-08-22 21:23:06 +0200 | [diff] [blame^] | 543 | (1) Erforderlich ist nur ein Ort für statische Dateien. Ausgeliefert wird über |
| 544 | Cloudflare Workers. Dort gilt eine Grenze von 25 MiB je Datei — unkomprimiert |
| 545 | gemessen —, und komprimiert wird beim Ausliefern ohnehin. `webpaket.sh` legt |
| 546 | deshalb keine `.gz`/`.br`-Beilagen mehr an und hält am Ende jede Datei gegen |
| 547 | diese Grenze; überschreitet eine sie, so bricht der Bau ab, statt das Hochladen |
| 548 | scheitern zu lassen. |
| Matthias Andreas Benkard | 2d33bf7 | 2026-08-16 06:40:07 +0200 | [diff] [blame] | 549 | |
| 550 | [source,shell script] |
| 551 | ---- |
| 552 | JAVA_HOME=/pfad/zu/oracle-graalvm ./mvnw -Pwasm package |
| Matthias Andreas Benkard | f3b47af | 2026-08-22 21:23:06 +0200 | [diff] [blame^] | 553 | ---- |
| 554 | |
| 555 | (2) Wer die Fassung stattdessen selbst ausliefert — unter einem Unterpfad einer |
| 556 | bestehenden Domain, wie zuvor unter https://matthias.benkard.de/aendggner/ —, |
| 557 | braucht die Vorkompression und fordert sie beim Bau an: |
| 558 | |
| 559 | [source,shell script] |
| 560 | ---- |
| 561 | JAVA_HOME=/pfad/zu/oracle-graalvm VORKOMPRIMIEREN=1 ./mvnw -Pwasm package |
| Matthias Andreas Benkard | 2d33bf7 | 2026-08-16 06:40:07 +0200 | [diff] [blame] | 562 | rsync -av --delete target/web/ server:/var/www/aendggner/ |
| 563 | ---- |
| 564 | |
| Matthias Andreas Benkard | f3b47af | 2026-08-22 21:23:06 +0200 | [diff] [blame^] | 565 | (3) `deploy/nginx-aendggner.conf` ist kein eigener `server`-Block, sondern ein |
| Matthias Andreas Benkard | 2d33bf7 | 2026-08-16 06:40:07 +0200 | [diff] [blame] | 566 | Schnipsel zum Einfügen in den vorhandenen (`include`). Er bringt mit: |
| 567 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 568 | 1. die Weiterleitung von `/aendggner` auf `/aendggner/`, ohne die alle relativen |
| 569 | Verweise der Seite auf die Domainwurzel zielten; |
| 570 | 2. den MIME-Typ `application/wasm`, ohne den der Browser die Instanziierung des |
| 571 | Moduls verweigert; |
| Matthias Andreas Benkard | f3b47af | 2026-08-22 21:23:06 +0200 | [diff] [blame^] | 572 | 3. `gzip_static`/`brotli_static` für die nach Absatz 2 vorkomprimierten Dateien, |
| 573 | statt 17 MB je Abruf neu zu packen; |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 574 | 4. `Cache-Control: no-cache` statt einer Haltefrist. Die Dateinamen tragen keine |
| 575 | Fassungskennung, und ein Browser mit altem `app.js` und neuem `.wasm` bekäme |
| 576 | sonst eine Mischfassung, die es nie gegeben hat. Revalidiert wird per ETag; das |
| 577 | unveränderte Modul kostet alsdann ein 304 ohne Rumpf; |
| 578 | 5. die Sicherheitskopfzeilen samt einer Content-Security-Policy. Zwei ihrer |
| 579 | Freigaben sind unvermeidlich und in der Datei begründet: `'wasm-unsafe-eval'` |
| 580 | für die Instanziierung des Moduls und `'unsafe-inline'` für Stile, weil die |
| 581 | Synopse als `blob:`-Dokument die Richtlinie der erzeugenden Seite erbt, ihr |
| 582 | Stylesheet aber eingebettet trägt. |
| Matthias Andreas Benkard | 2d33bf7 | 2026-08-16 06:40:07 +0200 | [diff] [blame] | 583 | |
| Matthias Andreas Benkard | f3b47af | 2026-08-22 21:23:06 +0200 | [diff] [blame^] | 584 | (4) `impressum.html` und `datenschutz.html` tragen die Angaben nach § 5 DDG und |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 585 | Art. 13 DSGVO. Die dort genannte Aufbewahrungsfrist der Zugriffsprotokolle |
| 586 | (14 Tage) muss zu derjenigen des Servers passen. |
| Matthias Andreas Benkard | 2d33bf7 | 2026-08-16 06:40:07 +0200 | [diff] [blame] | 587 | |
| Matthias Andreas Benkard | f3b47af | 2026-08-22 21:23:06 +0200 | [diff] [blame^] | 588 | (5) Der Footer der Startseite verweist auf den beigelegten Quelltext-Tarball; dies |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 589 | verlangt AGPLv3 § 13 für den Netzwerkbetrieb. Als fortlaufende Zweitquelle ist |
| 590 | die Anschrift nach § 3 Absatz 2 genannt. |
| Matthias Andreas Benkard | 2b1841e | 2026-08-15 10:51:11 +0200 | [diff] [blame] | 591 | |
| Matthias Andreas Benkard | 7b455cd | 2026-08-09 08:33:37 +0200 | [diff] [blame] | 592 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 593 | [[aufbau]] |
| 594 | == § 16 Aufbau des Quelltextes |
| Matthias Andreas Benkard | b291c36 | 2020-11-22 10:22:27 +0100 | [diff] [blame] | 595 | |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 596 | (1) Gemeinsamer Kern von Befehlszeile und Browser ist `eu.mulk.aendggner.Pipeline`: |
| 597 | Stammgesetz laden, Änderungsdokumente erkennen, zerlegen und anwenden, Synopse |
| 598 | ausgeben. Die Pipeline kennt kein Dateisystem; Eingaben erreichen sie als |
| 599 | `eu.mulk.aendggner.Quelle` (Name und Bytes). |
| 600 | |
| 601 | (2) Die Pakete unterhalb von `src/main/java/eu/mulk/aendggner/` gliedern sich wie |
| 602 | folgt: |
| 603 | |
| 604 | `aenderung/`:: |
| 605 | Erkennen der Dokumentart, Textbereinigung und Zerlegung in Änderungsbefehle |
| 606 | (`parse/`), Herkunftsnachweis (`Provenienz`), Stellenangaben (`Stelle`). |
| 607 | `anwendung/`:: |
| 608 | Anwenden der Befehle auf die Stammfassung, Auflösen der Stellenangaben, Zerlegen |
| 609 | in Sätze, Fortschreiben der Inhaltsübersicht. |
| 610 | `gesetz/`:: |
| 611 | Die Stammfassung nebst Gliederung, Normen, Absätzen und Superskripten; `gii/` |
| 612 | liest das Bundesformat, `land/` die Fassungen der Länder. |
| 613 | `synopse/`:: |
| 614 | Wortdiff, Aufbau und HTML-Ausgabe der Synopse. |
| 615 | |
| 616 | (3) Der Kern ist reines Java ohne Dateisystem- und ohne Netzzugriff; nur vier |
| 617 | Stellen berühren die Plattform (PDFBox, MIME-Erkennung, XML-Parser, |
| 618 | Dateizugriff). Sie sind hinter `eu.mulk.aendggner.Quelle` (Name und Bytes) und |
| 619 | `eu.mulk.aendggner.DateiTyp` (Signaturbytes statt Tika) gebündelt; hierauf beruht, |
| 620 | dass Befehlszeile und Browser dieselbe Pipeline speisen. Ein Java-Server ist |
| 621 | deshalb entbehrlich. |
| 622 | |
| 623 | (4) Zwei Eigenheiten von Web Image sind zu beachten und im Quelltext vermerkt: |
| 624 | |
| 625 | 1. Die nativen zlib-Bindungen des JDK fehlen (`java.util.zip.Inflater`), ohne die |
| 626 | kein PDF lesbar ist. `src/wasm/java/.../InflaterErsatz.java` ersetzt sie durch |
| 627 | die reine Java-Umsetzung von jzlib. |
| 628 | 2. Typisierte Felder lassen sich derzeit nicht nach `byte[]` umsetzen; der |
| 629 | Dateiinhalt wandert deshalb als Base64-Text über die JS-Grenze. |
| 630 | |
| 631 | |
| 632 | [[pruefung]] |
| 633 | == § 17 Prüfung |
| 634 | |
| 635 | (1) Herstellung und Prüfung erfolgen durch den nachstehenden Befehl: |
| Matthias Andreas Benkard | b291c36 | 2020-11-22 10:22:27 +0100 | [diff] [blame] | 636 | |
| 637 | [source,shell script] |
| 638 | ---- |
| 639 | ./mvnw verify |
| 640 | ---- |
| Matthias Andreas Benkard | 3dc36d4 | 2026-08-22 21:06:24 +0200 | [diff] [blame] | 641 | |
| 642 | (2) Die Prüfung umfasst neben den Einzelprüfungen Akzeptanzprüfungen, die |
| 643 | vollständige Änderungshefte auf die zugehörige Stammfassung anwenden und das |
| 644 | Ergebnis gegen die amtliche Nachfassung stellen. Die hierfür verwendeten |
| 645 | Beispieldaten nebst Herkunftsnachweis (`SOURCES`) liegen unter |
| 646 | `src/test/resources/sampledata/`. |