From 13cb719b87bcef41c4dd398f5a651ddb2b561e0d Mon Sep 17 00:00:00 2001 From: Ben Bridle Date: Sun, 21 Apr 2024 13:57:03 +1200 Subject: Completely rewrite the library --- src/elements/line_element.rs | 61 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/elements/line_element.rs (limited to 'src/elements/line_element.rs') diff --git a/src/elements/line_element.rs b/src/elements/line_element.rs new file mode 100644 index 0000000..cc47b4b --- /dev/null +++ b/src/elements/line_element.rs @@ -0,0 +1,61 @@ +pub enum LineElement { + Normal(String), + Bold(String), + Italic(String), + Monospace(String), + Math(String), + InternalLink(String), + ExternalLink(ExternalLink), +} + +impl LineElement { + /// Return only the character content, with none of the styling information. + pub fn as_plain_text(&self) -> &str { + match self { + LineElement::Normal(text) => text, + LineElement::Bold(text) => text, + LineElement::Italic(text) => text, + LineElement::Monospace(text) => text, + LineElement::Math(text) => text, + LineElement::InternalLink(label) => label, + LineElement::ExternalLink(ExternalLink { label, ..}) => label, + } + } +} + +pub struct ExternalLink { + pub label: String, + pub target: String, +} + +impl std::fmt::Display for LineElement { + fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { + let string = match self { + LineElement::Normal(text) => format!("{text}"), + LineElement::Bold(text) => format!("**{text}**"), + LineElement::Italic(text) => format!("_{text}_"), + LineElement::Monospace(text) => format!("`{text}`"), + LineElement::Math(text) => format!("${text}$"), + LineElement::InternalLink(text) => format!("[[{text}]]"), + LineElement::ExternalLink(ExternalLink { label, target }) => { + format!("[{label}]({target})") } + }; + f.write_str(&string) + } +} + +impl std::fmt::Debug for LineElement { + fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { + let string = match self { + LineElement::Normal(text) => format!("Normal ('{text}')"), + LineElement::Bold(text) => format!("Bold ('{text}')"), + LineElement::Italic(text) => format!("Italic ('{text}')"), + LineElement::Monospace(text) => format!("Monospace ('{text}')"), + LineElement::Math(text) => format!("Math ('{text}')"), + LineElement::InternalLink(text) => format!("InternalLink ('{text}')"), + LineElement::ExternalLink(ExternalLink { label, target }) => { + format!("ExternalLink (label:'{label}', target:'{target}')") } + }; + f.write_str(&string) + } +} -- cgit v1.2.3-70-g09d2