risp/src/par/mod.rs
philipp 443807d2b8
All checks were successful
CI/CD Pipeline / test (push) Successful in 36s
more clean up w/ pedclippy
2024-02-04 21:58:47 +01:00

201 lines
13 KiB
Rust
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

mod parser;
use crate::{law::LawBuilder, par::parser::Risdok};
use log::{debug, info};
use risp::misc::Error;
fn fetch_page(url: &str) -> Result<String, Error> {
Ok(ureq::get(url).call()?.into_string()?)
}
pub(crate) fn parse(url: &str, builder: &mut LawBuilder) -> Result<bool, Error> {
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<bool, Error> {
let xml = xml.replace("<gdash />", "-"); // used e.g. in §11 Abs. 3 UrhG
let xml = xml.replace(
// in § 17 (2)
r#"<liste><schlussteil ebene="0" art="normal" ct="text">(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.</schlussteil></liste>"#,
r#"<absatz typ="abs" ct="text" halign="j">(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.</absatz>"#,
);
let xml = xml.replace(
// in § 17 (2)
r#"<absatz typ="abs" ct="text" halign="j">(3) Die Verjährungsfrist beträgt</absatz><absatz typ="erltext" ct="text" halign="j">zwanzig Jahre,</absatz><liste><schluss typ="e1" ct="text">wenn die Handlung zwar nicht mit lebenslanger Freiheitsstrafe, aber mit mehr als zehnjähriger Freiheitsstrafe bedroht ist;</schluss></liste><absatz typ="erltext" ct="text" halign="j">zehn Jahre,</absatz><liste><schluss typ="e1" ct="text">wenn die Handlung mit mehr als fünfjähriger, aber höchstens zehnjähriger Freiheitsstrafe bedroht ist;</schluss></liste><absatz typ="erltext" ct="text" halign="j">fünf Jahre,</absatz><liste><schluss typ="e1" ct="text">wenn die Handlung mit mehr als einjähriger, aber höchstens fünfjähriger Freiheitsstrafe bedroht ist;</schluss></liste><absatz typ="erltext" ct="text" halign="j">drei Jahre,</absatz><liste><schluss typ="e1" ct="text">wenn die Handlung mit mehr als sechsmonatiger, aber höchstens einjähriger Freiheitsstrafe bedroht ist;</schluss></liste><absatz typ="erltext" ct="text" halign="j">ein Jahr,</absatz><liste><schluss typ="e1" ct="text">wenn die Handlung mit nicht mehr als sechsmonatiger Freiheitsstrafe oder nur mit Geldstrafe bedroht ist.</schluss></liste>"#,
r#"<absatz typ="abs" ct="text" halign="j">(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.</absatz>"#,
);
let xml = xml.replace(
r#"<absatz typ="abs" ct="text" halign="j">(3) Die Frist beträgt</absatz><absatz typ="erltext" ct="text" halign="j">fünfzehn Jahre,</absatz><liste><schlussteil ebene="0.5" art="normal" ct="text">wenn auf Freiheitsstrafe von mehr als einem Jahr, aber nicht mehr als zehn Jahren erkannt worden ist;</schlussteil></liste><absatz typ="erltext" ct="text" halign="j">zehn Jahre,</absatz><liste><schlussteil ebene="0.5" art="normal" ct="text">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;</schlussteil></liste><absatz typ="erltext" ct="text" halign="j">fünf Jahre</absatz><liste><schlussteil ebene="0.5" art="normal" ct="text">in allen übrigen Fällen.</schlussteil></liste>"#,
r#"<absatz typ="abs" ct="text" halign="j">(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.</absatz>"#,
);
let xml = xml.replace(
r#"<ueberschrift typ="g2" ct="text" halign="c">Erster Abschnitt</ueberschrift>"#,
r#"<ueberschrift typ="g1" ct="text" halign="c">Erster Abschnitt</ueberschrift>"#,
); // StGB
let xml = xml.replace(r#"<abstand ct="text" halign="l" />"#, r""); // StGB...
let xml = xml.replace(
r#"<ueberschrift typ="g1min" ct="text" halign="c">Strafbare Handlungen gegen Leib und Leben</ueberschrift>"#,
r#"<ueberschrift typ="g2" ct="text" halign="c">Strafbare Handlungen gegen Leib und Leben</ueberschrift>"#,
); // StGB
let xml = xml.replace(
r#"<ueberschrift typ="g1min" ct="text" halign="c">Allgemeine Bestimmungen</ueberschrift>"#,
r#"<ueberschrift typ="g2" ct="text" halign="c">Allgemeine Bestimmungen</ueberschrift>"#,
); // StGB
let xml = xml.replace(
r#"<ueberschrift typ="para" ct="text" halign="c">1. Verwertungsrechte.</ueberschrift>"#,
r#"<ueberschrift typ="g1" ct="text" halign="c">1. Verwertungsrechte.</ueberschrift>"#,
); // 1. Verwertungsrechte. before § 14
let xml = xml.replace(
r#"<ueberschrift typ="g1" ct="text" halign="c">Medizinische Behandlung</ueberschrift>"#,
r#"<ueberschrift typ="art" ct="text" halign="c">Medizinische Behandlung</ueberschrift>"#,
); // 1. Verwertungsrechte. before § 14
let xml = xml.replace(
r#"<ueberschrift typ="para" ct="text" halign="c">4b. Presseveröffentlichungen.</ueberschrift>"#,
r#"<ueberschrift typ="g1" ct="text" halign="c">4b. Presseveröffentlichungen.</ueberschrift>"#,
); // § 99d UrhG, Titel kein Para.... //TODO: not working
let xml = xml.replace(
r#"<ueberschrift typ="para" ct="text" halign="c">Erfordernisse zur Ersitzung:</ueberschrift>"#,
r#"<ueberschrift typ="art" ct="text" halign="c">Erfordernisse zur Ersitzung:</ueberschrift>"#,
);
let xml = xml.replace(
r#"<ueberschrift typ="art" ct="text" halign="c">"#,
r#"<ueberschrift typ="g1" ct="text" halign="c">@"#,
);
let xml = xml.replace(
r#"<ueberschrift typ="g1" ct="text" halign="c">Zweyter Theil</ueberschrift><ueberschrift typ="g1" ct="text" halign="c">des</ueberschrift><ueberschrift typ="g1" ct="text" halign="c">bürgerlichen Gesetzbuches.</ueberschrift><ueberschrift typ="g1" ct="text" halign="c">Von dem Sachenrechte.</ueberschrift>"#,
r#"<ueberschrift typ="g1" ct="text" halign="c">Zweyter Theil des bürgerlichen Gesetzbuches. Von dem Sachenrechte.</ueberschrift>"#,
);
let xml = xml.replace(
r#"<ueberschrift typ="g1" ct="text" halign="c">Dritter Theil</ueberschrift><ueberschrift typ="g1min" ct="text" halign="c">des</ueberschrift><ueberschrift typ="g1min" ct="text" halign="c">bürgerlichen Gesetzbuches.</ueberschrift>"#,
r#"<ueberschrift typ="g1" ct="text" halign="c">Dritter Theil des bürgerlichen Gesetzbuches.</ueberschrift>"#,
);
let xml = xml.replace(
r#"<ueberschrift typ="g1" ct="text" halign="c">Von den gemeinschaftlichen Bestimmungen der Personen- und Sachenrechte.</ueberschrift>"#,
r#"<ueberschrift typ="g2" ct="text" halign="c">Von den gemeinschaftlichen Bestimmungen der Personen- und Sachenrechte.</ueberschrift>"#,
);
let xml = xml.replace(
r#"<ueberschrift typ="g1" ct="text" halign="c">Erste Abtheilung</ueberschrift><ueberschrift typ="g2" ct="text" halign="c">des Sachenrechtes.</ueberschrift>"#,
r#"<ueberschrift typ="g1" ct="text" halign="c">Erste Abtheilung des Sachenrechtes.</ueberschrift>"#,
);
let xml = xml.replace(
r#"<ueberschrift typ="g1min" ct="text" halign="c">Von den dinglichen Rechten.</ueberschrift>"#,
r#"<ueberschrift typ="g2" ct="text" halign="c">Von den dinglichen Rechten.</ueberschrift>"#,
);
let xml = xml.replace("<super>", ""); // e.g. § 23a in MSchG
let xml = xml.replace("</super>", ""); // e.g. § 23a in MSchG
let xml = xml.replace("<i>", ""); // § 69 in MSchG
let xml = xml.replace("</i>", "");
let xml = xml.replace("<n>", ""); // § 49b in FSG
let xml = xml.replace("</n>", "");
let xml = xml.replace("<b>", ""); // § 14 in FSG
let xml = xml.replace("</b>", "");
let xml = xml.replace("<tab />", "");
let xml = xml.replace(
r"(Anm.: § 69 aufgehoben durch Art. 1 Z 12, BGBl. I Nr. 124/2017)",
r"<gldsym>§ 69.</gldsym>(Anm.: § 69 aufgehoben durch Art. 1 Z 12, BGBl. I Nr. 124/2017)",
);
// § 49d FSG
let xml = xml.replace(
r#"</absatz><liste><schlussteil ebene="0" art="normal" ct="text">Die Finanzordnungswidrigkeit wird mit einer Geldstrafe bis zu 50 000 Euro geahndet.</schlussteil></liste>"#,
r"Die Finanzordnungswidrigkeit wird mit einer Geldstrafe bis zu 50 000 Euro geahndet.</absatz>",
);
// § 127 FSG
let xml = xml.replace(
r#"<absatz typ="erltext" ct="text" halign="j">Die Öffentlichkeit ist auszuschließen:</absatz>"#,
r#"<absatz typ="abs" ct="text" halign="j">Die Öffentlichkeit ist auszuschließen:</absatz>"#,
);
// § 56 FSG
let xml = xml.replace(
r#"<ueberschrift typ="g2" ct="text" halign="c">A. Allgemeine Bestimmungen</ueberschrift>"#,
r#"<ueberschrift typ="g1" ct="text" halign="c">A. Allgemeine Bestimmungen</ueberschrift>"#,
);
// § 167 FSG
let xml = xml.replace(
r#"<absatz typ="abs" ct="text" halign="j">(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.</absatz>"#,
r#"<absatz typ="abs" ct="text" halign="j"><gldsym>§ 167.</gldsym>(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.</absatz>"#,
);
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<P>(filename: P) -> io::Result<Vec<String>>
where
P: AsRef<Path>,
{
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);
}
}
}