summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2022-11-02 13:07:27 +0000
committerLars Wirzenius <liw@liw.fi>2022-11-02 13:07:27 +0000
commit4b270f450b7a2ae1341ea22b8b373ba2cd8aa96c (patch)
tree9f913e13e22f9f3ae8b3503a7daa58ac54ef09e2
parentdcc3be6246a51c788f31faa8ccd1be6a36d8af8e (diff)
parentf23fe81456b2f5174aadbec63c333d77af21dc36 (diff)
downloadriki-4b270f450b7a2ae1341ea22b8b373ba2cd8aa96c.tar.gz
Merge branch 'liw/inline' into 'main'
feat: implement a simple version of the inline directive See merge request larswirzenius/riki!66
-rw-r--r--src/directive/inline.rs33
1 files changed, 26 insertions, 7 deletions
diff --git a/src/directive/inline.rs b/src/directive/inline.rs
index 7bef13c..78872b4 100644
--- a/src/directive/inline.rs
+++ b/src/directive/inline.rs
@@ -1,10 +1,15 @@
use crate::error::SiteError;
use crate::page::PageMeta;
+use crate::pagespec::PageSpec;
use crate::site::Site;
use crate::wikitext::ParsedDirective;
+use crate::util::make_relative_link;
+use std::path::Path;
#[derive(Debug, Default, Eq, PartialEq)]
-pub struct Inline {}
+pub struct Inline {
+ pages: String,
+}
impl Inline {
pub const REQUIRED: &'static [&'static str] = &["pages"];
@@ -26,17 +31,31 @@ impl Inline {
];
pub const ALLOW_ANY_UNNAMED: bool = true;
- pub fn new() -> Self {
- Self::default()
+ pub fn new(pages: String) -> Self {
+ Self { pages }
+ }
+
+ pub fn process(&self, site: &Site, meta: &mut PageMeta) -> Result<String, SiteError> {
+ let pagespec = PageSpec::new(meta.path(), &self.pages)?;
+ let matches: Vec<String> = site
+ .markdown_pages()
+ .iter()
+ .filter(|page| pagespec.matches(&site, page.meta().path()))
+ .map(|page| format!("* {}\n", Self::link(meta.path(), page.meta())))
+ .collect();
+ Ok(matches.join(""))
}
- pub fn process(&self, _site: &Site, _meta: &mut PageMeta) -> Result<String, SiteError> {
- Err(SiteError::UnimplementedDirective("inline".into()))
+ fn link(container: &Path, meta: &PageMeta) -> String {
+ let link = make_relative_link(container, meta.path());
+ format!("[{}]({})", meta.title(), link.display())
}
}
impl From<&ParsedDirective> for Inline {
- fn from(_p: &ParsedDirective) -> Self {
- Inline::new()
+ fn from(p: &ParsedDirective) -> Self {
+ let args = p.args();
+ let pages = args.get("pages").unwrap();
+ Inline::new(pages.to_string())
}
}