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/parse/InkrafttretensLeser.java29
1 files changed, 28 insertions, 1 deletions
diff --git a/src/main/java/eu/mulk/aendggner/aenderung/parse/InkrafttretensLeser.java b/src/main/java/eu/mulk/aendggner/aenderung/parse/InkrafttretensLeser.java
index 2892466..fccad16 100644
--- a/src/main/java/eu/mulk/aendggner/aenderung/parse/InkrafttretensLeser.java
+++ b/src/main/java/eu/mulk/aendggner/aenderung/parse/InkrafttretensLeser.java
@@ -45,6 +45,8 @@ public final class InkrafttretensLeser {
+ "(?:\\s+Buchstabe\\s+(\\p{Ll})\\b)?"
+ "(?:\\s+Doppelbuchstabe\\s+(\\p{Ll}{2})\\b)?");
+ private static final Pattern VERB = Pattern.compile("\\b(?:tritt|treten)\\b");
+
private static final Pattern AENDERUNGSFORMEL = Pattern.compile("wird wie folgt geändert");
private InkrafttretensLeser() {}
@@ -75,7 +77,7 @@ public final class InkrafttretensLeser {
/** Liest die Anordnungen eines einzelnen Blocks; {@code null}, wenn er keine trägt. */
public static @Nullable Inkrafttreten lies(String blockText) {
- var text = blockText.replaceAll("\\s+", " ").strip();
+ var text = ohneUeberschrift(blockText).replaceAll("\\s+", " ").strip();
var regeln = new ArrayList<Regel>();
for (var absatz : teileInAbsaetze(text)) {
var regel = liesAbsatz(absatz);
@@ -87,6 +89,31 @@ public final class InkrafttretensLeser {
}
/**
+ * Streicht die Überschrift des Artikels („Inkrafttreten“), die als eigene Zeile vor der Anordnung
+ * steht. Ohne das begänne der Wortlaut der Regel mit ihr, denn ein Artikel ohne Absatzmarken ist
+ * im ganzen ein Absatz.
+ */
+ private static String ohneUeberschrift(String blockText) {
+ var zeilen = blockText.lines().toList();
+ for (int i = 0; i < zeilen.size(); i++) {
+ var zeile = zeilen.get(i).strip();
+ if (zeile.isEmpty()) {
+ continue;
+ }
+ // Auf das bloße Vorkommen von „tritt“ ist kein Verlass: Die Überschrift „Inkrafttreten“
+ // trägt es selbst. Maßgeblich ist das Wort.
+ if (ABSATZ.matcher(zeile).lookingAt() || VERB.matcher(zeile).find()) {
+ return String.join("\n", zeilen.subList(i, zeilen.size()));
+ }
+ // Eine Überschrift steht für sich und endet nicht wie ein Satz.
+ if (zeile.endsWith(".") || zeile.length() > 60) {
+ return String.join("\n", zeilen.subList(i, zeilen.size()));
+ }
+ }
+ return blockText;
+ }
+
+ /**
* Zerlegt den Schlussartikel an seinen Absatzmarken. Ohne Marken ist der ganze Text ein Absatz
* („Dieses Gesetz tritt am Tage nach seiner Verkündung in Kraft.“).
*/