aboutsummaryrefslogtreecommitdiff
path: root/src/main
Commit message (Collapse)AuthorAgeFilesLines
* Recognize compound and multi-pair amendment commandsMatthias Andreas Benkard2026-07-132-11/+234
| | | | | | | | | | | | | | | | | | | | | | Split BefehlErkenner into a single-command pass and a fallback that composes Sammelbefehle from commands chained with "und"/", wird": - Multi-pair replacement ("… A durch B und C durch D ersetzt") emits one Ersetzung per pair, crossed with the (possibly coordinated) Stelle. - Verbund splitter probes each "und"/", wird" boundary; when both halves parse — trying the right clause as-is, capitalized, or with the left clause's locative prefix — it folds them into one Sammelbefehl. The single pass no longer short-circuits when a pattern matches but its Stelle is unparseable, so the fallback still gets a chance. Add "ein Komma eingefügt" and anchor-first insertion patterns the splitter needs, and let StellenParser.parseMehrfach inherit the component type for bare-number continuations ("Absatz 1 und 5"). Cuts UnbekannterBefehl counts: GEG 50->36, IfSG 11->7, AGG/UWG 2->1. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Change-Id: I8f76edd0c9ed6cf68c10c50f535a8182e13e378e
* Support multi-target "jeweils" commands and range renumberingMatthias Andreas Benkard2026-07-134-14/+196
| | | | | | | | | | | | Add a Sammelbefehl command that applies one operation to several "und"/"sowie"/comma-coordinated Stellen sharing a common prefix, and resolve "Die bisherigen Absätze X bis Y werden zu den Absätzen X' bis Y'" into descending single renumberings. Parsing gains StellenParser.parseMehrfach; the applier folds sub-commands into one log entry. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Change-Id: Iaa2c7161066d40d0605c00d3b6ca9a08696070e7
* Add AGG, BayJG, GEG, ProdHaftG, and UWG sample data.Matthias Andreas Benkard2026-07-1342-0/+29415
| | | | | | | | | | | | | | | | | | | | Five new datasets with provenance in SOURCES files: * UWG: 3. UWGAendG (BGBl. 2026 I Nr. 43) in the new digital BGBl format, plus drafts. * GEG: the 2023 "Heizungsgesetz" (BGBl. 2023 I Nr. 280, new format) and the pending GModG 2026 drafts. * AGG: 2. AGGAendG drafts (RefE/RegE/BT-Drs 21/6178) -- the base XML predates the bill, so this dataset produces real diffs -- and the official BMJV synopsis as ground truth. * ProdHaftG: product-liability modernization drafts (Artikel 1 is a replacement act, Artikel 2 amends the old law), with official synopsis. * BayJG: Bavarian hunting-law amendment (GVBl. 2026 S. 113) -- state law is not yet supported by the tool; kept for future work. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Change-Id: I8c33b6a19178f73cece9c9da99c713009016e578
* Support the digital BGBl format and bill drafts as inputs.Matthias Andreas Benkard2026-07-139-70/+481
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The Bundesgesetzblatt has been published digitally via recht.bund.de since 2023 in a new single-column layout, and pending amendment acts are only available as Referenten-/Regierungsentwuerfe or Bundestag printed papers. Both now work as patch inputs: * PDF extraction filters out small print by font size (two-pass PDFTextStripper): in the new BGBl format, footnote blocks and superscript footnote markers would otherwise land in the middle of the statutory text, even inside quoted passages. * TextBereiniger recognizes the new page headers (BGBl "Seite N von M", draft page markers " - N - ", Bundestag printed-paper headers) and joins markerless end-of-line hyphenation (BT-Drs PDFs break words without a hyphen character; regular wraps carry a trailing space, so its absence is the signal -- gated on the source using the trailing-space convention at all, protecting hand-written plain-text inputs). BMJV draft templates draw the hanging opening quote after the paragraph marker ("(1) „" / "§ 19„"); this inversion is repaired. * Drafts embed the statutory text between a cover sheet and a Begruendung section; article scanning now stops at the Begruendung heading. Articles without numbered items (single-command articles like ProdHaftG-RegE Artikel 2) are parsed from the preamble rest. * Target-law matching is declension-tolerant ("Das Allgemeine Gleichbehandlungsgesetz" matches "Allgemeines Gleichbehandlungsgesetz") via rough word-stem comparison. * New command form StrukturErsetzung ("§ 2 Absatz 2 wird durch die folgenden Absätze 2 und 3 ersetzt"); "durch die folgende Überschrift/den folgenden § N ersetzt" map to Neufassung; plural insertions ("die folgenden Absätze 6 und 7"), triple-letter outline markers (aaa), the compound punctuation replacement ("durch ein Komma und die Wörter ... ersetzt"), and Inhaltsuebersicht-Angaben inside a context frame are recognized. End-to-end smoke tests cover the four new datasets: UWG (new BGBl format, footnote-filter assertion), GEG 2023 ("Heizungsgesetz", 121 commands), AGG (BT-Drs draft against an unconsolidated base -- the first dataset with real diffs, spot-checked against the official BMJV synopsis), and ProdHaftG (draft whose Artikel 1 is a replacement law and only Artikel 2 amends the base). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Change-Id: Id1b12bc0bee4178bd1a5c55b3a83f6e13944af69
* Add IfSG sample data.Matthias Andreas Benkard2026-07-1311-0/+2354
| | | | | | | | | | | The Infektionsschutzgesetz as gii-norm XML, EPUB, and PDF (consolidated as of 2020-11-20, i.e. already including the Art. 1 changes below), the Drittes Bevoelkerungsschutzgesetz (BGBl. I 2020 S. 2397) as published, and the Bundestag/Bundesrat drafting documents, with provenance URLs in SOURCES. Used by the end-to-end smoke test. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Change-Id: I1221734ea3e3dab705151421774151438be1b337
* Implement the synopsis pipeline for amendment acts.Matthias Andreas Benkard2026-07-1324-35/+3187
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Add the full vertical slice from input files to a two-column HTML synopsis: * gesetz, gesetz.gii: immutable law model (Gesetz/Norm/Absatz) and an offline loader for the gii-norm XML format of gesetze-im-internet.de, flattening DL enumerations, tables, and pre blocks. * aenderung: amendment command model as a sealed interface with records (Ersetzung, Neufassung, Einfuegung, Anfuegung, Aufhebung, Streichung, Umnummerierung), including UnbekannterBefehl as the mandatory fallback -- unrecognized commands are reported, never dropped. * aenderung.parse: text extraction (PDFBox in content-stream order for two-column BGBl PDFs, plain text as escape hatch), BGBl header and hyphenation cleanup, quote extraction with placeholder substitution (quoted blocks cannot confuse the command regexes; unbalanced quotes -- which occur in real BGBl documents -- become warnings), outline scanning with successor-validated markers (1., a), aa), aa1)), and the command recognizer with context-frame stacking. * anwendung: sequential command application with a per-command protocol (ANGEWANDT / MANUELL_PRUEFEN plus reason), scope resolution down to sentence/enumeration ranges via a German sentence splitter. * synopse: norm pairing, word-level diff via java-diff-utils, and a self-contained HTML renderer with a Manuell-pruefen section. The CLI gains -o/--output, --vollstaendig, --artikel, --extract-only, and hidden debug flags (--dump-gesetz, --dump-befehle). On the IfSG sample (Drittes Bevoelkerungsschutzgesetz, BGBl. I 2020 S. 2397), 63 of 75 commands in Artikel 1 and 2 parse into typed commands; the remainder are ranges and compound commands that are deliberately out of scope for v1. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Change-Id: I93ef8ba300f1cac70916722f23c0cefc5f62da2b
* Modernize build: Java 21, Tika 3, PDFBox 3, JUnit 5.Matthias Andreas Benkard2026-07-131-32/+0
| | | | | | | | | | | | | | Bump all dependencies and plugins to current versions. Replace the tika-parsers bundle with a direct PDFBox dependency (we need PDFTextStripper control), add java-diff-utils for the synopsis diff, and add JUnit 5 with AssertJ for testing. Drop unused dependencies (tess4j, Lanterna, term4j, sqlite-jdbc, imageio codecs, annotation libraries) in favour of jspecify. Regenerate the Maven wrapper with the official plugin (Takari is dead) and remove the vestigial Ant wrapper and Tika configuration. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Change-Id: I0e1813b3967027cbb0bb978591d345ce138fa0a0
* Configure Tika correctly.Matthias Andreas Benkard2020-12-064-12/+96
| | | | | | | | | With the new configuration, Tika can now extract text from PDFs and XML documents. Also configures logging for the application. Change-Id: I7a89c2b232ed4e220665dd335a5f5a0cc3ef2994
* Add Apache Tika, remove iText7.Matthias Andreas Benkard2020-11-232-6/+26
| | | | Change-Id: I9736779cf57050a1dfd43d18625eb464a7179a9f
* Modularize, avoid shade plugin by default.Matthias Andreas Benkard2020-11-231-0/+3
| | | | Change-Id: I704d78b7553f057f73e1387078623d8fe5d0b154
* Define CLI arguments.Matthias Andreas Benkard2020-11-221-1/+13
| | | | Change-Id: I37d6cbb000df63013277fe4628cdb6570d68101a
* Project skeletonMatthias Andreas Benkard2020-11-221-0/+20
Change-Id: I5609adfca13ffad643a3db93e848fc01636b066a