File size: 3,119 Bytes
4d7e26e ec42294 4d7e26e dbfea4d 4d7e26e ec42294 4d7e26e 8644ef8 4d7e26e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | (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", "epub-chapters": "epub-chapters", 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.ReaderFallback || record.readerFallback) params.set("fallback", record.ReaderFallback || record.readerFallback);
if (record.ReaderChapterManifest || record.readerChapterManifest || record.ChapterManifest || record.chapterManifest) params.set("chapter_manifest", record.ReaderChapterManifest || record.readerChapterManifest || record.ChapterManifest || record.chapterManifest);
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);
|