summaryrefslogtreecommitdiff
path: root/src/elements/line_element.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/elements/line_element.rs')
-rw-r--r--src/elements/line_element.rs61
1 files changed, 61 insertions, 0 deletions
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)
+ }
+}