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); } } }