first part of FSG

This commit is contained in:
philipp 2023-11-06 17:31:17 +01:00
parent ccefe73206
commit 8faf69b76f
4 changed files with 76 additions and 2 deletions

View File

@ -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 {

View File

@ -42,7 +42,7 @@ impl From<roxmltree::Error> for Error {
fn main() {
env_logger::init();
let law = LawBuilder::new("MSchG");
let law = LawBuilder::new("FSG");
law.to_md();
//println!("{:#?}", builder.toc());

View File

@ -40,6 +40,12 @@ pub(crate) fn parse_from_str(xml: &str, builder: &mut LawBuilder) -> Result<bool
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>", "");
// Artikel 18 UrhG
let xml = xml.replace("<n><i>", "");
let xml = xml.replace("</i></n>", "");
@ -49,6 +55,30 @@ pub(crate) fn parse_from_str(xml: &str, builder: &mut LawBuilder) -> Result<bool
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)?;

View File

@ -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 {