/** * Format Utilities * * Функции для форматирования данных (время, текст, UUID). */ /** * Генерация UUID v4 * @returns {string} UUID */ export function generateUUID() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { const r = Math.random() * 16 | 0 const v = c === 'x' ? r : (r & 0x3 | 0x8) return v.toString(16) }) } /** * Форматировать время в секундах в читаемый вид * @param {number} seconds - Количество секунд * @returns {string} Отформатированное время (например, "2.5 сек", "1 мин 30 сек") */ export function formatTime(seconds) { if (seconds < 60) { return `${seconds.toFixed(1)} сек` } const minutes = Math.floor(seconds / 60) const secs = Math.floor(seconds % 60) return `${minutes} мин ${secs} сек` } /** * Форматировать ISO timestamp в локальное время * @param {string} isoString - ISO строка времени * @returns {string} Отформатированное локальное время */ export function formatTimestamp(isoString) { try { const date = new Date(isoString) return date.toLocaleString('ru-RU', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit' }) } catch (e) { return isoString } } /** * Проверить является ли текст таблицей * @param {string} text - Текст для проверки * @returns {boolean} True если текст похож на таблицу */ export function isTableText(text) { const lines = text.split('\n').filter(line => line.trim()) if (lines.length < 3) return false // Проверить наличие разделителей const hasSeparator = lines.some(line => /^[\s\-|+]+$/.test(line)) const hasPipes = lines.filter(line => line.includes('|')).length > 2 return hasSeparator || hasPipes } /** * Парсинг текстовой таблицы в HTML * @param {string} text - Текст таблицы * @returns {string} HTML таблица */ export function parseTextTable(text) { const lines = text.split('\n').filter(line => line.trim()) if (lines.length < 2) { return `
${escapeHtml(text)}`
}
let html = '