Files
Project-Thoth/applications/chatgpt-capture/src/filename.js
T

45 lines
1.4 KiB
JavaScript

function formatDateForFilename(dateValue) {
const date = dateValue ? new Date(dateValue) : new Date();
if (Number.isNaN(date.getTime())) {
return new Date().toISOString().slice(0, 10);
}
return date.toISOString().slice(0, 10);
}
function sanitizeFilenamePart(value) {
return String(value || "")
.normalize("NFKD")
.replace(/[\u0000-\u001F\u007F]/g, "")
.replace(/[<>:"/\\|?*]/g, " ")
.replace(/\s+/g, " ")
.replace(/^\.+|\.+$/g, "")
.replace(/^\s+|\s+$/g, "")
.trim();
}
function truncateFilename(filename, maxLength) {
if (!filename) {
return filename;
}
if (filename.length <= maxLength) {
return filename;
}
const extension = filename.slice(filename.lastIndexOf("."));
const base = filename.slice(0, filename.lastIndexOf("."));
const safeExtension = extension || ".md";
const safeBase = base.slice(0, Math.max(1, maxLength - safeExtension.length - 1)).trimEnd();
return `${safeBase}${safeExtension}`;
}
export function createConversationFilename(capturePayload) {
const date = formatDateForFilename(capturePayload?.capturedAt);
const platform = sanitizeFilenamePart(capturePayload?.sourcePlatform || "ChatGPT") || "ChatGPT";
const title = sanitizeFilenamePart(capturePayload?.title || "Conversation") || "Conversation";
const baseFilename = `${date} - ${platform} - ${title}.md`;
return truncateFilename(baseFilename, 180);
}