aboutsummaryrefslogtreecommitdiff
path: root/src/gemini_parser.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/gemini_parser.rs')
-rw-r--r--src/gemini_parser.rs35
1 files changed, 25 insertions, 10 deletions
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<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(),
}
}