/**
* 文件: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;
}
}
}