(function (root) { "use strict"; const ReaderMode = Object.freeze({ UNSUPPORTED: 0, ORIGINAL: 1, CONVERTED: 2, PENDING: 3, FAILED: 4, }); const modes = Object.freeze({ pdf: "pdf", epub: "epub", docx: "docx", html: "html", htm: "html", txt: "text", md: "markdown", markdown: "markdown", jpg: "image", jpeg: "image", png: "image", gif: "image", bmp: "image", webp: "image", mp3: "audio", wav: "audio", m4a: "audio", flac: "audio", mpga: "audio", audio: "audio", mp4: "video", mov: "video", video: "video", }); const articleExtensions = Object.freeze(Object.keys(modes)); function capability(extension) { const normalized = String(extension || "").toLowerCase(); return Object.freeze({ extension: normalized, mode: modes[normalized] || null, readerMode: modes[normalized] ? ReaderMode.ORIGINAL : ReaderMode.UNSUPPORTED, article: !!modes[normalized], }); } function clampNumber(value, minimum, maximum, fallback) { const numeric = Math.round(Number(value)); return Number.isFinite(numeric) ? Math.min(maximum, Math.max(minimum, numeric)) : fallback; } function readerUrl(record, basePath) { const source = record && (record.ReaderLink || record.readerLink || record.Link || record.link); const readerExtension = record && (record.ReaderExtension || record.readerExtension || record.Extension || record.extension); if (!source || capability(readerExtension).readerMode === ReaderMode.UNSUPPORTED) return ""; const params = new URLSearchParams({ url: source, title: (record.File || record.name || "") + ((record.Extension || record.extension) ? "." + (record.Extension || record.extension) : ""), ext: readerExtension || "", }); if (record.DownloadLink || record.downloadLink) params.set("download", record.DownloadLink || record.downloadLink); if (record.OcrUrl || record.ocrUrl) params.set("ocr", record.OcrUrl || record.ocrUrl); if (record.ReturnUrl || record.returnUrl) params.set("return", record.ReturnUrl || record.returnUrl); const repo = String(record.Repo || record.repo || "").split("/").pop(); const folder = Array.isArray(record.Folder || record.folder) ? (record.Folder || record.folder).join("/") : ""; if (repo) params.set("path", repo + (folder ? "/" + folder : "")); if (record.FolderUrl || record.folderUrl) params.set("folder_url", record.FolderUrl || record.folderUrl); return (basePath || "/reader.html") + "?" + params.toString(); } root.VoiceOfMLReader = Object.freeze({ ReaderMode, articleExtensions, capability, clampNumber, readerUrl }); })(typeof self !== "undefined" ? self : window);