Files
mmkk/frontend/src/utils/markdown.ts

111 lines
2.7 KiB
TypeScript
Raw Normal View History

/**
* Markdown工具模块
* Markdown相关的辅助函数
*/
/**
* Markdown中的标题用于目录
*/
export function extractHeadings(content: string): Array<{
level: number;
text: string;
id: string;
}> {
const headingRegex = /^(#{1,6})\s+(.+)$/gm;
const headings: Array<{ level: number; text: string; id: string }> = [];
let match;
while ((match = headingRegex.exec(content)) !== null) {
const level = match[1].length;
const text = match[2].trim();
const id = text.toLowerCase().replace(/[^\w\u4e00-\u9fa5]+/g, '-');
headings.push({ level, text, id });
}
return headings;
}
/**
*
*/
export function calculateReadingTime(content: string): number {
const chineseChars = content.match(/[\u4e00-\u9fa5]/g) || [];
const englishWords = content.match(/\b\w+\b/g) || [];
const chineseTime = chineseChars.length / 500;
const englishTime = englishWords.length / 200;
return Math.max(1, Math.ceil(chineseTime + englishTime));
}
/**
*
*/
export function calculateWordCount(content: string): {
characters: number;
words: number;
lines: number;
} {
const chineseChars = content.match(/[\u4e00-\u9fa5]/g) || [];
const englishWords = content.match(/\b\w+\b/g) || [];
const lines = content.split('\n').length;
return {
characters: chineseChars.length,
words: englishWords.length,
lines,
};
}
/**
*
*/
export function saveToLocalStorage(key: string, content: string): void {
try {
localStorage.setItem(`markdown-editor-${key}`, content);
} catch (error) {
console.warn('Failed to save to localStorage:', error);
}
}
/**
*
*/
export function loadFromLocalStorage(key: string): string | null {
try {
return localStorage.getItem(`markdown-editor-${key}`);
} catch (error) {
console.warn('Failed to load from localStorage:', error);
return null;
}
}
/**
*
*/
export function formatFileSize(bytes: number): string {
if (bytes === 0) return '0 B';
const k = 1024;
const sizes = ['B', 'KB', 'MB', 'GB'];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;
}
/**
*
*/
export function formatDate(timestamp: number): string {
const date = new Date(timestamp);
const now = new Date();
const diff = now.getTime() - date.getTime();
if (diff < 60000) return '刚刚';
if (diff < 3600000) return `${Math.floor(diff / 60000)}分钟前`;
if (diff < 86400000) return `${Math.floor(diff / 3600000)}小时前`;
if (diff < 604800000) return `${Math.floor(diff / 86400000)}天前`;
return date.toLocaleDateString('zh-CN');
}