aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/eu/mulk/aendggner/aenderung/Aenderungsbefehl.java15
-rw-r--r--src/main/java/eu/mulk/aendggner/aenderung/parse/BefehlErkenner.java17
-rw-r--r--src/main/java/eu/mulk/aendggner/anwendung/BefehlAnwender.java18
3 files changed, 50 insertions, 0 deletions
diff --git a/src/main/java/eu/mulk/aendggner/aenderung/Aenderungsbefehl.java b/src/main/java/eu/mulk/aendggner/aenderung/Aenderungsbefehl.java
index 47bca25..3138eeb 100644
--- a/src/main/java/eu/mulk/aendggner/aenderung/Aenderungsbefehl.java
+++ b/src/main/java/eu/mulk/aendggner/aenderung/Aenderungsbefehl.java
@@ -239,4 +239,19 @@ public sealed interface Aenderungsbefehl {
/** Fallback für alles, was der Parser nicht versteht — muss manuell geprüft werden. */
record UnbekannterBefehl(Stelle stelle, String originalText, Provenienz provenienz)
implements Aenderungsbefehl {}
+
+ /**
+ * „Die Inhaltsübersicht wird entsprechend der vorstehenden Nummer 8 Buchst. a geändert.“
+ *
+ * <p>Ein Befehl, der seinen Inhalt nicht selbst nennt, sondern auf einen anderen Punkt desselben
+ * Artikels verweist. Er wird erkannt, aber nicht angewandt: Die sinngemäße Übertragung setzte
+ * voraus, dass der Anwender die Befehlsliste zurückliest und das Ziel umdeutet („Überschrift des
+ * § 13“ → Titelspalte der Übersichtszeile). Erkannt zu werden ist gleichwohl mehr als gar nichts
+ * — die Rüge sagt dann, dass das Erzeugnis die Grenze zieht, und nicht, dass die Vorlage
+ * unverständlich sei.
+ *
+ * @param verweis der Wortlaut der Verweisung („Nummer 8 Buchst. a“).
+ */
+ record VerweisenderBefehl(Stelle stelle, String verweis, Provenienz provenienz)
+ implements Aenderungsbefehl {}
}
diff --git a/src/main/java/eu/mulk/aendggner/aenderung/parse/BefehlErkenner.java b/src/main/java/eu/mulk/aendggner/aenderung/parse/BefehlErkenner.java
index ef49b7b..f1cece5 100644
--- a/src/main/java/eu/mulk/aendggner/aenderung/parse/BefehlErkenner.java
+++ b/src/main/java/eu/mulk/aendggner/aenderung/parse/BefehlErkenner.java
@@ -17,6 +17,7 @@ import eu.mulk.aendggner.aenderung.Aenderungsbefehl.Streichung;
import eu.mulk.aendggner.aenderung.Aenderungsbefehl.StrukturEinfuegung;
import eu.mulk.aendggner.aenderung.Aenderungsbefehl.StrukturErsetzung;
import eu.mulk.aendggner.aenderung.Aenderungsbefehl.Umnummerierung;
+import eu.mulk.aendggner.aenderung.Aenderungsbefehl.VerweisenderBefehl;
import eu.mulk.aendggner.aenderung.Aenderungsbefehl.WoerterEinfuegung;
import eu.mulk.aendggner.aenderung.Aenderungsbefehl.WortAnker;
import eu.mulk.aendggner.aenderung.Aenderungsbefehl.WortlautVoranstellung;
@@ -520,6 +521,15 @@ final class BefehlErkenner {
private static final Pattern HALBSATZ = Pattern.compile("Halbsatz(?: \\d+[a-z]?)?");
+ // „Die Inhaltsübersicht wird entsprechend der vorstehenden Nummer 8 Buchst. a geändert.“ — ein
+ // Befehl, der seinen Inhalt nicht nennt, sondern auf einen anderen Punkt verweist. Verankert auf
+ // den ganzen Satz, damit ein bloß adverbiales „entsprechend“ nicht mitgerissen wird; ohne
+ // verschachtelte Quantoren und daher für die Mustersuche kostenneutral.
+ private static final Pattern VERWEISENDE_AENDERUNG =
+ Pattern.compile(
+ "^Die Inhaltsübersicht wird entsprechend (?:der|dem) "
+ + "(?:vorstehenden |vorgenannten |nachstehenden )?(.+?) geändert\\.$");
+
private static final Pattern EBENE_BEZEICHNUNG =
Pattern.compile(
"^(?:(?:§|Art\\.) (\\d+[a-z]?)|(?:Absatz|Abs\\.) (\\d+[a-z]?)|Satz(?: (\\d+[a-z]?))?|Sätze"
@@ -880,6 +890,13 @@ final class BefehlErkenner {
Matcher m;
+ // Die Verweisung auf einen anderen Punkt desselben Artikels. Sie steht ganz vorn, weil sie
+ // den vollen Satz beansprucht und sonst von der Neufassung an sich gezogen würde.
+ if ((m = VERWEISENDE_AENDERUNG.matcher(text)).matches()) {
+ return Optional.of(
+ new VerweisenderBefehl(mitInhaltsuebersicht(kontext), m.group(1).strip(), provenienz));
+ }
+
// Inhaltsübersichts-Angaben zuerst prüfen, bevor NEUFASSUNG/STRUKTUR_ERSETZUNG die Phrase
// strukturell (aber mit unparsbarer Stelle) an sich ziehen.
if ((m = INHALTSUEBERSICHT_ANGABE.matcher(text)).matches()) {
diff --git a/src/main/java/eu/mulk/aendggner/anwendung/BefehlAnwender.java b/src/main/java/eu/mulk/aendggner/anwendung/BefehlAnwender.java
index 64c6564..8d9b7e7 100644
--- a/src/main/java/eu/mulk/aendggner/anwendung/BefehlAnwender.java
+++ b/src/main/java/eu/mulk/aendggner/anwendung/BefehlAnwender.java
@@ -18,6 +18,7 @@ import eu.mulk.aendggner.aenderung.Aenderungsbefehl.StrukturEinfuegung;
import eu.mulk.aendggner.aenderung.Aenderungsbefehl.StrukturErsetzung;
import eu.mulk.aendggner.aenderung.Aenderungsbefehl.Umnummerierung;
import eu.mulk.aendggner.aenderung.Aenderungsbefehl.UnbekannterBefehl;
+import eu.mulk.aendggner.aenderung.Aenderungsbefehl.VerweisenderBefehl;
import eu.mulk.aendggner.aenderung.Aenderungsbefehl.WoerterEinfuegung;
import eu.mulk.aendggner.aenderung.Aenderungsbefehl.WortAnker;
import eu.mulk.aendggner.aenderung.Aenderungsbefehl.WortlautVoranstellung;
@@ -667,6 +668,20 @@ public final class BefehlAnwender {
if (befehl instanceof UnbekannterBefehl) {
return manuell(befehl, Grund.NICHT_ERKANNT, "Befehl nicht erkannt.");
}
+ // Gelesen, aber bewusst nicht ausgeführt. Die Weiche steht vor der Inhaltsübersichts-Weiche,
+ // damit die Rüge den Verweis nennt und nicht bloß die allgemeine Grenze jener Norm: Die
+ // sinngemäße Übertragung eines anderen Punktes setzte einen Rückgriff auf die Befehlsliste und
+ // eine Umdeutung des Ziels voraus („Überschrift des § 13“ → Titelspalte der Übersichtszeile),
+ // die dieser Anwender nicht leistet. Sie zu erraten wäre schlimmer, als sie zu benennen.
+ if (befehl instanceof VerweisenderBefehl v) {
+ return manuell(
+ befehl,
+ Grund.NICHT_UNTERSTUETZT,
+ "Der Befehl verweist auf „"
+ + v.verweis()
+ + "“ desselben Artikels; die sinngemäße Übertragung auf die Inhaltsübersicht ist"
+ + " nicht umgesetzt.");
+ }
// Sammelbefehle vor den Spezialweichen dispatchen (jeder Teil wird einzeln geroutet).
if (befehl instanceof Sammelbefehl s) {
return wendeSammelAn(normen, gliederungen, s);
@@ -724,6 +739,9 @@ public final class BefehlAnwender {
wendeGliederungsUeberschriftenAn(normen, gliederungen, g);
case Sammelbefehl s -> wendeSammelAn(normen, gliederungen, s);
case UnbekannterBefehl u -> manuell(befehl, Grund.NICHT_ERKANNT, "Befehl nicht erkannt.");
+ // Oben abgefangen; die Weiche muss ihn gleichwohl kennen.
+ case VerweisenderBefehl v ->
+ manuell(befehl, Grund.NICHT_UNTERSTUETZT, "Verweisender Befehl.");
};
} catch (RuntimeException e) {
return manuell(befehl, Grund.FEHLGESCHLAGEN, "Anwendung fehlgeschlagen: " + e);