#![doc = include_str!("../README.md")]
#![doc(
html_favicon_url = "https://kura.pro/metadata-gen/images/favicon.ico",
html_logo_url = "https://kura.pro/metadata-gen/images/logos/metadata-gen.svg",
html_root_url = "https://docs.rs/metadata-gen"
)]
#![crate_name = "metadata_gen"]
#![crate_type = "lib"]
use std::collections::HashMap;
pub mod error;
pub mod metadata;
pub mod metatags;
pub mod utils;
pub use error::MetadataError;
pub use metadata::{extract_metadata, process_metadata, Metadata};
pub use metatags::{generate_metatags, MetaTagGroups};
pub use utils::{async_extract_metadata_from_file, escape_html};
pub type MetadataMap = HashMap<String, String>;
pub type Keywords = Vec<String>;
pub type MetadataResult =
Result<(MetadataMap, Keywords, MetaTagGroups), MetadataError>;
pub fn extract_and_prepare_metadata(content: &str) -> MetadataResult {
if !content.contains(":") {
return Err(MetadataError::ExtractionError {
message: "No valid front matter found".to_string(),
});
}
let metadata = extract_metadata(content)?;
let metadata_map = metadata.into_inner();
let keywords = extract_keywords(&metadata_map);
let all_meta_tags = generate_metatags(&metadata_map);
Ok((metadata_map, keywords, all_meta_tags))
}
pub fn extract_keywords(
metadata: &HashMap<String, String>,
) -> Vec<String> {
metadata
.get("keywords")
.map(|k| k.split(',').map(|s| s.trim().to_string()).collect())
.unwrap_or_default()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_extract_and_prepare_metadata() {
let content = r#"---
title: Test Page
description: A test page for metadata extraction
keywords: test, metadata, extraction
---
# Test Content
This is a test file for metadata extraction."#;
let result = extract_and_prepare_metadata(content);
assert!(result.is_ok());
let (metadata, keywords, meta_tags) = result.unwrap();
assert_eq!(
metadata.get("title"),
Some(&"Test Page".to_string())
);
assert_eq!(
metadata.get("description"),
Some(&"A test page for metadata extraction".to_string())
);
assert_eq!(keywords, vec!["test", "metadata", "extraction"]);
assert!(!meta_tags.primary.is_empty());
}
#[test]
fn test_extract_keywords() {
let mut metadata = HashMap::new();
metadata.insert(
"keywords".to_string(),
"rust, programming, metadata".to_string(),
);
let keywords = extract_keywords(&metadata);
assert_eq!(keywords, vec!["rust", "programming", "metadata"]);
}
#[test]
fn test_extract_keywords_empty() {
let metadata = HashMap::new();
let keywords = extract_keywords(&metadata);
assert!(keywords.is_empty());
}
}