diff options
| -rw-r--r-- | README.adoc | 806 |
1 files changed, 493 insertions, 313 deletions
diff --git a/README.adoc b/README.adoc index 937bcae..996a0be 100644 --- a/README.adoc +++ b/README.adoc @@ -3,83 +3,175 @@ Matthias Andreas Benkard // Meta :experimental: :data-uri: -:sectnums: +:sectnums!: :toc: :stem: :toclevels: 2 -:description: Handbuch der Nichtamtlichen Zentralstelle für die maschinelle Fortschreibung von Stammgesetzen +: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 :keywords: mulk // Settings :icons: font :source-highlighter: pygments -== Resources +[.lead] +Ein Änderungsgesetz sagt nicht, was künftig gilt. Es sagt nur, was zu tun ist: +„In § 4 Absatz 2 Satz 1 werden die Wörter „X“ durch die Wörter „Y“ ersetzt.“ +Wer wissen will, wie die Vorschrift danach lautet, muss Hunderte solcher Befehle +von Hand nachvollziehen — und wer wissen will, was ein Entwurf bewirken _würde_, +findet in keinem amtlichen Angebot eine Antwort, denn konsolidiert wird erst nach +der Verkündung. -|=== -|Resource |Links +ÄndGgner nimmt diese Arbeit ab. Eingegeben werden ein Stammgesetz in geltender +Fassung und ein oder mehrere Änderungsdokumente — verkündete Änderungsgesetze aus +dem Bundesgesetzblatt und den Gesetz- und Verordnungsblättern der Länder ebenso +wie Referenten-, Regierungs- und Fraktionsentwürfe, Änderungsanträge und +Beschlussempfehlungen. Ausgegeben wird eine zweispaltige Synopse: links die +bisherige, rechts die künftige Fassung, die Unterschiede wortweise hervorgehoben. -|Public Artifact -|https://bintray.com/mulk/maven/aendggner[Bintray] - -|Bug Tracker -|MantisBT -|=== - - -[[building]] -== Building a JAR +[source,shell script] +---- +./mvnw package +java -jar target/aendggner-0.1.0-SNAPSHOT.jar stammgesetz.xml aenderungsgesetz.pdf -o synopse.html +---- -To build an executable JAR at `target/aendggner-${REVISION}.jar`: +Ohne Einrichtung läuft dasselbe im Browser unter +https://matthias.benkard.de/aendggner/; die dort angebotenen zwei +durchgerechneten Beispiele sind der kürzeste Weg zum ersten Ergebnis +(§ 14). + + +[[gegenstand]] +== § 1 Gegenstand und Zweck + +(1) Dieses Handbuch regelt Herstellung, Betrieb und Anwendung des +Softwareerzeugnisses „ÄndGgner“ (nachstehend: das Erzeugnis). + +(2) Das Erzeugnis dient der maschinellen Fortschreibung von Stammgesetzen anhand +von Änderungsvorschriften des Bundes und der Länder. Es erschließt aus einem +Änderungsdokument die darin enthaltenen Änderungsbefehle, wendet sie auf die +geltende Fassung des Stammgesetzes an und stellt beide Fassungen einander +gegenüber. + +(3) Das Erzeugnis ist nichtamtlich. Seine Ausgabe ist weder eine amtliche +Bekanntmachung noch eine Rechtsauskunft; maßgeblich bleibt allein der Wortlaut +des Gesetz- und Verordnungsblattes. Bei Entwürfen, Anträgen und +Beschlussempfehlungen zeigt die Synopse überdies nur, was gälte, wenn die Vorlage +so beschlossen würde; sie trägt hierauf den Hinweis *Entwurfsfassung — nicht +geltendes Recht*. + +(4) Es gilt der Grundsatz der Nichtverwerfung: Ein Befehl, der sich nicht +zweifelsfrei anwenden lässt — etwa weil er gegen eine ältere Gesetzesfassung +gerichtet ist, deren Zieltext nicht mehr besteht —, wird mitsamt der Begründung +seines Scheiterns in den Abschnitt *Manuell prüfen* der Synopse aufgenommen. Er +wird niemals stillschweigend übergangen. + + +[[begriffe]] +== § 2 Begriffsbestimmungen + +Im Sinne dieses Handbuchs ist + +Stammgesetz:: + das zu ändernde Gesetz in seiner geltenden (konsolidierten) Fassung, also + dasjenige Werk, dessen Fortschreibung begehrt wird. Bundesrecht wird als + gii-Norm-XML von https://www.gesetze-im-internet.de/[gesetze-im-internet.de] + angenommen, Landesrecht als konsolidierte Fassung aus dem jeweiligen + Landesportal (§ 5). +Änderungsdokument:: + das Werk, das die Änderung anordnet. Hierzu zählen das verkündete + Änderungsgesetz, der Gesetzentwurf, der Änderungsantrag und die + Beschlussempfehlung (§ 10). +Änderungsbefehl:: + die einzelne Anordnung innerhalb des Änderungsdokuments, gerichtet auf eine + bestimmte Stelle des Stammgesetzes („In § 4 Absatz 2 Satz 1 werden die Wörter + „X“ durch die Wörter „Y“ ersetzt“). Welche Befehlsformen erkannt werden, + bestimmt § 7. +Norm:: + die kleinste selbständig bezeichnete Einheit des Stammgesetzes, im Bundesrecht + und im Landesrecht der übrigen Länder der Paragraph, im bayerischen Landesrecht + der Artikel (§ 13). Auch die Inhaltsübersicht und die Gesetzesüberschrift + werden als Normen geführt, weil Änderungsbefehle auf sie zielen. +Synopse:: + die Ausgabe des Erzeugnisses: eine zweispaltige Gegenüberstellung der bisherigen + und der künftigen Fassung im Format HTML, gefolgt vom Protokoll der Anwendung + und dem Abschnitt *Manuell prüfen* nach § 1 Absatz 4. +Angewandt:: + gilt ein Befehl erst, wenn er im Wortlaut des Stammgesetzes gegriffen hat. Bei + Verbünden mehrerer Teile (§ 8 Absatz 3) gilt der Befehl nur dann als angewandt, + wenn jeder seiner Teile gegriffen hat. + + +[[bezugsquellen]] +== § 3 Bezugsquellen und Anschriften + +(1) Die Browserfassung wird betrieben unter +https://matthias.benkard.de/aendggner/. + +(2) Fortlaufende Quelltextquelle ist +https://gerrit.benkard.de/plugins/gitiles/aendggner. Die jeweils betriebene +Fassung liegt der Browserfassung überdies als `aendggner-quelltext.tar.gz` bei +(§ 15 Absatz 4). + +(3) Das Erzeugnis steht unter der GNU Affero General Public License, Fassung 3; +der Lizenztext ist der Datei `COPYING` zu entnehmen. + +(4) Der Stand des Quelltextes wird nach Kalendertagen im Verzeichnis der +Fassungen (`FASSUNGEN.txt`) geführt. + + +[[herstellung]] +== § 4 Herstellung des Erzeugnisses + +(1) Die ausführbare Archivdatei wird durch den nachstehenden Befehl unter +`target/aendggner-${REVISION}.jar` erzeugt: [source,shell script] ---- ./mvnw package ---- -`${REVISION}` defaults to `0.1.0-SNAPSHOT` unless you override it by -passing the `-Drevision` flag to `mvnw`. +(2) Die Fassungsbezeichnung `${REVISION}` nach Absatz 1 lautet +`0.1.0-SNAPSHOT`, soweit sie nicht durch Übergabe des Schalters `-Drevision` an +`mvnw` abweichend bestimmt wird. +(3) Vorausgesetzt wird ein Java-Entwicklungsbausatz der Fassung 21 oder neuer. +Für die Herstellung der Browserfassung gilt abweichend § 14 Absatz 3. -== Running the Command Line Application -To run the command line application after <<building,building>> it: +[[eingaben]] +== § 5 Zulässige Eingaben -[source,shell script] ----- -./mvnw exec:java ----- +(1) Als Stammgesetz des Bundes wird XML im gii-norm-Format von +https://www.gesetze-im-internet.de/[gesetze-im-internet.de] angenommen. Das +Portal gibt seine Werke nur als Archiv aus (`…/<kurz>/xml.zip`); das Archiv wird +unmittelbar angenommen und der enthaltene XML-Eintrag daraus entpackt, ein +Zwischenschritt von Hand entfällt. + +(2) Als Stammgesetz eines Landes wird die konsolidierte Fassung als PDF oder als +kanonischer Klartext im Format der `--extract-only`-Ausgabe (§ 6 Absatz 2) +angenommen. Hierbei gilt: + +1. Eine Zeile „Inhaltsübersicht“ eröffnet die gleichnamige Norm, auf die die + Angabe-Befehle zielen; ihre Zeilen tragen das Übersichtsformat + „§ N | Titel“. +2. Amtliche Satznummern und Fußnotenmarker stehen als Unicode-Superskripte im + Text („¹Die freilebende Tierwelt …“, „Enteignung⁶)“). Ob sie erhalten bleiben, + ergibt sich aus der geladenen Stammfassung, nicht aus einer Länderkennung. +3. Das Zitiersigel (§ oder Art.) folgt gleichfalls aus den Normköpfen der + Stammfassung. +(3) Als Änderungsdokument werden PDF-Dateien des Bundesgesetzblattes, der +Gesetz- und Verordnungsblätter der Länder und der Drucksachen von Bundestag, +Bundesrat und Landtagen sowie Klartext angenommen. Die Dokumentart wird aus dem +Text erschlossen, nicht aus dem Dateinamen (§ 10). Änderungsanträge dürfen +zusammen mit demjenigen Entwurf angegeben werden, den sie ändern (§ 11). -[[usage]] -== Usage - -ÄndGgner erzeugt aus einem Stammgesetz und einem Änderungsgesetz eine -zweispaltige HTML-Synopse (alte Fassung links, neue rechts, Änderungen -wortweise hervorgehoben). - -Eingaben: - -* Stammgesetz (Bundesrecht): XML im gii-norm-Format von - https://www.gesetze-im-internet.de/[gesetze-im-internet.de]. Das Portal gibt - es nur als Archiv aus (`…/<kurz>/xml.zip`); das Archiv wird unmittelbar - angenommen und der enthaltene XML-Eintrag daraus entpackt, ein Zwischenschritt - von Hand entfällt. -* Stammgesetz (Landesrecht): konsolidierte Fassung als PDF oder als - kanonischer Klartext im Format der `--extract-only`-Ausgabe. Eine Zeile - „Inhaltsübersicht“ eröffnet darin die gleichnamige Norm, auf die die - Angabe-Befehle zielen; ihre Zeilen tragen das Übersichtsformat - „§ N | Titel“. Amtliche - Satznummern und Fußnotenmarker stehen als Unicode-Superskripte im - Text („¹Die freilebende Tierwelt …“, „Enteignung⁶)“); ob sie erhalten - bleiben, ergibt sich aus der geladenen Stammfassung, nicht aus einer - Länderkennung. Ebenso folgt das Zitiersigel (§ oder Art.) aus den - Normköpfen der Stammfassung. -* Änderungsdokument: BGBl-, GVBl- oder Drucksachen-PDF (Bundestag, - Bundesrat, Landtage) oder Klartext. Die Dokumentart wird aus dem Text - erschlossen, nicht aus dem Dateinamen (siehe <<quellformate>>); - Änderungsanträge dürfen zusammen mit dem Entwurf angegeben werden, den - sie ändern. + +[[betrieb]] +== § 6 Betrieb der Befehlszeilenfassung + +(1) Nach der Herstellung nach § 4 wird das Erzeugnis wie folgt aufgerufen: [source,shell script] ---- @@ -87,135 +179,140 @@ java -jar target/aendggner-0.1.0-SNAPSHOT.jar \ stammgesetz.xml aenderungsgesetz.pdf -o synopse.html ---- -Wichtige Optionen: +(2) Von den Schaltern sind die folgenden von allgemeiner Bedeutung: `-o, --output <file>`:: - Ausgabedatei (Default `synopse.html`; `-` = Standardausgabe). + Ausgabedatei (Vorgabe `synopse.html`; „`-`“ bezeichnet die Standardausgabe). `--vollstaendig`:: Auch unveränderte Normen in die Synopse aufnehmen. `--artikel <n>`:: - Nur diesen Artikel des Änderungsgesetzes anwenden (Default: alle - Artikel, deren Einleitung das Stammgesetz nennt). + Nur den bezeichneten Artikel des Änderungsgesetzes anwenden. Ohne diese Angabe + werden alle Artikel angewandt, deren Einleitung das Stammgesetz nennt. `--extract-only`:: - Nur den bereinigten Lineartext des Änderungsgesetzes ausgeben. Nützlich, - wenn die PDF-Extraktion fehlerhaft ist: Text prüfen, von Hand - korrigieren und als Klartextdatei wieder einspeisen. - -Erkannt werden die gebräuchlichsten Änderungsbefehle des Handbuchs der -Rechtsförmlichkeit (Ersetzen, Neufassung, Einfügen, Anfügen, Aufheben, -Streichen, Umnummerierung) einschließlich zahlreicher Sonderformen: -Bereichs- und Koordinationsziele („Die Absätze 8 und 9 werden durch die -folgenden Absätze 8 bis 10 ersetzt“), strukturelle Streichungen ganzer -Einheiten („§ 9 wird gestrichen“), §- und Gliederungs-Umnummerierungen -(„§ 9a wird zu § 9“, „Der bisherige Abschnitt 2 wird zu Abschnitt 3“), -das Einfügen/Ersetzen ganzer §-Blöcke, Chapeau-Lokatoren („Im -Satzteil vor Nummer 1 …“), Änderungen an Anhängen und Anlagen („Der -Anhang wird wie folgt geändert: … Nach Nummer 2 wird die folgende -Nummer 2a eingefügt“), Angabe-Befehle auf die Inhaltsübersicht (gefasst, -ersetzt, eingefügt, gestrichen — sie werden auf die -Inhaltsübersichts-Norm angewandt), das Einfügen und Ersetzen von -Gliederungs-Überschriften („Nach § 33 werden die folgenden Überschriften -zu Teil 3 … eingefügt“), Voranstellungen, Mehrfach-Ersetzungs- und --Einfügepaare, Einfügungen, deren Position ein Wortanker statt einer -Stellenangabe bestimmt („Vor den Wörtern „Aus dem Bereich Verkehr:“ wird -folgender Absatz 5 eingefügt“), Verbünde aus Umnummerierung und -Folgeänderung („§ 50 wird zu § 38 und wird wie folgt geändert“, „Die -bisherige Nr. 7 wird Nr. 5 und das Komma wird durch das Wort „und“ -ersetzt“ — eine Satzzeichen-Operation meint dabei stets die soeben -umnummerierte Einheit, weil ihr Zieltext nichts unterscheidet), -Verb-Rahmen, deren Unterpunkte allein die Fundstelle tragen („Es werden -ersetzt: … in § 35 Absatz 3 die Angabe „X“ jeweils durch die Angabe -„Y“,“) sowie die Neufassung der Gesetzesüberschrift. - -Angewandt wird nicht stur in Dokumentreihenfolge: Umnummerierungen -beziehen sich stets auf die ursprüngliche Zählung, nicht auf den Stand -nach den vorangegangenen Punkten. Wer eine Bezeichnung räumt, kommt -deshalb vor den, der sie neu besetzt. Aus dieser einen Regel folgt die -absteigende Abarbeitung einer aufsteigenden Kaskade („Der bisherige -Absatz 3 wird Absatz 4“, „Der bisherige Absatz 4 wird Absatz 5“, …) -ebenso wie der Vorrang einer Umnummerierung vor der Einfügung, die deren -Bezeichnung neu vergibt. Wer vorrückt, nimmt dabei seine eigenen Räumer -mit: Auch eine über mehrere Punkte verschränkte Kaskade („Die bisherige -Nr. 15 wird Nr. 16“, „Die bisherigen Nrn. 13 und 14 werden die Nrn. 14 -und 15“, „Nach Nr. 12 wird folgende Nr. 13 eingefügt“) tritt deshalb -geschlossen vor die Einfügung, nicht bloß mit ihrem letzten Glied. - -Geordnet werden nicht die Befehle, sondern die einzelnen -Anwendungsschritte. Ein Verbund aus Umnummerierung und Folgeänderung -trägt nämlich zwei gegenläufige zeitliche Ansprüche: Die Umnummerierung -gehört nach vorn, die Folgeänderung dagegen an ihre Dokumentstelle, weil -sie die vorangegangenen Punkte als vollzogen voraussetzt — „Die -bisherige Nr. 11 wird Nr. 12 und die Angabe „schriftliche“ wird -gestrichen“ ist vorgezogen mehrdeutig, weil erst ein früherer Punkt die -zweite Fundstelle des Wortes beseitigt. Verschoben wird stets nur nach -vorn. Das Protokoll bleibt gleichwohl befehlsweise: Ein Verbund gilt nur -dann als angewandt, wenn jeder seiner Teile gegriffen hat, sonst nennt -die Meldung den Teil und den Grund. - -Die PDF-Aufbereitung toleriert Drucksachen-Artefakte (Seitenköpfe -und -füße, Vorabfassungs-Wasserzeichen, vertauschte oder gerade -Anführungszeichen, verklebte Wortgrenzen, zerlegt kodierte Umlaute) und -bestimmt die Brotschrift seitenweise, sodass auch -Ministeriumsentwürfe mit gemischten Layouts vollständig extrahiert -werden. Fehlt im amtlichen Satz ein schließendes Anführungszeichen, endet -das Zitat an der nächsten Strukturgrenze — an einer Artikel-Überschrift -oder, wo die Anführungszeichen eines Artikels nachweislich nicht -aufgehen, am nächsten Aufzählungspunkt des Änderungsgesetzes; gemeldet -wird das als Warnung. Auf den -Beispieldaten werden damit alle Befehle der BGBl-Fassungen und der -aktuellen Entwürfe angewandt (UWG/AGG/ProdHaftG: 0 manuell); was -unsicher bleibt — etwa Befehle gegen eine ältere Gesetzesfassung, deren -Zieltext nicht mehr existiert — landet mit Begründung im Abschnitt -*Manuell prüfen* der Synopse und wird niemals stillschweigend verworfen. - -Für das bayerische Landesrecht versteht ÄndGgner die dortigen -Konventionen: Stammgesetze gliedern sich in Artikel („Art. 6 Abs. 2 -Satz 1 Nr. 2“, durchgängig abgekürzt zitiert), Änderungsgesetze dagegen -in Paragraphen — auch mehrere Gesetze in einem GVBl-Heft, aus denen die -auf das Stammgesetz zielenden §§ (einschließlich „Weitere Änderung“) -anhand des Einleitungssatzes ausgewählt werden. Amtliche Satznummern -bleiben als Superskripte erhalten und dienen als exakte Satzgrenzen; -zusätzlich erkannt werden die bayerischen Befehlsformen („Fußnote 1 -wird aufgehoben“, „In Satz 1 wird die Satznummerierung „1“ gestrichen“, -„Dem Wortlaut werden die folgenden Abs. 1 bis 4 vorangestellt“, „Der -bisherige Wortlaut wird Abs. 5“, Halbsatz-Ziele, Klauselketten mit -gemeinsamem Schlussverb) sowie das Fortführungszeichen des GVBl (jedes -neugefasste Aufzählungsglied öffnet erneut mit „). Der Fall ist gegen -die amtliche Nachfassung belegt: Alle 154 auf das BayJG zielenden -Befehle des Heftes 6/2026 werden an 54 Normen selbsttätig angewandt, -auch die verschränkte Neunummerierung des Bußgeldkatalogs in Art. 56. + Nur den bereinigten Lineartext des Änderungsdokuments ausgeben. Dies ist + angezeigt, wenn die PDF-Aufbereitung (§ 9) fehlerhaft bleibt: Der Text ist zu + prüfen, von Hand zu berichtigen und als Klartextdatei wieder einzuspeisen. -Die übrigen Länder gliedern ihre Stammgesetze wie der Bund in -Paragraphen; die Unterschiede liegen im Gesetzblatt-Satz und in -Befehlsidiomen. Belegt sind Sachsen (SächsBeamtVG), Niedersachsen -(NEFG), Thüringen (ThürKigaFinVO) und Nordrhein-Westfalen — dort alle -vier ändernden Artikel eines -Heftes: Telemedienzuständigkeitsgesetz, Landesmediengesetz, -Ausführungsgesetz zum 17. Rundfunkänderungsstaatsvertrag und, mit 101 -Befehlen an 31 Normen der größte Fall des Heftes, das WDR-Gesetz — -mit Akzeptanztests gegen die -amtlichen Nachfassungen; für Schleswig-Holstein, Berlin und Hessen -reicht die Prüfung bis zur Befehlserkennung — dort vollständig, aber ohne -Anwendung —, weil deren Landesportale ihre Stammfassungen nur über eine -anmeldepflichtige Schnittstelle ausgeben. Thüringens Portal gibt sie -ebensowenig aus; dort ist die konsolidierte Fassung aus dem Stammheft und -den drei Änderungsheften des Gesetzblattes zusammengesetzt, die die -Parlamentsdatenbank des Landtags frei ausgibt. Welche Konvention welches Land beisteuert, welche -Stammfassungen woher stammen und was noch offen ist, verzeichnet -`src/main/resources/sampledata/Landesrecht-Beispiele.adoc`. +(3) Ein Aufruf unmittelbar aus dem Arbeitsbaum, ohne vorherige Herstellung nach +§ 4, ist zulässig: + +[source,shell script] +---- +./mvnw exec:java +---- + +(4) Die vollständige Schalterliste einschließlich der Schalter für die +Fehlersuche gibt `--help` aus. + + +[[befehle]] +== § 7 Erkannte Änderungsbefehle + +(1) Erkannt werden die gebräuchlichsten Änderungsbefehle des Handbuchs der +Rechtsförmlichkeit, nämlich Ersetzen, Neufassung, Einfügen, Anfügen, Aufheben, +Streichen und Umnummerierung. + +(2) Von den Sonderformen sind erkannt: + +1. Bereichs- und Koordinationsziele („Die Absätze 8 und 9 werden durch die + folgenden Absätze 8 bis 10 ersetzt“); +2. strukturelle Streichungen ganzer Einheiten („§ 9 wird gestrichen“); +3. §- und Gliederungs-Umnummerierungen („§ 9a wird zu § 9“, „Der bisherige + Abschnitt 2 wird zu Abschnitt 3“); +4. das Einfügen und Ersetzen ganzer §-Blöcke; +5. Chapeau-Lokatoren („Im Satzteil vor Nummer 1 …“); +6. Änderungen an Anhängen und Anlagen („Der Anhang wird wie folgt geändert: … + Nach Nummer 2 wird die folgende Nummer 2a eingefügt“); +7. Angabe-Befehle auf die Inhaltsübersicht (gefasst, ersetzt, eingefügt, + gestrichen); sie werden auf die Inhaltsübersichts-Norm angewandt; +8. das Einfügen und Ersetzen von Gliederungs-Überschriften („Nach § 33 werden + die folgenden Überschriften zu Teil 3 … eingefügt“); +9. Voranstellungen; +10. Mehrfach-Ersetzungs- und -Einfügepaare; +11. Einfügungen, deren Position ein Wortanker statt einer Stellenangabe bestimmt + („Vor den Wörtern „Aus dem Bereich Verkehr:“ wird folgender Absatz 5 + eingefügt“); +12. Verbünde aus Umnummerierung und Folgeänderung („§ 50 wird zu § 38 und wird + wie folgt geändert“, „Die bisherige Nr. 7 wird Nr. 5 und das Komma wird durch + das Wort „und“ ersetzt“). Eine Satzzeichen-Operation meint dabei stets die + soeben umnummerierte Einheit, weil ihr Zieltext nichts unterscheidet; +13. Verb-Rahmen, deren Unterpunkte allein die Fundstelle tragen („Es werden + ersetzt: … in § 35 Absatz 3 die Angabe „X“ jeweils durch die Angabe „Y“,“), + sowie +14. die Neufassung der Gesetzesüberschrift. + +(3) Landesrechtliche Befehlsformen bestimmt ergänzend § 13. + + +[[reihenfolge]] +== § 8 Reihenfolge der Anwendung + +(1) Angewandt wird nicht stur in Dokumentreihenfolge. Umnummerierungen beziehen +sich stets auf die ursprüngliche Zählung, nicht auf den Stand nach den +vorangegangenen Punkten; wer eine Bezeichnung räumt, kommt deshalb vor den, der +sie neu besetzt. + +(2) Aus Absatz 1 folgt + +1. die absteigende Abarbeitung einer aufsteigenden Kaskade („Der bisherige + Absatz 3 wird Absatz 4“, „Der bisherige Absatz 4 wird Absatz 5“, …) sowie +2. der Vorrang einer Umnummerierung vor derjenigen Einfügung, die deren + Bezeichnung neu vergibt. + +Wer vorrückt, nimmt dabei seine eigenen Räumer mit: Auch eine über mehrere Punkte +verschränkte Kaskade („Die bisherige Nr. 15 wird Nr. 16“, „Die bisherigen Nrn. 13 +und 14 werden die Nrn. 14 und 15“, „Nach Nr. 12 wird folgende Nr. 13 eingefügt“) +tritt geschlossen vor die Einfügung, nicht bloß mit ihrem letzten Glied. + +(3) Geordnet werden nicht die Befehle, sondern die einzelnen Anwendungsschritte. +Ein Verbund aus Umnummerierung und Folgeänderung (§ 7 Absatz 2 Nummer 12) trägt +nämlich zwei gegenläufige zeitliche Ansprüche: Die Umnummerierung gehört nach +vorn, die Folgeänderung dagegen an ihre Dokumentstelle, weil sie die +vorangegangenen Punkte als vollzogen voraussetzt — „Die bisherige Nr. 11 wird +Nr. 12 und die Angabe „schriftliche“ wird gestrichen“ ist vorgezogen mehrdeutig, +weil erst ein früherer Punkt die zweite Fundstelle des Wortes beseitigt. +Verschoben wird stets nur nach vorn. + +(4) Das Protokoll bleibt gleichwohl befehlsweise: Ein Verbund gilt nur dann als +angewandt, wenn jeder seiner Teile gegriffen hat; sonst nennt die Meldung den +Teil und den Grund. + + +[[aufbereitung]] +== § 9 Aufbereitung der Druckwerke + +(1) Die PDF-Aufbereitung toleriert die üblichen Drucksachen-Artefakte, nämlich +Seitenköpfe und -füße, Vorabfassungs-Wasserzeichen, vertauschte oder gerade +Anführungszeichen, verklebte Wortgrenzen und zerlegt kodierte Umlaute. Die +Brotschrift wird seitenweise bestimmt, sodass auch Ministeriumsentwürfe mit +gemischten Layouts vollständig ausgelesen werden. + +(2) Fehlt im amtlichen Satz ein schließendes Anführungszeichen, so endet das +Zitat an der nächsten Strukturgrenze, nämlich an einer Artikel-Überschrift oder — +dort, wo die Anführungszeichen eines Artikels nachweislich nicht aufgehen — am +nächsten Aufzählungspunkt des Änderungsdokuments. Der Vorgang wird als Warnung +gemeldet. + +(3) Auf den Beispieldaten (§ 17 Absatz 2) werden hiernach alle Befehle der +Fassungen des Bundesgesetzblattes und der aktuellen Entwürfe angewandt; für +UWG, AGG und ProdHaftG verbleibt kein Befehl zur Prüfung von Hand. Im Übrigen +gilt § 1 Absatz 4. + +(4) Bleibt die Aufbereitung im Einzelfall fehlerhaft, so ist nach § 6 Absatz 2 +mittels des Schalters `--extract-only` zu verfahren. [[quellformate]] -== Quellformate: Gesetz, Entwurf, Antrag +== § 10 Quellformate: Gesetz, Entwurf, Antrag -Ein Änderungsbefehl steht nicht nur im verkündeten Gesetzblatt. Dasselbe -Vorhaben durchläuft als Referenten-, Regierungs- und Fraktionsentwurf, -als Änderungsantrag und als Beschlussempfehlung mehrere Fassungen, und -die Frage „was gälte, wenn das durchkommt?“ stellt sich in jeder davon. -ÄndGgner erschließt die Art eines Dokuments deshalb aus seinem Kopf — -nie aus dem Dateinamen, der lügen kann (im Beispielkorpus heißt ein -Entschließungsantrag `BT-Drs-21-7071_Beschlussempfehlung.pdf`) und nie -aus einer Kennung, die von außen mitzugeben wäre. +Ein Änderungsbefehl steht nicht nur im verkündeten Gesetzblatt. Dasselbe Vorhaben +durchläuft als Referenten-, Regierungs- und Fraktionsentwurf, als Änderungsantrag +und als Beschlussempfehlung mehrere Fassungen, und die Frage „was gälte, wenn das +durchkommt?“ stellt sich in jeder davon. Das Erzeugnis erschließt die Art eines +Dokuments deshalb aus seinem Kopf — nie aus dem Dateinamen, der lügen kann (im +Beispielkorpus heißt ein Entschließungsantrag +`BT-Drs-21-7071_Beschlussempfehlung.pdf`), und nie aus einer Kennung, die von +außen mitzugeben wäre. Unterschieden werden: @@ -224,32 +321,34 @@ Unterschieden werden: Gesetzentwurf:: Referenten-, Regierungs- und Fraktionsentwürfe, auch als Drucksache von Bundestag, Bundesrat oder Landtag. Der Begründungsteil hinter dem - Regelungstext erzeugt keine Befehle; erkannt wird er an „Begründung“ - ebenso wie an den Entwurfsvarianten („A. Allgemeiner Teil“, „Zu - Artikel 1“). + Regelungstext erzeugt keine Befehle; erkannt wird er an „Begründung“ ebenso wie + an den Entwurfsvarianten („A. Allgemeiner Teil“, „Zu Artikel 1“). Änderungsantrag:: - Ändert nicht das Stammgesetz, sondern eine *Drucksache* — siehe unten. + Ändert nicht das Stammgesetz, sondern eine *Drucksache*; das Nähere bestimmt + § 11. Beschlussempfehlung:: - Trägt ihre Fassung in einer zweispaltigen Zusammenstellung, die - aufgelöst wird — die Synopse zeigt dann die vom Ausschuss beschlossene - Fassung (siehe unten). + Trägt ihre Fassung in einer zweispaltigen Zusammenstellung, die aufgelöst wird; + die Synopse zeigt alsdann die vom Ausschuss beschlossene Fassung. Das Nähere + bestimmt § 12. Dokument ohne Änderungsbefehle:: - Entschließungs- und schlichter Antrag, Plenarprotokoll, Bericht. Sie - werden übergangen und gemeldet — nicht stillschweigend zu null - Befehlen verarbeitet. + Entschließungs- und schlichter Antrag, Plenarprotokoll, Bericht. Sie werden + übergangen und gemeldet — nicht stillschweigend zu null Befehlen verarbeitet. + +Sobald ein Entwurf, ein Antrag oder eine Beschlussempfehlung beteiligt ist, trägt +die Synopse den Hinweis *Entwurfsfassung — nicht geltendes Recht* (§ 1 Absatz 3); +die Quellenzeile nennt je Datei die erkannte Art. -Sobald ein Entwurf, ein Antrag oder eine Beschlussempfehlung beteiligt -ist, trägt die Synopse den Hinweis *Entwurfsfassung — nicht geltendes -Recht*; die Quellenzeile nennt je Datei die erkannte Art. -=== Änderungsanträge +[[antraege]] +== § 11 Änderungsanträge -Ein Änderungsantrag ist eine Meta-Änderung: Er ändert den Entwurf, nicht -das Gesetz. Sein Rahmensatz adressiert deshalb zwei Ebenen zugleich — -„In § 3 Nr. 22 wird § 18 Nr. 1 wie folgt geändert:“ nennt erst die -Stelle _in der Drucksache_ (den 22. Änderungsbefehl ihres dritten -Paragraphen) und dann die Stelle _in dem Text, den dieser Befehl -zitiert_. Angegeben wird der Antrag zusammen mit seinem Entwurf: +(1) Ein Änderungsantrag ist eine Meta-Änderung: Er ändert den Entwurf, nicht das +Gesetz. Sein Rahmensatz adressiert deshalb zwei Ebenen zugleich — „In § 3 Nr. 22 +wird § 18 Nr. 1 wie folgt geändert:“ nennt erst die Stelle _in der Drucksache_ +(den 22. Änderungsbefehl ihres dritten Paragraphen) und dann die Stelle _in dem +Text, den dieser Befehl zitiert_. + +(2) Der Antrag ist zusammen mit seinem Entwurf anzugeben: [source,shell script] ---- @@ -258,115 +357,166 @@ java -jar target/aendggner-0.1.0-SNAPSHOT.jar \ Ltg-Drs-19-10365_Aenderungsantrag-Gruene.pdf -o synopse.html ---- -ÄndGgner wendet dann erst den Antrag auf den Entwurf an und danach den -so geänderten Entwurf auf das Stammgesetz; die Synopse zeigt also, was -gälte, wenn Entwurf _und_ Antrag durchkämen. Welcher Entwurf gemeint -ist, entscheidet die Drucksachennummer, die der Antrag selbst nennt -(„(Drs. 19/9707)“), nicht die Reihenfolge der Argumente. Fehlt der -Entwurf, bleibt der Antrag unangewandt und wird gemeldet — ihn +(3) Angewandt wird alsdann erst der Antrag auf den Entwurf und danach der so +geänderte Entwurf auf das Stammgesetz; die Synopse zeigt also, was gälte, wenn +Entwurf _und_ Antrag durchkämen. Welcher Entwurf gemeint ist, entscheidet die +Drucksachennummer, die der Antrag selbst nennt („(Drs. 19/9707)“), nicht die +Reihenfolge der Argumente. + +(4) Fehlt der Entwurf, so bleibt der Antrag unangewandt und wird gemeldet. Ihn ersatzweise auf das Stammgesetz loszulassen wäre falsch, denn seine -Stellenangaben zielen auf die Drucksache. Erkannt wird auch die -elliptische Antragsform, die das Hilfsverb nur einmal in der -Beschlussformel führt („1. In Nr. 1.29 die Angabe „,“ am Ende durch die +Stellenangaben zielen auf die Drucksache. + +(5) Erkannt wird auch die elliptische Antragsform, die das Hilfsverb nur einmal +in der Beschlussformel führt („1. In Nr. 1.29 die Angabe „,“ am Ende durch die Angabe „;“ ersetzt.“). -=== Beschlussempfehlungen: die beschlossene Fassung -Die maßgebliche Fassung einer Beschlussempfehlung steht in einer -zweispaltigen Zusammenstellung: links der Entwurf, rechts die Beschlüsse -des Ausschusses. Anders als beim alten BGBl und beim Berliner GVBl -stehen die Spalten *nicht* nacheinander im Inhaltsstrom, sondern -zeilenweise verschränkt; getrennt werden sie deshalb über die -Koordinaten (`PatchTextExtraktor.extrahiereSpalten`, Schnitt an der -Blattmitte, aber nur an einem tatsächlichen Spaltensteg, damit +[[zusammenstellung]] +== § 12 Beschlussempfehlungen; die beschlossene Fassung + +(1) Die maßgebliche Fassung einer Beschlussempfehlung steht in einer +zweispaltigen Zusammenstellung: links der Entwurf, rechts die Beschlüsse des +Ausschusses. Anders als beim alten BGBl und beim Berliner GVBl stehen die Spalten +*nicht* nacheinander im Inhaltsstrom, sondern zeilenweise verschränkt; getrennt +werden sie deshalb über die Koordinaten (`PatchTextExtraktor.extrahiereSpalten`, +Schnitt an der Blattmitte, aber nur an einem tatsächlichen Spaltensteg, damit ganzseitenbreite Zeilen ungeschnitten bleiben). -Die rechte Spalte für sich gelesen ist allerdings kein vollständiges -Dokument: Sie druckt Unverändertes nicht ab, sondern vermerkt bloß -„unverändert“ — und zwar nicht nur je Gliederungspunkt, sondern auch -zeilenweise innerhalb zitierter Blöcke, weshalb ihre Anführungszeichen -nicht aufgehen. Eine Auflösung über die Gliederungspfade scheitert daran -nachweislich. Maßgeblich ist stattdessen die *Grundlinie*: Beide Spalten -sind zeilensynchron gesetzt, jeder Vermerk steht auf der Höhe der -Entwurfszeile, die er meint. Der `ZusammenstellungsLeser` führt beide -Spalten über Seite und Grundlinie in eine gemeinsame Lesereihenfolge -zusammen und entscheidet dann Zeile für Zeile: „unverändert“ holt den -Wortlaut aus der Entwurfsspalte, „entfällt“ streicht ihn, sonst gilt die -Ausschussspalte. Dabei meint „unverändert“ den Wortlaut, nicht die -Zählung — streicht der Ausschuss einen Punkt, rücken die folgenden auf, -und seine Marke tritt an die Stelle der des Entwurfs. - -Die Quellenzeile der Synopse weist die verwendete Spalte als -`[Beschlussempfehlung …, Ausschussfassung]` aus. Lässt sich die -Zusammenstellung nicht auflösen, wird die Datei nach wie vor mit -Begründung übergangen — samt Hinweis auf die Drucksachennummer des -Entwurfs, der sich stattdessen eignet. Eine halb aufgelöste Fassung -auszugeben wäre schlimmer als keine. - -Belegt ist beides: dass die *linke* Spalte Befehl für Befehl den -Regierungsentwurf ergibt, aus dem die Zusammenstellung gebaut ist, und -dass die aufgelöste Fassung mehr Befehle trägt als er — der Ausschuss -hat der GEG-Novelle zwei Artikel hinzugefügt. Zwei Beispiele stehen im -Test: BT-Drs. 20/7619 (GEG) und BT-Drs. 19/24334 (Drittes -Bevölkerungsschutzgesetz). +(2) Die rechte Spalte für sich gelesen ist kein vollständiges Dokument: Sie druckt +Unverändertes nicht ab, sondern vermerkt bloß „unverändert“ — und zwar nicht nur +je Gliederungspunkt, sondern auch zeilenweise innerhalb zitierter Blöcke, weshalb +ihre Anführungszeichen nicht aufgehen. Eine Auflösung über die Gliederungspfade +scheitert daran nachweislich. + +(3) Maßgeblich ist stattdessen die *Grundlinie*: Beide Spalten sind zeilensynchron +gesetzt, jeder Vermerk steht auf der Höhe der Entwurfszeile, die er meint. Der +`ZusammenstellungsLeser` führt beide Spalten über Seite und Grundlinie in eine +gemeinsame Lesereihenfolge zusammen und entscheidet dann Zeile für Zeile: +„unverändert“ holt den Wortlaut aus der Entwurfsspalte, „entfällt“ streicht ihn, +sonst gilt die Ausschussspalte. Dabei meint „unverändert“ den Wortlaut, nicht die +Zählung; streicht der Ausschuss einen Punkt, so rücken die folgenden auf, und +seine Marke tritt an die Stelle derjenigen des Entwurfs. + +(4) Die Quellenzeile der Synopse weist die verwendete Spalte als +`[Beschlussempfehlung …, Ausschussfassung]` aus. + +(5) Lässt sich die Zusammenstellung nicht auflösen, so wird die Datei mit +Begründung übergangen, samt Hinweis auf die Drucksachennummer des Entwurfs, der +sich stattdessen eignet. Eine halb aufgelöste Fassung auszugeben wäre schlimmer +als keine. + +(6) Belegt ist beides: dass die *linke* Spalte Befehl für Befehl den +Regierungsentwurf ergibt, aus dem die Zusammenstellung gebaut ist, und dass die +aufgelöste Fassung mehr Befehle trägt als er — der Ausschuss hat der GEG-Novelle +zwei Artikel hinzugefügt. Zwei Beispiele stehen im Test: BT-Drs. 20/7619 (GEG) +und BT-Drs. 19/24334 (Drittes Bevölkerungsschutzgesetz). + + +[[landesrecht]] +== § 13 Landesrecht + +(1) Für das bayerische Landesrecht versteht das Erzeugnis die dortigen +Konventionen. Stammgesetze gliedern sich in Artikel („Art. 6 Abs. 2 Satz 1 +Nr. 2“, durchgängig abgekürzt zitiert), Änderungsgesetze dagegen in Paragraphen — +auch mehrere Gesetze in einem GVBl-Heft, aus denen die auf das Stammgesetz +zielenden §§ (einschließlich „Weitere Änderung“) anhand des Einleitungssatzes +ausgewählt werden. Amtliche Satznummern bleiben als Superskripte erhalten und +dienen als exakte Satzgrenzen. Zusätzlich erkannt werden + +1. die bayerischen Befehlsformen („Fußnote 1 wird aufgehoben“, „In Satz 1 wird + die Satznummerierung „1“ gestrichen“, „Dem Wortlaut werden die folgenden + Abs. 1 bis 4 vorangestellt“, „Der bisherige Wortlaut wird Abs. 5“), + Halbsatz-Ziele und Klauselketten mit gemeinsamem Schlussverb sowie +2. das Fortführungszeichen des GVBl, wonach jedes neugefasste Aufzählungsglied + erneut mit „ öffnet. + +Der Fall ist gegen die amtliche Nachfassung belegt: Alle 154 auf das BayJG +zielenden Befehle des Heftes 6/2026 werden an 54 Normen selbsttätig angewandt, +auch die verschränkte Neunummerierung des Bußgeldkatalogs in Art. 56. -[[web]] -== Web-App +(2) Die übrigen Länder gliedern ihre Stammgesetze wie der Bund in Paragraphen; +die Unterschiede liegen im Gesetzblatt-Satz und in den Befehlsidiomen. Belegt sind +Sachsen (SächsBeamtVG), Niedersachsen (NEFG), Thüringen (ThürKigaFinVO) und +Nordrhein-Westfalen — dort alle vier ändernden Artikel eines Heftes: +Telemedienzuständigkeitsgesetz, Landesmediengesetz, Ausführungsgesetz zum +17. Rundfunkänderungsstaatsvertrag und, mit 101 Befehlen an 31 Normen der größte +Fall des Heftes, das WDR-Gesetz —, jeweils mit Akzeptanztests gegen die amtlichen +Nachfassungen. -Neben der CLI gibt es eine Browserfassung, die dieselbe Pipeline -(`eu.mulk.aendggner.Pipeline`) über ein Upload-Formular zugänglich macht: -Stammgesetz- und Änderungsgesetz-Datei(en) wählen, Synopse erhalten. +(3) Für Schleswig-Holstein, Berlin und Hessen reicht die Prüfung bis zur +Befehlserkennung — dort vollständig, aber ohne Anwendung —, weil deren +Landesportale ihre Stammfassungen nur über eine anmeldepflichtige Schnittstelle +ausgeben. Thüringens Portal gibt sie ebensowenig aus; dort ist die konsolidierte +Fassung aus dem Stammheft und den drei Änderungsheften des Gesetzblattes +zusammengesetzt, die die Parlamentsdatenbank des Landtags frei ausgibt. -Über dem Formular steht ein zugeklappter Einführungsblock, der zwei -durchgerechnete Fälle mit Verweisen auf die amtlichen Fundstellen anbietet: -das UWG (`gesetze-im-internet.de/uwg_2004/xml.zip`) mit dem Dritten Gesetz zu -seiner Änderung (BGBl. 2026 I Nr. 43) und das AGG -(`gesetze-im-internet.de/agg/xml.zip`) mit dem Regierungsentwurf BT-Drs. -21/6178. Mitausgeliefert wird nichts; die Seite ruft die Dateien auch nicht -selbst ab, sie verweist nur darauf. +(4) Welche Konvention welches Land beisteuert, welche Stammfassungen woher +stammen und was noch offen ist, verzeichnet +`src/test/resources/sampledata/Landesrecht-Beispiele.adoc`. -Sie braucht keinen Server: Die vollständige Verarbeitung — PDF-Textgewinnung -mit PDFBox eingeschlossen — läuft als WebAssembly-Modul im Browser, übersetzt -mit GraalVM Web Image aus demselben Java-Quelltext. Ausgeliefert werden nur -statische Dateien; die gewählten Dokumente verlassen den Rechner der -Nutzer:innen nicht. -Bauen (verlangt Oracle GraalVM 25.1 oder neuer — Web Image ist dort enthalten, -in der Community Edition nicht): +[[web]] +== § 14 Browserfassung + +(1) Neben der Befehlszeilenfassung besteht eine Browserfassung, die dieselbe +Pipeline (`eu.mulk.aendggner.Pipeline`, § 16 Absatz 1) über ein +Upload-Formular zugänglich macht: Stammgesetz- und Änderungsgesetz-Datei(en) +wählen, Synopse erhalten. + +(2) Über dem Formular steht ein zugeklappter Einführungsblock, der zwei +durchgerechnete Fälle mit Verweisen auf die amtlichen Fundstellen anbietet, +nämlich das UWG (`gesetze-im-internet.de/uwg_2004/xml.zip`) mit dem Dritten Gesetz +zu seiner Änderung (BGBl. 2026 I Nr. 43) und das AGG +(`gesetze-im-internet.de/agg/xml.zip`) mit dem Regierungsentwurf BT-Drs. 21/6178. +Mitausgeliefert wird nichts; die Seite ruft die Dateien auch nicht selbst ab, sie +verweist nur darauf. + +(3) Ein Server ist nicht erforderlich: Die vollständige Verarbeitung — +PDF-Textgewinnung mit PDFBox eingeschlossen — läuft als WebAssembly-Modul im +Browser, übersetzt mit GraalVM Web Image aus demselben Java-Quelltext. +Ausgeliefert werden nur statische Dateien; die gewählten Dokumente verlassen den +Rechner der Nutzer:innen nicht. Die Herstellung verlangt abweichend von § 4 +Absatz 3 Oracle GraalVM 25.1 oder neuer, denn Web Image ist nur dort enthalten, +nicht in der Community Edition: [source,shell script] ---- JAVA_HOME=/pfad/zu/oracle-graalvm ./mvnw -Pwasm package ---- -Ergebnis ist `target/web/` mit `index.html`, `app.js`, `worker.js`, +(4) Ergebnis ist `target/web/` mit `index.html`, `app.js`, `worker.js`, `style.css`, `favicon.svg`, `aendggner.js` und `aendggner.js.wasm` (rund 24 MB, komprimiert etwa 7 MB). Das Verzeichnis ist so, wie es dasteht, auslieferbar: `deploy/webpaket.sh` läuft am Ende desselben Befehls, wirft den mehrere hundert Megabyte großen Textzwischenschritt `aendggner.js.wat` fort, legt den Quelltext der gebauten Fassung als `aendggner-quelltext.tar.gz` samt `quelltext-fassung.txt` bei und komprimiert die großen Dateien nach `.gz` und -`.br` vor. Trägt der Arbeitsbaum uneingecheckte Änderungen, bricht der Bau ab — -der beigelegte Quelltext wäre dann nicht der gebaute; für einen Probelauf hilft -`QUELLTEXT_UNGEPRUEFT=1`. +`.br` vor. + +(5) Trägt der Arbeitsbaum uneingecheckte Änderungen, so bricht die Herstellung +nach Absatz 3 ab, denn der beigelegte Quelltext wäre alsdann nicht der gebaute. +Für einen Probelauf hilft `QUELLTEXT_UNGEPRUEFT=1`. -Lokal ansehen — `file://` genügt nicht, Browser laden Wasm-Module und Worker -nur über HTTP (http://localhost:8000/): +(6) Zur örtlichen Ansicht genügt `file://` nicht; Browser laden Wasm-Module und +Worker nur über HTTP (http://localhost:8000/): [source,shell script] ---- jwebserver -d target/web ---- -Die Befehlszeilenfassung bleibt davon unberührt und ist weiterhin der Weg für -Massenläufe. +(7) Die Befehlszeilenfassung (§ 6) bleibt hiervon unberührt und ist weiterhin der +Weg für Massenläufe. -=== Ausrollen -Betrieben wird die Fassung unter einem Unterpfad einer bestehenden Domain, -https://matthias.benkard.de/aendggner/ — ein eigener Server und ein eigenes -Zertifikat sind dafür nicht nötig. Nötig ist nur ein Webserver für statische -Dateien. +[[ausrollen]] +== § 15 Ausrollen + +(1) Betrieben wird die Fassung unter einem Unterpfad einer bestehenden Domain, +https://matthias.benkard.de/aendggner/. Ein eigener Server und ein eigenes +Zertifikat sind hierfür nicht erforderlich; erforderlich ist nur ein Webserver +für statische Dateien. [source,shell script] ---- @@ -374,55 +524,85 @@ JAVA_HOME=/pfad/zu/oracle-graalvm ./mvnw -Pwasm package rsync -av --delete target/web/ server:/var/www/aendggner/ ---- -`deploy/nginx-aendggner.conf` ist dafür kein eigener `server`-Block, sondern ein +(2) `deploy/nginx-aendggner.conf` ist kein eigener `server`-Block, sondern ein Schnipsel zum Einfügen in den vorhandenen (`include`). Er bringt mit: -* die Weiterleitung von `/aendggner` auf `/aendggner/`, ohne die alle relativen - Verweise der Seite auf die Domainwurzel zielten; -* den MIME-Typ `application/wasm`, ohne den der Browser die Instanziierung des - Moduls verweigert; -* `gzip_static`/`brotli_static` für die vorkomprimierten Dateien, statt 24 MB je - Abruf neu zu packen; -* `Cache-Control: no-cache` statt einer Haltefrist: Die Dateinamen tragen keine - Fassungskennung, und ein Browser mit altem `app.js` und neuem `.wasm` bekäme - sonst eine Mischfassung, die es nie gegeben hat. Revalidiert wird per ETag, das - unveränderte Modul kostet dann ein 304 ohne Rumpf; -* die Sicherheitskopfzeilen samt einer Content-Security-Policy. Zwei ihrer - Freigaben sind unvermeidlich und in der Datei begründet: `'wasm-unsafe-eval'` - für die Instanziierung des Moduls und `'unsafe-inline'` für Stile, weil die - Synopse als `blob:`-Dokument die Richtlinie der erzeugenden Seite erbt, ihr - Stylesheet aber eingebettet trägt. - -Der Footer der Startseite verweist auf den beigelegten Quelltext-Tarball; das -verlangt AGPLv3 §13 für den Netzwerkbetrieb. Als fortlaufende Zweitquelle ist -https://gerrit.benkard.de/plugins/gitiles/aendggner genannt. `impressum.html` -und `datenschutz.html` tragen die Angaben nach § 5 DDG und Art. 13 DSGVO; die -dort genannte Aufbewahrungsfrist der Zugriffsprotokolle (14 Tage) muss zu der -des Servers passen. - -=== Warum WebAssembly und nicht ein Java-Server - -Der Kern ist reines Java ohne Dateisystem- oder Netzzugriff; nur vier Stellen -berührten die Plattform (PDFBox, MIME-Erkennung, XML-Parser, Dateizugriff). -Sie sind hinter `eu.mulk.aendggner.Quelle` (Name + Bytes) und -`eu.mulk.aendggner.DateiTyp` (Signaturbytes statt Tika) gebündelt, sodass -Befehlszeile und Browser dieselbe Pipeline speisen. - -Zwei Eigenheiten von Web Image sind dabei zu beachten und im Quelltext -vermerkt: - -* Die nativen zlib-Bindungen des JDK fehlen (`java.util.zip.Inflater`), ohne - die kein PDF lesbar ist. `src/wasm/java/.../InflaterErsatz.java` ersetzt sie - durch die reine Java-Umsetzung von jzlib. -* Typisierte Felder lassen sich derzeit nicht nach `byte[]` umsetzen; der - Dateiinhalt wandert deshalb als Base64-Text über die JS-Grenze. - - -== Running the Tests - -To build and run the tests: +1. die Weiterleitung von `/aendggner` auf `/aendggner/`, ohne die alle relativen + Verweise der Seite auf die Domainwurzel zielten; +2. den MIME-Typ `application/wasm`, ohne den der Browser die Instanziierung des + Moduls verweigert; +3. `gzip_static`/`brotli_static` für die vorkomprimierten Dateien, statt 24 MB je + Abruf neu zu packen; +4. `Cache-Control: no-cache` statt einer Haltefrist. Die Dateinamen tragen keine + Fassungskennung, und ein Browser mit altem `app.js` und neuem `.wasm` bekäme + sonst eine Mischfassung, die es nie gegeben hat. Revalidiert wird per ETag; das + unveränderte Modul kostet alsdann ein 304 ohne Rumpf; +5. die Sicherheitskopfzeilen samt einer Content-Security-Policy. Zwei ihrer + Freigaben sind unvermeidlich und in der Datei begründet: `'wasm-unsafe-eval'` + für die Instanziierung des Moduls und `'unsafe-inline'` für Stile, weil die + Synopse als `blob:`-Dokument die Richtlinie der erzeugenden Seite erbt, ihr + Stylesheet aber eingebettet trägt. + +(3) `impressum.html` und `datenschutz.html` tragen die Angaben nach § 5 DDG und +Art. 13 DSGVO. Die dort genannte Aufbewahrungsfrist der Zugriffsprotokolle +(14 Tage) muss zu derjenigen des Servers passen. + +(4) Der Footer der Startseite verweist auf den beigelegten Quelltext-Tarball; dies +verlangt AGPLv3 § 13 für den Netzwerkbetrieb. Als fortlaufende Zweitquelle ist +die Anschrift nach § 3 Absatz 2 genannt. + + +[[aufbau]] +== § 16 Aufbau des Quelltextes + +(1) Gemeinsamer Kern von Befehlszeile und Browser ist `eu.mulk.aendggner.Pipeline`: +Stammgesetz laden, Änderungsdokumente erkennen, zerlegen und anwenden, Synopse +ausgeben. Die Pipeline kennt kein Dateisystem; Eingaben erreichen sie als +`eu.mulk.aendggner.Quelle` (Name und Bytes). + +(2) Die Pakete unterhalb von `src/main/java/eu/mulk/aendggner/` gliedern sich wie +folgt: + +`aenderung/`:: + Erkennen der Dokumentart, Textbereinigung und Zerlegung in Änderungsbefehle + (`parse/`), Herkunftsnachweis (`Provenienz`), Stellenangaben (`Stelle`). +`anwendung/`:: + Anwenden der Befehle auf die Stammfassung, Auflösen der Stellenangaben, Zerlegen + in Sätze, Fortschreiben der Inhaltsübersicht. +`gesetz/`:: + Die Stammfassung nebst Gliederung, Normen, Absätzen und Superskripten; `gii/` + liest das Bundesformat, `land/` die Fassungen der Länder. +`synopse/`:: + Wortdiff, Aufbau und HTML-Ausgabe der Synopse. + +(3) Der Kern ist reines Java ohne Dateisystem- und ohne Netzzugriff; nur vier +Stellen berühren die Plattform (PDFBox, MIME-Erkennung, XML-Parser, +Dateizugriff). Sie sind hinter `eu.mulk.aendggner.Quelle` (Name und Bytes) und +`eu.mulk.aendggner.DateiTyp` (Signaturbytes statt Tika) gebündelt; hierauf beruht, +dass Befehlszeile und Browser dieselbe Pipeline speisen. Ein Java-Server ist +deshalb entbehrlich. + +(4) Zwei Eigenheiten von Web Image sind zu beachten und im Quelltext vermerkt: + +1. Die nativen zlib-Bindungen des JDK fehlen (`java.util.zip.Inflater`), ohne die + kein PDF lesbar ist. `src/wasm/java/.../InflaterErsatz.java` ersetzt sie durch + die reine Java-Umsetzung von jzlib. +2. Typisierte Felder lassen sich derzeit nicht nach `byte[]` umsetzen; der + Dateiinhalt wandert deshalb als Base64-Text über die JS-Grenze. + + +[[pruefung]] +== § 17 Prüfung + +(1) Herstellung und Prüfung erfolgen durch den nachstehenden Befehl: [source,shell script] ---- ./mvnw verify ---- + +(2) Die Prüfung umfasst neben den Einzelprüfungen Akzeptanzprüfungen, die +vollständige Änderungshefte auf die zugehörige Stammfassung anwenden und das +Ergebnis gegen die amtliche Nachfassung stellen. Die hierfür verwendeten +Beispieldaten nebst Herkunftsnachweis (`SOURCES`) liegen unter +`src/test/resources/sampledata/`. |
