From bb8e5641f68c3c24c05340ca859d35de3d08242c Mon Sep 17 00:00:00 2001 From: philipp Date: Fri, 16 Feb 2024 09:21:21 +0100 Subject: [PATCH] cleaner code: --- data/expected/par/10002296 | 2 +- src/paragraph/parser/abschnitt.rs | 123 ++++++++++++++++++------------ src/paragraph/parser/liste.rs | 78 +++++++++++++++++++ src/paragraph/parser/mod.rs | 48 +----------- 4 files changed, 153 insertions(+), 98 deletions(-) create mode 100644 src/paragraph/parser/liste.rs diff --git a/data/expected/par/10002296 b/data/expected/par/10002296 index a90b822..8629d3c 100644 --- a/data/expected/par/10002296 +++ b/data/expected/par/10002296 @@ -209,7 +209,7 @@ New_par: § 83.;{"Item":[{"Text":"(1) Wer einen anderen am Körper verletzt oder New_new_para_header: Schwere Körperverletzung New_par: § 84.;{"Item":[{"Text":"(1) Wer einen anderen am Körper misshandelt und dadurch fahrlässig eine länger als vierundzwanzig Tage dauernde Gesundheitsschädigung oder Berufsunfähigkeit oder eine an sich schwere Verletzung oder Gesundheitsschädigung zufügt, ist mit Freiheitsstrafe bis zu drei Jahren zu bestrafen."},{"Text":"(2) Ebenso ist zu bestrafen, wer eine Körperverletzung (§ 83 Abs. 1 oder Abs. 2) an einem Beamten, Zeugen oder Sachverständigen während oder wegen der Vollziehung seiner Aufgaben oder der Erfüllung seiner Pflichten begeht."},{"Text":"(3) Ebenso ist der Täter zu bestrafen, wenn er mindestens drei selbstständige Taten (§ 83 Abs. 1 oder Abs. 2) ohne begreiflichen Anlass und unter Anwendung erheblicher Gewalt begangen hat."},{"Text":"(4) Mit Freiheitsstrafe von sechs Monaten bis zu fünf Jahren ist zu bestrafen, wer einen anderen am Körper verletzt oder an der Gesundheit schädigt und dadurch, wenn auch nur fahrlässig, eine schwere Körperverletzung oder Gesundheitsschädigung (Abs. 1) des anderen herbeiführt."},{"List":[{"Text":"(5) Ebenso ist zu bestrafen, wer eine Körperverletzung (§ 83 Abs. 1 oder Abs. 2) begeht"},{"List":[{"List":[{"Text":"1. auf eine Weise, mit der Lebensgefahr verbunden ist,"},{"Text":"2. mit mindestens zwei Personen in verabredeter Verbindung oder"},{"Text":"3. unter Zufügung besonderer Qualen."}]}]}]}]} New_new_para_header: Körperverletzung mit schweren Dauerfolgen -New_par: § 85.;{"Item":[{"List":[{"Text":"(1) Wer einen anderen am Körper misshandelt und dadurch fahrlässig für immer oder für lange Zeit"},{"List":[{"List":[{"Text":"1. den Verlust oder eine schwere Schädigung der Sprache, des Sehvermögens, des Gehörs oder der Fortpflanzungsfähigkeit,"},{"Text":"2. eine erhebliche Verstümmelung oder eine auffallende Verunstaltung,"},{"Text":"2a. eine Verstümmelung oder sonstige Verletzung der Genitalien, die geeignet ist, eine nachhaltige Beeinträchtigung des sexuellen Empfindens herbeizuführen, oder"},{"Text":"3. ein schweres Leiden, Siechtum oder Berufsunfähigkeit des Geschädigten,"}]}]},{"Text":"herbeiführt, ist mit Freiheitsstrafe von sechs Monaten bis zu fünf Jahren zu bestrafen."}]},{"Text":"(2) Mit Freiheitsstrafe von einem bis zu zehn Jahren ist zu bestrafen, wer einen anderen am Körper verletzt oder an der Gesundheit schädigt und dadurch, wenn auch nur fahrlässig, eine schwere Dauerfolge (Abs. 1) beim Verletzten herbeiführt."}]} +New_par: § 85.;{"Item":[{"List":[{"Text":"(1) Wer einen anderen am Körper misshandelt und dadurch fahrlässig für immer oder für lange Zeit"},{"List":[{"List":[{"Text":"1. den Verlust oder eine schwere Schädigung der Sprache, des Sehvermögens, des Gehörs oder der Fortpflanzungsfähigkeit,"},{"Text":"2. eine erhebliche Verstümmelung oder eine auffallende Verunstaltung,"},{"Text":"2a. eine Verstümmelung oder sonstige Verletzung der Genitalien, die geeignet ist, eine nachhaltige Beeinträchtigung des sexuellen Empfindens herbeizuführen, oder"},{"Text":"3. ein schweres Leiden, Siechtum oder Berufsunfähigkeit des Geschädigten,"}]},{"Text":"herbeiführt, ist mit Freiheitsstrafe von sechs Monaten bis zu fünf Jahren zu bestrafen."}]}]},{"Text":"(2) Mit Freiheitsstrafe von einem bis zu zehn Jahren ist zu bestrafen, wer einen anderen am Körper verletzt oder an der Gesundheit schädigt und dadurch, wenn auch nur fahrlässig, eine schwere Dauerfolge (Abs. 1) beim Verletzten herbeiführt."}]} New_new_para_header: Körperverletzung mit tödlichem Ausgang New_par: § 86.;{"Item":[{"Text":"(1) Wer einen anderen am Körper misshandelt und dadurch fahrlässig dessen Tod herbeiführt, ist mit Freiheitsstrafe von einem bis zu zehn Jahren zu bestrafen."},{"Text":"(2) Wer einen anderen am Körper verletzt oder an der Gesundheit schädigt und dadurch fahrlässig dessen Tod herbeiführt, ist mit Freiheitsstrafe von einem bis zu fünfzehn Jahren zu bestrafen."}]} New_new_para_header: Absichtliche schwere Körperverletzung diff --git a/src/paragraph/parser/abschnitt.rs b/src/paragraph/parser/abschnitt.rs index 65ed42f..5b0b464 100644 --- a/src/paragraph/parser/abschnitt.rs +++ b/src/paragraph/parser/abschnitt.rs @@ -4,8 +4,9 @@ use std::iter::Peekable; use roxmltree::{Children, Node}; use crate::law::LawBuilder; +use crate::paragraph::parser::liste::Liste; use crate::paragraph::parser::{ - Absatz, AbsatzAbs, Content, Fzinhalt, Kzinhalt, Liste, Table, Ueberschrift, + Absatz, AbsatzAbs, Content, Fzinhalt, Kzinhalt, Table, Ueberschrift, }; #[derive(Debug, PartialEq, Default)] @@ -30,56 +31,13 @@ impl Abschnitt { } let mut absatze = Vec::new(); - let absatz = AbsatzAbs::parse(c.next().expect("We need at least one 'Absatz'")); - let par_id = absatz - .gldsym - .clone() - .expect("First 'Absatz' needs to have § id"); - // If there's a "liste" after an "absatz", the "liste" should be part of the "absatz" - if let Some(child) = c.peek() { - if Liste::test(child) { - let liste = Liste::parse(c.next().unwrap()); - let mut to_add = vec![Content::Text(absatz.content), liste.get_content()]; - if let Some(subchild) = c.peek() { - if Absatz::test_with_typ(subchild, "satz") { - // After a 'liste' there can be a ' par_id, + None => panic!("First paragraph needs to have an id, not found"), + }; + absatze.push(first_abs); //There can be as many 'Absätze' as our lovely lawsetter wants while let Some(child) = c.peek() { @@ -229,4 +187,69 @@ impl Abschnitt { } true } + + // Parses one logical 'Absatz'. If there's a List or Table after the Absatz, RIS assumes this + // one to be included in the paragraph + // + // # Returns + // - String: (optional) paragraph id + // - Content: content of the paragraph + fn parse_absatz(&self, c: &mut Peekable) -> (Option, Content) { + let absatz = AbsatzAbs::parse(c.next().unwrap()); + let par_id = absatz.gldsym; + + // If there's a "liste" after an "absatz", the "liste" should be part of the "absatz" + if let Some(child) = c.peek() { + if Liste::test(child) { + println!("11@"); + ( + par_id, + Content::List(vec![ + Content::Text(absatz.content), + Liste::parse_real(c).get_content(), + ]), + ) + } else if Table::test(child) { + // If there's a "table" after an "absatz", the "table" should be part of the "absatz" + let table = Table::parse(c.next().unwrap()); + if let Some(child) = c.peek() { + if Absatz::test_with_typ(child, "erltext") { + let after_absatz = Absatz::parse(c.next().unwrap()); + ( + par_id, + Content::List(vec![ + Content::Text(absatz.content), + Content::List(table.get_list()), + Content::Text(after_absatz.content), + ]), + ) + } else { + ( + par_id, + Content::List(vec![ + Content::Text(absatz.content), + Content::List(table.get_list()), + ]), + ) + } + } else { + (par_id, Content::Text("THIS SHOULD NOT HAPPEN".into())) + } + } else if Absatz::test_with_typ(child, "satz") { + // After a 'liste' there can be a ', +} +impl Liste { + pub(crate) fn test(n: &Node) -> bool { + n.tag_name().name() == "liste" + } + + //TODO: rename: parse_full + pub(crate) fn parse_real(n: &mut Peekable) -> Self { + Expect::from(n.peek().unwrap()).tag("liste"); + + let mut content = Vec::new(); + + let mut c = n.next().unwrap().children().peekable(); + + // Parse stuff inside + while let Some(child) = c.peek() { + if Ziffernliste::test(child) { + content.push(Ziffernliste::parse(c.next().unwrap()).get_content()); + } else if Schlussteil::test(child) { + // 162 Schifffahrtsgesetz show use that a 'schlussteil' can be at the start of a list + content.push(Content::Text(Schlussteil::parse(c.next().unwrap()).content)); + } else { + break; + } + } + + // Parse stuff after , which logically still is for the list + while let Some(child) = n.peek() { + if Absatz::test_with_typ(child, "satz") { + content.push(Content::Text(Absatz::parse(n.next().unwrap()).content)); + } else { + break; + } + } + Self { content } + } + + pub(crate) fn parse(n: Node) -> Self { + Expect::from(&n).tag("liste"); + + let mut content = Vec::new(); + + let mut c = n.children().peekable(); + + while let Some(child) = c.peek() { + if Ziffernliste::test(child) { + content.push(Ziffernliste::parse(c.next().unwrap()).get_content()); + } else if Schlussteil::test(child) { + // 162 Schifffahrtsgesetz show use that a 'schlussteil' can be at the start of a list + content.push(Content::Text(Schlussteil::parse(c.next().unwrap()).content)); + } else if Absatz::test_with_typ(child, "satz") { + content.push(Content::Text(Absatz::parse(c.next().unwrap()).content)); + } else { + break; + } + } + + assert_eq!(c.next(), None); + + Self { content } + } + + pub(crate) fn get_content(&self) -> Content { + Content::List(self.content.clone()) + } +} diff --git a/src/paragraph/parser/mod.rs b/src/paragraph/parser/mod.rs index 6e76d89..224acc3 100644 --- a/src/paragraph/parser/mod.rs +++ b/src/paragraph/parser/mod.rs @@ -15,6 +15,7 @@ // limitations under the Licence. mod abschnitt; +mod liste; use abschnitt::Abschnitt; use roxmltree::Node; @@ -270,53 +271,6 @@ impl Schlussteil { } } -#[derive(Debug)] -pub(crate) struct Liste { - content: Vec, -} -impl Liste { - pub(crate) fn test(n: &Node) -> bool { - n.tag_name().name() == "liste" - } - - pub(crate) fn parse(n: Node) -> Self { - assert!(Self::test(&n)); - - let mut content = Vec::new(); - - let mut c = n.children().peekable(); - - // 162 Schifffahrtsgesetz show use that a 'schlussteil' can be at the start of a list - while let Some(child) = c.peek() { - if Schlussteil::test(child) { - content.push(Content::Text(Schlussteil::parse(c.next().unwrap()).content)); - } else { - break; - } - } - - content.push(Ziffernliste::parse(c.next().unwrap()).get_content()); - - while let Some(child) = c.peek() { - if Ziffernliste::test(child) { - content.push(Ziffernliste::parse(c.next().unwrap()).get_content()); - } else if Schlussteil::test(child) { - content.push(Content::Text(Schlussteil::parse(c.next().unwrap()).content)); - } else { - break; - } - } - - assert_eq!(c.next(), None); - - Self { content } - } - - pub(crate) fn get_content(&self) -> Content { - Content::List(self.content.clone()) - } -} - #[derive(Debug, PartialEq)] pub(crate) struct AbsatzAbs { gldsym: Option,