1#![doc = include_str!("../README.md")]
4#![doc(
5 html_favicon_url = "https://kura.pro/metadata-gen/images/favicon.ico",
6 html_logo_url = "https://kura.pro/metadata-gen/images/logos/metadata-gen.svg",
7 html_root_url = "https://docs.rs/metadata-gen"
8)]
9#![crate_name = "metadata_gen"]
10#![crate_type = "lib"]
11
12use std::collections::HashMap;
13
14pub mod error;
16pub mod metadata;
18pub mod metatags;
20pub mod utils;
22
23pub use error::MetadataError;
24pub use metadata::{extract_metadata, process_metadata, Metadata};
25pub use metatags::{generate_metatags, MetaTagGroups};
26pub use utils::{async_extract_metadata_from_file, escape_html};
27
28pub type MetadataMap = HashMap<String, String>;
30pub type Keywords = Vec<String>;
32pub type MetadataResult =
34 Result<(MetadataMap, Keywords, MetaTagGroups), MetadataError>;
35
36pub fn extract_and_prepare_metadata(content: &str) -> MetadataResult {
75 if !content.contains(":") {
77 return Err(MetadataError::ExtractionError {
78 message: "No valid front matter found".to_string(),
79 });
80 }
81
82 let metadata = extract_metadata(content)?;
83 let metadata_map = metadata.into_inner();
84 let keywords = extract_keywords(&metadata_map);
85 let all_meta_tags = generate_metatags(&metadata_map);
86
87 Ok((metadata_map, keywords, all_meta_tags))
88}
89
90pub fn extract_keywords(
102 metadata: &HashMap<String, String>,
103) -> Vec<String> {
104 metadata
105 .get("keywords")
106 .map(|k| k.split(',').map(|s| s.trim().to_string()).collect())
107 .unwrap_or_default()
108}
109
110#[cfg(test)]
111mod tests {
112 use super::*;
113
114 #[test]
115 fn test_extract_and_prepare_metadata() {
116 let content = r#"---
117title: Test Page
118description: A test page for metadata extraction
119keywords: test, metadata, extraction
120---
121# Test Content
122This is a test file for metadata extraction."#;
123
124 let result = extract_and_prepare_metadata(content);
125 assert!(result.is_ok());
126
127 let (metadata, keywords, meta_tags) = result.unwrap();
128 assert_eq!(
129 metadata.get("title"),
130 Some(&"Test Page".to_string())
131 );
132 assert_eq!(
133 metadata.get("description"),
134 Some(&"A test page for metadata extraction".to_string())
135 );
136 assert_eq!(keywords, vec!["test", "metadata", "extraction"]);
137 assert!(!meta_tags.primary.is_empty());
138 }
139
140 #[test]
141 fn test_extract_keywords() {
142 let mut metadata = HashMap::new();
143 metadata.insert(
144 "keywords".to_string(),
145 "rust, programming, metadata".to_string(),
146 );
147
148 let keywords = extract_keywords(&metadata);
149 assert_eq!(keywords, vec!["rust", "programming", "metadata"]);
150 }
151
152 #[test]
153 fn test_extract_keywords_empty() {
154 let metadata = HashMap::new();
155 let keywords = extract_keywords(&metadata);
156 assert!(keywords.is_empty());
157 }
158}