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);