diff --git a/src/law.rs b/src/law.rs index f3e4f6d..6c97e42 100644 --- a/src/law.rs +++ b/src/law.rs @@ -116,6 +116,16 @@ 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()) } +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(')')) +} + +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(')')) +} + /// Is used to generate a law struct. It's organized mainly by classifier. #[derive(Debug, PartialEq)] pub(crate) struct LawBuilder { @@ -186,6 +196,7 @@ impl LawBuilder { let mut law_id = None; if name == "UrhG" { law_id = Some(10001848); + let hauptstueck = Classifier::new("Hauptstück", Arc::new(&contains)); classifiers.push(hauptstueck.clone()); @@ -207,6 +218,38 @@ impl LawBuilder { Classifier::new("Numbered Header", Arc::new(&starts_with_number)); numbered_header.set_parent(0); classifiers.push(numbered_header); + } else if name == "FSG" { + law_id = Some(10003898); + + let artikel = Classifier::new("Artikel", Arc::new(&contains)); + classifiers.push(artikel); + + let mut abschnitt = Classifier::new(" Abschnitt", Arc::new(&contains)); + abschnitt.set_parent(0); + classifiers.push(abschnitt); + + let mut unterabschnitt = Classifier::new("Unterabschnitt", Arc::new(&contains)); + unterabschnitt.set_parent(1); + classifiers.push(unterabschnitt); + + let mut hauptstueck = Classifier::new("Hauptstück", Arc::new(&contains)); + hauptstueck.set_parent(9999); + classifiers.push(hauptstueck); + + let mut numbered_header = + Classifier::new("Numbered Header", Arc::new(&starts_with_letter)); + numbered_header.set_parent(9999); + classifiers.push(numbered_header); + + let mut uppercase_headers = + Classifier::new("Numbered Header", Arc::new(&starts_with_uppercaseletter)); + uppercase_headers.set_parent(9999); + classifiers.push(uppercase_headers); + + let mut number_header = + Classifier::new("Numbered Header", Arc::new(&starts_with_number)); + number_header.set_parent(9999); + classifiers.push(number_header); } let mut builder = Self { diff --git a/src/main.rs b/src/main.rs index 968ce82..eb41428 100644 --- a/src/main.rs +++ b/src/main.rs @@ -42,7 +42,7 @@ impl From for Error { fn main() { env_logger::init(); - let law = LawBuilder::new("MSchG"); + let law = LawBuilder::new("FSG"); law.to_md(); //println!("{:#?}", builder.toc()); diff --git a/src/par/mod.rs b/src/par/mod.rs index 7da8713..134dbbc 100644 --- a/src/par/mod.rs +++ b/src/par/mod.rs @@ -40,6 +40,12 @@ pub(crate) fn parse_from_str(xml: &str, builder: &mut LawBuilder) -> Result", ""); // § 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("", ""); + // Artikel 18 UrhG let xml = xml.replace("", ""); let xml = xml.replace("", ""); @@ -49,6 +55,30 @@ pub(crate) fn parse_from_str(xml: &str, builder: &mut LawBuilder) -> Result§ 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)?; diff --git a/src/par/parser.rs b/src/par/parser.rs index afb283f..32e6cf6 100644 --- a/src/par/parser.rs +++ b/src/par/parser.rs @@ -258,7 +258,8 @@ pub(crate) struct Ziffernliste { } impl Ziffernliste { pub(crate) fn test(n: &Node) -> bool { - ["ziffernliste", "aufzaehlung", "literaliste"].contains(&n.tag_name().name()) + // strichliste -> § 194b FSG + ["ziffernliste", "aufzaehlung", "literaliste", "strichliste"].contains(&n.tag_name().name()) } pub(crate) fn parse(n: Node) -> Self {