export class DocumentFormatter { static MONTHS_ID = ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Agu', 'Sep', 'Okt', 'Nov', 'Des']; static CATEGORY_RULES = [ { key: 'skripsi', match: ['skripsi', 'tugas akhir', 'ta'] }, { key: 'akademik', match: ['akademik', 'kalender', 'kaldik'] }, { key: 'praktik', match: ['praktik', 'praktek', 'kerja praktik', 'kp'] }, ]; static formatDate(iso) { if (!iso) return ''; const date = new Date(iso); if (Number.isNaN(date.getTime())) return ''; const day = String(date.getDate()).padStart(2, '0'); const month = this.MONTHS_ID[date.getMonth()]; return `${day} ${month} ${date.getFullYear()}`; } static categoryFromTags(tags) { if (!tags || tags.length === 0) return 'umum'; const lower = tags.map(tag => tag.toLowerCase()); for (const rule of this.CATEGORY_RULES) { if (rule.match.some(match => lower.includes(match))) return rule.key; } return 'umum'; } static fileTypeFromName(name) { const lower = (name || '').toLowerCase(); if (lower.endsWith('.docx') || lower.endsWith('.doc')) return 'docx'; return 'pdf'; } static downloadFilename(name, type) { const ext = `.${type}`; return name.toLowerCase().endsWith(ext) ? name : `${name}${ext}`; } static escapeHtml(str) { if (str == null) return ''; return String(str) .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); } static escapeAttr(str) { return this.escapeHtml(str); } static parseTags(raw) { if (!raw) return []; const str = String(raw).trim(); if (!str) return []; if (str.startsWith('[')) { try { const arr = JSON.parse(str); if (Array.isArray(arr)) { return arr.map(tag => String(tag).trim()).filter(Boolean); } } catch { // Fall through to comma-separated parsing. } } return str.split(',').map(tag => tag.trim()).filter(Boolean); } }