Skip to main content

nargo_document/theme/
mod.rs

1//! 主题系统模块
2//! 提供主题管理和模板渲染功能,兼容 VuTeX 主题系统
3
4pub mod dark_theme;
5pub mod default_theme;
6pub mod tech_theme;
7
8pub use dark_theme::DarkTheme;
9pub use default_theme::{DefaultTheme, LocaleInfo, NavItem, PageContext, SidebarGroup, SidebarLink};
10pub use tech_theme::TechTheme;
11
12use crate::config::Config;
13use std::sync::Arc;
14
15/// 主题 Trait,定义了主题必须实现的功能
16pub trait Theme: Send + Sync {
17    /// 获取主题名称
18    fn name(&self) -> &str;
19
20    /// 渲染页面
21    fn render_page(&self, context: &PageContext) -> Result<String, Box<dyn std::error::Error>>;
22
23    /// 获取主题配置
24    fn config(&self) -> &Config;
25
26    /// 获取主题的静态资源
27    fn static_resources(&self) -> Vec<(String, String)> {
28        Vec::new()
29    }
30}
31
32/// 主题工厂,用于创建主题实例
33pub struct ThemeFactory;
34
35impl ThemeFactory {
36    /// 创建主题实例
37    ///
38    /// # 参数
39    /// * `theme_name` - 主题名称
40    /// * `config` - 文档配置
41    ///
42    /// # 返回值
43    /// 返回主题实例或错误
44    pub fn create(theme_name: &str, config: Config) -> Result<Arc<dyn Theme>, Box<dyn std::error::Error>> {
45        match theme_name.to_lowercase().as_str() {
46            "default" => Ok(Arc::new(DefaultTheme::new(config)?)),
47            "dark" => Ok(Arc::new(DarkTheme::new(config)?)),
48            "tech" => Ok(Arc::new(TechTheme::new(config)?)),
49            "vutex-theme-default" => Ok(Arc::new(DefaultTheme::new(config)?)),
50            _ => Err(format!("Unknown theme: {}", theme_name).into()),
51        }
52    }
53
54    /// 获取所有可用主题名称
55    pub fn available_themes() -> Vec<&'static str> {
56        vec!["default", "dark", "tech", "vutex-theme-default"]
57    }
58}