summaryrefslogtreecommitdiff
path: root/src/library/link.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/library/link.rs')
-rw-r--r--src/library/link.rs29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/library/link.rs b/src/library/link.rs
new file mode 100644
index 00000000..114d25a1
--- /dev/null
+++ b/src/library/link.rs
@@ -0,0 +1,29 @@
+use super::prelude::*;
+use crate::util::EcoString;
+
+/// `link`: Link text or other elements.
+pub fn link(_: &mut EvalContext, args: &mut Args) -> TypResult<Value> {
+ let url: String = args.expect::<EcoString>("url")?.into();
+ let body = args.find().unwrap_or_else(|| {
+ let mut text = url.as_str();
+ for prefix in ["mailto:", "tel:"] {
+ text = text.trim_start_matches(prefix);
+ }
+ Node::Text(text.into())
+ });
+
+ Ok(Value::Node(
+ body.styled(Styles::one(LinkNode::URL, Some(url))),
+ ))
+}
+
+/// Host for link styles.
+#[derive(Debug, Hash)]
+pub struct LinkNode;
+
+properties! {
+ LinkNode,
+
+ /// An URL to link to.
+ URL: Option<String> = None,
+}