UNPKG

r2-shared-js

Version:

Readium 2 'shared' for NodeJS (TypeScript)

729 lines (728 loc) 72.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.convertDaisyToReadiumWebPub = void 0; var tslib_1 = require("tslib"); var debug_ = require("debug"); var fs = require("fs"); var mime = require("mime-types"); var path = require("path"); var xmldom = require("@xmldom/xmldom"); var xpath = require("xpath"); var yazl_1 = require("yazl"); var media_overlay_1 = require("../models/media-overlay"); var metadata_1 = require("../models/metadata"); var metadata_properties_1 = require("../models/metadata-properties"); var publication_1 = require("../models/publication"); var publication_link_1 = require("../models/publication-link"); var serializable_1 = require("r2-lcp-js/dist/es5/src/serializable"); var epub_daisy_common_1 = require("./epub-daisy-common"); var debug = debug_("r2:shared#parser/daisy-convert-to-epub"); function ensureDirs(fspath) { var dirname = path.dirname(fspath); if (!fs.existsSync(dirname)) { ensureDirs(dirname); fs.mkdirSync(dirname); } } var convertDaisyToReadiumWebPub = function (outputDirPath, publication, generateDaisyAudioManifestOnly) { return tslib_1.__awaiter(void 0, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { return [2, new Promise(function (resolve, reject) { return tslib_1.__awaiter(void 0, void 0, void 0, function () { var isFullTextAudio, isAudioOnly, isTextOnly, zipInternal, zip, nccZipEntry, outputZipPath, timeoutId, zipfile, writeStream, select, elementNames, mediaOverlaysMap_1, getMediaOverlaysDuration_1, patchMediaOverlaysTextHref_1, smilDocs_1, loadOrGetCachedSmil_1, findLinkInToc_1, createHtmlFromSmilFile, audioOnlySmilHtmls, previousLinkItem, spineIndex, _i, _a, linkItem, computedDur, dur, smilTextRef, audioOnlySmilHtmlHref, smilHtml, resourcesToKeep, dtBooks, _b, _c, resLink, cssText, _d, elementNames_1, elementName, regex, dtBookStr, dtBookDoc, title, listElements, i, listElement, type, _e, elementNames_2, elementName, els, _f, els_1, el, cls, stylesheets, cssHrefs, _g, stylesheets_1, stylesheet, match, href, smilRefs, _h, smilRefs_1, smilRef, ref, dtbookNowXHTML, xhtmlFilePath, resLinkJson, resLinkClone, buff, mediaOverlaysSequence, _loop_1, _j, mediaOverlaysSequence_1, mediaOverlay, findFirstDescendantTextOrAudio_1, processLink_1, processLinks_1, _k, _l, link, _m, _o, link, jsonObj, jsonStr, transformPublicationToAudioBook, audioPublication, jsonObjAudio, jsonStrAudio, outputManifestPath, ero_1, erreur_1; var _p, _q, _r, _s, _t; return tslib_1.__generator(this, function (_u) { switch (_u.label) { case 0: isFullTextAudio = ((_p = publication.Metadata) === null || _p === void 0 ? void 0 : _p.AdditionalJSON) && (publication.Metadata.AdditionalJSON["dtb:multimediaType"] === "audioFullText" || publication.Metadata.AdditionalJSON["ncc:multimediaType"] === "audioFullText" || (!publication.Metadata.AdditionalJSON["dtb:multimediaType"] && !publication.Metadata.AdditionalJSON["ncc:multimediaType"])); isAudioOnly = ((_q = publication.Metadata) === null || _q === void 0 ? void 0 : _q.AdditionalJSON) && (publication.Metadata.AdditionalJSON["dtb:multimediaType"] === "audioNCX" || publication.Metadata.AdditionalJSON["ncc:multimediaType"] === "audioNcc"); isTextOnly = ((_r = publication.Metadata) === null || _r === void 0 ? void 0 : _r.AdditionalJSON) && (publication.Metadata.AdditionalJSON["dtb:multimediaType"] === "textNCX" || publication.Metadata.AdditionalJSON["ncc:multimediaType"] === "textNcc"); zipInternal = publication.findFromInternal("zip"); if (!zipInternal) { debug("No publication zip!?"); return [2, reject("No publication zip!?")]; } zip = zipInternal.Value; return [4, zip.getEntries()]; case 1: nccZipEntry = (_u.sent()).find(function (entry) { return /ncc\.html$/i.test(entry); }); outputZipPath = path.join(outputDirPath, "".concat(isAudioOnly ? "daisy_audioNCX" : (isTextOnly ? "daisy_textNCX" : "daisy_audioFullText"), "-to-epub.webpub")); if (!generateDaisyAudioManifestOnly) { ensureDirs(outputZipPath); } zipfile = generateDaisyAudioManifestOnly ? undefined : new yazl_1.ZipFile(); _u.label = 2; case 2: _u.trys.push([2, 33, 34, 35]); if (!generateDaisyAudioManifestOnly) { writeStream = fs.createWriteStream(outputZipPath); zipfile.outputStream.pipe(writeStream) .on("close", function () { debug("ZIP close"); if (timeoutId) { clearTimeout(timeoutId); timeoutId = undefined; resolve(outputZipPath); } }) .on("error", function (e) { debug("ZIP error", e); reject(e); }); } select = xpath.useNamespaces({ dtbook: "http://www.daisy.org/z3986/2005/dtbook/", }); elementNames = [ "address", "annoref", "annotation", "author", "bdo", "bodymatter", "book", "bridgehead", "byline", "caption", "cite", "col", "colgroup", "covertitle", "dateline", "dfn", "docauthor", "doctitle", "dtbook", "epigraph", "frontmatter", "hd", "imggroup", "kbd", "level", "levelhd", "level1", "level2", "level3", "level4", "level5", "level6", "lic", "line", "linegroup", "linenum", "link", "list", "note", "noteref", "pagenum", "poem", "prodnote", "rearmatter", "samp", "sent", "sub", "sup", "q", "w", "notice", "sidebar", "blockquote", "abbr", "acronym", "title", ]; getMediaOverlaysDuration_1 = function (mo) { var duration = 0; if (typeof mo.AudioClipBegin !== "undefined" && typeof mo.AudioClipEnd !== "undefined") { duration = mo.AudioClipEnd - mo.AudioClipBegin; } else if (mo.Children) { for (var _i = 0, _a = mo.Children; _i < _a.length; _i++) { var child = _a[_i]; duration += getMediaOverlaysDuration_1(child); } } return duration; }; patchMediaOverlaysTextHref_1 = function (mo, audioOnlySmilHtmlHref) { var smilTextRef; if (audioOnlySmilHtmlHref && mo.Audio) { smilTextRef = audioOnlySmilHtmlHref; mo.Text = "".concat(smilTextRef, "#").concat(mo.ParID || mo.TextID || "_yyy_"); } else if (mo.Text) { mo.Text = mo.Text.replace(/((\.xml)|(\.html))(#.*)?$/i, ".xhtml$4"); smilTextRef = mo.Text; var k = smilTextRef.indexOf("#"); if (k > 0) { smilTextRef = smilTextRef.substr(0, k); } } if (mo.Children) { for (var _i = 0, _a = mo.Children; _i < _a.length; _i++) { var child = _a[_i]; var smilTextRef_ = patchMediaOverlaysTextHref_1(child, audioOnlySmilHtmlHref); if (!smilTextRef_) { debug("########## WARNING: !smilTextRef ???!!", smilTextRef_, child); } else if (smilTextRef && smilTextRef !== smilTextRef_) { debug("########## WARNING: smilTextRef !== smilTextRef_ ???!!", smilTextRef, smilTextRef_); } if (!smilTextRef) { smilTextRef = smilTextRef_; } } } return smilTextRef; }; smilDocs_1 = {}; loadOrGetCachedSmil_1 = function (smilPathInZip) { return tslib_1.__awaiter(void 0, void 0, void 0, function () { var smilDoc, smilStr; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: smilDoc = smilDocs_1[smilPathInZip]; if (!!smilDoc) return [3, 2]; return [4, (0, epub_daisy_common_1.loadFileStrFromZipPath)(smilPathInZip, smilPathInZip, zip)]; case 1: smilStr = _a.sent(); if (!smilStr) { debug("!loadFileStrFromZipPath", smilPathInZip); return [2, Promise.reject("!loadFileStrFromZipPath " + smilPathInZip)]; } smilDoc = new xmldom.DOMParser().parseFromString(smilStr, "application/xml"); if (nccZipEntry) { (0, epub_daisy_common_1.flattenDaisy2SmilAudioSeq)(smilPathInZip, smilDoc); } smilDocs_1[smilPathInZip] = smilDoc; _a.label = 2; case 2: return [2, Promise.resolve(smilDoc)]; } }); }); }; findLinkInToc_1 = function (links, hrefDecoded) { for (var _i = 0, links_1 = links; _i < links_1.length; _i++) { var link = links_1[_i]; if (link.HrefDecoded === hrefDecoded) { return link; } else if (link.Children) { var foundLink = findLinkInToc_1(link.Children, hrefDecoded); if (foundLink) { return foundLink; } } } return undefined; }; createHtmlFromSmilFile = function (smilPathInZip) { return tslib_1.__awaiter(void 0, void 0, void 0, function () { var smilDoc, smilDocClone, txtCounter, parEls, _i, parEls_1, parEl, audioElements, _a, audioElements_1, audioElement, textId, textElements, _b, textElements_1, textElement, src, elmId, hrefDecoded, tocLinkItem, hrefDecoded_, text, textNode, bodyContent, bodyContentStr, contentStr, htmlDoc, htmlFilePath; return tslib_1.__generator(this, function (_c) { switch (_c.label) { case 0: return [4, loadOrGetCachedSmil_1(smilPathInZip)]; case 1: smilDoc = _c.sent(); smilDocClone = smilDoc.cloneNode(true); txtCounter = 0; parEls = Array.from(smilDocClone.getElementsByTagName("par")); for (_i = 0, parEls_1 = parEls; _i < parEls_1.length; _i++) { parEl = parEls_1[_i]; audioElements = Array.from(parEl.getElementsByTagName("audio")).filter(function (el) { return el; }); for (_a = 0, audioElements_1 = audioElements; _a < audioElements_1.length; _a++) { audioElement = audioElements_1[_a]; if (audioElement.parentNode) { audioElement.parentNode.removeChild(audioElement); } } textId = void 0; textElements = Array.from(parEl.getElementsByTagName("text")).filter(function (el) { return el; }); for (_b = 0, textElements_1 = textElements; _b < textElements_1.length; _b++) { textElement = textElements_1[_b]; src = textElement.getAttribute("src"); if (src) { textElement.setAttribute("data-src", src.replace(/((\.xml)|(\.html))(#.*)?$/i, ".xhtml$4")); textElement.removeAttribute("src"); } if (!textId) { textId = textElement.getAttribute("id"); } } elmId = parEl.getAttribute("id"); hrefDecoded = "".concat(smilPathInZip, "#").concat(elmId); tocLinkItem = publication.TOC ? findLinkInToc_1(publication.TOC, hrefDecoded) : undefined; if (!tocLinkItem && textId) { hrefDecoded_ = "".concat(smilPathInZip, "#").concat(textId); tocLinkItem = publication.TOC ? findLinkInToc_1(publication.TOC, hrefDecoded_) : undefined; } text = tocLinkItem ? tocLinkItem.Title : undefined; if (text) { txtCounter = 0; } textNode = smilDocClone.createTextNode(text ? text : "... [".concat(++txtCounter, "]")); parEl.appendChild(textNode); } bodyContent = smilDocClone.getElementsByTagName("body")[0]; bodyContentStr = new xmldom.XMLSerializer().serializeToString(bodyContent); contentStr = bodyContentStr .replace("xmlns=\"http://www.w3.org/2001/SMIL20/\"", "") .replace(/dur=/g, "data-dur=") .replace(/endsync=/g, "data-endsync=") .replace(/fill=/g, "data-fill=") .replace(/system-required=/g, "data-system-required=") .replace(/customTest=/g, "data-customTest=") .replace(/class=/g, "data-class=") .replace(/<seq/g, "<div class=\"smil-seq\"") .replace(/<text/g, "<hr class=\"smil-text\"") .replace(/<par/g, "<p class=\"smil-par\"") .replace(/<\/seq>/g, "</div>") .replace(/<\/par>/g, "</p>"); htmlDoc = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:epub=\"http://www.idpf.org/2007/ops\" xml:lang=\"en\" lang=\"en\">\n <head>\n <title>".concat(smilPathInZip, "</title>\n </head>\n ").concat(contentStr, "\n</html>\n"); htmlFilePath = smilPathInZip.replace(/\.smil$/i, ".xhtml"); if (!generateDaisyAudioManifestOnly) { zipfile.addBuffer(Buffer.from(htmlDoc), htmlFilePath); } return [2, htmlFilePath]; } }); }); }; audioOnlySmilHtmls = []; if (!publication.Spine) return [3, 9]; mediaOverlaysMap_1 = {}; previousLinkItem = void 0; spineIndex = -1; _i = 0, _a = publication.Spine; _u.label = 3; case 3: if (!(_i < _a.length)) return [3, 9]; linkItem = _a[_i]; spineIndex++; if (!linkItem.MediaOverlays) { return [3, 8]; } if (!!linkItem.MediaOverlays.initialized) return [3, 5]; return [4, (0, epub_daisy_common_1.lazyLoadMediaOverlays)(publication, linkItem.MediaOverlays)]; case 4: _u.sent(); if (isFullTextAudio || isAudioOnly) { (0, epub_daisy_common_1.updateDurations)(linkItem.MediaOverlays.duration, linkItem); } _u.label = 5; case 5: if (isFullTextAudio || isAudioOnly) { computedDur = getMediaOverlaysDuration_1(linkItem.MediaOverlays); if (computedDur) { if (!linkItem.MediaOverlays.duration) { linkItem.MediaOverlays.duration = computedDur; (0, epub_daisy_common_1.updateDurations)(computedDur, linkItem); } else { if (Math.round(linkItem.MediaOverlays.duration) !== Math.round(computedDur)) { debug("linkItem.MediaOverlays.duration !== computedDur", linkItem.MediaOverlays.duration, computedDur); } } } if (previousLinkItem && previousLinkItem.MediaOverlays && typeof previousLinkItem.MediaOverlays.totalElapsedTime !== "undefined" && typeof linkItem.MediaOverlays.totalElapsedTime !== "undefined") { dur = linkItem.MediaOverlays.totalElapsedTime - previousLinkItem.MediaOverlays.totalElapsedTime; if (dur > 0) { if (!previousLinkItem.MediaOverlays.duration) { previousLinkItem.MediaOverlays.duration = dur; (0, epub_daisy_common_1.updateDurations)(dur, previousLinkItem); } else { if (Math.round(previousLinkItem.MediaOverlays.duration) !== Math.round(dur)) { debug("previousLinkItem.MediaOverlays.duration !== dur", previousLinkItem.MediaOverlays.duration, dur); } } } } previousLinkItem = linkItem; } smilTextRef = void 0; if (isAudioOnly) { audioOnlySmilHtmlHref = (_s = linkItem.MediaOverlays.SmilPathInZip) === null || _s === void 0 ? void 0 : _s.replace(/\.smil$/i, ".xhtml"); if (audioOnlySmilHtmlHref) { smilTextRef = patchMediaOverlaysTextHref_1(linkItem.MediaOverlays, audioOnlySmilHtmlHref); } } else { smilTextRef = patchMediaOverlaysTextHref_1(linkItem.MediaOverlays, undefined); } if (!smilTextRef) return [3, 8]; if (!(isAudioOnly && linkItem.MediaOverlays.SmilPathInZip)) return [3, 7]; return [4, createHtmlFromSmilFile(linkItem.MediaOverlays.SmilPathInZip)]; case 6: _u.sent(); smilHtml = new publication_link_1.Link(); smilHtml.Href = smilTextRef; smilHtml.TypeLink = "application/xhtml+xml"; audioOnlySmilHtmls.push(smilHtml); _u.label = 7; case 7: if (!mediaOverlaysMap_1[smilTextRef]) { mediaOverlaysMap_1[smilTextRef] = { index: spineIndex, mos: [], }; } mediaOverlaysMap_1[smilTextRef].index = spineIndex; mediaOverlaysMap_1[smilTextRef].mos.push(linkItem.MediaOverlays); _u.label = 8; case 8: _i++; return [3, 3]; case 9: publication.Spine = []; resourcesToKeep = []; dtBooks = tslib_1.__spreadArray([], audioOnlySmilHtmls, true); _b = 0, _c = publication.Resources; _u.label = 10; case 10: if (!(_b < _c.length)) return [3, 18]; resLink = _c[_b]; if (!resLink.HrefDecoded) { return [3, 17]; } if (!(resLink.TypeLink === "text/css" || /\.css$/i.test(resLink.HrefDecoded))) return [3, 12]; return [4, (0, epub_daisy_common_1.loadFileStrFromZipPath)(resLink.Href, resLink.HrefDecoded, zip)]; case 11: cssText = _u.sent(); if (!cssText) { debug("!loadFileStrFromZipPath", resLink.HrefDecoded); return [3, 17]; } cssText = cssText.replace(/\/\*([\s\S]+?)\*\//gm, function (_match, p1, _offset, _string) { var base64 = Buffer.from(p1).toString("base64"); return "/*__".concat(base64, "__*/"); }); for (_d = 0, elementNames_1 = elementNames; _d < elementNames_1.length; _d++) { elementName = elementNames_1[_d]; regex = new RegExp("([^#.a-zA-Z0-9-_])(".concat(elementName, ")([^a-zA-Z0-9-_;])"), "g"); cssText = cssText.replace(regex, "$1.$2_R2$3"); cssText = cssText.replace(regex, "$1.$2_R2$3"); } cssText = cssText.replace(/\/\*__([\s\S]+?)__\*\//g, function (_match, p1, _offset, _string) { var comment = Buffer.from(p1, "base64").toString("utf8"); return "/*".concat(comment, "*/"); }); if (!generateDaisyAudioManifestOnly) { zipfile.addBuffer(Buffer.from(cssText), resLink.HrefDecoded); } resourcesToKeep.push(resLink); return [3, 17]; case 12: if (!(resLink.TypeLink === "application/x-dtbook+xml" || /\.xml$/i.test(resLink.HrefDecoded))) return [3, 14]; return [4, (0, epub_daisy_common_1.loadFileStrFromZipPath)(resLink.Href, resLink.HrefDecoded, zip)]; case 13: dtBookStr = _u.sent(); if (!dtBookStr) { debug("!loadFileStrFromZipPath", dtBookStr); return [3, 17]; } dtBookStr = dtBookStr.replace(/xmlns=""/, " "); dtBookStr = dtBookStr.replace(/<dtbook/, "<dtbook xmlns:epub=\"http://www.idpf.org/2007/ops\" "); dtBookDoc = new xmldom.DOMParser().parseFromString(dtBookStr, "application/xml"); title = (_t = dtBookDoc.getElementsByTagName("doctitle")[0]) === null || _t === void 0 ? void 0 : _t.textContent; if (title) { title = title.trim(); if (!title.length) { title = null; } } listElements = dtBookDoc.getElementsByTagName("list"); for (i = 0; i < listElements.length; i++) { listElement = listElements.item(i); if (!listElement) { continue; } type = listElement.getAttribute("type"); if (type) { listElement.tagName = type; } } for (_e = 0, elementNames_2 = elementNames; _e < elementNames_2.length; _e++) { elementName = elementNames_2[_e]; els = Array.from(dtBookDoc.getElementsByTagName(elementName)).filter(function (el) { return el; }); for (_f = 0, els_1 = els; _f < els_1.length; _f++) { el = els_1[_f]; el.setAttribute("data-dtbook", elementName); cls = el.getAttribute("class"); el.setAttribute("class", "".concat(cls ? (cls + " ") : "").concat(elementName, "_R2")); el.tagName = ((elementName === "dtbook") ? "html" : ((elementName === "book") ? "body" : ((elementName === "pagenum") ? "span" : ((elementName === "sent") ? "span" : ((elementName === "caption") ? "figcaption" : ((elementName === "imggroup") ? "figure" : (elementName === "sidebar") ? "aside" : "div")))))); if (elementName === "pagenum") { el.setAttribute("epub:type", "pagebreak"); } else if (elementName === "annotation") { el.setAttribute("epub:type", "annotation"); } else if (elementName === "note") { el.setAttribute("epub:type", "note"); } else if (elementName === "prodnote") { el.setAttribute("epub:type", "note"); } else if (elementName === "sidebar") { el.setAttribute("epub:type", "sidebar"); } } } stylesheets = select("/processing-instruction('xml-stylesheet')", dtBookDoc); cssHrefs = []; for (_g = 0, stylesheets_1 = stylesheets; _g < stylesheets_1.length; _g++) { stylesheet = stylesheets_1[_g]; if (!stylesheet.nodeValue) { continue; } if (!stylesheet.nodeValue.includes("text/css")) { continue; } match = stylesheet.nodeValue.match(/href=("|')(.*?)("|')/); if (!match) { continue; } href = match[2].trim(); if (href) { cssHrefs.push(href); } } smilRefs = select("//*[@smilref]", dtBookDoc); for (_h = 0, smilRefs_1 = smilRefs; _h < smilRefs_1.length; _h++) { smilRef = smilRefs_1[_h]; ref = smilRef.getAttribute("smilref"); if (ref) { smilRef.setAttribute("data-smilref", ref); } smilRef.removeAttribute("smilref"); } dtbookNowXHTML = new xmldom.XMLSerializer().serializeToString(dtBookDoc) .replace(/xmlns="http:\/\/www\.daisy\.org\/z3986\/2005\/dtbook\/"/, "xmlns=\"http://www.w3.org/1999/xhtml\"") .replace(/xmlns="http:\/\/www\.daisy\.org\/z3986\/2005\/dtbook\/"/g, " ") .replace(/^([\s\S]*)<html/gm, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE html>\n<html ") .replace(/<head([\s\S]*?)>/gm, "\n<head$1>\n<meta charset=\"UTF-8\" />\n".concat(title ? "<title>".concat(title, "</title>") : "", "\n")) .replace(/<\/head[\s\S]*?>/gm, "\n".concat(cssHrefs.reduce(function (pv, cv) { return pv + "\n" + "<link rel=\"stylesheet\" type=\"text/css\" href=\"".concat(cv, "\" />"); }, ""), "\n</head>\n")); xhtmlFilePath = resLink.HrefDecoded.replace(/\.([^\.]+)$/i, ".xhtml"); if (!generateDaisyAudioManifestOnly) { zipfile.addBuffer(Buffer.from(dtbookNowXHTML), xhtmlFilePath); } resLinkJson = (0, serializable_1.TaJsonSerialize)(resLink); resLinkClone = (0, serializable_1.TaJsonDeserialize)(resLinkJson, publication_link_1.Link); resLinkClone.setHrefDecoded(xhtmlFilePath); resLinkClone.TypeLink = "application/xhtml+xml"; dtBooks.push(resLinkClone); return [3, 17]; case 14: if (!(!/\.opf$/i.test(resLink.HrefDecoded) && !/\.res$/i.test(resLink.HrefDecoded) && !/\.ncx$/i.test(resLink.HrefDecoded) && !/ncc\.html$/i.test(resLink.HrefDecoded))) return [3, 17]; if (!!generateDaisyAudioManifestOnly) return [3, 16]; return [4, (0, epub_daisy_common_1.loadFileBufferFromZipPath)(resLink.Href, resLink.HrefDecoded, zip)]; case 15: buff = _u.sent(); if (/\.html$/i.test(resLink.HrefDecoded)) { resLink.setHrefDecoded(resLink.HrefDecoded.replace(/\.html$/i, ".xhtml")); } if (buff) { zipfile.addBuffer(buff, resLink.HrefDecoded); } _u.label = 16; case 16: resourcesToKeep.push(resLink); if (/\.x?html$/i.test(resLink.HrefDecoded) || resLink.TypeLink === "text/html" || resLink.TypeLink === "application/xhtml+xml") { if (resLink.TypeLink === "text/html") { resLink.TypeLink = "application/xhtml+xml"; } dtBooks.push(resLink); } _u.label = 17; case 17: _b++; return [3, 10]; case 18: if (mediaOverlaysMap_1) { Object.keys(mediaOverlaysMap_1).forEach(function (smilTextRef) { if (!mediaOverlaysMap_1) { return; } debug("smilTextRef: " + smilTextRef); var mos = mediaOverlaysMap_1[smilTextRef].mos; if (mos.length === 1) { debug("smilTextRef [1]: " + smilTextRef); return; } var mergedMediaOverlays = new media_overlay_1.MediaOverlayNode(); mergedMediaOverlays.SmilPathInZip = undefined; mergedMediaOverlays.initialized = true; mergedMediaOverlays.Role = []; mergedMediaOverlays.Role.push("section"); mergedMediaOverlays.duration = 0; var i = -1; for (var _i = 0, mos_1 = mos; _i < mos_1.length; _i++) { var mo = mos_1[_i]; i++; if (mo.Children) { debug("smilTextRef [".concat(i, "]: ") + smilTextRef); if (!mergedMediaOverlays.Children) { mergedMediaOverlays.Children = []; } mergedMediaOverlays.Children = mergedMediaOverlays.Children.concat(mo.Children); if (mo.duration) { mergedMediaOverlays.duration += mo.duration; } } } mediaOverlaysMap_1[smilTextRef].mos = [mergedMediaOverlays]; }); mediaOverlaysSequence = Object.keys(mediaOverlaysMap_1).map(function (smilTextRef) { if (!mediaOverlaysMap_1) { return undefined; } return { index: mediaOverlaysMap_1[smilTextRef].index, mo: mediaOverlaysMap_1[smilTextRef].mos[0], smilTextRef: smilTextRef, }; }).filter(function (e) { return e; }).sort(function (a, b) { if (a && b && a.index < b.index) { return -1; } if (a && b && a.index > b.index) { return 1; } return 0; }); _loop_1 = function (mediaOverlay) { if (!mediaOverlay) { return "continue"; } debug("mediaOverlay:", mediaOverlay.index, mediaOverlay.smilTextRef); var dtBookLink = dtBooks.find(function (l) { return l.HrefDecoded && mediaOverlay.smilTextRef ? l.HrefDecoded.toLowerCase() === mediaOverlay.smilTextRef.toLowerCase() : false; }); if (!dtBookLink) { debug("!!dtBookLink", JSON.stringify(dtBooks, null, 4)); } else if (dtBookLink.HrefDecoded && mediaOverlay.smilTextRef && dtBookLink.HrefDecoded.toLowerCase() !== mediaOverlay.smilTextRef.toLowerCase()) { debug("dtBook.HrefDecoded !== mediaOverlay.smilTextRef", dtBookLink.HrefDecoded, mediaOverlay.smilTextRef); } else { if (isFullTextAudio || isAudioOnly) { dtBookLink.MediaOverlays = mediaOverlay.mo; if (mediaOverlay.mo.duration) { dtBookLink.Duration = mediaOverlay.mo.duration; } var moURL = "smil-media-overlays_".concat(mediaOverlay.index, ".json"); if (!dtBookLink.Properties) { dtBookLink.Properties = new metadata_properties_1.Properties(); } dtBookLink.Properties.MediaOverlay = moURL; if (!dtBookLink.Alternate) { dtBookLink.Alternate = []; } var moLink = new publication_link_1.Link(); moLink.Href = moURL; moLink.TypeLink = "application/vnd.syncnarr+json"; moLink.Duration = dtBookLink.Duration; dtBookLink.Alternate.push(moLink); var jsonObjMO = (0, serializable_1.TaJsonSerialize)(mediaOverlay.mo); var jsonStrMO = global.JSON.stringify(jsonObjMO, null, " "); if (!generateDaisyAudioManifestOnly) { zipfile.addBuffer(Buffer.from(jsonStrMO), moURL); } debug("dtBookLink IN SPINE:", mediaOverlay.index, dtBookLink.HrefDecoded, dtBookLink.Duration, moURL); } else { debug("dtBookLink IN SPINE (no audio):", mediaOverlay.index, dtBookLink.HrefDecoded); } publication.Spine.push(dtBookLink); } }; for (_j = 0, mediaOverlaysSequence_1 = mediaOverlaysSequence; _j < mediaOverlaysSequence_1.length; _j++) { mediaOverlay = mediaOverlaysSequence_1[_j]; _loop_1(mediaOverlay); } } publication.Resources = resourcesToKeep; if (!publication.Metadata) { publication.Metadata = new metadata_1.Metadata(); } if (!publication.Metadata.AdditionalJSON) { publication.Metadata.AdditionalJSON = {}; } publication.Metadata.AdditionalJSON.ReadiumWebPublicationConvertedFrom = isAudioOnly ? "DAISY_audioNCX" : (isTextOnly ? "DAISY_textNCX" : "DAISY_audioFullText"); findFirstDescendantTextOrAudio_1 = function (parent, audio) { if (parent.childNodes && parent.childNodes.length) { for (var i = 0; i < parent.childNodes.length; i++) { var child = parent.childNodes[i]; if (child.nodeType === 1) { var element = child; if (element.localName && element.localName.toLowerCase() === (audio ? "audio" : "text")) { return element; } } } for (var i = 0; i < parent.childNodes.length; i++) { var child = parent.childNodes[i]; if (child.nodeType === 1) { var element = child; var found = findFirstDescendantTextOrAudio_1(element, audio); if (found) { return found; } } } } return undefined; }; processLink_1 = function (link) { return tslib_1.__awaiter(void 0, void 0, void 0, function () { var href, fragment, arr, smilDoc, targetEl, src; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: href = link.HrefDecoded; if (!href) { return [2]; } if (isAudioOnly) { link.setHrefDecoded(href.replace(/\.smil(#.*)?$/i, ".xhtml$1")); link.TypeLink = "application/xhtml+xml"; return [2]; } if (href.indexOf("#") >= 0) { arr = href.split("#"); href = arr[0].trim(); fragment = arr[1].trim(); } if (!href) { return [2]; } return [4, loadOrGetCachedSmil_1(href)]; case 1: smilDoc = _a.sent();