/** * 文件:html-processor.ts * 作用:处理HTML内容的生成和格式化 * * 职责: * 1. HTML内容清理和格式化 * 2. CSS样式内联处理 * 3. HTML结构生成 * 4. 代码高亮处理 */ import { sanitizeHTMLToDom } from 'obsidian'; import { applyCSS } from '../utils'; import InlineCSS from '../inline-css'; import { NMPSettings } from '../settings'; import AssetsManager from '../assets'; import { ErrorHandler } from './error-handler'; export interface HtmlProcessOptions { enableCodeHighlight?: boolean; enableInlineCSS?: boolean; theme?: string; highlight?: string; customCSS?: string; } /** * HTML处理器类 */ export class HtmlProcessor { private settings: NMPSettings; private assetsManager: AssetsManager; constructor() { this.settings = NMPSettings.getInstance(); this.assetsManager = AssetsManager.getInstance(); } /** * 生成完整的HTML文档 */ generateFullHtml(content: string, options: HtmlProcessOptions = {}): string { try { const theme = options.theme || this.settings.defaultStyle; const highlight = options.highlight || this.settings.defaultHighlight; // 获取基础样式 const baseCSS = this.getBaseCSS(theme, highlight); // 处理自定义CSS let customCSS = options.customCSS || ''; if (this.settings.useCustomCss && this.settings.customCSSNote) { customCSS += '\n' + this.settings.customCSSNote; } // 构建完整HTML const html = ` Note2Any Export
${content}
`; return html; } catch (error) { ErrorHandler.handle(error as Error, 'HtmlProcessor.generateFullHtml'); throw error; } } /** * 处理HTML内容的内联CSS */ async processInlineCSS(html: string): Promise { // 简化版内联CSS处理,使用原生方法 try { // 这里可以实现一个简单的CSS内联功能 // 或者集成第三方库如 juice return html; } catch (error) { ErrorHandler.handle(error as Error, 'HtmlProcessor.processInlineCSS'); console.warn('[HtmlProcessor] 内联CSS处理失败,使用原始HTML', error); return html; } } /** * 清理和格式化HTML内容 */ sanitizeHtml(html: string): DocumentFragment { try { return sanitizeHTMLToDom(html); } catch (error) { ErrorHandler.handle(error as Error, 'HtmlProcessor.sanitizeHtml'); throw error; } } /** * 应用CSS样式到元素 */ applyStylesToElement(html: string, css: string): string { try { return applyCSS(html, css); } catch (error) { ErrorHandler.handle(error as Error, 'HtmlProcessor.applyStylesToElement'); throw error; } } /** * 获取基础CSS样式 */ private getBaseCSS(theme: string, highlight: string): string { try { let css = ''; // 主题样式 const themeCSS = this.assetsManager.getTheme(theme); if (themeCSS) { css += themeCSS + '\n'; } // 代码高亮样式 const highlightCSS = this.assetsManager.getHighlight(highlight); if (highlightCSS) { css += highlightCSS + '\n'; } return css; } catch (error) { ErrorHandler.handle(error as Error, 'HtmlProcessor.getBaseCSS'); return ''; } } /** * 生成响应式HTML包装器 */ wrapWithResponsive(content: string, maxWidth = '800px'): string { return `
${content}
`; } /** * 添加打印样式 */ addPrintStyles(): string { return ` `; } /** * 处理代码块高亮 */ processCodeHighlight(html: string, highlight: string): string { try { // 这里可以添加更复杂的代码高亮处理逻辑 // 目前主要依赖 AssetsManager 提供的高亮样式 return html; } catch (error) { ErrorHandler.handle(error as Error, 'HtmlProcessor.processCodeHighlight'); return html; } } /** * 优化HTML结构用于移动端显示 */ optimizeForMobile(html: string): string { try { // 添加移动端优化的meta标签和样式 const mobileOptimizations = ` `; // 在head标签中插入移动端优化 return html.replace('', mobileOptimizations + ''); } catch (error) { ErrorHandler.handle(error as Error, 'HtmlProcessor.optimizeForMobile'); return html; } } }