~rbdr/page

f07392253d4db57964eae389dab219c963dd4c95 — Ruben Beltran del Rio 4 months ago 6a8515f
Treat preformatted text with alt as an image
3 files changed, 27 insertions(+), 12 deletions(-)

M Cargo.lock
M Cargo.toml
M src/gemini_parser.rs
M Cargo.lock => Cargo.lock +1 -1
@@ 4,4 4,4 @@ version = 3

[[package]]
name = "page"
version = "1.2.0"
version = "1.3.0"

M Cargo.toml => Cargo.toml +1 -1
@@ 1,6 1,6 @@
[package]
name = "page"
version = "1.2.0"
version = "1.3.0"
edition = "2021"

[dependencies]

M src/gemini_parser.rs => src/gemini_parser.rs +25 -10
@@ 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<String> = None;
    let mut html: String = "".to_owned();
    let mut current_line_type: Option<LineType> = None;

    let mut heading_stack: Vec<u8> = 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) = &current_line_type {


@@ 30,10 38,10 @@ pub fn parse(source: &str) -> String {
                if is_block(&line_type) {
                    if let Some(line) = &current_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!("<li>{}</li>", 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<u8>) -> 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 => "<ul>",
        LineType::Quote => "<blockquote>",
        LineType::PreformattedText => "<pre>",
        _ => "",
        LineType::ListItem => "<ul>".to_string(),
        LineType::Quote => "<blockquote>".to_string(),
        LineType::PreformattedText => {
            if let Some(label) = &block_label {
                return format!("<pre role=\"img\" aria-label=\"h{}\">", label);
            } else {
                return "<pre>".to_string();
            }
        },
        _ => "".to_string(),
    }
}