use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FrontMatter {
pub title: Option<String>,
pub date: Option<DateTime<Utc>>,
pub tags: Option<Vec<String>>,
pub lang: Option<String>,
pub draft: Option<bool>,
#[serde(flatten)]
pub extra: HashMap<String, serde_yaml::Value>,
}
#[derive(Debug, Clone)]
pub struct Document {
pub front_matter: FrontMatter,
pub content: String,
pub file_path: String,
pub language: String,
pub base_name: String,
}
pub fn parse_markdown_with_frontmatter(content: &str) -> Result<(FrontMatter, String), Box<dyn std::error::Error>> {
if let Some(stripped) = content.strip_prefix("---\n") {
if let Some(end_pos) = stripped.find("\n---\n") {
let yaml_content = &stripped[..end_pos];
let markdown_content = &stripped[end_pos + 5..];
let front_matter: FrontMatter = serde_yaml::from_str(yaml_content)?;
return Ok((front_matter, markdown_content.to_string()));
}
}
Ok((FrontMatter {
title: None,
date: None,
tags: None,
lang: None,
draft: None,
extra: HashMap::new(),
}, content.to_string()))
}
pub fn extract_language_from_filename(filename: &str) -> (String, String) {
if let Some(dot_pos) = filename.rfind('.') {
let base_part = &filename[..dot_pos];
let potential_lang = &filename[dot_pos + 1..];
if potential_lang.len() == 2 {
return (base_part.to_string(), potential_lang.to_string());
}
}
(filename.to_string(), "en".to_string())
}