add generic metada type for md files + comments
This commit is contained in:
parent
1467740f60
commit
cb67c85040
1 changed files with 49 additions and 31 deletions
|
@ -6,6 +6,7 @@ use ramhorns::Content;
|
|||
use serde::{Deserialize, Deserializer};
|
||||
use std::fs;
|
||||
|
||||
/// Metadata for blog posts
|
||||
#[derive(Default, Deserialize, Content, Debug)]
|
||||
pub struct FileMetadataBlog {
|
||||
pub title: Option<String>,
|
||||
|
@ -16,37 +17,7 @@ pub struct FileMetadataBlog {
|
|||
pub toc: Option<bool>,
|
||||
}
|
||||
|
||||
#[derive(Default, Deserialize, Content, Debug)]
|
||||
pub struct FileMetadataContact {
|
||||
pub title: String,
|
||||
pub custom: Option<bool>,
|
||||
pub user: Option<String>,
|
||||
pub link: Option<String>,
|
||||
pub newtab: Option<bool>,
|
||||
pub description: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(Default, Deserialize, Content, Debug)]
|
||||
pub struct FileMetadataPortfolio {
|
||||
pub title: Option<String>,
|
||||
pub link: Option<String>,
|
||||
pub description: Option<String>,
|
||||
pub language: Option<String>,
|
||||
}
|
||||
|
||||
pub enum TypeFileMetadata {
|
||||
Blog,
|
||||
Contact,
|
||||
Portfolio,
|
||||
}
|
||||
|
||||
#[derive(Default, Deserialize, Content, Debug)]
|
||||
pub struct FileMetadata {
|
||||
pub blog: Option<FileMetadataBlog>,
|
||||
pub contact: Option<FileMetadataContact>,
|
||||
pub portfolio: Option<FileMetadataPortfolio>,
|
||||
}
|
||||
|
||||
/// A tag, related to post blog
|
||||
#[derive(Content, Debug, Clone)]
|
||||
pub struct Tag {
|
||||
pub name: String,
|
||||
|
@ -67,6 +38,44 @@ impl<'de> Deserialize<'de> for Tag {
|
|||
}
|
||||
}
|
||||
|
||||
/// Metadata for contact entry
|
||||
#[derive(Default, Deserialize, Content, Debug)]
|
||||
pub struct FileMetadataContact {
|
||||
pub title: String,
|
||||
pub custom: Option<bool>,
|
||||
pub user: Option<String>,
|
||||
pub link: Option<String>,
|
||||
pub newtab: Option<bool>,
|
||||
pub description: Option<String>,
|
||||
}
|
||||
|
||||
/// Metadata for portfolio cards
|
||||
#[derive(Default, Deserialize, Content, Debug)]
|
||||
pub struct FileMetadataPortfolio {
|
||||
pub title: Option<String>,
|
||||
pub link: Option<String>,
|
||||
pub description: Option<String>,
|
||||
pub language: Option<String>,
|
||||
}
|
||||
|
||||
/// List of available metadata types
|
||||
pub enum TypeFileMetadata {
|
||||
Generic,
|
||||
Blog,
|
||||
Contact,
|
||||
Portfolio,
|
||||
}
|
||||
|
||||
/// Structure who holds all the metadata the file have
|
||||
/// Usually all fields are None except one
|
||||
#[derive(Default, Deserialize, Content, Debug)]
|
||||
pub struct FileMetadata {
|
||||
pub blog: Option<FileMetadataBlog>,
|
||||
pub contact: Option<FileMetadataContact>,
|
||||
pub portfolio: Option<FileMetadataPortfolio>,
|
||||
}
|
||||
|
||||
/// Global metadata
|
||||
#[derive(Content, Debug)]
|
||||
pub struct Metadata {
|
||||
pub info: FileMetadata,
|
||||
|
@ -75,6 +84,7 @@ pub struct Metadata {
|
|||
pub syntax_highlight: bool,
|
||||
}
|
||||
|
||||
/// File description
|
||||
#[derive(Content, Debug)]
|
||||
pub struct File {
|
||||
pub metadata: Metadata,
|
||||
|
@ -214,7 +224,11 @@ pub fn get_metadata<'a>(root: &'a AstNode<'a>, mtype: TypeFileMetadata) -> FileM
|
|||
match root
|
||||
.children()
|
||||
.find_map(|node| match &node.data.borrow().value {
|
||||
// Extract metadata from frontmatter
|
||||
NodeValue::FrontMatter(text) => Some(match mtype {
|
||||
TypeFileMetadata::Generic => FileMetadata {
|
||||
..FileMetadata::default()
|
||||
},
|
||||
TypeFileMetadata::Blog => FileMetadata {
|
||||
blog: Some(deserialize_metadata(text)),
|
||||
..FileMetadata::default()
|
||||
|
@ -240,7 +254,11 @@ pub fn get_metadata<'a>(root: &'a AstNode<'a>, mtype: TypeFileMetadata) -> FileM
|
|||
_ => None,
|
||||
}) {
|
||||
Some(data) => data,
|
||||
// No metadata
|
||||
None => match mtype {
|
||||
TypeFileMetadata::Generic => FileMetadata {
|
||||
..FileMetadata::default()
|
||||
},
|
||||
TypeFileMetadata::Blog => FileMetadata {
|
||||
blog: Some(FileMetadataBlog::default()),
|
||||
..FileMetadata::default()
|
||||
|
|
Loading…
Reference in a new issue