Implement the synopsis pipeline for amendment acts.

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
24 files changed
tree: 05984a493b1a583543068be368aeb191ccd01d79
  1. .mvn/
  2. src/
  3. .gitignore
  4. COPYING
  5. mvnw
  6. mvnw.cmd
  7. pom.xml
  8. README.adoc