Add options to placeholders

pull/1/head
trivernis 5 years ago
parent ba7fd40f92
commit e80ecea6cf

2
Cargo.lock generated

@ -358,7 +358,7 @@ dependencies = [
[[package]] [[package]]
name = "snekdown" name = "snekdown"
version = "0.5.5" version = "0.6.0"
dependencies = [ dependencies = [
"chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
"crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",

@ -1,6 +1,6 @@
[package] [package]
name = "snekdown" name = "snekdown"
version = "0.5.5" version = "0.6.0"
authors = ["trivernis <trivernis@protonmail.com>"] authors = ["trivernis <trivernis@protonmail.com>"]
edition = "2018" edition = "2018"
license-file = "LICENSE" license-file = "LICENSE"

@ -79,6 +79,21 @@ Header with rows
| row | row | row | row | row | row
``` ```
### Placeholders
Placeholders can be used to insert special elements in a specific place.
```md
Insert the table of contents
[[TOC]]
Insert the current date
[[date]]
Insert the current time
[[time]]
```
### Metadata ### Metadata
Additional metadata can be provided for some elements. Additional metadata can be provided for some elements.
@ -120,4 +135,7 @@ Set the size of an image
Set the source of a quote Set the source of a quote
[author=Me date=[[date]] display="author - date"]> It's me [author=Me date=[[date]] display="author - date"]> It's me
Set options for placeholders
[[toc]][ordered]
``` ```

@ -211,6 +211,7 @@ pub struct Image {
pub struct Placeholder { pub struct Placeholder {
pub(crate) name: String, pub(crate) name: String,
pub(crate) value: Option<Element>, pub(crate) value: Option<Element>,
pub(crate) metadata: Option<InlineMetadata>,
} }
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
@ -260,21 +261,21 @@ impl Document {
found found
} }
pub fn create_toc(&self) -> List { pub fn create_toc(&self, ordered: bool) -> List {
let mut list = List::new(); let mut list = List::new();
list.ordered = true; list.ordered = ordered;
self.elements.iter().for_each(|e| match e { self.elements.iter().for_each(|e| match e {
Block::Section(sec) => { Block::Section(sec) => {
if !sec.get_hide_in_toc() { if !sec.get_hide_in_toc() {
let mut item = ListItem::new(Line::Anchor(sec.header.get_anchor()), 1, true); let mut item = ListItem::new(Line::Anchor(sec.header.get_anchor()), 1, ordered);
item.children.append(&mut sec.get_toc_list().items); item.children.append(&mut sec.get_toc_list(ordered).items);
list.add_item(item); list.add_item(item);
} }
} }
Block::Import(imp) => { Block::Import(imp) => {
let anchor = imp.anchor.lock().unwrap(); let anchor = imp.anchor.lock().unwrap();
if let Some(doc) = &anchor.document { if let Some(doc) = &anchor.document {
list.items.append(&mut doc.create_toc().items) list.items.append(&mut doc.create_toc(ordered).items)
} }
} }
_ => {} _ => {}
@ -317,13 +318,13 @@ impl Section {
found found
} }
pub fn get_toc_list(&self) -> List { pub fn get_toc_list(&self, ordered: bool) -> List {
let mut list = List::new(); let mut list = List::new();
self.elements.iter().for_each(|e| { self.elements.iter().for_each(|e| {
if let Block::Section(sec) = e { if let Block::Section(sec) = e {
if !sec.get_hide_in_toc() { if !sec.get_hide_in_toc() {
let mut item = ListItem::new(Line::Anchor(sec.header.get_anchor()), 1, true); let mut item = ListItem::new(Line::Anchor(sec.header.get_anchor()), 1, ordered);
item.children.append(&mut sec.get_toc_list().items); item.children.append(&mut sec.get_toc_list(ordered).items);
list.add_item(item); list.add_item(item);
} }
} }
@ -469,8 +470,12 @@ impl PartialEq for Import {
} }
impl Placeholder { impl Placeholder {
pub fn new(name: String) -> Self { pub fn new(name: String, metadata: Option<InlineMetadata>) -> Self {
Self { name, value: None } Self {
name,
value: None,
metadata,
}
} }
pub fn set_value(&mut self, value: Element) { pub fn set_value(&mut self, value: Element) {

@ -106,8 +106,6 @@ pub struct Parser {
} }
impl Parser { impl Parser {
/// TODO fn get_until(until: &[char], err_when: &[]) -> String
pub fn new_from_file(path: String) -> Result<Self, io::Error> { pub fn new_from_file(path: String) -> Result<Self, io::Error> {
let content = read_to_string(path.clone())?; let content = read_to_string(path.clone())?;
Ok(Self::new(content, Some(path))) Ok(Self::new(content, Some(path)))
@ -716,7 +714,13 @@ impl Parser {
}; };
self.skip_char(); self.skip_char();
let placeholder = Arc::new(Mutex::new(Placeholder::new(name))); let metadata = if let Ok(meta) = self.parse_inline_metadata() {
Some(meta)
} else {
None
};
let placeholder = Arc::new(Mutex::new(Placeholder::new(name, metadata)));
self.document.add_placeholder(Arc::clone(&placeholder)); self.document.add_placeholder(Arc::clone(&placeholder));
Ok(placeholder) Ok(placeholder)

@ -35,7 +35,14 @@ impl ProcessPlaceholders for Document {
self.placeholders.iter().for_each(|p| { self.placeholders.iter().for_each(|p| {
let mut pholder = p.lock().unwrap(); let mut pholder = p.lock().unwrap();
match pholder.name.to_ascii_lowercase().as_str() { match pholder.name.to_ascii_lowercase().as_str() {
P_TOC => pholder.set_value(block!(Block::List(self.create_toc()))), P_TOC => {
let ordered = if let Some(meta) = &pholder.metadata {
meta.get_bool("ordered")
} else {
false
};
pholder.set_value(block!(Block::List(self.create_toc(ordered))))
}
P_DATE => pholder.set_value(inline!(Inline::Plain(PlainText { P_DATE => pholder.set_value(inline!(Inline::Plain(PlainText {
value: get_date_string() value: get_date_string()
}))), }))),
@ -53,7 +60,7 @@ impl ProcessPlaceholders for Document {
fn get_time_string() -> String { fn get_time_string() -> String {
let now = Local::now(); let now = Local::now();
format!("{:02}:{:02}:{02}", now.hour(), now.minute(), now.second()) format!("{:02}:{:02}:{:02}", now.hour(), now.minute(), now.second())
} }
fn get_date_string() -> String { fn get_date_string() -> String {

Loading…
Cancel
Save