72 lines
2.2 KiB
JavaScript
72 lines
2.2 KiB
JavaScript
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, '"')
|
|
.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);
|
|
}
|
|
}
|