UNPKG

r2-shared-js

Version:

Readium 2 'shared' for NodeJS (TypeScript)

1,109 lines (1,108 loc) 88.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.updateDurations = exports.lazyLoadMediaOverlays = exports.flattenDaisy2SmilAudioSeq = exports.addMediaOverlaySMIL = exports.fillTOC = exports.loadFileBufferFromZipPath = exports.loadFileStrFromZipPath = exports.addOtherMetadata = exports.getOpf_ = exports.getOpf = exports.getNcx_ = exports.getNcx = exports.langStringIsRTL = exports.setPublicationDirection = exports.addTitle = exports.addIdentifier = exports.addLanguage = exports.fillSpineAndResource = exports.findInManifestByID = exports.findInSpineByHref = exports.findAllMetaByRefineAndProperty = exports.findMetaByRefineAndProperty = exports.addContributor = exports.findContributorInMeta = exports.fillSubject = exports.fillPublicationDate = exports.isEpub3OrMore = exports.parseSpaceSeparatedString = exports.BCP47_UNKNOWN_LANG = exports.mediaOverlayURLParam = exports.mediaOverlayURLPath = void 0; var tslib_1 = require("tslib"); var debug_ = require("debug"); var mime = require("mime-types"); var moment = require("moment"); var path = require("path"); var xmldom = require("@xmldom/xmldom"); var media_overlay_1 = require("../models/media-overlay"); var metadata_1 = require("../models/metadata"); var metadata_contributor_1 = require("../models/metadata-contributor"); var metadata_media_overlay_1 = require("../models/metadata-media-overlay"); var metadata_properties_1 = require("../models/metadata-properties"); var metadata_subject_1 = require("../models/metadata-subject"); var publication_link_1 = require("../models/publication-link"); var ta_json_string_tokens_converter_1 = require("../models/ta-json-string-tokens-converter"); var UrlUtils_1 = require("r2-utils-js/dist/es5/src/_utils/http/UrlUtils"); var BufferUtils_1 = require("r2-utils-js/dist/es5/src/_utils/stream/BufferUtils"); var xml_js_mapper_1 = require("r2-utils-js/dist/es5/src/_utils/xml-js-mapper"); var transformer_1 = require("../transform/transformer"); var zipHasEntry_1 = require("../_utils/zipHasEntry"); var ncx_1 = require("./epub/ncx"); var opf_1 = require("./epub/opf"); var opf_author_1 = require("./epub/opf-author"); var smil_1 = require("./epub/smil"); var smil_seq_1 = require("./epub/smil-seq"); var debug = debug_("r2:shared#parser/epub-daisy-common"); var epub3 = "3.0"; var epub301 = "3.0.1"; var epub31 = "3.1"; exports.mediaOverlayURLPath = "media-overlay.json"; exports.mediaOverlayURLParam = "resource"; exports.BCP47_UNKNOWN_LANG = "und"; var parseSpaceSeparatedString = function (str) { return str ? str.trim().split(" ").map(function (role) { return role.trim(); }).filter(function (role) { return role.length > 0; }) : []; }; exports.parseSpaceSeparatedString = parseSpaceSeparatedString; var getEpubVersion = function (rootfile, opf) { if (rootfile.Version) { return rootfile.Version; } else if (opf.Version) { return opf.Version; } return undefined; }; var isEpub3OrMore = function (rootfile, opf) { var version = getEpubVersion(rootfile, opf); return (version === epub3 || version === epub301 || version === epub31); }; exports.isEpub3OrMore = isEpub3OrMore; var fillPublicationDate = function (publication, rootfile, opf) { var _a, _b, _c, _d, _e, _f, _g; var publishedDateStr; var modifiedDateStr; if ((_b = (_a = opf.Metadata) === null || _a === void 0 ? void 0 : _a.Meta) === null || _b === void 0 ? void 0 : _b.length) { for (var _i = 0, _h = opf.Metadata.Meta; _i < _h.length; _i++) { var m = _h[_i]; if (m.Name === "dcterms:modified" && m.Content) { modifiedDateStr = m.Content; break; } if (m.Property === "dcterms:modified" && m.Data) { modifiedDateStr = m.Data; break; } } } var opfMetadataDateArray = [].concat(((_e = (_d = (_c = opf.Metadata) === null || _c === void 0 ? void 0 : _c.DCMetadata) === null || _d === void 0 ? void 0 : _d.Date) === null || _e === void 0 ? void 0 : _e.length) ? opf.Metadata.DCMetadata.Date : [], ((_g = (_f = opf.Metadata) === null || _f === void 0 ? void 0 : _f.Date) === null || _g === void 0 ? void 0 : _g.length) ? opf.Metadata.Date : []); if (opfMetadataDateArray === null || opfMetadataDateArray === void 0 ? void 0 : opfMetadataDateArray.length) { for (var _j = 0, opfMetadataDateArray_1 = opfMetadataDateArray; _j < opfMetadataDateArray_1.length; _j++) { var metaDate = opfMetadataDateArray_1[_j]; if (!modifiedDateStr && (metaDate.Event === "modification" || metaDate.Event === "ops-modification")) { modifiedDateStr = metaDate.Data; } if (!publishedDateStr && (metaDate.Event === "publication" || metaDate.Event === "ops-publication")) { publishedDateStr = metaDate.Data; } if (modifiedDateStr && publishedDateStr) { break; } } if (!publishedDateStr) { for (var _k = 0, opfMetadataDateArray_2 = opfMetadataDateArray; _k < opfMetadataDateArray_2.length; _k++) { var metaDate = opfMetadataDateArray_2[_k]; if (!metaDate.Event) { publishedDateStr = metaDate.Data; break; } } } if (!publishedDateStr) { if (!rootfile || (0, exports.isEpub3OrMore)(rootfile, opf)) { publishedDateStr = opfMetadataDateArray[0].Data; } } } if (publishedDateStr) { try { var mom = moment(publishedDateStr); if (mom.isValid()) { publication.Metadata.PublicationDate = mom.toDate(); } } catch (_err) { debug("INVALID published DATE/TIME? " + publishedDateStr); } } if (modifiedDateStr) { try { var mom = moment(modifiedDateStr); if (mom.isValid()) { publication.Metadata.Modified = mom.toDate(); } } catch (_err) { debug("INVALID modified DATE/TIME? " + modifiedDateStr); } } }; exports.fillPublicationDate = fillPublicationDate; var fillSubject = function (publication, opf) { var _a, _b, _c, _d, _e; var opfMetadataSubject = ((_c = (_b = (_a = opf.Metadata) === null || _a === void 0 ? void 0 : _a.DCMetadata) === null || _b === void 0 ? void 0 : _b.Subject) === null || _c === void 0 ? void 0 : _c.length) ? opf.Metadata.DCMetadata.Subject : (((_e = (_d = opf.Metadata) === null || _d === void 0 ? void 0 : _d.Subject) === null || _e === void 0 ? void 0 : _e.length) ? opf.Metadata.Subject : undefined); if (opfMetadataSubject) { opfMetadataSubject.forEach(function (s) { var sub = new metadata_subject_1.Subject(); var xmlLang = s.Lang || opf.Lang; var isLangOverride = s.Lang && opf.Lang && s.Lang !== opf.Lang; if (xmlLang && (isLangOverride || (0, exports.langStringIsRTL)(xmlLang.toLowerCase()))) { sub.Name = {}; sub.Name[xmlLang.toLowerCase()] = s.Data; } else { sub.Name = s.Data; } sub.Code = s.Term; sub.Scheme = s.Authority; if (!publication.Metadata.Subject) { publication.Metadata.Subject = []; } publication.Metadata.Subject.push(sub); }); } }; exports.fillSubject = fillSubject; var findContributorInMeta = function (publication, rootfile, opf) { var _a, _b, _c, _d, _e; if (!rootfile || (0, exports.isEpub3OrMore)(rootfile, opf)) { var func = function (meta) { if (meta.Property === "dcterms:creator" || meta.Property === "dcterms:contributor") { var cont = new opf_author_1.Author(); cont.Data = meta.Data; cont.ID = meta.ID; (0, exports.addContributor)(publication, rootfile, opf, cont, undefined); } }; if ((_c = (_b = (_a = opf.Metadata) === null || _a === void 0 ? void 0 : _a.XMetadata) === null || _b === void 0 ? void 0 : _b.Meta) === null || _c === void 0 ? void 0 : _c.length) { opf.Metadata.XMetadata.Meta.forEach(func); } if ((_e = (_d = opf.Metadata) === null || _d === void 0 ? void 0 : _d.Meta) === null || _e === void 0 ? void 0 : _e.length) { opf.Metadata.Meta.forEach(func); } } }; exports.findContributorInMeta = findContributorInMeta; var addContributor = function (publication, rootfile, opf, cont, forcedRole) { var contributor = new metadata_contributor_1.Contributor(); var role; if (rootfile && (0, exports.isEpub3OrMore)(rootfile, opf)) { if (cont.FileAs) { contributor.SortAs = cont.FileAs; } else { var metaFileAs = (0, exports.findMetaByRefineAndProperty)(opf, cont.ID, "file-as"); if (metaFileAs && metaFileAs.Property === "file-as") { contributor.SortAs = metaFileAs.Data; } } var metaRole = (0, exports.findMetaByRefineAndProperty)(opf, cont.ID, "role"); if (metaRole && metaRole.Property === "role") { role = metaRole.Data; } if (!role && forcedRole) { role = forcedRole; } var metaAlt = (0, exports.findAllMetaByRefineAndProperty)(opf, cont.ID, "alternate-script"); if (metaAlt && metaAlt.length) { contributor.Name = {}; metaAlt.forEach(function (m) { if (m.Lang) { contributor.Name[m.Lang.toLowerCase()] = m.Data; } }); var xmlLang = cont.Lang || opf.Lang; if (xmlLang) { contributor.Name[xmlLang.toLowerCase()] = cont.Data; } else if (publication.Metadata && publication.Metadata.Language && publication.Metadata.Language.length && !contributor.Name[publication.Metadata.Language[0].toLowerCase()]) { contributor.Name[publication.Metadata.Language[0].toLowerCase()] = cont.Data; } else { contributor.Name[exports.BCP47_UNKNOWN_LANG] = cont.Data; } } else { var xmlLang = cont.Lang || opf.Lang; var isLangOverride = cont.Lang && opf.Lang && cont.Lang !== opf.Lang; if (xmlLang && (isLangOverride || (0, exports.langStringIsRTL)(xmlLang.toLowerCase()))) { contributor.Name = {}; contributor.Name[xmlLang.toLowerCase()] = cont.Data; } else { contributor.Name = cont.Data; } } } else { var xmlLang = cont.Lang || opf.Lang; var isLangOverride = cont.Lang && opf.Lang && cont.Lang !== opf.Lang; if (xmlLang && (isLangOverride || (0, exports.langStringIsRTL)(xmlLang.toLowerCase()))) { contributor.Name = {}; contributor.Name[xmlLang.toLowerCase()] = cont.Data; } else { contributor.Name = cont.Data; } role = cont.Role; if (!role && forcedRole) { role = forcedRole; } } if (role) { switch (role) { case "aut": { if (!publication.Metadata.Author) { publication.Metadata.Author = []; } publication.Metadata.Author.push(contributor); break; } case "trl": { if (!publication.Metadata.Translator) { publication.Metadata.Translator = []; } publication.Metadata.Translator.push(contributor); break; } case "art": { if (!publication.Metadata.Artist) { publication.Metadata.Artist = []; } publication.Metadata.Artist.push(contributor); break; } case "edt": { if (!publication.Metadata.Editor) { publication.Metadata.Editor = []; } publication.Metadata.Editor.push(contributor); break; } case "ill": { if (!publication.Metadata.Illustrator) { publication.Metadata.Illustrator = []; } publication.Metadata.Illustrator.push(contributor); break; } case "ltr": { if (!publication.Metadata.Letterer) { publication.Metadata.Letterer = []; } publication.Metadata.Letterer.push(contributor); break; } case "pen": { if (!publication.Metadata.Penciler) { publication.Metadata.Penciler = []; } publication.Metadata.Penciler.push(contributor); break; } case "clr": { if (!publication.Metadata.Colorist) { publication.Metadata.Colorist = []; } publication.Metadata.Colorist.push(contributor); break; } case "ink": { if (!publication.Metadata.Inker) { publication.Metadata.Inker = []; } publication.Metadata.Inker.push(contributor); break; } case "nrt": { if (!publication.Metadata.Narrator) { publication.Metadata.Narrator = []; } publication.Metadata.Narrator.push(contributor); break; } case "pbl": { if (!publication.Metadata.Publisher) { publication.Metadata.Publisher = []; } publication.Metadata.Publisher.push(contributor); break; } default: { contributor.Role = [role]; if (!publication.Metadata.Contributor) { publication.Metadata.Contributor = []; } publication.Metadata.Contributor.push(contributor); } } } }; exports.addContributor = addContributor; var findMetaByRefineAndProperty = function (opf, ID, property) { var ret = (0, exports.findAllMetaByRefineAndProperty)(opf, ID, property); if (ret.length) { return ret[0]; } return undefined; }; exports.findMetaByRefineAndProperty = findMetaByRefineAndProperty; var findAllMetaByRefineAndProperty = function (opf, ID, property) { var _a, _b, _c, _d, _e; var metas = []; var refineID = "#" + ID; var func = function (metaTag) { if (metaTag.Refine === refineID && metaTag.Property === property) { metas.push(metaTag); } }; if ((_c = (_b = (_a = opf.Metadata) === null || _a === void 0 ? void 0 : _a.XMetadata) === null || _b === void 0 ? void 0 : _b.Meta) === null || _c === void 0 ? void 0 : _c.length) { opf.Metadata.XMetadata.Meta.forEach(func); } if ((_e = (_d = opf.Metadata) === null || _d === void 0 ? void 0 : _d.Meta) === null || _e === void 0 ? void 0 : _e.length) { opf.Metadata.Meta.forEach(func); } return metas; }; exports.findAllMetaByRefineAndProperty = findAllMetaByRefineAndProperty; var findInSpineByHref = function (publication, href) { if (publication.Spine && publication.Spine.length) { var ll = publication.Spine.find(function (l) { if (l.HrefDecoded === href) { return true; } return false; }); if (ll) { return ll; } } return undefined; }; exports.findInSpineByHref = findInSpineByHref; var findInManifestByID = function (publication, rootfile, opf, ID, zip, addLinkData) { return tslib_1.__awaiter(void 0, void 0, void 0, function () { var item, linkItem, itemHrefDecoded; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: if (!(opf.Manifest && opf.Manifest.length)) return [3, 2]; item = opf.Manifest.find(function (manItem) { if (manItem.ID === ID) { return true; } return false; }); if (!(item && opf.ZipPath)) return [3, 2]; linkItem = new publication_link_1.Link(); linkItem.TypeLink = item.MediaType; itemHrefDecoded = item.HrefDecoded; if (!itemHrefDecoded) { return [2, Promise.reject("item.Href?!")]; } linkItem.setHrefDecoded(path.join(path.dirname(opf.ZipPath), itemHrefDecoded) .replace(/\\/g, "/")); return [4, addLinkData(publication, rootfile, opf, zip, linkItem, item)]; case 1: _a.sent(); return [2, linkItem]; case 2: return [2, Promise.reject("ID ".concat(ID, " not found"))]; } }); }); }; exports.findInManifestByID = findInManifestByID; var fillSpineAndResource = function (publication, rootfile, opf, zip, addLinkData) { return tslib_1.__awaiter(void 0, void 0, void 0, function () { var _i, _a, item, linkItem, err_1, _b, _c, item, itemHrefDecoded, zipPath, linkSpine, linkItem; return tslib_1.__generator(this, function (_d) { switch (_d.label) { case 0: if (!opf.ZipPath) { return [2]; } if (!(opf.Spine && opf.Spine.Items && opf.Spine.Items.length)) return [3, 7]; _i = 0, _a = opf.Spine.Items; _d.label = 1; case 1: if (!(_i < _a.length)) return [3, 7]; item = _a[_i]; if (!(!item.Linear || item.Linear === "yes")) return [3, 6]; linkItem = void 0; _d.label = 2; case 2: _d.trys.push([2, 4, , 5]); return [4, (0, exports.findInManifestByID)(publication, rootfile, opf, item.IDref, zip, addLinkData)]; case 3: linkItem = _d.sent(); return [3, 5]; case 4: err_1 = _d.sent(); debug(err_1); return [3, 6]; case 5: if (linkItem && linkItem.Href) { if (!publication.Spine) { publication.Spine = []; } publication.Spine.push(linkItem); } _d.label = 6; case 6: _i++; return [3, 1]; case 7: if (!(opf.Manifest && opf.Manifest.length)) return [3, 11]; _b = 0, _c = opf.Manifest; _d.label = 8; case 8: if (!(_b < _c.length)) return [3, 11]; item = _c[_b]; itemHrefDecoded = item.HrefDecoded; if (!itemHrefDecoded) { debug("!? item.Href", JSON.stringify(item, null, 4)); return [3, 10]; } zipPath = path.join(path.dirname(opf.ZipPath), itemHrefDecoded) .replace(/\\/g, "/"); linkSpine = (0, exports.findInSpineByHref)(publication, zipPath); if (!(!linkSpine || !linkSpine.Href)) return [3, 10]; linkItem = new publication_link_1.Link(); linkItem.TypeLink = item.MediaType; linkItem.setHrefDecoded(zipPath); if (!publication.Resources) { publication.Resources = []; } publication.Resources.push(linkItem); return [4, addLinkData(publication, rootfile, opf, zip, linkItem, item)]; case 9: _d.sent(); _d.label = 10; case 10: _b++; return [3, 8]; case 11: return [2]; } }); }); }; exports.fillSpineAndResource = fillSpineAndResource; var addLanguage = function (publication, opf) { var _a, _b, _c, _d, _e; var opfMetadataLanguage = ((_c = (_b = (_a = opf.Metadata) === null || _a === void 0 ? void 0 : _a.DCMetadata) === null || _b === void 0 ? void 0 : _b.Language) === null || _c === void 0 ? void 0 : _c.length) ? opf.Metadata.DCMetadata.Language : (((_e = (_d = opf.Metadata) === null || _d === void 0 ? void 0 : _d.Language) === null || _e === void 0 ? void 0 : _e.length) ? opf.Metadata.Language : undefined); if (opfMetadataLanguage) { publication.Metadata.Language = opfMetadataLanguage; } }; exports.addLanguage = addLanguage; var addIdentifier = function (publication, opf) { var _a, _b, _c, _d, _e; var opfMetadataIdentifier = ((_c = (_b = (_a = opf.Metadata) === null || _a === void 0 ? void 0 : _a.DCMetadata) === null || _b === void 0 ? void 0 : _b.Identifier) === null || _c === void 0 ? void 0 : _c.length) ? opf.Metadata.DCMetadata.Identifier : (((_e = (_d = opf.Metadata) === null || _d === void 0 ? void 0 : _d.Identifier) === null || _e === void 0 ? void 0 : _e.length) ? opf.Metadata.Identifier : undefined); if (opfMetadataIdentifier) { if (opf.UniqueIdentifier && opfMetadataIdentifier.length > 1) { opfMetadataIdentifier.forEach(function (iden) { if (iden.ID === opf.UniqueIdentifier) { publication.Metadata.Identifier = iden.Data; } }); } else if (opfMetadataIdentifier.length > 0) { publication.Metadata.Identifier = opfMetadataIdentifier[0].Data; } } }; exports.addIdentifier = addIdentifier; var addTitle = function (publication, rootfile, opf) { var _a, _b, _c, _d, _e, _f, _g, _h; var opfMetadataTitle = ((_c = (_b = (_a = opf.Metadata) === null || _a === void 0 ? void 0 : _a.DCMetadata) === null || _b === void 0 ? void 0 : _b.Title) === null || _c === void 0 ? void 0 : _c.length) ? opf.Metadata.DCMetadata.Title : (((_e = (_d = opf.Metadata) === null || _d === void 0 ? void 0 : _d.Title) === null || _e === void 0 ? void 0 : _e.length) ? opf.Metadata.Title : undefined); if (rootfile && (0, exports.isEpub3OrMore)(rootfile, opf)) { var mainTitle = void 0; var subTitle_1; var subTitleDisplaySeq_1 = 0; if (opfMetadataTitle) { if (((_f = opf.Metadata) === null || _f === void 0 ? void 0 : _f.Meta) || ((_h = (_g = opf.Metadata) === null || _g === void 0 ? void 0 : _g.XMetadata) === null || _h === void 0 ? void 0 : _h.Meta)) { var tt = opfMetadataTitle.find(function (title) { var _a, _b, _c; var refineID = "#" + title.ID; var func0 = function (meta) { if (meta.Data === "main" && meta.Refine === refineID) { return true; } return false; }; var m = ((_a = opf.Metadata) === null || _a === void 0 ? void 0 : _a.Meta) ? opf.Metadata.Meta.find(func0) : undefined; if (!m && ((_c = (_b = opf.Metadata) === null || _b === void 0 ? void 0 : _b.XMetadata) === null || _c === void 0 ? void 0 : _c.Meta)) { m = opf.Metadata.XMetadata.Meta.find(func0); } if (m) { return true; } return false; }); if (tt) { mainTitle = tt; } opfMetadataTitle.forEach(function (title) { var _a, _b, _c, _d, _e, _f; var refineID = "#" + title.ID; var func1 = function (meta) { if (meta.Data === "subtitle" && meta.Refine === refineID) { return true; } return false; }; var m = ((_a = opf.Metadata) === null || _a === void 0 ? void 0 : _a.Meta) ? opf.Metadata.Meta.find(func1) : undefined; if (!m && ((_c = (_b = opf.Metadata) === null || _b === void 0 ? void 0 : _b.XMetadata) === null || _c === void 0 ? void 0 : _c.Meta)) { m = opf.Metadata.XMetadata.Meta.find(func1); } if (m) { var titleDisplaySeq = 0; var func2 = function (meta) { if (meta.Property === "display-seq" && meta.Refine === refineID) { return true; } return false; }; var mds = ((_d = opf.Metadata) === null || _d === void 0 ? void 0 : _d.Meta) ? opf.Metadata.Meta.find(func2) : undefined; if (!mds && ((_f = (_e = opf.Metadata) === null || _e === void 0 ? void 0 : _e.XMetadata) === null || _f === void 0 ? void 0 : _f.Meta)) { mds = opf.Metadata.XMetadata.Meta.find(func2); } if (mds) { try { titleDisplaySeq = parseInt(mds.Data, 10); } catch (err) { debug(err); debug(mds.Data); titleDisplaySeq = 0; } if (isNaN(titleDisplaySeq)) { debug("NaN"); debug(mds.Data); titleDisplaySeq = 0; } } else { titleDisplaySeq = 0; } if (!subTitle_1 || titleDisplaySeq < subTitleDisplaySeq_1) { subTitle_1 = title; subTitleDisplaySeq_1 = titleDisplaySeq; } } }); } if (!mainTitle) { mainTitle = opfMetadataTitle[0]; } } if (mainTitle) { var metaAlt = (0, exports.findAllMetaByRefineAndProperty)(opf, mainTitle.ID, "alternate-script"); if (metaAlt && metaAlt.length) { publication.Metadata.Title = {}; metaAlt.forEach(function (m) { if (m.Lang) { publication.Metadata.Title[m.Lang.toLowerCase()] = m.Data; } }); var xmlLang = mainTitle.Lang || opf.Lang; if (xmlLang) { publication.Metadata.Title[xmlLang.toLowerCase()] = mainTitle.Data; } else if (publication.Metadata.Language && publication.Metadata.Language.length && !publication.Metadata.Title[publication.Metadata.Language[0].toLowerCase()]) { publication.Metadata.Title[publication.Metadata.Language[0].toLowerCase()] = mainTitle.Data; } else { publication.Metadata.Title[exports.BCP47_UNKNOWN_LANG] = mainTitle.Data; } } else { var xmlLang = mainTitle.Lang || opf.Lang; var isLangOverride = mainTitle.Lang && opf.Lang && mainTitle.Lang !== opf.Lang; if (xmlLang && (isLangOverride || (0, exports.langStringIsRTL)(xmlLang.toLowerCase()))) { publication.Metadata.Title = {}; publication.Metadata.Title[xmlLang.toLowerCase()] = mainTitle.Data; } else { publication.Metadata.Title = mainTitle.Data; } } } if (subTitle_1) { var metaAlt = (0, exports.findAllMetaByRefineAndProperty)(opf, subTitle_1.ID, "alternate-script"); if (metaAlt && metaAlt.length) { publication.Metadata.SubTitle = {}; metaAlt.forEach(function (m) { if (m.Lang) { publication.Metadata.SubTitle[m.Lang.toLowerCase()] = m.Data; } }); var xmlLang = subTitle_1.Lang || opf.Lang; if (xmlLang) { publication.Metadata.SubTitle[xmlLang.toLowerCase()] = subTitle_1.Data; } else if (publication.Metadata.Language && publication.Metadata.Language.length && !publication.Metadata.SubTitle[publication.Metadata.Language[0].toLowerCase()]) { publication.Metadata.SubTitle[publication.Metadata.Language[0].toLowerCase()] = subTitle_1.Data; } else { publication.Metadata.SubTitle[exports.BCP47_UNKNOWN_LANG] = subTitle_1.Data; } } else { var xmlLang = subTitle_1.Lang || opf.Lang; var isLangOverride = subTitle_1.Lang && opf.Lang && subTitle_1.Lang !== opf.Lang; if (xmlLang && (isLangOverride || (0, exports.langStringIsRTL)(xmlLang.toLowerCase()))) { publication.Metadata.SubTitle = {}; publication.Metadata.SubTitle[xmlLang.toLowerCase()] = subTitle_1.Data; } else { publication.Metadata.SubTitle = subTitle_1.Data; } } } } else { if (opfMetadataTitle) { var xmlLang = opfMetadataTitle[0].Lang || opf.Lang; var isLangOverride = opfMetadataTitle[0].Lang && opf.Lang && opfMetadataTitle[0].Lang !== opf.Lang; if (xmlLang && (isLangOverride || (0, exports.langStringIsRTL)(xmlLang.toLowerCase()))) { publication.Metadata.Title = {}; publication.Metadata.Title[xmlLang.toLowerCase()] = opfMetadataTitle[0].Data; } else { publication.Metadata.Title = opfMetadataTitle[0].Data; } } } }; exports.addTitle = addTitle; var setPublicationDirection = function (publication, opf) { if (opf.Spine && opf.Spine.PageProgression) { switch (opf.Spine.PageProgression) { case "auto": { publication.Metadata.Direction = metadata_1.DirectionEnum.Auto; break; } case "ltr": { publication.Metadata.Direction = metadata_1.DirectionEnum.LTR; break; } case "rtl": { publication.Metadata.Direction = metadata_1.DirectionEnum.RTL; break; } } } if (publication.Metadata.Language && publication.Metadata.Language.length && (!publication.Metadata.Direction || publication.Metadata.Direction === metadata_1.DirectionEnum.Auto)) { var lang = publication.Metadata.Language[0].toLowerCase(); if ((0, exports.langStringIsRTL)(lang)) { publication.Metadata.Direction = metadata_1.DirectionEnum.RTL; } } }; exports.setPublicationDirection = setPublicationDirection; var langStringIsRTL = function (lang) { return lang === "ar" || lang.startsWith("ar-") || lang === "he" || lang.startsWith("he-") || lang === "fa" || lang.startsWith("fa-") || lang === "zh-Hant" || lang === "zh-TW"; }; exports.langStringIsRTL = langStringIsRTL; var getNcx = function (ncxManItem, opf, zip) { return tslib_1.__awaiter(void 0, void 0, void 0, function () { var dname, ncxManItemHrefDecoded, ncxFilePath, has, err, zipEntries, _i, zipEntries_1, zipEntry, ncxZipStream_, err_2, ncxZipStream, ncxZipData, err_3, ncxStr; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: if (!opf.ZipPath) { return [2, Promise.reject("?!!opf.ZipPath")]; } dname = path.dirname(opf.ZipPath); ncxManItemHrefDecoded = ncxManItem.HrefDecoded; if (!ncxManItemHrefDecoded) { return [2, Promise.reject("?!ncxManItem.Href")]; } ncxFilePath = path.join(dname, ncxManItemHrefDecoded).replace(/\\/g, "/"); return [4, (0, zipHasEntry_1.zipHasEntry)(zip, ncxFilePath, undefined)]; case 1: has = _a.sent(); if (!!has) return [3, 3]; err = "NOT IN ZIP (NCX): ".concat(ncxManItem.Href, " --- ").concat(ncxFilePath); debug(err); return [4, zip.getEntries()]; case 2: zipEntries = _a.sent(); for (_i = 0, zipEntries_1 = zipEntries; _i < zipEntries_1.length; _i++) { zipEntry = zipEntries_1[_i]; if (zipEntry.startsWith("__MACOSX/")) { continue; } debug(zipEntry); } return [2, Promise.reject(err)]; case 3: _a.trys.push([3, 5, , 6]); return [4, zip.entryStreamPromise(ncxFilePath)]; case 4: ncxZipStream_ = _a.sent(); return [3, 6]; case 5: err_2 = _a.sent(); debug(err_2); return [2, Promise.reject(err_2)]; case 6: ncxZipStream = ncxZipStream_.stream; _a.label = 7; case 7: _a.trys.push([7, 9, , 10]); return [4, (0, BufferUtils_1.streamToBufferPromise)(ncxZipStream)]; case 8: ncxZipData = _a.sent(); return [3, 10]; case 9: err_3 = _a.sent(); debug(err_3); return [2, Promise.reject(err_3)]; case 10: ncxStr = ncxZipData.toString("utf8"); return [2, (0, exports.getNcx_)(ncxStr, ncxFilePath)]; } }); }); }; exports.getNcx = getNcx; var getNcx_ = function (ncxStr, ncxFilePath) { var iStart = ncxStr.indexOf("<ncx"); if (iStart >= 0) { var iEnd = ncxStr.indexOf(">", iStart); if (iEnd > iStart) { var clip = ncxStr.substr(iStart, iEnd - iStart); if (clip.indexOf("xmlns") < 0) { ncxStr = ncxStr.replace(/<ncx/, "<ncx xmlns=\"http://www.daisy.org/z3986/2005/ncx/\" "); } } } var ncxDoc = new xmldom.DOMParser().parseFromString(ncxStr); var ncx = xml_js_mapper_1.XML.deserialize(ncxDoc, ncx_1.NCX); ncx.ZipPath = ncxFilePath; return ncx; }; exports.getNcx_ = getNcx_; var getOpf = function (zip, rootfilePathDecoded, rootfilePath) { return tslib_1.__awaiter(void 0, void 0, void 0, function () { var has, err, zipEntries, _i, zipEntries_2, zipEntry, opfZipStream_, err_4, opfZipStream, opfZipData, err_5, opfStr; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4, (0, zipHasEntry_1.zipHasEntry)(zip, rootfilePathDecoded, rootfilePath)]; case 1: has = _a.sent(); if (!!has) return [3, 3]; err = "NOT IN ZIP (container OPF rootfile): ".concat(rootfilePath, " --- ").concat(rootfilePathDecoded); debug(err); return [4, zip.getEntries()]; case 2: zipEntries = _a.sent(); for (_i = 0, zipEntries_2 = zipEntries; _i < zipEntries_2.length; _i++) { zipEntry = zipEntries_2[_i]; if (zipEntry.startsWith("__MACOSX/")) { continue; } debug(zipEntry); } return [2, Promise.reject(err)]; case 3: _a.trys.push([3, 5, , 6]); return [4, zip.entryStreamPromise(rootfilePathDecoded)]; case 4: opfZipStream_ = _a.sent(); return [3, 6]; case 5: err_4 = _a.sent(); debug(err_4); return [2, Promise.reject(err_4)]; case 6: opfZipStream = opfZipStream_.stream; _a.label = 7; case 7: _a.trys.push([7, 9, , 10]); return [4, (0, BufferUtils_1.streamToBufferPromise)(opfZipStream)]; case 8: opfZipData = _a.sent(); return [3, 10]; case 9: err_5 = _a.sent(); debug(err_5); return [2, Promise.reject(err_5)]; case 10: opfStr = opfZipData.toString("utf8"); return [2, (0, exports.getOpf_)(opfStr, rootfilePathDecoded)]; } }); }); }; exports.getOpf = getOpf; var getOpf_ = function (opfStr, rootfilePathDecoded) { var iStart = opfStr.indexOf("<package"); if (iStart >= 0) { var iEnd = opfStr.indexOf(">", iStart); if (iEnd > iStart) { var clip = opfStr.substr(iStart, iEnd - iStart); if (clip.indexOf("xmlns") < 0) { opfStr = opfStr.replace(/<package/, "<package xmlns=\"http://openebook.org/namespaces/oeb-package/1.0/\" "); } } } var opfDoc = new xmldom.DOMParser().parseFromString(opfStr); var opf = xml_js_mapper_1.XML.deserialize(opfDoc, opf_1.OPF); opf.ZipPath = rootfilePathDecoded; return opf; }; exports.getOpf_ = getOpf_; var addOtherMetadata = function (publication, rootfile, opf) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9; if (!opf.Metadata) { return; } var opfMetadataRights = ((_c = (_b = (_a = opf.Metadata) === null || _a === void 0 ? void 0 : _a.DCMetadata) === null || _b === void 0 ? void 0 : _b.Rights) === null || _c === void 0 ? void 0 : _c.length) ? opf.Metadata.DCMetadata.Rights : (((_e = (_d = opf.Metadata) === null || _d === void 0 ? void 0 : _d.Rights) === null || _e === void 0 ? void 0 : _e.length) ? opf.Metadata.Rights : undefined); if (opfMetadataRights) { publication.Metadata.Rights = opfMetadataRights.join(" "); } var opfMetadataDescription = ((_h = (_g = (_f = opf.Metadata) === null || _f === void 0 ? void 0 : _f.DCMetadata) === null || _g === void 0 ? void 0 : _g.Description) === null || _h === void 0 ? void 0 : _h.length) ? opf.Metadata.DCMetadata.Description : (((_k = (_j = opf.Metadata) === null || _j === void 0 ? void 0 : _j.Description) === null || _k === void 0 ? void 0 : _k.length) ? opf.Metadata.Description : undefined); if (opfMetadataDescription) { publication.Metadata.Description = opfMetadataDescription[0]; } var opfMetadataPublisher = ((_o = (_m = (_l = opf.Metadata) === null || _l === void 0 ? void 0 : _l.DCMetadata) === null || _m === void 0 ? void 0 : _m.Publisher) === null || _o === void 0 ? void 0 : _o.length) ? opf.Metadata.DCMetadata.Publisher : (((_q = (_p = opf.Metadata) === null || _p === void 0 ? void 0 : _p.Publisher) === null || _q === void 0 ? void 0 : _q.length) ? opf.Metadata.Publisher : undefined); if (opfMetadataPublisher) { publication.Metadata.Publisher = []; opfMetadataPublisher.forEach(function (pub) { var contrib = new metadata_contributor_1.Contributor(); contrib.Name = pub; publication.Metadata.Publisher.push(contrib); }); } var opfMetadataSource = ((_t = (_s = (_r = opf.Metadata) === null || _r === void 0 ? void 0 : _r.DCMetadata) === null || _s === void 0 ? void 0 : _s.Source) === null || _t === void 0 ? void 0 : _t.length) ? opf.Metadata.DCMetadata.Source : (((_v = (_u = opf.Metadata) === null || _u === void 0 ? void 0 : _u.Source) === null || _v === void 0 ? void 0 : _v.length) ? opf.Metadata.Source : undefined); if (opfMetadataSource) { publication.Metadata.Source = opfMetadataSource[0]; } var opfMetadataContributor = ((_y = (_x = (_w = opf.Metadata) === null || _w === void 0 ? void 0 : _w.DCMetadata) === null || _x === void 0 ? void 0 : _x.Contributor) === null || _y === void 0 ? void 0 : _y.length) ? opf.Metadata.DCMetadata.Contributor : (((_0 = (_z = opf.Metadata) === null || _z === void 0 ? void 0 : _z.Contributor) === null || _0 === void 0 ? void 0 : _0.length) ? opf.Metadata.Contributor : undefined); if (opfMetadataContributor) { opfMetadataContributor.forEach(function (cont) { (0, exports.addContributor)(publication, rootfile, opf, cont, undefined); }); } var opfMetadataCreator = ((_3 = (_2 = (_1 = opf.Metadata) === null || _1 === void 0 ? void 0 : _1.DCMetadata) === null || _2 === void 0 ? void 0 : _2.Creator) === null || _3 === void 0 ? void 0 : _3.length) ? opf.Metadata.DCMetadata.Creator : (((_5 = (_4 = opf.Metadata) === null || _4 === void 0 ? void 0 : _4.Creator) === null || _5 === void 0 ? void 0 : _5.length) ? opf.Metadata.Creator : undefined); if (opfMetadataCreator) { opfMetadataCreator.forEach(function (cont) { (0, exports.addContributor)(publication, rootfile, opf, cont, "aut"); }); } if ((_6 = opf.Metadata) === null || _6 === void 0 ? void 0 : _6.Link) { opf.Metadata.Link.forEach(function (metaLink) { if (metaLink.Property === "a11y:certifierCredential" || metaLink.Rel === "a11y:certifierCredential") { var val = metaLink.Href; if (!val) { return; } val = val.trim(); if (!val) { return; } if (!publication.Metadata.CertifierCredential) { publication.Metadata.CertifierCredential = []; } publication.Metadata.CertifierCredential.push(val); } else if (metaLink.Property === "a11y:certifierReport" || metaLink.Rel === "a11y:certifierReport") { var val = metaLink.Href; if (!val) { return; } val = val.trim(); if (!val) { return; } if (!publication.Metadata.CertifierReport) { publication.Metadata.CertifierReport = []; } publication.Metadata.CertifierReport.push(val); } else if (metaLink.Property === "dcterms:conformsTo" || metaLink.Rel === "dcterms:conformsTo") { var val = metaLink.Href; if (!val) { return; } val = val.trim(); if (!val) { return; } if (!publication.Metadata.ConformsTo) { publication.Metadata.ConformsTo = []; } publication.Metadata.ConformsTo.push(val); } }); } if (opf.Metadata.Meta || ((_7 = opf.Metadata.XMetadata) === null || _7 === void 0 ? void 0 : _7.Meta)) { var AccessibilitySummarys_1 = []; var metaFunc = function (metaTag) { if (metaTag.Name === "schema:accessMode" || metaTag.Property === "schema:accessMode") { var val = metaTag.Property ? metaTag.Data : metaTag.Content; if (!val) { return; } val = val.trim(); if (!val) { return; } if (!publication.Metadata.AccessMode) { publication.Metadata.AccessMode = []; } publication.Metadata.AccessMode.push(val); } else if (metaTag.Name === "schema:accessibilityFeature" || metaTag.Property === "schema:accessibilityFeature") { var val = metaTag.Property ? metaTag.Data : metaTag.Content; if (!val) { return; } val = val.trim(); if (!val) { return; } if (!publication.Metadata.AccessibilityFeature) { publication.Metadata.AccessibilityFeature = []; } publication.Metadata.AccessibilityFeature.push(val); } else if (metaTag.Name === "schema:accessibilityHazard" || metaTag.Property === "schema:accessibilityHazard") { var val = metaTag.Property ? metaTag.Data : metaTag.Content; if (!val) { return; } val = val.trim(); if (!val) { return; } if (!publication.Metadata.AccessibilityHazard) { publication.Metadata.AccessibilityHazard = []; } publication.Metadata.AccessibilityHazard.push(val); } else if (metaTag.Name === "schema:accessibilitySummary" || metaTag.Property === "schema:accessibilitySummary") { var val = metaTag.Property ? metaTag.Data : metaTag.Content; if (!val) { return; } val = val.trim(); if (!val) { return; } AccessibilitySummarys_1.push({ metaTag: metaTag, val: val, }); } else if (metaTag.Name === "schema:accessModeSufficient" || metaTag.Property === "schema:accessModeSufficient") { var val = metaTag.Property ? metaTag.Data : metaTag.Content; if (!val) { return; } val = val.trim(); if (!val) { return; } if (!publication.Metadata.AccessModeSufficient) { publication.Metadata.AccessModeSufficient = []; } publication.Metadata.AccessModeSufficient.push((0, ta_json_string_tokens_converter_1.DelinearizeAccessModeSufficient)(val)); } else if (metaTag.Name === "schema:accessibilityAPI" || metaTag.Property === "schema:accessibilityAPI") { var val = metaTag.Property ? metaTag.Data : metaTag.Content; if (!val) { return; } val = val.trim(); if (!val) { return; } if (!publication.Metadata.AccessibilityAPI) { publication.Metadata.AccessibilityAPI = []; } publication.Metadata.AccessibilityAPI.push(val); } else if (metaTag.Name === "schema:accessibilityControl" || metaTag.Property === "schema:accessibilityControl") { var val = metaTag.Property ? metaTag.Data : metaTag.Content; if (!val) { return; } val = val.trim(); if (!val) { return; } if (!publication.Metadata.AccessibilityControl) { publication.Metadata.AccessibilityControl = []; } publication.Metadata.AccessibilityControl.push(val); } else if (metaTag.Name === "a11y:certifiedBy" || metaTag.Property === "a11y:certifiedBy") { var val = metaTag.Property ? metaTag.Data : metaTag.Content; if (!val) { return; } val = val.trim(); if (!val) { return; } if (!publication.Metadata.CertifiedBy) { publication.Metadata.CertifiedBy = []; } publication.Metadata.CertifiedBy.push(val); } else if (metaTag.Name === "a11y:certifierCredential" || metaTag.Property === "a11y:certifierCredential") { var val = metaTag.Property ? metaTag.Data : metaTag.Content; if (!val) { return; } val = val.trim(); if (!val) { return;