From: Ruben Beltran del Rio Date: Sun, 4 Feb 2024 16:53:02 +0000 (+0100) Subject: Treat preformatted text with alt as an image X-Git-Tag: 1.3.0~1 X-Git-Url: https://git.r.bdr.sh/rbdr/page/commitdiff_plain/f07392253d4db57964eae389dab219c963dd4c95?ds=sidebyside;hp=6a8515fe6ed81369badb51496699a2ff25dbfa9f Treat preformatted text with alt as an image --- diff --git a/Cargo.lock b/Cargo.lock index 2a9b116..83a98a7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,4 +4,4 @@ version = 3 [[package]] name = "page" -version = "1.2.0" +version = "1.3.0" diff --git a/Cargo.toml b/Cargo.toml index 7ddba56..c148552 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "page" -version = "1.2.0" +version = "1.3.0" edition = "2021" [dependencies] diff --git a/src/gemini_parser.rs b/src/gemini_parser.rs index e63ebd3..14d74c6 100644 --- a/src/gemini_parser.rs +++ b/src/gemini_parser.rs @@ -1,9 +1,10 @@ -pub fn parse(source: &str) -> String { + pub fn parse(source: &str) -> String { let lines = source.split("\n"); let mut is_preformatted = false; - let mut html:String = "".to_owned(); + let mut block_label: Option = None; + let mut html: String = "".to_owned(); let mut current_line_type: Option = None; let mut heading_stack: Vec = Vec::new(); @@ -17,7 +18,14 @@ pub fn parse(source: &str) -> String { line_type = identify_line(&line[..end], is_preformatted); } match line_type { - LineType::PreformattedToggle => is_preformatted = !is_preformatted, + LineType::PreformattedToggle => { + is_preformatted = !is_preformatted; + if is_preformatted && line.char_indices().count() > 3 { + block_label = Some(get_partial_line_content(&line_type, line)); + } else { + block_label = None; + } + }, _ => { // Close previous block if needed if let Some(line) = ¤t_line_type { @@ -30,10 +38,10 @@ pub fn parse(source: &str) -> String { if is_block(&line_type) { if let Some(line) = ¤t_line_type { if line != &line_type { - html.push_str(get_line_opener(&line_type)); + html.push_str(&get_line_opener(&line_type, block_label.as_ref())); } } else { - html.push_str(get_line_opener(&line_type)); + html.push_str(&get_line_opener(&line_type, None)); } let line_content = get_partial_line_content(&line_type, line); @@ -68,6 +76,7 @@ fn get_partial_line_content(line_type: &LineType, line: &str) -> String { LineType::ListItem => format!("
  • {}
  • ", encoded_line[2..].trim()), LineType::Quote => encoded_line[1..].trim().to_string(), LineType::PreformattedText => format!("{}\n", encoded_line), + LineType::PreformattedToggle => encoded_line[3..].trim().to_string(), _ => "".to_string(), } } @@ -131,12 +140,18 @@ fn close_heading_wrapper(heading_stack: &mut Vec) -> String { return string; } -fn get_line_opener(line_type: &LineType) -> &'static str { +fn get_line_opener(line_type: &LineType, block_label: Option<&String>) -> String { match line_type { - LineType::ListItem => "
      ", - LineType::Quote => "
      ", - LineType::PreformattedText => "
      ",
      -        _ => "",
      +        LineType::ListItem => "
        ".to_string(), + LineType::Quote => "
        ".to_string(), + LineType::PreformattedText => { + if let Some(label) = &block_label { + return format!("
        ", label);
        +            } else {
        +                return "
        ".to_string();
        +            }
        +        },
        +        _ => "".to_string(),
             }
         }