),
@@ -526,94 +461,94 @@ impl Display for Content {
}
}
-#[cfg(test)]
-mod tests {
- use pretty_assertions::assert_eq;
- use std::{
- fs::File,
- io::{self, BufRead, Read},
- path::Path,
- };
-
- use super::*;
-
- fn read_lines(filename: P) -> io::Result>
- where
- P: AsRef,
- {
- let file = File::open(filename)?;
- let buf_reader = io::BufReader::new(file);
- buf_reader.lines().collect()
- }
-
- #[ignore]
- #[test]
- fn test_with_live_data() {
- let law: Law = LawBuilder::new("UrhG").into();
-
- let path = Path::new("./data/urhg/builder.result");
- let mut file = File::open(path).unwrap();
- let mut json = String::new();
- file.read_to_string(&mut json).unwrap();
-
- let expected: Law = serde_json::from_str(&json).unwrap();
-
- assert_eq!(law, expected);
- }
-
- #[ignore]
- #[test]
- fn test_stgb_with_live_data() {
- let law: Law = LawBuilder::new("StGB").into();
-
- let path = Path::new("./data/stgb/builder.result");
- let mut file = File::open(path).unwrap();
- let mut json = String::new();
- file.read_to_string(&mut json).unwrap();
-
- let expected: Law = serde_json::from_str(&json).unwrap();
-
- //println!("{}", serde_json::to_string(&law).unwrap());
-
- assert_eq!(law, expected);
- }
-
- #[test]
- fn test_builder_full_urhg() {
- let mut builder = LawBuilder::test("UrhG");
-
- let path = Path::new("./data/urhg/par");
- let input = read_lines(path.join("../par.result")).unwrap();
-
- for i in input {
- let (command, content) = i.split_once(":").unwrap();
-
- match command {
- "New_header" => builder.new_header(content),
- "New desc" => builder.new_desc(content),
- "New_new_para_header" => builder.new_next_para_header(content),
- "New_par" => {
- let (par, real_content) = i.split_once(";").unwrap();
- let (_, real_par) = par.split_once(":").unwrap();
- let real_content: Content = serde_json::from_str(real_content).unwrap();
- builder.new_par(real_par.trim().into(), real_content);
- }
- _ => {
- panic!("Don't know command '{command}'");
- }
- }
- }
-
- let actual: Law = builder.into();
-
- //println!("{}", serde_json::to_string(&law).unwrap());
-
- let mut file = File::open(path.join("../builder.result")).unwrap();
- let mut json = String::new();
- file.read_to_string(&mut json).unwrap();
-
- let expected = serde_json::from_str(&json).unwrap();
-
- assert_eq!(actual, expected);
- }
-}
+//#[cfg(test)]
+//mod tests {
+// use pretty_assertions::assert_eq;
+// use std::{
+// fs::File,
+// io::{self, BufRead, Read},
+// path::Path,
+// };
+//
+// use super::*;
+//
+// fn read_lines(filename: P) -> io::Result>
+// where
+// P: AsRef,
+// {
+// let file = File::open(filename)?;
+// let buf_reader = io::BufReader::new(file);
+// buf_reader.lines().collect()
+// }
+//
+// #[ignore]
+// #[test]
+// fn test_with_live_data() {
+// let law: Law = LawBuilder::new("UrhG").into();
+//
+// let path = Path::new("./data/urhg/builder.result");
+// let mut file = File::open(path).unwrap();
+// let mut json = String::new();
+// file.read_to_string(&mut json).unwrap();
+//
+// let expected: Law = serde_json::from_str(&json).unwrap();
+//
+// assert_eq!(law, expected);
+// }
+//
+// #[ignore]
+// #[test]
+// fn test_stgb_with_live_data() {
+// let law: Law = LawBuilder::new("StGB").into();
+//
+// let path = Path::new("./data/stgb/builder.result");
+// let mut file = File::open(path).unwrap();
+// let mut json = String::new();
+// file.read_to_string(&mut json).unwrap();
+//
+// let expected: Law = serde_json::from_str(&json).unwrap();
+//
+// //println!("{}", serde_json::to_string(&law).unwrap());
+//
+// assert_eq!(law, expected);
+// }
+//
+// #[test]
+// fn test_builder_full_urhg() {
+// let mut builder = LawBuilder::test("UrhG");
+//
+// let path = Path::new("./data/urhg/par");
+// let input = read_lines(path.join("../par.result")).unwrap();
+//
+// for i in input {
+// let (command, content) = i.split_once(":").unwrap();
+//
+// match command {
+// "New_header" => builder.new_header(content),
+// "New desc" => builder.new_desc(content),
+// "New_new_para_header" => builder.new_next_para_header(content),
+// "New_par" => {
+// let (par, real_content) = i.split_once(";").unwrap();
+// let (_, real_par) = par.split_once(":").unwrap();
+// let real_content: Content = serde_json::from_str(real_content).unwrap();
+// builder.new_par(real_par.trim().into(), real_content);
+// }
+// _ => {
+// panic!("Don't know command '{command}'");
+// }
+// }
+// }
+//
+// let actual: Law = builder.into();
+//
+// //println!("{}", serde_json::to_string(&law).unwrap());
+//
+// let mut file = File::open(path.join("../builder.result")).unwrap();
+// let mut json = String::new();
+// file.read_to_string(&mut json).unwrap();
+//
+// let expected = serde_json::from_str(&json).unwrap();
+//
+// assert_eq!(actual, expected);
+// }
+//}
diff --git a/src/law/responsible.rs b/src/law/responsible.rs
index bef0af0..fa28004 100644
--- a/src/law/responsible.rs
+++ b/src/law/responsible.rs
@@ -1,17 +1,17 @@
-pub(crate) fn contains_without_unter(classifier_name: &str, instance_name: &str) -> bool {
+pub fn contains_without_unter(classifier_name: &str, instance_name: &str) -> bool {
instance_name
.to_lowercase()
.contains(&classifier_name.to_lowercase())
&& !instance_name.to_lowercase().contains("unter")
}
-pub(crate) fn contains(classifier_name: &str, instance_name: &str) -> bool {
+pub fn contains(classifier_name: &str, instance_name: &str) -> bool {
instance_name
.to_lowercase()
.contains(&classifier_name.to_lowercase())
}
-pub(crate) fn starts_with_roman_number(_: &str, s: &str) -> bool {
+pub fn starts_with_roman_number(_: &str, s: &str) -> bool {
// Define the prefixes for Roman numerals.
let roman_prefixes = [
"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII", "XIII", "XIV",
@@ -24,20 +24,20 @@ pub(crate) fn starts_with_roman_number(_: &str, s: &str) -> bool {
.any(|&prefix| s.starts_with(&(prefix.to_string() + ".")))
}
-pub(crate) fn contains_at_start(_classifier_name: &str, instance_name: &str) -> bool {
+pub fn contains_at_start(_classifier_name: &str, instance_name: &str) -> bool {
!instance_name.is_empty() && instance_name.starts_with('@')
}
-pub(crate) fn starts_with_number(_classifier_name: &str, instance_name: &str) -> bool {
+pub fn starts_with_number(_classifier_name: &str, instance_name: &str) -> bool {
matches!(instance_name.trim().as_bytes().first(), Some(c) if c.is_ascii_digit())
}
-pub(crate) fn starts_with_letter(_classifier_name: &str, instance_name: &str) -> bool {
+pub fn starts_with_letter(_classifier_name: &str, instance_name: &str) -> bool {
instance_name.starts_with(|c: char| c.is_ascii_lowercase())
&& (instance_name.chars().nth(1) == Some('.') || instance_name.chars().nth(1) == Some(')'))
}
-pub(crate) fn starts_with_uppercaseletter(_classifier_name: &str, instance_name: &str) -> bool {
+pub fn starts_with_uppercaseletter(_classifier_name: &str, instance_name: &str) -> bool {
instance_name.starts_with(|c: char| c.is_ascii_uppercase())
&& (instance_name.chars().nth(1) == Some('.') || instance_name.chars().nth(1) == Some(')'))
}
diff --git a/src/lib.rs b/src/lib.rs
index 7c40796..8de8ebe 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,2 +1,3 @@
+pub mod law;
pub mod misc;
pub mod risparser;
diff --git a/src/main.rs b/src/main.rs
index a645d85..bf7f331 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,7 +1,4 @@
-use law::{Law, LawBuilder};
-
-mod law;
-mod par;
+use risp::law::{Law, LawBuilder};
fn main() {
env_logger::init();
diff --git a/src/par/mod.rs b/src/par/mod.rs
deleted file mode 100644
index fce2fb5..0000000
--- a/src/par/mod.rs
+++ /dev/null
@@ -1,200 +0,0 @@
-mod parser;
-
-use crate::{law::LawBuilder, par::parser::Risdok};
-use log::{debug, info};
-use risp::misc::Error;
-
-fn fetch_page(url: &str) -> Result {
- Ok(ureq::get(url).call()?.into_string()?)
-}
-
-pub(crate) fn parse(url: &str, builder: &mut LawBuilder) -> Result {
- info!("Parsing {url}");
- let xml = fetch_page(url)?;
- parse_from_str(&xml, builder)
-}
-
-pub(crate) fn parse_from_str(xml: &str, builder: &mut LawBuilder) -> Result {
- let xml = xml.replace("", "-"); // used e.g. in §11 Abs. 3 UrhG
-
- let xml = xml.replace(
- // in § 17 (2)
- r#"(2) Einer Rundfunksendung steht es gleich, wenn ein Werk von einer im In- oder im Ausland gelegenen Stelle aus der Öffentlichkeit im Inland, ähnlich wie durch Rundfunk, aber mit Hilfe von Leitungen wahrnehmbar gemacht wird."#,
- r#"(2) Einer Rundfunksendung steht es gleich, wenn ein Werk von einer im In- oder im Ausland gelegenen Stelle aus der Öffentlichkeit im Inland, ähnlich wie durch Rundfunk, aber mit Hilfe von Leitungen wahrnehmbar gemacht wird."#,
- );
-
- let xml = xml.replace(
- // in § 17 (2)
- r#"(3) Die Verjährungsfrist beträgtzwanzig Jahre,wenn die Handlung zwar nicht mit lebenslanger Freiheitsstrafe, aber mit mehr als zehnjähriger Freiheitsstrafe bedroht ist;zehn Jahre,wenn die Handlung mit mehr als fünfjähriger, aber höchstens zehnjähriger Freiheitsstrafe bedroht ist;fünf Jahre,wenn die Handlung mit mehr als einjähriger, aber höchstens fünfjähriger Freiheitsstrafe bedroht ist;drei Jahre,wenn die Handlung mit mehr als sechsmonatiger, aber höchstens einjähriger Freiheitsstrafe bedroht ist;ein Jahr,wenn die Handlung mit nicht mehr als sechsmonatiger Freiheitsstrafe oder nur mit Geldstrafe bedroht ist."#,
- r#"(3) Die Verjährungsfrist beträgt zwanzig Jahre, wenn die Handlung zwar nicht mit lebenslanger Freiheitsstrafe, aber mit mehr als zehnjähriger Freiheitsstrafe bedroht ist; zehn Jahre, wenn die Handlung mit mehr als fünfjähriger, aber höchstens zehnjähriger Freiheitsstrafe bedroht ist; fünf Jahre, wenn die Handlung mit mehr als einjähriger, aber höchstens fünfjähriger Freiheitsstrafe bedroht ist; drei Jahre, wenn die Handlung mit mehr als sechsmonatiger, aber höchstens einjähriger Freiheitsstrafe bedroht ist; ein Jahr, wenn die Handlung mit nicht mehr als sechsmonatiger Freiheitsstrafe oder nur mit Geldstrafe bedroht ist."#,
- );
-
- let xml = xml.replace(
- r#"(3) Die Frist beträgtfünfzehn Jahre,wenn auf Freiheitsstrafe von mehr als einem Jahr, aber nicht mehr als zehn Jahren erkannt worden ist;zehn Jahre,wenn auf Freiheitsstrafe von mehr als drei Monaten, aber nicht mehr als einem Jahr oder auf eine Geldstrafe unter Festsetzung einer Ersatzfreiheitsstrafe von mehr als drei Monaten erkannt worden ist;fünf Jahrein allen übrigen Fällen."#,
- r#"(3) Die Frist beträgt fünfzehn Jahre, wenn auf Freiheitsstrafe von mehr als einem Jahr, aber nicht mehr als zehn Jahren erkannt worden ist; zehn Jahre, wenn auf Freiheitsstrafe von mehr als drei Monaten, aber nicht mehr als einem Jahr oder auf eine Geldstrafe unter Festsetzung einer Ersatzfreiheitsstrafe von mehr als drei Monaten erkannt worden ist; fünf Jahre in allen übrigen Fällen."#,
- );
-
- let xml = xml.replace(
- r#"Erster Abschnitt"#,
- r#"Erster Abschnitt"#,
- ); // StGB
-
- let xml = xml.replace(r#""#, r""); // StGB...
-
- let xml = xml.replace(
- r#"Strafbare Handlungen gegen Leib und Leben"#,
- r#"Strafbare Handlungen gegen Leib und Leben"#,
- ); // StGB
- let xml = xml.replace(
- r#"Allgemeine Bestimmungen"#,
- r#"Allgemeine Bestimmungen"#,
- ); // StGB
-
- let xml = xml.replace(
- r#"1. Verwertungsrechte."#,
- r#"1. Verwertungsrechte."#,
- ); // 1. Verwertungsrechte. before § 14
-
- let xml = xml.replace(
- r#"Medizinische Behandlung"#,
- r#"Medizinische Behandlung"#,
- ); // 1. Verwertungsrechte. before § 14
-
- let xml = xml.replace(
- r#"4b. Presseveröffentlichungen."#,
- r#"4b. Presseveröffentlichungen."#,
- ); // § 99d UrhG, Titel kein Para.... //TODO: not working
-
- let xml = xml.replace(
- r#"Erfordernisse zur Ersitzung:"#,
- r#"Erfordernisse zur Ersitzung:"#,
- );
-
- let xml = xml.replace(
- r#""#,
- r#"@"#,
- );
-
- let xml = xml.replace(
- r#"Zweyter Theildesbürgerlichen Gesetzbuches.Von dem Sachenrechte."#,
- r#"Zweyter Theil des bürgerlichen Gesetzbuches. Von dem Sachenrechte."#,
- );
-
- let xml = xml.replace(
- r#"Dritter Theildesbürgerlichen Gesetzbuches."#,
- r#"Dritter Theil des bürgerlichen Gesetzbuches."#,
- );
- let xml = xml.replace(
- r#"Von den gemeinschaftlichen Bestimmungen der Personen- und Sachenrechte."#,
- r#"Von den gemeinschaftlichen Bestimmungen der Personen- und Sachenrechte."#,
- );
-
- let xml = xml.replace(
- r#"Erste Abtheilungdes Sachenrechtes."#,
- r#"Erste Abtheilung des Sachenrechtes."#,
- );
-
- let xml = xml.replace(
- r#"Von den dinglichen Rechten."#,
- r#"Von den dinglichen Rechten."#,
- );
-
- let xml = xml.replace("", ""); // e.g. § 23a in MSchG
- let xml = xml.replace("", ""); // e.g. § 23a in MSchG
- let xml = xml.replace("", ""); // § 69 in MSchG
- let xml = xml.replace("", "");
-
- let xml = xml.replace("", ""); // § 49b in FSG
- let xml = xml.replace("", "");
-
- let xml = xml.replace("", ""); // § 14 in FSG
- let xml = xml.replace("", "");
-
- let xml = xml.replace("", "");
-
- let xml = xml.replace(
- r"(Anm.: § 69 aufgehoben durch Art. 1 Z 12, BGBl. I Nr. 124/2017)",
- r"§ 69.(Anm.: § 69 aufgehoben durch Art. 1 Z 12, BGBl. I Nr. 124/2017)",
- );
-
- // § 49d FSG
- let xml = xml.replace(
- r#"Die Finanzordnungswidrigkeit wird mit einer Geldstrafe bis zu 50 000 Euro geahndet."#,
- r"Die Finanzordnungswidrigkeit wird mit einer Geldstrafe bis zu 50 000 Euro geahndet.",
- );
-
- // § 127 FSG
- let xml = xml.replace(
- r#"Die Öffentlichkeit ist auszuschließen:"#,
- r#"Die Öffentlichkeit ist auszuschließen:"#,
- );
-
- // § 56 FSG
- let xml = xml.replace(
- r#"A. Allgemeine Bestimmungen"#,
- r#"A. Allgemeine Bestimmungen"#,
- );
-
- // § 167 FSG
- let xml = xml.replace(
- r#"(1) Gegen die Versäumung einer Frist oder einer mündlichen Verhandlung ist auf Antrag des Beschuldigten oder der Nebenbeteiligten eines anhängigen oder abgeschlossenen Finanzstrafverfahrens die Wiedereinsetzung in den vorigen Stand zu bewilligen, wenn der Antragsteller durch die Versäumung einen Rechtsnachteil erleidet und glaubhaft macht, daß er durch ein unvorhergesehenes oder unabwendbares Ereignis verhindert war, die Frist einzuhalten oder zur Verhandlung zu erscheinen. Daß dem Beschuldigten oder dem Nebenbeteiligten ein Verschulden an der Versäumung zur Last liegt, hindert die Bewilligung der Wiedereinsetzung nicht, wenn es sich nur um einen minderen Grad des Versehens handelt."#,
- r#"§ 167.(1) Gegen die Versäumung einer Frist oder einer mündlichen Verhandlung ist auf Antrag des Beschuldigten oder der Nebenbeteiligten eines anhängigen oder abgeschlossenen Finanzstrafverfahrens die Wiedereinsetzung in den vorigen Stand zu bewilligen, wenn der Antragsteller durch die Versäumung einen Rechtsnachteil erleidet und glaubhaft macht, daß er durch ein unvorhergesehenes oder unabwendbares Ereignis verhindert war, die Frist einzuhalten oder zur Verhandlung zu erscheinen. Daß dem Beschuldigten oder dem Nebenbeteiligten ein Verschulden an der Versäumung zur Last liegt, hindert die Bewilligung der Wiedereinsetzung nicht, wenn es sich nur um einen minderen Grad des Versehens handelt."#,
- );
-
- debug!("{xml}");
-
- let continue_parsing = Risdok::from_str(&xml, builder)?;
-
- Ok(continue_parsing)
-}
-
-#[cfg(test)]
-mod tests {
- use pretty_assertions::assert_eq;
- use std::{
- fs::{self, File},
- io::{self, BufRead, Read},
- path::Path,
- };
-
- use super::*;
-
- fn read_lines(filename: P) -> io::Result>
- where
- P: AsRef,
- {
- let file = File::open(filename)?;
- let buf_reader = io::BufReader::new(file);
- buf_reader.lines().collect()
- }
-
- #[test]
- fn test_par_full_urhg() {
- let mut builder = LawBuilder::test("UrhG");
-
- let path = Path::new("./data/urhg/par");
- let mut entries: Vec<_> = fs::read_dir(path)
- .unwrap()
- .filter_map(|entry| entry.ok())
- .collect();
-
- entries.sort_by_key(|entry| entry.file_name());
-
- for entry in entries {
- let mut file = File::open(path.join(entry.file_name())).unwrap();
- let mut json = String::new();
- file.read_to_string(&mut json).unwrap();
-
- let cont = parse_from_str(&json, &mut builder).unwrap();
- if !cont {
- break;
- }
- }
-
- let expected = read_lines(path.join("../par.result")).unwrap();
-
- for (actual, expected) in builder.history.iter().zip(&expected) {
- assert_eq!(actual, expected);
- }
- }
-}
diff --git a/src/risparser/mod.rs b/src/risparser/mod.rs
index 085cee4..275b913 100644
--- a/src/risparser/mod.rs
+++ b/src/risparser/mod.rs
@@ -1,4 +1,4 @@
//! This deals with accessing RIS data.
pub mod overview;
-pub mod paragraphs;
+pub mod paragraph;
diff --git a/src/risparser/overview/mod.rs b/src/risparser/overview/mod.rs
index f529d30..3b795c3 100644
--- a/src/risparser/overview/mod.rs
+++ b/src/risparser/overview/mod.rs
@@ -140,7 +140,7 @@ mod tests {
for path in paths {
let path = path.unwrap();
let file_path = format!("{}", path.path().display());
- let law_id = format!("{}", path.file_name().into_string().unwrap());
+ let law_id = path.file_name().into_string().unwrap().to_string();
let law_id: usize = law_id
.parse()
.expect("Filename needs to be usize (= law_id in RIS)");
diff --git a/src/risparser/paragraph/mod.rs b/src/risparser/paragraph/mod.rs
new file mode 100644
index 0000000..32d2194
--- /dev/null
+++ b/src/risparser/paragraph/mod.rs
@@ -0,0 +1,126 @@
+//! Deals with getting all paragraphs for a given law text
+mod parser;
+
+use log::info;
+
+use crate::{law::LawBuilder, misc::Error};
+
+use self::parser::Risdok;
+
+pub struct Parser {
+ remove: Vec,
+}
+
+impl Parser {
+ pub fn new() -> Self {
+ Self { remove: Vec::new() }
+ }
+
+ pub fn add_string_to_remove(&mut self, data: &str) {
+ self.remove.push(data.into());
+ }
+
+ /// Parses the content available in `url`. Calls appropriate functions in supplied `LawBuilder`.
+ pub fn parse(&self, url: &str, builder: &mut LawBuilder) -> Result {
+ info!("Parsing {url}");
+ let xml = fetch(url)?;
+
+ self.parse_from_str(&xml, builder)
+ }
+
+ fn parse_from_str(&self, xml: &str, builder: &mut LawBuilder) -> Result {
+ let mut xml = String::from(xml);
+ for r in &self.remove {
+ xml = xml.replace(r, "");
+ }
+
+ Risdok::from_str(&xml, builder)
+ }
+}
+
+#[cfg(not(test))]
+fn fetch(url: &str) -> Result {
+ Ok(ureq::get(url).call()?.into_string()?)
+}
+
+#[cfg(test)]
+fn fetch(url: &str) -> Result {
+ use std::{
+ fs,
+ hash::{DefaultHasher, Hash, Hasher},
+ };
+
+ let mut hasher = DefaultHasher::new();
+ url.hash(&mut hasher);
+ let hash = format!("{:x}", hasher.finish());
+
+ let expected_filename = format!("./data/cache/par-{hash}");
+
+ match fs::read_to_string(&expected_filename) {
+ Ok(data) => Ok(data),
+ Err(_) => {
+ info!("Not finding url {url} in the cache, downloading...");
+ let data = ureq::get(url).call()?.into_string()?;
+ fs::write(expected_filename, &data).expect("Unable to write file");
+ Ok(data)
+ }
+ }
+}
+
+#[cfg(test)]
+mod tests {
+
+ use std::{fs, sync::Arc};
+
+ use crate::{
+ law::{responsible::contains, Classifier, LawBuilder},
+ risparser::paragraph::Parser,
+ };
+ use pretty_assertions::assert_eq;
+
+ #[test]
+ fn paragraph() {
+ let laws = fs::read_dir("./data/expected/overview/")
+ .expect("No folder with expected overview files");
+
+ for law in laws {
+ let path = law.unwrap();
+ let law_path = format!("{}", path.path().display());
+ let law_id = path.file_name().into_string().unwrap().to_string();
+
+ //TODO: Remove this if once all law texts pass
+ if ["10001905".into()].contains(&law_id) {
+ let expected_path = format!("./data/expected/par/{law_id}");
+
+ let pars = fs::read_to_string(law_path).expect("Could not read file {file_path}.");
+ let pars = pars.trim().split('\n').collect::>();
+
+ let mut builder = LawBuilder::new("law");
+ builder.add_classifier(Classifier::new("Abschnitt", Arc::new(&contains)).root());
+
+ let mut parser = Parser::new();
+ parser.add_string_to_remove(r#"(§§ 1, 2, 3, 4,6, § 8 Abs. 1 und 2 des Gesetzes vom 16. Februar 1883, RGBl. Nr. 20, betreffend das Verfahren zum Zwecke der Todeserklärung und der Beweisführung des Todes, in der Fassung des Gesetzes vom 31. März 1918, RGBl. Nr. 129:)"#);
+ parser.add_string_to_remove(r#"(§§ 1 bis 11 des Gesetzes über die Verschollenheit, die Todeserklärung und die Feststellung der Todeszeit vom 4. Juli 1939, Deutsches RGBl. I S. 1186:)"#);
+ parser.add_string_to_remove(r#"(§ 56 Abs. 3 des Gesetzes vom 4. Juli 1939, Deutsches RGBl. I S. 1186:)"#);
+ parser.add_string_to_remove(r#"(§ 10 des Gesetzes vom 16. Februar 1883, RGBl. Nr. 20, betreffend das Verfahren zum Zwecke der Todeserklärung und der Beweisführung des Todes, in der Fassung des Gesetzes vom 31. März 1918, RGBl. Nr. 129:)"#);
+ parser.add_string_to_remove(r#"(§§ 10a, 10b und 10c des Gesetzes vom 16. Februar 1883, RGBl. Nr. 20, betreffend das Verfahren zum Zwecke der Todeserklärung und der Beweisführung des Todes, in der Fassung des Gesetzes vom 31. März 1918, RGBl. Nr. 129:)"#);
+ parser.add_string_to_remove("");
+ parser.add_string_to_remove("");
+ for par in pars {
+ let cont = parser.parse(par, &mut builder).unwrap();
+ if !cont {
+ break;
+ }
+ }
+
+ let actual = builder.history;
+
+ let expected = fs::read_to_string(&expected_path)
+ .expect(&format!("Could not read file {expected_path}."));
+ let expected = expected.trim().split('\n').collect::>();
+
+ assert_eq!(actual, expected);
+ }
+ }
+ }
+}
diff --git a/src/par/parser.rs b/src/risparser/paragraph/parser.rs
similarity index 97%
rename from src/par/parser.rs
rename to src/risparser/paragraph/parser.rs
index cfe36b3..309353e 100644
--- a/src/par/parser.rs
+++ b/src/risparser/paragraph/parser.rs
@@ -1,7 +1,9 @@
-use risp::misc::Error;
use roxmltree::Node;
-use crate::law::{Content, LawBuilder};
+use crate::{
+ law::{Content, LawBuilder},
+ misc::Error,
+};
#[derive(Debug, PartialEq)]
pub(crate) struct Risdok {}
@@ -99,6 +101,11 @@ impl Abschnitt {
} else if Ueberschrift::test(child, "g1min") {
let ueberschrift = Ueberschrift::parse(c.next().unwrap(), "g1min");
builder.new_header(&ueberschrift.content);
+ } else if Ueberschrift::test(child, "art") {
+ let ueberschrift = Ueberschrift::parse(c.next().unwrap(), "art");
+ if ueberschrift.content.trim().starts_with("Artikel") {
+ return false;
+ }
} else {
break;
}
diff --git a/src/risparser/paragraphs.rs b/src/risparser/paragraphs.rs
deleted file mode 100644
index 221a663..0000000
--- a/src/risparser/paragraphs.rs
+++ /dev/null
@@ -1 +0,0 @@
-//! Deals with getting all paragraphs for a given law text