r2-shared-js
Version:
Readium 2 'shared' for NodeJS (TypeScript)
1,109 lines (1,108 loc) • 88.7 kB
JavaScript
"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;