Socket
Socket
Sign inDemoInstall

jw-epub-parser

Package Overview
Dependencies
125
Maintainers
2
Versions
129
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 2.0.0-beta.2 to 2.0.0-beta.3

dist/index.js.map

1404

dist/index.js

@@ -1,1402 +0,2 @@

import dateFormat from 'dateformat';
import JSZip from 'jszip';
import * as path from 'path-browserify';
const isMWBEpub = (name) => {
let regex = /^mwb_[A-Z][A-Z]?[A-Z]?_202\d(0[1-9]|1[0-2])\.epub$/i;
return regex.test(name);
};
const isWEpub = (name) => {
let regex = /^w_[A-Z][A-Z]?[A-Z]?_202\d(0[1-9]|1[0-2])\.epub$/i;
return regex.test(name);
};
const getInputType = (input) => {
const result = { browser: false, node: true };
if (input.name || input.url || input.htmlRaws) {
result.browser = true;
}
return result;
};
const getEPUBFileName = (input) => {
const filename = input.name || input.url || input;
return window.path.basename(filename);
};
const isValidEPUB = (input) => {
const epubFilename = getEPUBFileName(input);
const isMWB = isMWBEpub(epubFilename);
const isW = isWEpub(epubFilename);
return isMWB || isW;
};
const isValidEPUBIssue = (input) => {
let valid = true;
const epubFilename = getEPUBFileName(input);
const isMWB = isMWBEpub(epubFilename);
const isW = isWEpub(epubFilename);
const type = isMWB ? 'mwb' : isW ? 'w' : undefined;
const issue = +epubFilename.split('_')[2].split('.epub')[0];
if (type === 'mwb' && issue < 202207) valid = false;
if (type === 'w' && issue < 202304) valid = false;
return valid;
};
const getEPUBYear = (input) => {
const filename = getEPUBFileName(input);
return filename.split('_')[2].substring(0, 4);
};
const getEPUBLanguage = (input) => {
const filename = getEPUBFileName(input);
return filename.split('_')[1];
};
const getEPUBData = async (input) => {
if (input.name) {
return input;
}
if (input.url) {
const epubRes = await window.fetch(input.url);
if (epubRes.status !== 200) {
throw new Error('EPUB file could not be downloaded. Check the URL you provided.');
}
const epubData = await epubRes.blob();
const data = await epubData.arrayBuffer();
return data;
}
const data = await window.readFile(input);
return data;
};
var languages$1 = [
{ locale: 'en', code: 'E' },
{ locale: 'fr-FR', code: 'F' },
{ locale: 'mg-MG', code: 'MG' },
{ locale: 'pt-BR', code: 'T' },
{ locale: 'mg-TND', code: 'TND' },
{ locale: 'mg-TNK', code: 'TNK' },
{ locale: 'mg-VZ', code: 'VZ' },
];
class JWEPUBParserError extends Error {
constructor(code, message) {
super(message);
this.code = `jw-epub-parser/failed-${code}`;
}
}
const languages = window.jw_epub_parser.languages;
const getMonthNames = (lang) => {
return [
{ index: 0, name: languages[lang].januaryVariations },
{ index: 1, name: languages[lang].februaryVariations },
{ index: 2, name: languages[lang].marchVariations },
{ index: 3, name: languages[lang].aprilVariations },
{ index: 4, name: languages[lang].mayVariations },
{ index: 5, name: languages[lang].juneVariations },
{ index: 6, name: languages[lang].julyVariations },
{ index: 7, name: languages[lang].augustVariations },
{ index: 8, name: languages[lang].septemberVariations },
{ index: 9, name: languages[lang].octoberVariations },
{ index: 10, name: languages[lang].novemberVariations },
{ index: 11, name: languages[lang].decemberVariations },
];
};
const getTGWTalkVariations = (lang) => languages[lang].tgwTalk10Variations;
const getTGWBibleReadingVariations = (lang) => languages[lang].tgwBibleReadingVariations;
const getAssignmentsName = (lang) => [
languages[lang].initialCallVideoVariations,
languages[lang].returnVisitVideoVariations,
languages[lang].memorialInvitationVideoVariations,
languages[lang].initialCallVariations,
languages[lang].returnVisitVariations,
languages[lang].bibleStudyVariations,
languages[lang].talkVariations,
languages[lang].memorialInvitationVariations,
];
const getAssignmentsVariations = (lang) => languages[lang].assignmentAyfVariations;
const getLivingPartsVariations = (lang) => languages[lang].assignmentLcVariations;
const getCBSVariations = (lang) => languages[lang].cbsVariations;
const getStudyArticleDateVariations = (lang) => languages[lang].studyArticleDateVariations;
const extractMonthName = (src, lang) => {
let varDay;
let monthIndex;
src = src.split('–')[0];
const monthNames = getMonthNames(lang);
for (const month of monthNames) {
const monthLang = month.name;
const regex = new RegExp(`(${monthLang})`);
const array = regex.exec(src);
if (Array.isArray(array)) {
varDay = +src.match(/(\d+)/)[0];
monthIndex = month.index;
break;
}
}
if (typeof varDay === 'number' && typeof monthIndex === 'number') {
return { varDay, monthIndex };
}
throw new JWEPUBParserError('week-date', `Parsing failed when extracting the week date. The input was: ${src}`);
};
const extractSongNumber = (src) => {
return +src.match(/(\d+)/)[0];
};
const extractTGWTalk = (src, lang) => {
const variations = getTGWTalkVariations(lang).split('|');
const pattern = '{{ title }}';
let result;
for (const variation of variations) {
const startIndex = variation.indexOf(pattern);
const endIndex = src.length - variation.replace(pattern, '').length + startIndex;
const extracted = src.substring(startIndex, endIndex);
const verifyExtract = variation.replace(pattern, extracted);
if (verifyExtract === src) {
result = extracted;
break;
}
}
if (result) return result;
throw new JWEPUBParserError('tgw-talk', `Parsing failed for Treasures from God’s Word part. The input was: ${src}`);
};
const extractTGWBibleReading = (src, lang) => {
const variations = getTGWBibleReadingVariations(lang).split('|');
const pattern = '{{ source }}';
let result;
for (const variation of variations) {
const startIndex = variation.indexOf(pattern);
const endIndex = src.length - variation.replace(pattern, '').length + startIndex;
const extracted = src.substring(startIndex, endIndex);
const verifyExtract = variation.replace(pattern, extracted);
if (verifyExtract === src) {
result = extracted;
break;
}
}
if (result) return result;
throw new JWEPUBParserError('tgw-bibleReading', 'Parsing failed for Bible Reading part');
};
const extractAYFAssignment = (src, lang) => {
const variations = getAssignmentsVariations(lang).split('|');
const assignmentsName = getAssignmentsName(lang);
const patternAssignment = '{{ assignment }}';
const patternSource = '{{ source }}';
let result;
for (const variation of variations) {
const patternSourceIndex = variation.indexOf(patternSource);
const find = variation.substring(0, patternSourceIndex).trim();
let assignmentsList = '(';
for (let a = 0; a < assignmentsName.length; a++) {
assignmentsList += assignmentsName[a];
if (a < assignmentsName.length - 1) {
assignmentsList += '|';
}
}
assignmentsList += ')';
let textSearch = find.replace('{{ duration }}', '\\d+');
textSearch = textSearch.replace('(', '(\\(');
textSearch = textSearch.replace(')', ')\\)');
textSearch = textSearch.replace(' :', ' ?:?');
textSearch = textSearch.replace(') ', ') ?');
textSearch = textSearch.replace('??', '?');
textSearch = textSearch.replace(patternAssignment, assignmentsList);
const regex = new RegExp(textSearch.trim());
const array = regex.exec(src);
if (array !== null) {
const partTiming = +array[2].match(/(\d+)/)[0];
let textSearch = find.replace('{{ assignment }}', '');
textSearch = textSearch.replace('{{ duration }}', partTiming);
const split = src.split(textSearch.trim());
if (split.length === 2) {
const partType = split[0].trim();
let textSearch = variation.replace('{{ assignment }}', partType);
textSearch = textSearch.replace('{{ duration }}', partTiming);
const findNextIndex = textSearch.indexOf('{{ source }}');
const srcNext = src.substring(findNextIndex);
const obj = { src: srcNext, type: partType, time: partTiming };
let verifyExtract = variation.replace('{{ assignment }}', obj.type);
verifyExtract = verifyExtract.replace('{{ duration }}', obj.time);
verifyExtract = verifyExtract.replace('{{ source }}', obj.src);
if (verifyExtract === src) {
result = obj;
break;
}
}
}
}
if (result) return result;
throw new JWEPUBParserError(
'ayf-part',
`Parsing failed for Apply Yourself to the Field Ministry part. The input was: ${src}`
);
};
const extractLCAssignment = (src, lang) => {
const variations = getLivingPartsVariations(lang).split('|');
const patternSource = '{{ source }}';
const patternDuration = '{{ duration }}';
const patternContent = '{{ content }}';
let result;
for (const variation of variations) {
const patternSourceIndex = variation.indexOf(patternSource);
const patternContentIndex = variation.indexOf(patternContent);
let masterSearch = variation.replace(patternSource, '');
masterSearch = masterSearch.replace(patternContent, '');
let textSearch = masterSearch.replace('{{ duration }}', '\\d+');
textSearch = textSearch.replace('(', '(\\(');
textSearch = textSearch.replace(')', ')\\)');
textSearch = textSearch.replace(' :', ' ?:?');
textSearch = textSearch.replace(') ', ') ?');
textSearch = textSearch.replace('??', '?');
const regex = new RegExp(textSearch.trim());
const array = regex.exec(src);
if (array !== null) {
const partTiming = +array[0].match(/(\d+)/)[0];
const findStrings = masterSearch.replace(patternDuration, partTiming);
let split = src.split(findStrings);
if (split.length === 1) {
split = src.split(findStrings.trim());
}
if (split.length === 2) {
let partTitle;
let partContent;
if (split[1] === '') {
partTitle = split[0].trim();
partContent = '';
}
if (split[1] !== '') {
if (patternSourceIndex < patternContentIndex) {
partTitle = split[0].trim();
partContent = split[1].trim();
}
if (patternSourceIndex > patternContentIndex) {
partTitle = split[1].trim();
partContent = split[0].trim();
}
}
let verifyExtract = variation.replace('{{ source }}', partTitle);
verifyExtract = verifyExtract.replace('{{ duration }}', partTiming);
verifyExtract = verifyExtract.replace('{{ content }}', partContent);
if (split[1] === '') verifyExtract = verifyExtract.trim();
if (verifyExtract === src) {
result = {
time: partTiming,
title: partTitle,
content: partContent,
};
break;
}
}
}
}
if (result) return result;
throw new JWEPUBParserError('lc-part', `Parsing failed for Living as Christians part. The input was: ${src}`);
};
const extractCBSSource = (src, lang) => {
const variations = getCBSVariations(lang).split('|');
const pattern = '{{ source }}';
let result;
for (const variation of variations) {
const startIndex = variation.indexOf(pattern);
const endIndex = src.length - variation.replace('{{ source }}', '').length + startIndex;
const extracted = src.substring(startIndex, endIndex);
const verifyExtract = variation.replace('{{ source }}', extracted);
if (verifyExtract === src) {
result = extracted;
break;
}
}
if (result) return result;
throw new JWEPUBParserError('lc-cbs', `Parsing failed for Congregation Bible Study part. The input was: ${src}`);
};
const extractLastSong = (src) => {
const temp = extractSongNumber(src);
return temp > 151 ? src : temp;
};
const extractWTStudyDate = (src, lang) => {
const variations = getStudyArticleDateVariations(lang).split('|');
const patternNumber = '{{ number }}';
const patternDate = '{{ date }}';
let varDay;
let monthIndex;
let varYear;
for (const variation of variations) {
let textSearch = variation.replace(patternDate, '');
textSearch = textSearch.replace(patternNumber, '\\d+');
const regex = new RegExp(textSearch.trim());
const array = regex.exec(src);
if (array !== null) {
const dateStartIndex = array[0].length;
const dateValue = src.substring(dateStartIndex);
textSearch = dateValue.trim().split('–')[0];
const monthNames = getMonthNames(lang);
for (const month of monthNames) {
const monthLang = month.name;
const regex = new RegExp(`(${monthLang})`);
const array2 = regex.exec(textSearch);
if (Array.isArray(array2)) {
varDay = +textSearch.match(/(\d+)/)[0];
monthIndex = month.index;
const findYear = /\b\d{4}\b/;
const array3 = findYear.exec(dateValue);
if (array3 !== null) {
varYear = +array3[0];
}
break;
}
}
}
}
if (typeof varDay === 'number' && typeof monthIndex === 'number' && typeof varYear === 'number') {
return { varDay, monthIndex, varYear };
}
throw new JWEPUBParserError('wtstudy', `Parsing failed for Watchtower Study Date. The input was: ${src}`);
};
const getMWBWeekDateEnhanced = (weekDate, mwbYear, lang) => {
const { varDay, monthIndex } = extractMonthName(weekDate, lang);
const schedDate = new Date(mwbYear, monthIndex, varDay);
return dateFormat(schedDate, 'mm/dd/yyyy');
};
const getMWBTGWTalkEnhanced = (src, lang) => {
return extractTGWTalk(src, lang);
};
const getMWBTGWBibleReadingEnhanced = (src, lang) => {
return extractTGWBibleReading(src, lang);
};
const getMWBAYFEnhanced = (src, lang) => {
return extractAYFAssignment(src, lang);
};
const getMWBLCEnhanced = (src, lang) => {
return extractLCAssignment(src, lang);
};
const getMWBCBSEnhanced = (src, lang) => {
return extractCBSSource(src, lang);
};
const getWTStudyDateEnhanced = (src, lang) => {
const { varDay, monthIndex, varYear } = extractWTStudyDate(src, lang);
const schedDate = new Date(varYear, monthIndex, varDay);
return dateFormat(schedDate, 'mm/dd/yyyy');
};
const isValidHTML = (name) => {
let valid = false;
if (name.startsWith('OEBPS') && name.endsWith('.xhtml')) {
const fileName = name.split('/')[1].split('.')[0];
if (!isNaN(fileName)) {
valid = true;
}
}
return valid;
};
const getHTMLString = async (zip, filename) => {
const content = await zip.file(filename).async('string');
return content;
};
const isValidMWBSchedule = (htmlDoc) => {
let valid = false;
const isValidTGW = htmlDoc.querySelector(`[class*=treasures]`) ? true : false;
const isValidAYF = htmlDoc.querySelector(`[class*=ministry]`) ? true : false;
const isValidLC = htmlDoc.querySelector(`[class*=christianLiving]`) ? true : false;
if (isValidTGW === true && isValidAYF === true && isValidLC === true) {
valid = true;
}
return valid;
};
const HTMLParse = (htmlString) => {
const parser = new window.DOMParser();
const htmlDoc = parser.parseFromString(htmlString, 'text/html');
return htmlDoc;
};
const getHTMLDocsFromRaws = (htmlRaws) => {
const files = [];
for (const content of htmlRaws) {
const htmlDoc = HTMLParse(content);
files.push(htmlDoc);
}
return files;
};
const isValidWSchedule = (htmlDoc) => {
const valid = htmlDoc.querySelector('.groupTOC') ? true : false;
return valid;
};
const extractEPUBFiles = async (data) => {
const appZip = new JSZip();
const contents = await appZip.loadAsync(data);
return contents;
};
const validateEPUBContents = async (data) => {
const MAX_FILES = 300;
const MAX_SIZE = 20000000; // 20 MO
let fileCount = 0;
let totalSize = 0;
let targetDirectory = 'archive_tmp';
const result = { isBig: false, isMore: false, isSuspicious: false };
const appZip = new JSZip();
const contents = await appZip.loadAsync(data);
for (let [filename] of Object.entries(contents.files)) {
fileCount++;
if (fileCount > MAX_FILES) {
result.isMore = true;
}
// Prevent ZipSlip path traversal (S6096)
const resolvedPath = window.path.join(targetDirectory, filename);
if (!resolvedPath.startsWith(targetDirectory)) {
result.isSuspicious = true;
}
const contentSize = await appZip.file(filename).async('ArrayBuffer');
totalSize += contentSize.byteLength;
if (totalSize > MAX_SIZE) {
result.isBig = true;
}
}
fileCount = 0;
totalSize = 0;
return result;
};
const getHTMLDocs = async (zip, isMWB, isW) => {
const files = [];
for (let [filename] of Object.entries(zip.files)) {
const isValidFile = isValidHTML(filename);
if (isValidFile) {
const content = await getHTMLString(zip, filename);
const htmlDoc = HTMLParse(content);
const isValidSchedule = isMWB ? isValidMWBSchedule(htmlDoc) : isW ? isValidWSchedule(htmlDoc) : false;
if (isValidSchedule) {
files.push(htmlDoc);
}
}
}
return files;
};
const getHTMLWTArticleDoc = async (zip, articleFilename) => {
let article;
for (let [filename] of Object.entries(zip.files)) {
const shortName = window.path.basename(filename);
if (shortName === articleFilename) {
const content = await getHTMLString(zip, filename);
const htmlDoc = HTMLParse(content);
return htmlDoc;
}
}
return article;
};
const getMWBWeekDate = (htmlItem, fromHTML) => {
const wdHtml = fromHTML
? htmlItem.querySelector('article').querySelector('header').querySelector('h1')
: htmlItem.getElementsByTagName('h1').item(0);
const weekDate = wdHtml.textContent.replaceAll(/\u00A0/g, ' ');
return weekDate;
};
const getMWBWeeklyBibleReading = (htmlItem, fromHTML) => {
const wbHtml = fromHTML
? htmlItem.querySelector('article').querySelector('header').querySelector('h2')
: htmlItem.getElementsByTagName('h2').item(0);
const weeklyBibleReading = wbHtml.textContent.replaceAll(/\u00A0/g, ' ');
return weeklyBibleReading;
};
const getMWBAYFCount = (htmlItem) => {
return htmlItem.querySelector('#section3').querySelectorAll('li').length;
};
const getMWBLCCount = (htmlItem) => {
const itemsCn = htmlItem.querySelector('#section4').querySelectorAll('li').length;
return itemsCn === 6 ? 2 : 1;
};
const getMWBSources = (htmlItem) => {
let src = '';
// get elements with meeting schedule data: pGroup
const pGroupData = htmlItem.querySelectorAll('.pGroup');
pGroupData.forEach((pGroup) => {
const liData = pGroup.querySelectorAll('li');
liData.forEach((li) => {
const firstP = li.querySelector('p');
src += '|' + firstP.textContent;
});
});
src = src.replaceAll(/\u00A0/g, ' '); // remove non-breaking space
return src;
};
const getWStudyArticles = (htmlItem) => {
return htmlItem.querySelectorAll('h3');
};
const getWStudyDate = (htmlItem) => {
return htmlItem.textContent.replaceAll(/\u00A0/g, ' '); // remove non-breaking space;
};
const getWSTudySongs = async ({ htmlItem, zip, fromHTML, htmlArticles, index }) => {
let article;
const articleLink = htmlItem.nextElementSibling.querySelector('a').getAttribute('href');
if (!fromHTML) {
article = await getHTMLWTArticleDoc(zip, articleLink);
}
if (fromHTML) {
const wtArticle = htmlArticles[index];
article = HTMLParse(wtArticle);
}
if (article) {
const themeScrp = article.querySelector('.themeScrp');
const WTOpeningSong = extractSongNumber(themeScrp.nextElementSibling.querySelector('a').textContent);
const blockTeach = article.querySelector('.blockTeach');
const WTConcludingSong = extractSongNumber(blockTeach.nextElementSibling.querySelector('a').textContent);
return { WTOpeningSong, WTConcludingSong };
}
};
const getWStudyTitle = (htmlItem) => {
const articleLink = htmlItem.nextElementSibling.querySelector('a');
const studyTitle = articleLink.textContent.replaceAll(/\u00A0/g, ' '); // remove non-breaking space;;
return studyTitle;
};
const startParse = async (epubInput) => {
const isRawsHTML = epubInput.htmlRaws ? true : false;
let result = {};
if (!isRawsHTML) {
const isValidName = isValidEPUB(epubInput);
if (!isValidName) {
throw new Error('The selected epub file has an incorrect naming.');
}
const isValiIssue = isValidEPUBIssue(epubInput);
if (!isValiIssue) {
throw new Error(
'EPUB import is only supported for Meeting Workbook starting on July 2022, and for Watchtower Study starting on April 2023.'
);
}
const epubBuffer = await getEPUBData(epubInput);
const epubCheck = await validateEPUBContents(epubBuffer);
if (epubCheck.isBig) {
throw new Error('EPUB file seems to be large. Extract aborted.');
}
if (epubCheck.isMore) {
throw new Error('EPUB file seems to contain more files than expected. Extract aborted.');
}
if (epubCheck.isSuspicious) {
throw new Error('EPUB file seems to be suspicious. Extract aborted.');
}
const epubFilename = getEPUBFileName(epubInput);
const isMWB = isMWBEpub(epubFilename);
const isW = isWEpub(epubFilename);
const epubContents = await extractEPUBFiles(epubBuffer);
const htmlDocs = await getHTMLDocs(epubContents, isMWB, isW);
if (htmlDocs.length === 0) {
throw new Error(
`The file you provided is not a valid ${
isMWB ? 'Meeting Workbook' : 'Watchtower Study'
} EPUB file. Please make sure that the file is correct.`
);
}
if (isW && htmlDocs.length > 1) {
throw new Error(
`The file you provided is not a valid Watchtower Study EPUB file. Please make sure that the file is correct.`
);
}
const epubYear = getEPUBYear(epubInput);
const epubLang = getEPUBLanguage(epubInput);
if (isMWB) {
result = await parseMWBEpub({ htmlDocs, epubYear, epubLang, fromHTML: false });
}
if (isW) {
result = await parseWEpub({ htmlItem: htmlDocs[0], epubLang, fromHTML: false, epubContents });
}
}
if (isRawsHTML) {
const htmlDocs = getHTMLDocsFromRaws(epubInput.htmlRaws);
if (epubInput.isMWB) {
result = await parseMWBEpub({
htmlDocs,
epubYear: epubInput.epubYear,
epubLang: epubInput.epubLang,
fromHTML: true,
});
}
if (epubInput.isW) {
result = await parseWEpub({
htmlItem: htmlDocs[0],
epubYear: epubInput.epubYear,
epubLang: epubInput.epubLang,
fromHTML: true,
htmlArticles: epubInput.htmlArticles,
});
}
}
return result;
};
const parseMWBEpub = async ({ htmlDocs, epubYear, epubLang, fromHTML }) => {
const weeksData = [];
const isEnhancedParsing = languages$1.find((language) => language.code === epubLang);
for (const htmlItem of htmlDocs) {
const weekItem = {};
// get week date
const weekDate = getMWBWeekDate(htmlItem, fromHTML);
if (isEnhancedParsing) {
const weekDateEnhanced = getMWBWeekDateEnhanced(weekDate, epubYear, epubLang);
weekItem.mwb_week_date = weekDateEnhanced;
weekItem.mwb_week_date_locale = weekDate;
} else {
weekItem.mwb_week_date = weekDate;
}
// get weekly Bible Reading
weekItem.mwb_weekly_bible_reading = getMWBWeeklyBibleReading(htmlItem, fromHTML);
// compile all sources
const src = getMWBSources(htmlItem);
let splits = src.split('|');
let tmpSrc = '';
// First song
weekItem.mwb_song_first = extractSongNumber(splits[1]);
// 10min TGW Source
tmpSrc = splits[3].trim();
if (isEnhancedParsing) {
weekItem.mwb_tgw_talk = getMWBTGWTalkEnhanced(tmpSrc, epubLang);
} else {
weekItem.mwb_tgw_talk = tmpSrc;
}
//Bible Reading Source
tmpSrc = splits[7].trim();
if (isEnhancedParsing) {
weekItem.mwb_tgw_bread = getMWBTGWBibleReadingEnhanced(tmpSrc, epubLang);
} else {
weekItem.mwb_tgw_bread = tmpSrc;
}
// get number of assignments in Apply Yourself Parts
const cnAYF = getMWBAYFCount(htmlItem);
// AYF Part Count
weekItem.mwb_ayf_count = cnAYF;
//AYF1 Source
tmpSrc = splits[8].trim();
if (isEnhancedParsing) {
const partEnhanced = getMWBAYFEnhanced(tmpSrc, epubLang);
weekItem.mwb_ayf_part1 = partEnhanced.src;
weekItem.mwb_ayf_part1_time = partEnhanced.time;
weekItem.mwb_ayf_part1_type = partEnhanced.type;
} else {
weekItem.mwb_ayf_part1 = tmpSrc;
}
//AYF2 Source
if (cnAYF > 1) {
tmpSrc = splits[9].trim();
if (isEnhancedParsing) {
const partEnhanced = getMWBAYFEnhanced(tmpSrc, epubLang);
weekItem.mwb_ayf_part2 = partEnhanced.src;
weekItem.mwb_ayf_part2_time = partEnhanced.time;
weekItem.mwb_ayf_part2_type = partEnhanced.type;
} else {
weekItem.mwb_ayf_part2 = tmpSrc;
}
}
//AYF3 Source
if (cnAYF > 2) {
tmpSrc = splits[10].trim();
if (isEnhancedParsing) {
const partEnhanced = getMWBAYFEnhanced(tmpSrc, epubLang);
weekItem.mwb_ayf_part3 = partEnhanced.src;
weekItem.mwb_ayf_part3_time = partEnhanced.time;
weekItem.mwb_ayf_part3_type = partEnhanced.type;
} else {
weekItem.mwb_ayf_part3 = tmpSrc;
}
}
// AYF4 Source
if (cnAYF > 3) {
tmpSrc = splits[11].trim();
if (isEnhancedParsing) {
const partEnhanced = getMWBAYFEnhanced(tmpSrc, epubLang);
weekItem.mwb_ayf_part4 = partEnhanced.src;
weekItem.mwb_ayf_part4_time = partEnhanced.time;
weekItem.mwb_ayf_part4_type = partEnhanced.type;
} else {
weekItem.mwb_ayf_part4 = tmpSrc;
}
}
// Middle song
let nextIndex = cnAYF > 3 ? 12 : cnAYF > 2 ? 11 : cnAYF > 1 ? 10 : 9;
weekItem.mwb_song_middle = extractSongNumber(splits[nextIndex]);
// get number of assignments in Living as Christians Parts
const cnLC = getMWBLCCount(htmlItem);
// LC Part Count
weekItem.mwb_lc_count = cnLC;
// 1st LC part
nextIndex++;
tmpSrc = splits[nextIndex].trim();
if (isEnhancedParsing) {
const lcEnhanced = getMWBLCEnhanced(tmpSrc, epubLang);
weekItem.mwb_lc_part1 = lcEnhanced.title;
weekItem.mwb_lc_part1Time = lcEnhanced.time;
if (lcEnhanced.content && lcEnhanced.content !== '') {
weekItem.mwb_lc_part1Content = lcEnhanced.content;
}
} else {
weekItem.mwb_lc_part1 = tmpSrc;
}
// 2nd LC part
if (cnLC === 2) {
nextIndex++;
tmpSrc = splits[nextIndex].trim();
if (isEnhancedParsing) {
const lcEnhanced = getMWBLCEnhanced(tmpSrc, epubLang);
weekItem.mwb_lc_part2 = lcEnhanced.title;
weekItem.mwb_lc_part2Time = lcEnhanced.time;
if (lcEnhanced.content && lcEnhanced.content !== '') {
weekItem.mwb_lc_part2Content = lcEnhanced.content;
}
} else {
weekItem.mwb_lc_part2 = tmpSrc;
}
}
// CBS Source
nextIndex++;
tmpSrc = splits[nextIndex].trim();
if (isEnhancedParsing) {
weekItem.mwb_lc_cbs = getMWBCBSEnhanced(tmpSrc, epubLang);
} else {
weekItem.mwb_lc_cbs = tmpSrc;
}
// Concluding Song
nextIndex++;
nextIndex++;
tmpSrc = splits[nextIndex].trim();
weekItem.mwb_song_conclude = extractLastSong(tmpSrc);
weeksData.push(weekItem);
}
return weeksData;
};
const parseWEpub = async ({ htmlItem, epubLang, fromHTML, epubContents, htmlArticles }) => {
const weeksData = [];
const isEnhancedParsing = languages$1.find((language) => language.code === epubLang);
const studyArticles = getWStudyArticles(htmlItem);
for (const [index, studyArticle] of studyArticles.entries()) {
const weekItem = {};
const studyDate = getWStudyDate(studyArticle);
if (isEnhancedParsing) {
const wStudyEnhanced = getWTStudyDateEnhanced(studyDate, epubLang);
weekItem.w_study_date = wStudyEnhanced;
weekItem.w_study_date_locale = studyDate;
} else {
weekItem.w_study_date = studyDate;
}
const studyTitle = getWStudyTitle(studyArticle);
weekItem.w_study_title = studyTitle;
const songs = await getWSTudySongs({ fromHTML, zip: epubContents, htmlArticles, htmlItem: studyArticle, index });
if (songs) {
weekItem.w_study_opening_song = songs.WTOpeningSong;
weekItem.w_study_concluding_song = songs.WTConcludingSong;
}
weeksData.push(weekItem);
}
return weeksData;
};
var januaryVariations$6 = "January";
var februaryVariations$6 = "February";
var marchVariations$6 = "March";
var aprilVariations$6 = "April";
var mayVariations$6 = "May";
var juneVariations$6 = "June";
var julyVariations$6 = "July";
var augustVariations$6 = "August";
var septemberVariations$6 = "September";
var octoberVariations$6 = "October";
var novemberVariations$6 = "November";
var decemberVariations$6 = "December";
var tgwTalk10Variations$6 = "{{ title }}: (10 min.)";
var tgwBibleReadingVariations$6 = "Bible Reading: (4 min.) {{ source }}";
var initialCallVideoVariations$6 = "Initial Call Video";
var returnVisitVideoVariations$6 = "Return Visit Video";
var memorialInvitationVideoVariations$6 = "Memorial Invitation Video";
var initialCallVariations$6 = "Initial Call";
var returnVisitVariations$6 = "Return Visit";
var bibleStudyVariations$6 = "Bible Study";
var talkVariations$6 = "Talk";
var memorialInvitationVariations$6 = "Memorial Invitation";
var assignmentAyfVariations$6 = "{{ assignment }}: ({{ duration }} min.) {{ source }}";
var assignmentLcVariations$6 = "{{ source }}: ({{ duration }} min.) {{ content }}";
var cbsVariations$6 = "Congregation Bible Study: (30 min.) {{ source }}";
var studyArticleDateVariations$6 = "Study Article {{ number }}: {{ date }}";
var E = {
januaryVariations: januaryVariations$6,
februaryVariations: februaryVariations$6,
marchVariations: marchVariations$6,
aprilVariations: aprilVariations$6,
mayVariations: mayVariations$6,
juneVariations: juneVariations$6,
julyVariations: julyVariations$6,
augustVariations: augustVariations$6,
septemberVariations: septemberVariations$6,
octoberVariations: octoberVariations$6,
novemberVariations: novemberVariations$6,
decemberVariations: decemberVariations$6,
tgwTalk10Variations: tgwTalk10Variations$6,
tgwBibleReadingVariations: tgwBibleReadingVariations$6,
initialCallVideoVariations: initialCallVideoVariations$6,
returnVisitVideoVariations: returnVisitVideoVariations$6,
memorialInvitationVideoVariations: memorialInvitationVideoVariations$6,
initialCallVariations: initialCallVariations$6,
returnVisitVariations: returnVisitVariations$6,
bibleStudyVariations: bibleStudyVariations$6,
talkVariations: talkVariations$6,
memorialInvitationVariations: memorialInvitationVariations$6,
assignmentAyfVariations: assignmentAyfVariations$6,
assignmentLcVariations: assignmentLcVariations$6,
cbsVariations: cbsVariations$6,
studyArticleDateVariations: studyArticleDateVariations$6
};
var januaryVariations$5 = "janvier";
var februaryVariations$5 = "février";
var marchVariations$5 = "mars";
var aprilVariations$5 = "avril";
var mayVariations$5 = "mai";
var juneVariations$5 = "juin";
var julyVariations$5 = "juillet";
var augustVariations$5 = "août";
var septemberVariations$5 = "septembre";
var octoberVariations$5 = "octobre";
var novemberVariations$5 = "novembre";
var decemberVariations$5 = "décembre";
var tgwTalk10Variations$5 = "{{ title }} (10 min)";
var tgwBibleReadingVariations$5 = "Lecture de la Bible (4 min) : {{ source }}";
var initialCallVideoVariations$5 = "Vidéo du premier contact";
var returnVisitVideoVariations$5 = "Vidéo de la nouvelle visite";
var memorialInvitationVideoVariations$5 = "Vidéo d’invitation au Mémorial";
var initialCallVariations$5 = "Premier contact";
var returnVisitVariations$5 = "Nouvelle visite";
var bibleStudyVariations$5 = "Cours biblique";
var talkVariations$5 = "Discours";
var memorialInvitationVariations$5 = "Invitation au Mémorial";
var assignmentAyfVariations$5 = "{{ assignment }} ({{ duration }} min) : {{ source }}";
var assignmentLcVariations$5 = "{{ source }} ({{ duration }} min) : {{ content }}|{{ source }} ({{ duration }} min)";
var cbsVariations$5 = "Étude biblique de l’assemblée (30 min) : {{ source }}";
var studyArticleDateVariations$5 = "Article d’étude no {{ number }} : {{ date }}";
var F = {
januaryVariations: januaryVariations$5,
februaryVariations: februaryVariations$5,
marchVariations: marchVariations$5,
aprilVariations: aprilVariations$5,
mayVariations: mayVariations$5,
juneVariations: juneVariations$5,
julyVariations: julyVariations$5,
augustVariations: augustVariations$5,
septemberVariations: septemberVariations$5,
octoberVariations: octoberVariations$5,
novemberVariations: novemberVariations$5,
decemberVariations: decemberVariations$5,
tgwTalk10Variations: tgwTalk10Variations$5,
tgwBibleReadingVariations: tgwBibleReadingVariations$5,
initialCallVideoVariations: initialCallVideoVariations$5,
returnVisitVideoVariations: returnVisitVideoVariations$5,
memorialInvitationVideoVariations: memorialInvitationVideoVariations$5,
initialCallVariations: initialCallVariations$5,
returnVisitVariations: returnVisitVariations$5,
bibleStudyVariations: bibleStudyVariations$5,
talkVariations: talkVariations$5,
memorialInvitationVariations: memorialInvitationVariations$5,
assignmentAyfVariations: assignmentAyfVariations$5,
assignmentLcVariations: assignmentLcVariations$5,
cbsVariations: cbsVariations$5,
studyArticleDateVariations: studyArticleDateVariations$5
};
var januaryVariations$4 = "Janoary";
var februaryVariations$4 = "Febroary";
var marchVariations$4 = "Martsa";
var aprilVariations$4 = "Aprily";
var mayVariations$4 = "Mey";
var juneVariations$4 = "Jona";
var julyVariations$4 = "Jolay";
var augustVariations$4 = "Aogositra";
var septemberVariations$4 = "Septambra";
var octoberVariations$4 = "Oktobra";
var novemberVariations$4 = "Novambra";
var decemberVariations$4 = "Desambra";
var tgwTalk10Variations$4 = "{{ title }}: (10 min.)";
var tgwBibleReadingVariations$4 = "Famakiana Baiboly: (4 min.) {{ source }}";
var initialCallVideoVariations$4 = "Video Fitoriana";
var returnVisitVideoVariations$4 = "Video Fiverenana Mitsidika";
var memorialInvitationVideoVariations$4 = "Video Fanasana Fahatsiarovana";
var initialCallVariations$4 = "Fitoriana";
var returnVisitVariations$4 = "Fiverenana Mitsidika";
var bibleStudyVariations$4 = "Fampianarana Baiboly";
var talkVariations$4 = "Lahateny";
var memorialInvitationVariations$4 = "Fanasana Fahatsiarovana";
var assignmentAyfVariations$4 = "{{ assignment }}: ({{ duration }} min.) {{ source }}";
var assignmentLcVariations$4 = "{{ source }}: ({{ duration }} min.) {{ content }}";
var cbsVariations$4 = "Fianarana Baiboly: (30 min.) {{ source }}";
var studyArticleDateVariations$4 = "Lahatsoratra Fianarana {{ number }}: {{ date }}";
var MG = {
januaryVariations: januaryVariations$4,
februaryVariations: februaryVariations$4,
marchVariations: marchVariations$4,
aprilVariations: aprilVariations$4,
mayVariations: mayVariations$4,
juneVariations: juneVariations$4,
julyVariations: julyVariations$4,
augustVariations: augustVariations$4,
septemberVariations: septemberVariations$4,
octoberVariations: octoberVariations$4,
novemberVariations: novemberVariations$4,
decemberVariations: decemberVariations$4,
tgwTalk10Variations: tgwTalk10Variations$4,
tgwBibleReadingVariations: tgwBibleReadingVariations$4,
initialCallVideoVariations: initialCallVideoVariations$4,
returnVisitVideoVariations: returnVisitVideoVariations$4,
memorialInvitationVideoVariations: memorialInvitationVideoVariations$4,
initialCallVariations: initialCallVariations$4,
returnVisitVariations: returnVisitVariations$4,
bibleStudyVariations: bibleStudyVariations$4,
talkVariations: talkVariations$4,
memorialInvitationVariations: memorialInvitationVariations$4,
assignmentAyfVariations: assignmentAyfVariations$4,
assignmentLcVariations: assignmentLcVariations$4,
cbsVariations: cbsVariations$4,
studyArticleDateVariations: studyArticleDateVariations$4
};
var januaryVariations$3 = "de janeiro|janeiro";
var februaryVariations$3 = "de fevereiro|fevereiro";
var marchVariations$3 = "de março|março";
var aprilVariations$3 = "de abril|abril";
var mayVariations$3 = "de maio|maio";
var juneVariations$3 = "de junho|junho";
var julyVariations$3 = "de julho|julho";
var augustVariations$3 = "de agosto|agosto";
var septemberVariations$3 = "de setembro|setembro";
var octoberVariations$3 = "de outubro|outubro";
var novemberVariations$3 = "de novembro|novembro";
var decemberVariations$3 = "de dezembro|dezembro";
var tgwTalk10Variations$3 = "{{ title }}: (10 min)|{{ title }} (10 min)|{{ title }} (10min)";
var tgwBibleReadingVariations$3 = "Leitura da Bíblia: (4 min) {{ source }}";
var initialCallVideoVariations$3 = "Vídeo da primeira conversa";
var returnVisitVideoVariations$3 = "Vídeo da revisita";
var memorialInvitationVideoVariations$3 = "Vídeo do convite da Celebração";
var initialCallVariations$3 = "Primeira conversa — designação 1|Primeira conversa — designação 2|Primeira conversa";
var returnVisitVariations$3 = "Revisita — designação 1|Revisita — designação 2|Revisita";
var bibleStudyVariations$3 = "Estudo bíblico";
var talkVariations$3 = "Discurso";
var memorialInvitationVariations$3 = "Convite da Celebração";
var assignmentAyfVariations$3 = "{{ assignment }}: ({{ duration }} min) {{ source }}";
var assignmentLcVariations$3 = "{{ source }}: ({{ duration }} min) {{ content }}|{{ source }}: ({{ duration }} min.) {{ content }}";
var cbsVariations$3 = "Estudo bíblico de congregação: (30 min) {{ source }}";
var studyArticleDateVariations$3 = "Estudo {{ number }} | {{ date }}";
var T = {
januaryVariations: januaryVariations$3,
februaryVariations: februaryVariations$3,
marchVariations: marchVariations$3,
aprilVariations: aprilVariations$3,
mayVariations: mayVariations$3,
juneVariations: juneVariations$3,
julyVariations: julyVariations$3,
augustVariations: augustVariations$3,
septemberVariations: septemberVariations$3,
octoberVariations: octoberVariations$3,
novemberVariations: novemberVariations$3,
decemberVariations: decemberVariations$3,
tgwTalk10Variations: tgwTalk10Variations$3,
tgwBibleReadingVariations: tgwBibleReadingVariations$3,
initialCallVideoVariations: initialCallVideoVariations$3,
returnVisitVideoVariations: returnVisitVideoVariations$3,
memorialInvitationVideoVariations: memorialInvitationVideoVariations$3,
initialCallVariations: initialCallVariations$3,
returnVisitVariations: returnVisitVariations$3,
bibleStudyVariations: bibleStudyVariations$3,
talkVariations: talkVariations$3,
memorialInvitationVariations: memorialInvitationVariations$3,
assignmentAyfVariations: assignmentAyfVariations$3,
assignmentLcVariations: assignmentLcVariations$3,
cbsVariations: cbsVariations$3,
studyArticleDateVariations: studyArticleDateVariations$3
};
var januaryVariations$2 = "Janvie";
var februaryVariations$2 = "Fevrie";
var marchVariations$2 = "Marsa";
var aprilVariations$2 = "Avrily";
var mayVariations$2 = "Mey";
var juneVariations$2 = "Jona";
var julyVariations$2 = "Jolay";
var augustVariations$2 = "Aogositra";
var septemberVariations$2 = "Septambra";
var octoberVariations$2 = "Oktobra|Okotobra";
var novemberVariations$2 = "Novambra";
var decemberVariations$2 = "Desambra";
var tgwTalk10Variations$2 = "{{ title }}: (10 min.)";
var tgwBibleReadingVariations$2 = "Famakiagne Baiboly: (4 min.) {{ source }}";
var initialCallVideoVariations$2 = "Fitoriagne Alefa Video";
var returnVisitVideoVariations$2 = "Fiheregnagne Mitilike Alefa Video";
var memorialInvitationVideoVariations$2 = "Fanasagne amy ty Fahatsiarovagne Alefa Video";
var initialCallVariations$2 = "Fitoriagne";
var returnVisitVariations$2 = "Fiheregnagne Mitilike";
var bibleStudyVariations$2 = "Fampianaragne Baiboly";
var talkVariations$2 = "Lahajaka";
var memorialInvitationVariations$2 = "Fanasagne amy ty Fahatsiarovagne";
var assignmentAyfVariations$2 = "{{ assignment }}: ({{ duration }} min.) {{ source }}|{{ assignment }}: ({{ duration }} min) {{ source }}|{{ assignment }}: ({{ duration }} min.). {{ source }}|{{ assignment }}: ({{ duration }} min.) {{ source }}";
var assignmentLcVariations$2 = "{{ source }}: ({{ duration }} min.) {{ content }}|{{ source }}: ({{ duration }} min.). {{ content }}|{{ source }} ({{ duration }} min.) {{ content }}";
var cbsVariations$2 = "Fianaragne Baiboly Anoe ty Fiangonagne: (30 min.) {{ source }}";
var studyArticleDateVariations$2 = "Lahatsoratse Fianaragne {{ number }}: {{ date }}";
var TND = {
januaryVariations: januaryVariations$2,
februaryVariations: februaryVariations$2,
marchVariations: marchVariations$2,
aprilVariations: aprilVariations$2,
mayVariations: mayVariations$2,
juneVariations: juneVariations$2,
julyVariations: julyVariations$2,
augustVariations: augustVariations$2,
septemberVariations: septemberVariations$2,
octoberVariations: octoberVariations$2,
novemberVariations: novemberVariations$2,
decemberVariations: decemberVariations$2,
tgwTalk10Variations: tgwTalk10Variations$2,
tgwBibleReadingVariations: tgwBibleReadingVariations$2,
initialCallVideoVariations: initialCallVideoVariations$2,
returnVisitVideoVariations: returnVisitVideoVariations$2,
memorialInvitationVideoVariations: memorialInvitationVideoVariations$2,
initialCallVariations: initialCallVariations$2,
returnVisitVariations: returnVisitVariations$2,
bibleStudyVariations: bibleStudyVariations$2,
talkVariations: talkVariations$2,
memorialInvitationVariations: memorialInvitationVariations$2,
assignmentAyfVariations: assignmentAyfVariations$2,
assignmentLcVariations: assignmentLcVariations$2,
cbsVariations: cbsVariations$2,
studyArticleDateVariations: studyArticleDateVariations$2
};
var januaryVariations$1 = "Zanvie";
var februaryVariations$1 = "Fevrie";
var marchVariations$1 = "Marsy";
var aprilVariations$1 = "Avrily";
var mayVariations$1 = "May";
var juneVariations$1 = "Ziain";
var julyVariations$1 = "Zie|ZIE";
var augustVariations$1 = "Aoty";
var septemberVariations$1 = "Septambra";
var octoberVariations$1 = "Oktobra";
var novemberVariations$1 = "Novambra";
var decemberVariations$1 = "Desambra";
var tgwTalk10Variations$1 = "{{ title }}: (10 min.)";
var tgwBibleReadingVariations$1 = "Vaky Baiboly: (4 min.) {{ source }}";
var initialCallVideoVariations$1 = "Video Fitorian̈a";
var returnVisitVideoVariations$1 = "Video Lera Mitsidiky";
var memorialInvitationVideoVariations$1 = "Video Invitasiony Fahatsiarovan̈a";
var initialCallVariations$1 = "Fitorian̈a";
var returnVisitVariations$1 = "Lera Mitsidiky|Lera mitsidiky";
var bibleStudyVariations$1 = "Lera Mampianatra|Fianaran̈a Baiboly";
var talkVariations$1 = "Kabaro";
var memorialInvitationVariations$1 = "Invitasiony Fahatsiarovan̈a";
var assignmentAyfVariations$1 = "{{ assignment }}: ({{ duration }} min.) {{ source }}";
var assignmentLcVariations$1 = "{{ source }}: ({{ duration }} min.) {{ content }}";
var cbsVariations$1 = "Fianaran̈a Baiboly Ataony Fiangonan̈a: (30 min.) {{ source }}|Fianaran̈a Baiboly Ataony Fiangonan̈a: (30min.) {{ source }}";
var studyArticleDateVariations$1 = "Lahatsoratra Fianaran̈a {{ number }}: {{ date }}";
var TNK = {
januaryVariations: januaryVariations$1,
februaryVariations: februaryVariations$1,
marchVariations: marchVariations$1,
aprilVariations: aprilVariations$1,
mayVariations: mayVariations$1,
juneVariations: juneVariations$1,
julyVariations: julyVariations$1,
augustVariations: augustVariations$1,
septemberVariations: septemberVariations$1,
octoberVariations: octoberVariations$1,
novemberVariations: novemberVariations$1,
decemberVariations: decemberVariations$1,
tgwTalk10Variations: tgwTalk10Variations$1,
tgwBibleReadingVariations: tgwBibleReadingVariations$1,
initialCallVideoVariations: initialCallVideoVariations$1,
returnVisitVideoVariations: returnVisitVideoVariations$1,
memorialInvitationVideoVariations: memorialInvitationVideoVariations$1,
initialCallVariations: initialCallVariations$1,
returnVisitVariations: returnVisitVariations$1,
bibleStudyVariations: bibleStudyVariations$1,
talkVariations: talkVariations$1,
memorialInvitationVariations: memorialInvitationVariations$1,
assignmentAyfVariations: assignmentAyfVariations$1,
assignmentLcVariations: assignmentLcVariations$1,
cbsVariations: cbsVariations$1,
studyArticleDateVariations: studyArticleDateVariations$1
};
var januaryVariations = "Zanviè";
var februaryVariations = "Fevriè";
var marchVariations = "Marsa";
var aprilVariations = "Avrily";
var mayVariations = "Mey";
var juneVariations = "Ziein";
var julyVariations = "Ziè";
var augustVariations = "Oòh";
var septemberVariations = "Septambra";
var octoberVariations = "Oktobra";
var novemberVariations = "Novambra";
var decemberVariations = "Desambra";
var tgwTalk10Variations = "{{ title }}: (10 min.)";
var tgwBibleReadingVariations = "Famakia Baiboly: (4 min.) {{ source }}";
var initialCallVideoVariations = "Video Fitoria";
var returnVisitVideoVariations = "Video Fimpolia Mitsidiky";
var memorialInvitationVideoVariations = "Video Fanasà Fahatiarova";
var initialCallVariations = "Fitoria|Fianara";
var returnVisitVariations = "Fimpolia Mitsidiky";
var bibleStudyVariations = "Fampianara Baiboly";
var talkVariations = "Lahateny";
var memorialInvitationVariations = "Fanasà amy Fahatiarova";
var assignmentAyfVariations = "{{ assignment }}: ({{ duration }} min.) {{ source }}|{{ assignment }} ({{ duration }} min.) {{ source }}";
var assignmentLcVariations = "{{ source }}: ({{ duration }} min.) {{ content }}|{{ source }} ({{ duration }} min.) {{ content }}";
var cbsVariations = "Fianara Baiboly: (30 min.) {{ source }}";
var studyArticleDateVariations = "Lahatsoratsy Fianara {{ number }}: {{ date }}";
var VZ = {
januaryVariations: januaryVariations,
februaryVariations: februaryVariations,
marchVariations: marchVariations,
aprilVariations: aprilVariations,
mayVariations: mayVariations,
juneVariations: juneVariations,
julyVariations: julyVariations,
augustVariations: augustVariations,
septemberVariations: septemberVariations,
octoberVariations: octoberVariations,
novemberVariations: novemberVariations,
decemberVariations: decemberVariations,
tgwTalk10Variations: tgwTalk10Variations,
tgwBibleReadingVariations: tgwBibleReadingVariations,
initialCallVideoVariations: initialCallVideoVariations,
returnVisitVideoVariations: returnVisitVideoVariations,
memorialInvitationVideoVariations: memorialInvitationVideoVariations,
initialCallVariations: initialCallVariations,
returnVisitVariations: returnVisitVariations,
bibleStudyVariations: bibleStudyVariations,
talkVariations: talkVariations,
memorialInvitationVariations: memorialInvitationVariations,
assignmentAyfVariations: assignmentAyfVariations,
assignmentLcVariations: assignmentLcVariations,
cbsVariations: cbsVariations,
studyArticleDateVariations: studyArticleDateVariations
};
window.path = path;
window.jw_epub_parser = {
languages: { E, F, MG, T, TND, TNK, VZ },
};
const loadEPUB = async (epubInput) => {
try {
// Step: Validate Environment
const { browser } = getInputType(epubInput);
if (!browser) {
throw new Error(
'You are using the Browser version of jw-epub-parser. Please switch to the Node version if needed.'
);
}
// Step: Start Parsing
const data = await startParse(epubInput);
return data;
} catch (err) {
console.error(err);
}
};
export { loadEPUB };
import*as a from"path-browserify";import i from"dateformat";import t from"jszip";var e={januaryVariations:"January",februaryVariations:"February",marchVariations:"March",aprilVariations:"April",mayVariations:"May",juneVariations:"June",julyVariations:"July",augustVariations:"August",septemberVariations:"September",octoberVariations:"October",novemberVariations:"November",decemberVariations:"December",tgwTalk10Variations:"{{ title }}: (10 min.)",tgwBibleReadingVariations:"Bible Reading: (4 min.) {{ source }}",initialCallVideoVariations:"Initial Call Video",returnVisitVideoVariations:"Return Visit Video",memorialInvitationVideoVariations:"Memorial Invitation Video",initialCallVariations:"Initial Call",returnVisitVariations:"Return Visit",bibleStudyVariations:"Bible Study",talkVariations:"Talk",memorialInvitationVariations:"Memorial Invitation",assignmentAyfVariations:"{{ assignment }}: ({{ duration }} min.) {{ source }}",assignmentLcVariations:"{{ source }}: ({{ duration }} min.) {{ content }}",cbsVariations:"Congregation Bible Study: (30 min.) {{ source }}",studyArticleDateVariations:"Study Article {{ number }}: {{ date }}"},r={januaryVariations:"janvier",februaryVariations:"février",marchVariations:"mars",aprilVariations:"avril",mayVariations:"mai",juneVariations:"juin",julyVariations:"juillet",augustVariations:"août",septemberVariations:"septembre",octoberVariations:"octobre",novemberVariations:"novembre",decemberVariations:"décembre",tgwTalk10Variations:"{{ title }} (10 min)",tgwBibleReadingVariations:"Lecture de la Bible (4 min) : {{ source }}",initialCallVideoVariations:"Vidéo du premier contact",returnVisitVideoVariations:"Vidéo de la nouvelle visite",memorialInvitationVideoVariations:"Vidéo d’invitation au Mémorial",initialCallVariations:"Premier contact",returnVisitVariations:"Nouvelle visite",bibleStudyVariations:"Cours biblique",talkVariations:"Discours",memorialInvitationVariations:"Invitation au Mémorial",assignmentAyfVariations:"{{ assignment }} ({{ duration }} min) : {{ source }}",assignmentLcVariations:"{{ source }} ({{ duration }} min) : {{ content }}|{{ source }} ({{ duration }} min)",cbsVariations:"Étude biblique de l’assemblée (30 min) : {{ source }}",studyArticleDateVariations:"Article d’étude no {{ number }} : {{ date }}"},n={januaryVariations:"Janoary",februaryVariations:"Febroary",marchVariations:"Martsa",aprilVariations:"Aprily",mayVariations:"Mey",juneVariations:"Jona",julyVariations:"Jolay",augustVariations:"Aogositra",septemberVariations:"Septambra",octoberVariations:"Oktobra",novemberVariations:"Novambra",decemberVariations:"Desambra",tgwTalk10Variations:"{{ title }}: (10 min.)",tgwBibleReadingVariations:"Famakiana Baiboly: (4 min.) {{ source }}",initialCallVideoVariations:"Video Fitoriana",returnVisitVideoVariations:"Video Fiverenana Mitsidika",memorialInvitationVideoVariations:"Video Fanasana Fahatsiarovana",initialCallVariations:"Fitoriana",returnVisitVariations:"Fiverenana Mitsidika",bibleStudyVariations:"Fampianarana Baiboly",talkVariations:"Lahateny",memorialInvitationVariations:"Fanasana Fahatsiarovana",assignmentAyfVariations:"{{ assignment }}: ({{ duration }} min.) {{ source }}",assignmentLcVariations:"{{ source }}: ({{ duration }} min.) {{ content }}",cbsVariations:"Fianarana Baiboly: (30 min.) {{ source }}",studyArticleDateVariations:"Lahatsoratra Fianarana {{ number }}: {{ date }}"},o={januaryVariations:"de janeiro|janeiro",februaryVariations:"de fevereiro|fevereiro",marchVariations:"de março|março",aprilVariations:"de abril|abril",mayVariations:"de maio|maio",juneVariations:"de junho|junho",julyVariations:"de julho|julho",augustVariations:"de agosto|agosto",septemberVariations:"de setembro|setembro",octoberVariations:"de outubro|outubro",novemberVariations:"de novembro|novembro",decemberVariations:"de dezembro|dezembro",tgwTalk10Variations:"{{ title }}: (10 min)|{{ title }} (10 min)|{{ title }} (10min)",tgwBibleReadingVariations:"Leitura da Bíblia: (4 min) {{ source }}",initialCallVideoVariations:"Vídeo da primeira conversa",returnVisitVideoVariations:"Vídeo da revisita",memorialInvitationVideoVariations:"Vídeo do convite da Celebração",initialCallVariations:"Primeira conversa — designação 1|Primeira conversa — designação 2|Primeira conversa",returnVisitVariations:"Revisita — designação 1|Revisita — designação 2|Revisita",bibleStudyVariations:"Estudo bíblico",talkVariations:"Discurso",memorialInvitationVariations:"Convite da Celebração",assignmentAyfVariations:"{{ assignment }}: ({{ duration }} min) {{ source }}",assignmentLcVariations:"{{ source }}: ({{ duration }} min) {{ content }}|{{ source }}: ({{ duration }} min.) {{ content }}",cbsVariations:"Estudo bíblico de congregação: (30 min) {{ source }}",studyArticleDateVariations:"Estudo {{ number }} | {{ date }}"},s={januaryVariations:"Janvie",februaryVariations:"Fevrie",marchVariations:"Marsa",aprilVariations:"Avrily",mayVariations:"Mey",juneVariations:"Jona",julyVariations:"Jolay",augustVariations:"Aogositra",septemberVariations:"Septambra",octoberVariations:"Oktobra|Okotobra",novemberVariations:"Novambra",decemberVariations:"Desambra",tgwTalk10Variations:"{{ title }}: (10 min.)",tgwBibleReadingVariations:"Famakiagne Baiboly: (4 min.) {{ source }}",initialCallVideoVariations:"Fitoriagne Alefa Video",returnVisitVideoVariations:"Fiheregnagne Mitilike Alefa Video",memorialInvitationVideoVariations:"Fanasagne amy ty Fahatsiarovagne Alefa Video",initialCallVariations:"Fitoriagne",returnVisitVariations:"Fiheregnagne Mitilike",bibleStudyVariations:"Fampianaragne Baiboly",talkVariations:"Lahajaka",memorialInvitationVariations:"Fanasagne amy ty Fahatsiarovagne",assignmentAyfVariations:"{{ assignment }}: ({{ duration }} min.) {{ source }}|{{ assignment }}: ({{ duration }} min) {{ source }}|{{ assignment }}: ({{ duration }} min.). {{ source }}|{{ assignment }}: ({{ duration }} min.) {{ source }}",assignmentLcVariations:"{{ source }}: ({{ duration }} min.) {{ content }}|{{ source }}: ({{ duration }} min.). {{ content }}|{{ source }} ({{ duration }} min.) {{ content }}",cbsVariations:"Fianaragne Baiboly Anoe ty Fiangonagne: (30 min.) {{ source }}",studyArticleDateVariations:"Lahatsoratse Fianaragne {{ number }}: {{ date }}"},l={januaryVariations:"Zanvie",februaryVariations:"Fevrie",marchVariations:"Marsy",aprilVariations:"Avrily",mayVariations:"May",juneVariations:"Ziain",julyVariations:"Zie|ZIE",augustVariations:"Aoty",septemberVariations:"Septambra",octoberVariations:"Oktobra",novemberVariations:"Novambra",decemberVariations:"Desambra",tgwTalk10Variations:"{{ title }}: (10 min.)",tgwBibleReadingVariations:"Vaky Baiboly: (4 min.) {{ source }}",initialCallVideoVariations:"Video Fitorian̈a",returnVisitVideoVariations:"Video Lera Mitsidiky",memorialInvitationVideoVariations:"Video Invitasiony Fahatsiarovan̈a",initialCallVariations:"Fitorian̈a",returnVisitVariations:"Lera Mitsidiky|Lera mitsidiky",bibleStudyVariations:"Lera Mampianatra|Fianaran̈a Baiboly",talkVariations:"Kabaro",memorialInvitationVariations:"Invitasiony Fahatsiarovan̈a",assignmentAyfVariations:"{{ assignment }}: ({{ duration }} min.) {{ source }}",assignmentLcVariations:"{{ source }}: ({{ duration }} min.) {{ content }}",cbsVariations:"Fianaran̈a Baiboly Ataony Fiangonan̈a: (30 min.) {{ source }}|Fianaran̈a Baiboly Ataony Fiangonan̈a: (30min.) {{ source }}",studyArticleDateVariations:"Lahatsoratra Fianaran̈a {{ number }}: {{ date }}"},c={januaryVariations:"Zanviè",februaryVariations:"Fevriè",marchVariations:"Marsa",aprilVariations:"Avrily",mayVariations:"Mey",juneVariations:"Ziein",julyVariations:"Ziè",augustVariations:"Oòh",septemberVariations:"Septambra",octoberVariations:"Oktobra",novemberVariations:"Novambra",decemberVariations:"Desambra",tgwTalk10Variations:"{{ title }}: (10 min.)",tgwBibleReadingVariations:"Famakia Baiboly: (4 min.) {{ source }}",initialCallVideoVariations:"Video Fitoria",returnVisitVideoVariations:"Video Fimpolia Mitsidiky",memorialInvitationVideoVariations:"Video Fanasà Fahatiarova",initialCallVariations:"Fitoria|Fianara",returnVisitVariations:"Fimpolia Mitsidiky",bibleStudyVariations:"Fampianara Baiboly",talkVariations:"Lahateny",memorialInvitationVariations:"Fanasà amy Fahatiarova",assignmentAyfVariations:"{{ assignment }}: ({{ duration }} min.) {{ source }}|{{ assignment }} ({{ duration }} min.) {{ source }}",assignmentLcVariations:"{{ source }}: ({{ duration }} min.) {{ content }}|{{ source }} ({{ duration }} min.) {{ content }}",cbsVariations:"Fianara Baiboly: (30 min.) {{ source }}",studyArticleDateVariations:"Lahatsoratsy Fianara {{ number }}: {{ date }}"};window.path=a,window.jw_epub_parser={languages:{E:e,F:r,MG:n,T:o,TND:s,TNK:l,VZ:c}};const m=a=>/^mwb_[A-Z][A-Z]?[A-Z]?_202\d(0[1-9]|1[0-2])\.epub$/i.test(a),u=a=>/^w_[A-Z][A-Z]?[A-Z]?_202\d(0[1-9]|1[0-2])\.epub$/i.test(a),d=a=>{const i=a.name||a.url||a;return window.path.basename(i)};var V=[{locale:"en",code:"E"},{locale:"fr-FR",code:"F"},{locale:"mg-MG",code:"MG"},{locale:"pt-BR",code:"T"},{locale:"mg-TND",code:"TND"},{locale:"mg-TNK",code:"TNK"},{locale:"mg-VZ",code:"VZ"}];class b extends Error{constructor(a,i){super(i),this.code=`jw-epub-parser/failed-${a}`}}const y=window.jw_epub_parser.languages,p=a=>[{index:0,name:y[a].januaryVariations},{index:1,name:y[a].februaryVariations},{index:2,name:y[a].marchVariations},{index:3,name:y[a].aprilVariations},{index:4,name:y[a].mayVariations},{index:5,name:y[a].juneVariations},{index:6,name:y[a].julyVariations},{index:7,name:y[a].augustVariations},{index:8,name:y[a].septemberVariations},{index:9,name:y[a].octoberVariations},{index:10,name:y[a].novemberVariations},{index:11,name:y[a].decemberVariations}],g=a=>+a.match(/(\d+)/)[0],f=(a,i)=>{const t=(a=>y[a].tgwTalk10Variations)(i).split("|"),e="{{ title }}";let r;for(const i of t){const t=i.indexOf(e),n=a.length-i.replace(e,"").length+t,o=a.substring(t,n);if(i.replace(e,o)===a){r=o;break}}if(r)return r;throw new b("tgw-talk",`Parsing failed for Treasures from God’s Word part. The input was: ${a}`)},w=(a,i)=>{const t=(a=>y[a].tgwBibleReadingVariations)(i).split("|"),e="{{ source }}";let r;for(const i of t){const t=i.indexOf(e),n=a.length-i.replace(e,"").length+t,o=a.substring(t,n);if(i.replace(e,o)===a){r=o;break}}if(r)return r;throw new b("tgw-bibleReading","Parsing failed for Bible Reading part")},h=(a,i)=>{const t=(a=>y[a].assignmentAyfVariations)(i).split("|"),e=(a=>[y[a].initialCallVideoVariations,y[a].returnVisitVideoVariations,y[a].memorialInvitationVideoVariations,y[a].initialCallVariations,y[a].returnVisitVariations,y[a].bibleStudyVariations,y[a].talkVariations,y[a].memorialInvitationVariations])(i);let r;for(const i of t){const t=i.indexOf("{{ source }}"),n=i.substring(0,t).trim();let o="(";for(let a=0;a<e.length;a++)o+=e[a],a<e.length-1&&(o+="|");o+=")";let s=n.replace("{{ duration }}","\\d+");s=s.replace("(","(\\("),s=s.replace(")",")\\)"),s=s.replace(" :"," ?:?"),s=s.replace(") ",") ?"),s=s.replace("??","?"),s=s.replace("{{ assignment }}",o);const l=new RegExp(s.trim()).exec(a);if(null!==l){const t=+l[2].match(/(\d+)/)[0];let e=n.replace("{{ assignment }}","");e=e.replace("{{ duration }}",t);const o=a.split(e.trim());if(2===o.length){const e=o[0].trim();let n=i.replace("{{ assignment }}",e);n=n.replace("{{ duration }}",t);const s=n.indexOf("{{ source }}"),l={src:a.substring(s),type:e,time:t};let c=i.replace("{{ assignment }}",l.type);if(c=c.replace("{{ duration }}",l.time),c=c.replace("{{ source }}",l.src),c===a){r=l;break}}}}if(r)return r;throw new b("ayf-part",`Parsing failed for Apply Yourself to the Field Ministry part. The input was: ${a}`)},_=(a,i)=>{const t=(a=>y[a].assignmentLcVariations)(i).split("|"),e="{{ source }}",r="{{ content }}";let n;for(const i of t){const t=i.indexOf(e),o=i.indexOf(r);let s=i.replace(e,"");s=s.replace(r,"");let l=s.replace("{{ duration }}","\\d+");l=l.replace("(","(\\("),l=l.replace(")",")\\)"),l=l.replace(" :"," ?:?"),l=l.replace(") ",") ?"),l=l.replace("??","?");const c=new RegExp(l.trim()).exec(a);if(null!==c){const e=+c[0].match(/(\d+)/)[0],r=s.replace("{{ duration }}",e);let l=a.split(r);if(1===l.length&&(l=a.split(r.trim())),2===l.length){let r,s;""===l[1]&&(r=l[0].trim(),s=""),""!==l[1]&&(t<o&&(r=l[0].trim(),s=l[1].trim()),t>o&&(r=l[1].trim(),s=l[0].trim()));let c=i.replace("{{ source }}",r);if(c=c.replace("{{ duration }}",e),c=c.replace("{{ content }}",s),""===l[1]&&(c=c.trim()),c===a){n={time:e,title:r,content:s};break}}}}if(n)return n;throw new b("lc-part",`Parsing failed for Living as Christians part. The input was: ${a}`)},v=(a,i)=>{const t=(a=>y[a].cbsVariations)(i).split("|");let e;for(const i of t){const t=i.indexOf("{{ source }}"),r=a.length-i.replace("{{ source }}","").length+t,n=a.substring(t,r);if(i.replace("{{ source }}",n)===a){e=n;break}}if(e)return e;throw new b("lc-cbs",`Parsing failed for Congregation Bible Study part. The input was: ${a}`)},A=a=>{const i=g(a);return i>151?a:i},k=(a,i)=>{const t=(a=>y[a].studyArticleDateVariations)(i).split("|");let e,r,n;for(const o of t){let t=o.replace("{{ date }}","");t=t.replace("{{ number }}","\\d+");const s=new RegExp(t.trim()).exec(a);if(null!==s){const o=s[0].length,l=a.substring(o);t=l.trim().split("–")[0];const c=p(i);for(const a of c){const i=a.name,o=new RegExp(`(${i})`).exec(t);if(Array.isArray(o)){e=+t.match(/(\d+)/)[0],r=a.index;const i=/\b\d{4}\b/.exec(l);null!==i&&(n=+i[0]);break}}}}if("number"==typeof e&&"number"==typeof r&&"number"==typeof n)return{varDay:e,monthIndex:r,varYear:n};throw new b("wtstudy",`Parsing failed for Watchtower Study Date. The input was: ${a}`)},F=(a,t,e)=>{const{varDay:r,monthIndex:n}=((a,i)=>{let t,e;a=a.split("–")[0];const r=p(i);for(const i of r){const r=i.name,n=new RegExp(`(${r})`).exec(a);if(Array.isArray(n)){t=+a.match(/(\d+)/)[0],e=i.index;break}}if("number"==typeof t&&"number"==typeof e)return{varDay:t,monthIndex:e};throw new b("week-date",`Parsing failed when extracting the week date. The input was: ${a}`)})(a,e),o=new Date(t,n,r);return i(o,"mm/dd/yyyy")},S=(a,i)=>f(a,i),x=(a,i)=>w(a,i),B=(a,i)=>h(a,i),T=(a,i)=>_(a,i),j=(a,i)=>v(a,i),E=(a,t)=>{const{varDay:e,monthIndex:r,varYear:n}=k(a,t),o=new Date(n,r,e);return i(o,"mm/dd/yyyy")},M=a=>{let i=!1;if(a.startsWith("OEBPS")&&a.endsWith(".xhtml")){const t=a.split("/")[1].split(".")[0];isNaN(t)||(i=!0)}return i},L=async(a,i)=>await a.file(i).async("string"),C=a=>{let i=!1;const t=!!a.querySelector("[class*=treasures]"),e=!!a.querySelector("[class*=ministry]"),r=!!a.querySelector("[class*=christianLiving]");return!0===t&&!0===e&&!0===r&&(i=!0),i},I=a=>(new window.DOMParser).parseFromString(a,"text/html"),D=a=>!!a.querySelector(".groupTOC"),R=(a,i)=>(i?a.querySelector("article").querySelector("header").querySelector("h1"):a.getElementsByTagName("h1").item(0)).textContent.replaceAll(/\u00A0/g," "),q=(a,i)=>(i?a.querySelector("article").querySelector("header").querySelector("h2"):a.getElementsByTagName("h2").item(0)).textContent.replaceAll(/\u00A0/g," "),P=a=>a.querySelector("#section3").querySelectorAll("li").length,O=a=>6===a.querySelector("#section4").querySelectorAll("li").length?2:1,N=a=>{let i="";return a.querySelectorAll(".pGroup").forEach((a=>{a.querySelectorAll("li").forEach((a=>{const t=a.querySelector("p");i+="|"+t.textContent}))})),i=i.replaceAll(/\u00A0/g," "),i},W=a=>a.textContent.replaceAll(/\u00A0/g," "),Z=async({htmlItem:a,zip:i,fromHTML:t,htmlArticles:e,index:r})=>{let n;const o=a.nextElementSibling.querySelector("a").getAttribute("href");if(t||(n=await(async(a,i)=>{for(let[t]of Object.entries(a.files))if(window.path.basename(t)===i){const i=await L(a,t);return I(i)}})(i,o)),t){const a=e[r];n=I(a)}if(n){const a=n.querySelector(".themeScrp"),i=g(a.nextElementSibling.querySelector("a").textContent),t=n.querySelector(".blockTeach");return{WTOpeningSong:i,WTConcludingSong:g(t.nextElementSibling.querySelector("a").textContent)}}},$=a=>a.nextElementSibling.querySelector("a").textContent.replaceAll(/\u00A0/g," "),Y=async a=>{const i=!!a.htmlRaws;let e={};if(!i){const i=(a=>{const i=d(a),t=m(i),e=u(i);return t||e})(a);if(!i)throw new Error("The selected epub file has an incorrect naming.");const r=(a=>{let i=!0;const t=d(a),e=m(t),r=u(t),n=e?"mwb":r?"w":void 0,o=+t.split("_")[2].split(".epub")[0];return"mwb"===n&&o<202207&&(i=!1),"w"===n&&o<202304&&(i=!1),i})(a);if(!r)throw new Error("EPUB import is only supported for Meeting Workbook starting on July 2022, and for Watchtower Study starting on April 2023.");const n=await(async a=>{if(a.name)return a;if(a.url){const i=await window.fetch(a.url);if(200!==i.status)throw new Error("EPUB file could not be downloaded. Check the URL you provided.");const t=await i.blob();return await t.arrayBuffer()}return await window.readFile(a)})(a),o=await(async a=>{let i=0,e=0,r="archive_tmp";const n={isBig:!1,isMore:!1,isSuspicious:!1},o=new t,s=await o.loadAsync(a);for(let[a]of Object.entries(s.files))i++,i>300&&(n.isMore=!0),window.path.join(r,a).startsWith(r)||(n.isSuspicious=!0),e+=(await o.file(a).async("ArrayBuffer")).byteLength,e>2e7&&(n.isBig=!0);return i=0,e=0,n})(n);if(o.isBig)throw new Error("EPUB file seems to be large. Extract aborted.");if(o.isMore)throw new Error("EPUB file seems to contain more files than expected. Extract aborted.");if(o.isSuspicious)throw new Error("EPUB file seems to be suspicious. Extract aborted.");const s=d(a),l=m(s),c=u(s),V=await(async a=>{const i=new t;return await i.loadAsync(a)})(n),b=await(async(a,i,t)=>{const e=[];for(let[r]of Object.entries(a.files))if(M(r)){const n=await L(a,r),o=I(n);(i?C(o):t&&D(o))&&e.push(o)}return e})(V,l,c);if(0===b.length)throw new Error(`The file you provided is not a valid ${l?"Meeting Workbook":"Watchtower Study"} EPUB file. Please make sure that the file is correct.`);if(c&&b.length>1)throw new Error("The file you provided is not a valid Watchtower Study EPUB file. Please make sure that the file is correct.");const y=d(a).split("_")[2].substring(0,4),p=(a=>d(a).split("_")[1])(a);l&&(e=await J({htmlDocs:b,epubYear:y,epubLang:p,fromHTML:!1})),c&&(e=await U({htmlItem:b[0],epubLang:p,fromHTML:!1,epubContents:V}))}if(i){const i=(a=>{const i=[];for(const t of a){const a=I(t);i.push(a)}return i})(a.htmlRaws);a.isMWB&&(e=await J({htmlDocs:i,epubYear:a.epubYear,epubLang:a.epubLang,fromHTML:!0})),a.isW&&(e=await U({htmlItem:i[0],epubYear:a.epubYear,epubLang:a.epubLang,fromHTML:!0,htmlArticles:a.htmlArticles}))}return e},J=async({htmlDocs:a,epubYear:i,epubLang:t,fromHTML:e})=>{const r=[],n=V.find((a=>a.code===t));for(const o of a){const a={},s=R(o,e);if(n){const e=F(s,i,t);a.mwb_week_date=e,a.mwb_week_date_locale=s}else a.mwb_week_date=s;a.mwb_weekly_bible_reading=q(o,e);let l=N(o).split("|"),c="";a.mwb_song_first=g(l[1]),c=l[3].trim(),a.mwb_tgw_talk=n?S(c,t):c,c=l[7].trim(),a.mwb_tgw_bread=n?x(c,t):c;const m=P(o);if(a.mwb_ayf_count=m,c=l[8].trim(),n){const i=B(c,t);a.mwb_ayf_part1=i.src,a.mwb_ayf_part1_time=i.time,a.mwb_ayf_part1_type=i.type}else a.mwb_ayf_part1=c;if(m>1)if(c=l[9].trim(),n){const i=B(c,t);a.mwb_ayf_part2=i.src,a.mwb_ayf_part2_time=i.time,a.mwb_ayf_part2_type=i.type}else a.mwb_ayf_part2=c;if(m>2)if(c=l[10].trim(),n){const i=B(c,t);a.mwb_ayf_part3=i.src,a.mwb_ayf_part3_time=i.time,a.mwb_ayf_part3_type=i.type}else a.mwb_ayf_part3=c;if(m>3)if(c=l[11].trim(),n){const i=B(c,t);a.mwb_ayf_part4=i.src,a.mwb_ayf_part4_time=i.time,a.mwb_ayf_part4_type=i.type}else a.mwb_ayf_part4=c;let u=m>3?12:m>2?11:m>1?10:9;a.mwb_song_middle=g(l[u]);const d=O(o);if(a.mwb_lc_count=d,u++,c=l[u].trim(),n){const i=T(c,t);a.mwb_lc_part1=i.title,a.mwb_lc_part1Time=i.time,i.content&&""!==i.content&&(a.mwb_lc_part1Content=i.content)}else a.mwb_lc_part1=c;if(2===d)if(u++,c=l[u].trim(),n){const i=T(c,t);a.mwb_lc_part2=i.title,a.mwb_lc_part2Time=i.time,i.content&&""!==i.content&&(a.mwb_lc_part2Content=i.content)}else a.mwb_lc_part2=c;u++,c=l[u].trim(),a.mwb_lc_cbs=n?j(c,t):c,u++,u++,c=l[u].trim(),a.mwb_song_conclude=A(c),r.push(a)}return r},U=async({htmlItem:a,epubLang:i,fromHTML:t,epubContents:e,htmlArticles:r})=>{const n=[],o=V.find((a=>a.code===i)),s=(a=>a.querySelectorAll("h3"))(a);for(const[a,l]of s.entries()){const s={},c=W(l);if(o){const a=E(c,i);s.w_study_date=a,s.w_study_date_locale=c}else s.w_study_date=c;const m=$(l);s.w_study_title=m;const u=await Z({fromHTML:t,zip:e,htmlArticles:r,htmlItem:l,index:a});u&&(s.w_study_opening_song=u.WTOpeningSong,s.w_study_concluding_song=u.WTConcludingSong),n.push(s)}return n},H=async a=>{try{(a=>{if(!a)throw new Error("You did not pass anything to the loadEPUB function.")})(a);const{browser:i}=(a=>{const i={browser:!1,node:!0};return(a.name||a.url||a.htmlRaws)&&(i.browser=!0),i})(a);if(!i)throw new Error("You are using the Browser version of jw-epub-parser. Please switch to the Node version if needed.");return await Y(a)}catch(a){console.error(a)}};export{H as loadEPUB};
//# sourceMappingURL=index.js.map

@@ -1,1388 +0,2 @@

import 'global-jsdom/register';
import fetch from 'node-fetch';
import * as path from 'path';
import { readFile } from 'fs/promises';
import dateFormat from 'dateformat';
import JSZip from 'jszip';
var januaryVariations$6 = "January";
var februaryVariations$6 = "February";
var marchVariations$6 = "March";
var aprilVariations$6 = "April";
var mayVariations$6 = "May";
var juneVariations$6 = "June";
var julyVariations$6 = "July";
var augustVariations$6 = "August";
var septemberVariations$6 = "September";
var octoberVariations$6 = "October";
var novemberVariations$6 = "November";
var decemberVariations$6 = "December";
var tgwTalk10Variations$6 = "{{ title }}: (10 min.)";
var tgwBibleReadingVariations$6 = "Bible Reading: (4 min.) {{ source }}";
var initialCallVideoVariations$6 = "Initial Call Video";
var returnVisitVideoVariations$6 = "Return Visit Video";
var memorialInvitationVideoVariations$6 = "Memorial Invitation Video";
var initialCallVariations$6 = "Initial Call";
var returnVisitVariations$6 = "Return Visit";
var bibleStudyVariations$6 = "Bible Study";
var talkVariations$6 = "Talk";
var memorialInvitationVariations$6 = "Memorial Invitation";
var assignmentAyfVariations$6 = "{{ assignment }}: ({{ duration }} min.) {{ source }}";
var assignmentLcVariations$6 = "{{ source }}: ({{ duration }} min.) {{ content }}";
var cbsVariations$6 = "Congregation Bible Study: (30 min.) {{ source }}";
var studyArticleDateVariations$6 = "Study Article {{ number }}: {{ date }}";
var E = {
januaryVariations: januaryVariations$6,
februaryVariations: februaryVariations$6,
marchVariations: marchVariations$6,
aprilVariations: aprilVariations$6,
mayVariations: mayVariations$6,
juneVariations: juneVariations$6,
julyVariations: julyVariations$6,
augustVariations: augustVariations$6,
septemberVariations: septemberVariations$6,
octoberVariations: octoberVariations$6,
novemberVariations: novemberVariations$6,
decemberVariations: decemberVariations$6,
tgwTalk10Variations: tgwTalk10Variations$6,
tgwBibleReadingVariations: tgwBibleReadingVariations$6,
initialCallVideoVariations: initialCallVideoVariations$6,
returnVisitVideoVariations: returnVisitVideoVariations$6,
memorialInvitationVideoVariations: memorialInvitationVideoVariations$6,
initialCallVariations: initialCallVariations$6,
returnVisitVariations: returnVisitVariations$6,
bibleStudyVariations: bibleStudyVariations$6,
talkVariations: talkVariations$6,
memorialInvitationVariations: memorialInvitationVariations$6,
assignmentAyfVariations: assignmentAyfVariations$6,
assignmentLcVariations: assignmentLcVariations$6,
cbsVariations: cbsVariations$6,
studyArticleDateVariations: studyArticleDateVariations$6
};
var januaryVariations$5 = "janvier";
var februaryVariations$5 = "février";
var marchVariations$5 = "mars";
var aprilVariations$5 = "avril";
var mayVariations$5 = "mai";
var juneVariations$5 = "juin";
var julyVariations$5 = "juillet";
var augustVariations$5 = "août";
var septemberVariations$5 = "septembre";
var octoberVariations$5 = "octobre";
var novemberVariations$5 = "novembre";
var decemberVariations$5 = "décembre";
var tgwTalk10Variations$5 = "{{ title }} (10 min)";
var tgwBibleReadingVariations$5 = "Lecture de la Bible (4 min) : {{ source }}";
var initialCallVideoVariations$5 = "Vidéo du premier contact";
var returnVisitVideoVariations$5 = "Vidéo de la nouvelle visite";
var memorialInvitationVideoVariations$5 = "Vidéo d’invitation au Mémorial";
var initialCallVariations$5 = "Premier contact";
var returnVisitVariations$5 = "Nouvelle visite";
var bibleStudyVariations$5 = "Cours biblique";
var talkVariations$5 = "Discours";
var memorialInvitationVariations$5 = "Invitation au Mémorial";
var assignmentAyfVariations$5 = "{{ assignment }} ({{ duration }} min) : {{ source }}";
var assignmentLcVariations$5 = "{{ source }} ({{ duration }} min) : {{ content }}|{{ source }} ({{ duration }} min)";
var cbsVariations$5 = "Étude biblique de l’assemblée (30 min) : {{ source }}";
var studyArticleDateVariations$5 = "Article d’étude no {{ number }} : {{ date }}";
var F = {
januaryVariations: januaryVariations$5,
februaryVariations: februaryVariations$5,
marchVariations: marchVariations$5,
aprilVariations: aprilVariations$5,
mayVariations: mayVariations$5,
juneVariations: juneVariations$5,
julyVariations: julyVariations$5,
augustVariations: augustVariations$5,
septemberVariations: septemberVariations$5,
octoberVariations: octoberVariations$5,
novemberVariations: novemberVariations$5,
decemberVariations: decemberVariations$5,
tgwTalk10Variations: tgwTalk10Variations$5,
tgwBibleReadingVariations: tgwBibleReadingVariations$5,
initialCallVideoVariations: initialCallVideoVariations$5,
returnVisitVideoVariations: returnVisitVideoVariations$5,
memorialInvitationVideoVariations: memorialInvitationVideoVariations$5,
initialCallVariations: initialCallVariations$5,
returnVisitVariations: returnVisitVariations$5,
bibleStudyVariations: bibleStudyVariations$5,
talkVariations: talkVariations$5,
memorialInvitationVariations: memorialInvitationVariations$5,
assignmentAyfVariations: assignmentAyfVariations$5,
assignmentLcVariations: assignmentLcVariations$5,
cbsVariations: cbsVariations$5,
studyArticleDateVariations: studyArticleDateVariations$5
};
var januaryVariations$4 = "Janoary";
var februaryVariations$4 = "Febroary";
var marchVariations$4 = "Martsa";
var aprilVariations$4 = "Aprily";
var mayVariations$4 = "Mey";
var juneVariations$4 = "Jona";
var julyVariations$4 = "Jolay";
var augustVariations$4 = "Aogositra";
var septemberVariations$4 = "Septambra";
var octoberVariations$4 = "Oktobra";
var novemberVariations$4 = "Novambra";
var decemberVariations$4 = "Desambra";
var tgwTalk10Variations$4 = "{{ title }}: (10 min.)";
var tgwBibleReadingVariations$4 = "Famakiana Baiboly: (4 min.) {{ source }}";
var initialCallVideoVariations$4 = "Video Fitoriana";
var returnVisitVideoVariations$4 = "Video Fiverenana Mitsidika";
var memorialInvitationVideoVariations$4 = "Video Fanasana Fahatsiarovana";
var initialCallVariations$4 = "Fitoriana";
var returnVisitVariations$4 = "Fiverenana Mitsidika";
var bibleStudyVariations$4 = "Fampianarana Baiboly";
var talkVariations$4 = "Lahateny";
var memorialInvitationVariations$4 = "Fanasana Fahatsiarovana";
var assignmentAyfVariations$4 = "{{ assignment }}: ({{ duration }} min.) {{ source }}";
var assignmentLcVariations$4 = "{{ source }}: ({{ duration }} min.) {{ content }}";
var cbsVariations$4 = "Fianarana Baiboly: (30 min.) {{ source }}";
var studyArticleDateVariations$4 = "Lahatsoratra Fianarana {{ number }}: {{ date }}";
var MG = {
januaryVariations: januaryVariations$4,
februaryVariations: februaryVariations$4,
marchVariations: marchVariations$4,
aprilVariations: aprilVariations$4,
mayVariations: mayVariations$4,
juneVariations: juneVariations$4,
julyVariations: julyVariations$4,
augustVariations: augustVariations$4,
septemberVariations: septemberVariations$4,
octoberVariations: octoberVariations$4,
novemberVariations: novemberVariations$4,
decemberVariations: decemberVariations$4,
tgwTalk10Variations: tgwTalk10Variations$4,
tgwBibleReadingVariations: tgwBibleReadingVariations$4,
initialCallVideoVariations: initialCallVideoVariations$4,
returnVisitVideoVariations: returnVisitVideoVariations$4,
memorialInvitationVideoVariations: memorialInvitationVideoVariations$4,
initialCallVariations: initialCallVariations$4,
returnVisitVariations: returnVisitVariations$4,
bibleStudyVariations: bibleStudyVariations$4,
talkVariations: talkVariations$4,
memorialInvitationVariations: memorialInvitationVariations$4,
assignmentAyfVariations: assignmentAyfVariations$4,
assignmentLcVariations: assignmentLcVariations$4,
cbsVariations: cbsVariations$4,
studyArticleDateVariations: studyArticleDateVariations$4
};
var januaryVariations$3 = "de janeiro|janeiro";
var februaryVariations$3 = "de fevereiro|fevereiro";
var marchVariations$3 = "de março|março";
var aprilVariations$3 = "de abril|abril";
var mayVariations$3 = "de maio|maio";
var juneVariations$3 = "de junho|junho";
var julyVariations$3 = "de julho|julho";
var augustVariations$3 = "de agosto|agosto";
var septemberVariations$3 = "de setembro|setembro";
var octoberVariations$3 = "de outubro|outubro";
var novemberVariations$3 = "de novembro|novembro";
var decemberVariations$3 = "de dezembro|dezembro";
var tgwTalk10Variations$3 = "{{ title }}: (10 min)|{{ title }} (10 min)|{{ title }} (10min)";
var tgwBibleReadingVariations$3 = "Leitura da Bíblia: (4 min) {{ source }}";
var initialCallVideoVariations$3 = "Vídeo da primeira conversa";
var returnVisitVideoVariations$3 = "Vídeo da revisita";
var memorialInvitationVideoVariations$3 = "Vídeo do convite da Celebração";
var initialCallVariations$3 = "Primeira conversa — designação 1|Primeira conversa — designação 2|Primeira conversa";
var returnVisitVariations$3 = "Revisita — designação 1|Revisita — designação 2|Revisita";
var bibleStudyVariations$3 = "Estudo bíblico";
var talkVariations$3 = "Discurso";
var memorialInvitationVariations$3 = "Convite da Celebração";
var assignmentAyfVariations$3 = "{{ assignment }}: ({{ duration }} min) {{ source }}";
var assignmentLcVariations$3 = "{{ source }}: ({{ duration }} min) {{ content }}|{{ source }}: ({{ duration }} min.) {{ content }}";
var cbsVariations$3 = "Estudo bíblico de congregação: (30 min) {{ source }}";
var studyArticleDateVariations$3 = "Estudo {{ number }} | {{ date }}";
var T = {
januaryVariations: januaryVariations$3,
februaryVariations: februaryVariations$3,
marchVariations: marchVariations$3,
aprilVariations: aprilVariations$3,
mayVariations: mayVariations$3,
juneVariations: juneVariations$3,
julyVariations: julyVariations$3,
augustVariations: augustVariations$3,
septemberVariations: septemberVariations$3,
octoberVariations: octoberVariations$3,
novemberVariations: novemberVariations$3,
decemberVariations: decemberVariations$3,
tgwTalk10Variations: tgwTalk10Variations$3,
tgwBibleReadingVariations: tgwBibleReadingVariations$3,
initialCallVideoVariations: initialCallVideoVariations$3,
returnVisitVideoVariations: returnVisitVideoVariations$3,
memorialInvitationVideoVariations: memorialInvitationVideoVariations$3,
initialCallVariations: initialCallVariations$3,
returnVisitVariations: returnVisitVariations$3,
bibleStudyVariations: bibleStudyVariations$3,
talkVariations: talkVariations$3,
memorialInvitationVariations: memorialInvitationVariations$3,
assignmentAyfVariations: assignmentAyfVariations$3,
assignmentLcVariations: assignmentLcVariations$3,
cbsVariations: cbsVariations$3,
studyArticleDateVariations: studyArticleDateVariations$3
};
var januaryVariations$2 = "Janvie";
var februaryVariations$2 = "Fevrie";
var marchVariations$2 = "Marsa";
var aprilVariations$2 = "Avrily";
var mayVariations$2 = "Mey";
var juneVariations$2 = "Jona";
var julyVariations$2 = "Jolay";
var augustVariations$2 = "Aogositra";
var septemberVariations$2 = "Septambra";
var octoberVariations$2 = "Oktobra|Okotobra";
var novemberVariations$2 = "Novambra";
var decemberVariations$2 = "Desambra";
var tgwTalk10Variations$2 = "{{ title }}: (10 min.)";
var tgwBibleReadingVariations$2 = "Famakiagne Baiboly: (4 min.) {{ source }}";
var initialCallVideoVariations$2 = "Fitoriagne Alefa Video";
var returnVisitVideoVariations$2 = "Fiheregnagne Mitilike Alefa Video";
var memorialInvitationVideoVariations$2 = "Fanasagne amy ty Fahatsiarovagne Alefa Video";
var initialCallVariations$2 = "Fitoriagne";
var returnVisitVariations$2 = "Fiheregnagne Mitilike";
var bibleStudyVariations$2 = "Fampianaragne Baiboly";
var talkVariations$2 = "Lahajaka";
var memorialInvitationVariations$2 = "Fanasagne amy ty Fahatsiarovagne";
var assignmentAyfVariations$2 = "{{ assignment }}: ({{ duration }} min.) {{ source }}|{{ assignment }}: ({{ duration }} min) {{ source }}|{{ assignment }}: ({{ duration }} min.). {{ source }}|{{ assignment }}: ({{ duration }} min.) {{ source }}";
var assignmentLcVariations$2 = "{{ source }}: ({{ duration }} min.) {{ content }}|{{ source }}: ({{ duration }} min.). {{ content }}|{{ source }} ({{ duration }} min.) {{ content }}";
var cbsVariations$2 = "Fianaragne Baiboly Anoe ty Fiangonagne: (30 min.) {{ source }}";
var studyArticleDateVariations$2 = "Lahatsoratse Fianaragne {{ number }}: {{ date }}";
var TND = {
januaryVariations: januaryVariations$2,
februaryVariations: februaryVariations$2,
marchVariations: marchVariations$2,
aprilVariations: aprilVariations$2,
mayVariations: mayVariations$2,
juneVariations: juneVariations$2,
julyVariations: julyVariations$2,
augustVariations: augustVariations$2,
septemberVariations: septemberVariations$2,
octoberVariations: octoberVariations$2,
novemberVariations: novemberVariations$2,
decemberVariations: decemberVariations$2,
tgwTalk10Variations: tgwTalk10Variations$2,
tgwBibleReadingVariations: tgwBibleReadingVariations$2,
initialCallVideoVariations: initialCallVideoVariations$2,
returnVisitVideoVariations: returnVisitVideoVariations$2,
memorialInvitationVideoVariations: memorialInvitationVideoVariations$2,
initialCallVariations: initialCallVariations$2,
returnVisitVariations: returnVisitVariations$2,
bibleStudyVariations: bibleStudyVariations$2,
talkVariations: talkVariations$2,
memorialInvitationVariations: memorialInvitationVariations$2,
assignmentAyfVariations: assignmentAyfVariations$2,
assignmentLcVariations: assignmentLcVariations$2,
cbsVariations: cbsVariations$2,
studyArticleDateVariations: studyArticleDateVariations$2
};
var januaryVariations$1 = "Zanvie";
var februaryVariations$1 = "Fevrie";
var marchVariations$1 = "Marsy";
var aprilVariations$1 = "Avrily";
var mayVariations$1 = "May";
var juneVariations$1 = "Ziain";
var julyVariations$1 = "Zie|ZIE";
var augustVariations$1 = "Aoty";
var septemberVariations$1 = "Septambra";
var octoberVariations$1 = "Oktobra";
var novemberVariations$1 = "Novambra";
var decemberVariations$1 = "Desambra";
var tgwTalk10Variations$1 = "{{ title }}: (10 min.)";
var tgwBibleReadingVariations$1 = "Vaky Baiboly: (4 min.) {{ source }}";
var initialCallVideoVariations$1 = "Video Fitorian̈a";
var returnVisitVideoVariations$1 = "Video Lera Mitsidiky";
var memorialInvitationVideoVariations$1 = "Video Invitasiony Fahatsiarovan̈a";
var initialCallVariations$1 = "Fitorian̈a";
var returnVisitVariations$1 = "Lera Mitsidiky|Lera mitsidiky";
var bibleStudyVariations$1 = "Lera Mampianatra|Fianaran̈a Baiboly";
var talkVariations$1 = "Kabaro";
var memorialInvitationVariations$1 = "Invitasiony Fahatsiarovan̈a";
var assignmentAyfVariations$1 = "{{ assignment }}: ({{ duration }} min.) {{ source }}";
var assignmentLcVariations$1 = "{{ source }}: ({{ duration }} min.) {{ content }}";
var cbsVariations$1 = "Fianaran̈a Baiboly Ataony Fiangonan̈a: (30 min.) {{ source }}|Fianaran̈a Baiboly Ataony Fiangonan̈a: (30min.) {{ source }}";
var studyArticleDateVariations$1 = "Lahatsoratra Fianaran̈a {{ number }}: {{ date }}";
var TNK = {
januaryVariations: januaryVariations$1,
februaryVariations: februaryVariations$1,
marchVariations: marchVariations$1,
aprilVariations: aprilVariations$1,
mayVariations: mayVariations$1,
juneVariations: juneVariations$1,
julyVariations: julyVariations$1,
augustVariations: augustVariations$1,
septemberVariations: septemberVariations$1,
octoberVariations: octoberVariations$1,
novemberVariations: novemberVariations$1,
decemberVariations: decemberVariations$1,
tgwTalk10Variations: tgwTalk10Variations$1,
tgwBibleReadingVariations: tgwBibleReadingVariations$1,
initialCallVideoVariations: initialCallVideoVariations$1,
returnVisitVideoVariations: returnVisitVideoVariations$1,
memorialInvitationVideoVariations: memorialInvitationVideoVariations$1,
initialCallVariations: initialCallVariations$1,
returnVisitVariations: returnVisitVariations$1,
bibleStudyVariations: bibleStudyVariations$1,
talkVariations: talkVariations$1,
memorialInvitationVariations: memorialInvitationVariations$1,
assignmentAyfVariations: assignmentAyfVariations$1,
assignmentLcVariations: assignmentLcVariations$1,
cbsVariations: cbsVariations$1,
studyArticleDateVariations: studyArticleDateVariations$1
};
var januaryVariations = "Zanviè";
var februaryVariations = "Fevriè";
var marchVariations = "Marsa";
var aprilVariations = "Avrily";
var mayVariations = "Mey";
var juneVariations = "Ziein";
var julyVariations = "Ziè";
var augustVariations = "Oòh";
var septemberVariations = "Septambra";
var octoberVariations = "Oktobra";
var novemberVariations = "Novambra";
var decemberVariations = "Desambra";
var tgwTalk10Variations = "{{ title }}: (10 min.)";
var tgwBibleReadingVariations = "Famakia Baiboly: (4 min.) {{ source }}";
var initialCallVideoVariations = "Video Fitoria";
var returnVisitVideoVariations = "Video Fimpolia Mitsidiky";
var memorialInvitationVideoVariations = "Video Fanasà Fahatiarova";
var initialCallVariations = "Fitoria|Fianara";
var returnVisitVariations = "Fimpolia Mitsidiky";
var bibleStudyVariations = "Fampianara Baiboly";
var talkVariations = "Lahateny";
var memorialInvitationVariations = "Fanasà amy Fahatiarova";
var assignmentAyfVariations = "{{ assignment }}: ({{ duration }} min.) {{ source }}|{{ assignment }} ({{ duration }} min.) {{ source }}";
var assignmentLcVariations = "{{ source }}: ({{ duration }} min.) {{ content }}|{{ source }} ({{ duration }} min.) {{ content }}";
var cbsVariations = "Fianara Baiboly: (30 min.) {{ source }}";
var studyArticleDateVariations = "Lahatsoratsy Fianara {{ number }}: {{ date }}";
var VZ = {
januaryVariations: januaryVariations,
februaryVariations: februaryVariations,
marchVariations: marchVariations,
aprilVariations: aprilVariations,
mayVariations: mayVariations,
juneVariations: juneVariations,
julyVariations: julyVariations,
augustVariations: augustVariations,
septemberVariations: septemberVariations,
octoberVariations: octoberVariations,
novemberVariations: novemberVariations,
decemberVariations: decemberVariations,
tgwTalk10Variations: tgwTalk10Variations,
tgwBibleReadingVariations: tgwBibleReadingVariations,
initialCallVideoVariations: initialCallVideoVariations,
returnVisitVideoVariations: returnVisitVideoVariations,
memorialInvitationVideoVariations: memorialInvitationVideoVariations,
initialCallVariations: initialCallVariations,
returnVisitVariations: returnVisitVariations,
bibleStudyVariations: bibleStudyVariations,
talkVariations: talkVariations,
memorialInvitationVariations: memorialInvitationVariations,
assignmentAyfVariations: assignmentAyfVariations,
assignmentLcVariations: assignmentLcVariations,
cbsVariations: cbsVariations,
studyArticleDateVariations: studyArticleDateVariations
};
window.path = path;
window.fetch = fetch;
window.readFile = readFile;
window.jw_epub_parser = {
languages: { E, F, MG, T, TND, TNK, VZ },
};
var languages$1 = [
{ locale: 'en', code: 'E' },
{ locale: 'fr-FR', code: 'F' },
{ locale: 'mg-MG', code: 'MG' },
{ locale: 'pt-BR', code: 'T' },
{ locale: 'mg-TND', code: 'TND' },
{ locale: 'mg-TNK', code: 'TNK' },
{ locale: 'mg-VZ', code: 'VZ' },
];
class JWEPUBParserError extends Error {
constructor(code, message) {
super(message);
this.code = `jw-epub-parser/failed-${code}`;
}
}
const languages = window.jw_epub_parser.languages;
const getMonthNames = (lang) => {
return [
{ index: 0, name: languages[lang].januaryVariations },
{ index: 1, name: languages[lang].februaryVariations },
{ index: 2, name: languages[lang].marchVariations },
{ index: 3, name: languages[lang].aprilVariations },
{ index: 4, name: languages[lang].mayVariations },
{ index: 5, name: languages[lang].juneVariations },
{ index: 6, name: languages[lang].julyVariations },
{ index: 7, name: languages[lang].augustVariations },
{ index: 8, name: languages[lang].septemberVariations },
{ index: 9, name: languages[lang].octoberVariations },
{ index: 10, name: languages[lang].novemberVariations },
{ index: 11, name: languages[lang].decemberVariations },
];
};
const getTGWTalkVariations = (lang) => languages[lang].tgwTalk10Variations;
const getTGWBibleReadingVariations = (lang) => languages[lang].tgwBibleReadingVariations;
const getAssignmentsName = (lang) => [
languages[lang].initialCallVideoVariations,
languages[lang].returnVisitVideoVariations,
languages[lang].memorialInvitationVideoVariations,
languages[lang].initialCallVariations,
languages[lang].returnVisitVariations,
languages[lang].bibleStudyVariations,
languages[lang].talkVariations,
languages[lang].memorialInvitationVariations,
];
const getAssignmentsVariations = (lang) => languages[lang].assignmentAyfVariations;
const getLivingPartsVariations = (lang) => languages[lang].assignmentLcVariations;
const getCBSVariations = (lang) => languages[lang].cbsVariations;
const getStudyArticleDateVariations = (lang) => languages[lang].studyArticleDateVariations;
const extractMonthName = (src, lang) => {
let varDay;
let monthIndex;
src = src.split('–')[0];
const monthNames = getMonthNames(lang);
for (const month of monthNames) {
const monthLang = month.name;
const regex = new RegExp(`(${monthLang})`);
const array = regex.exec(src);
if (Array.isArray(array)) {
varDay = +src.match(/(\d+)/)[0];
monthIndex = month.index;
break;
}
}
if (typeof varDay === 'number' && typeof monthIndex === 'number') {
return { varDay, monthIndex };
}
throw new JWEPUBParserError('week-date', `Parsing failed when extracting the week date. The input was: ${src}`);
};
const extractSongNumber = (src) => {
return +src.match(/(\d+)/)[0];
};
const extractTGWTalk = (src, lang) => {
const variations = getTGWTalkVariations(lang).split('|');
const pattern = '{{ title }}';
let result;
for (const variation of variations) {
const startIndex = variation.indexOf(pattern);
const endIndex = src.length - variation.replace(pattern, '').length + startIndex;
const extracted = src.substring(startIndex, endIndex);
const verifyExtract = variation.replace(pattern, extracted);
if (verifyExtract === src) {
result = extracted;
break;
}
}
if (result) return result;
throw new JWEPUBParserError('tgw-talk', `Parsing failed for Treasures from God’s Word part. The input was: ${src}`);
};
const extractTGWBibleReading = (src, lang) => {
const variations = getTGWBibleReadingVariations(lang).split('|');
const pattern = '{{ source }}';
let result;
for (const variation of variations) {
const startIndex = variation.indexOf(pattern);
const endIndex = src.length - variation.replace(pattern, '').length + startIndex;
const extracted = src.substring(startIndex, endIndex);
const verifyExtract = variation.replace(pattern, extracted);
if (verifyExtract === src) {
result = extracted;
break;
}
}
if (result) return result;
throw new JWEPUBParserError('tgw-bibleReading', 'Parsing failed for Bible Reading part');
};
const extractAYFAssignment = (src, lang) => {
const variations = getAssignmentsVariations(lang).split('|');
const assignmentsName = getAssignmentsName(lang);
const patternAssignment = '{{ assignment }}';
const patternSource = '{{ source }}';
let result;
for (const variation of variations) {
const patternSourceIndex = variation.indexOf(patternSource);
const find = variation.substring(0, patternSourceIndex).trim();
let assignmentsList = '(';
for (let a = 0; a < assignmentsName.length; a++) {
assignmentsList += assignmentsName[a];
if (a < assignmentsName.length - 1) {
assignmentsList += '|';
}
}
assignmentsList += ')';
let textSearch = find.replace('{{ duration }}', '\\d+');
textSearch = textSearch.replace('(', '(\\(');
textSearch = textSearch.replace(')', ')\\)');
textSearch = textSearch.replace(' :', ' ?:?');
textSearch = textSearch.replace(') ', ') ?');
textSearch = textSearch.replace('??', '?');
textSearch = textSearch.replace(patternAssignment, assignmentsList);
const regex = new RegExp(textSearch.trim());
const array = regex.exec(src);
if (array !== null) {
const partTiming = +array[2].match(/(\d+)/)[0];
let textSearch = find.replace('{{ assignment }}', '');
textSearch = textSearch.replace('{{ duration }}', partTiming);
const split = src.split(textSearch.trim());
if (split.length === 2) {
const partType = split[0].trim();
let textSearch = variation.replace('{{ assignment }}', partType);
textSearch = textSearch.replace('{{ duration }}', partTiming);
const findNextIndex = textSearch.indexOf('{{ source }}');
const srcNext = src.substring(findNextIndex);
const obj = { src: srcNext, type: partType, time: partTiming };
let verifyExtract = variation.replace('{{ assignment }}', obj.type);
verifyExtract = verifyExtract.replace('{{ duration }}', obj.time);
verifyExtract = verifyExtract.replace('{{ source }}', obj.src);
if (verifyExtract === src) {
result = obj;
break;
}
}
}
}
if (result) return result;
throw new JWEPUBParserError(
'ayf-part',
`Parsing failed for Apply Yourself to the Field Ministry part. The input was: ${src}`
);
};
const extractLCAssignment = (src, lang) => {
const variations = getLivingPartsVariations(lang).split('|');
const patternSource = '{{ source }}';
const patternDuration = '{{ duration }}';
const patternContent = '{{ content }}';
let result;
for (const variation of variations) {
const patternSourceIndex = variation.indexOf(patternSource);
const patternContentIndex = variation.indexOf(patternContent);
let masterSearch = variation.replace(patternSource, '');
masterSearch = masterSearch.replace(patternContent, '');
let textSearch = masterSearch.replace('{{ duration }}', '\\d+');
textSearch = textSearch.replace('(', '(\\(');
textSearch = textSearch.replace(')', ')\\)');
textSearch = textSearch.replace(' :', ' ?:?');
textSearch = textSearch.replace(') ', ') ?');
textSearch = textSearch.replace('??', '?');
const regex = new RegExp(textSearch.trim());
const array = regex.exec(src);
if (array !== null) {
const partTiming = +array[0].match(/(\d+)/)[0];
const findStrings = masterSearch.replace(patternDuration, partTiming);
let split = src.split(findStrings);
if (split.length === 1) {
split = src.split(findStrings.trim());
}
if (split.length === 2) {
let partTitle;
let partContent;
if (split[1] === '') {
partTitle = split[0].trim();
partContent = '';
}
if (split[1] !== '') {
if (patternSourceIndex < patternContentIndex) {
partTitle = split[0].trim();
partContent = split[1].trim();
}
if (patternSourceIndex > patternContentIndex) {
partTitle = split[1].trim();
partContent = split[0].trim();
}
}
let verifyExtract = variation.replace('{{ source }}', partTitle);
verifyExtract = verifyExtract.replace('{{ duration }}', partTiming);
verifyExtract = verifyExtract.replace('{{ content }}', partContent);
if (split[1] === '') verifyExtract = verifyExtract.trim();
if (verifyExtract === src) {
result = {
time: partTiming,
title: partTitle,
content: partContent,
};
break;
}
}
}
}
if (result) return result;
throw new JWEPUBParserError('lc-part', `Parsing failed for Living as Christians part. The input was: ${src}`);
};
const extractCBSSource = (src, lang) => {
const variations = getCBSVariations(lang).split('|');
const pattern = '{{ source }}';
let result;
for (const variation of variations) {
const startIndex = variation.indexOf(pattern);
const endIndex = src.length - variation.replace('{{ source }}', '').length + startIndex;
const extracted = src.substring(startIndex, endIndex);
const verifyExtract = variation.replace('{{ source }}', extracted);
if (verifyExtract === src) {
result = extracted;
break;
}
}
if (result) return result;
throw new JWEPUBParserError('lc-cbs', `Parsing failed for Congregation Bible Study part. The input was: ${src}`);
};
const extractLastSong = (src) => {
const temp = extractSongNumber(src);
return temp > 151 ? src : temp;
};
const extractWTStudyDate = (src, lang) => {
const variations = getStudyArticleDateVariations(lang).split('|');
const patternNumber = '{{ number }}';
const patternDate = '{{ date }}';
let varDay;
let monthIndex;
let varYear;
for (const variation of variations) {
let textSearch = variation.replace(patternDate, '');
textSearch = textSearch.replace(patternNumber, '\\d+');
const regex = new RegExp(textSearch.trim());
const array = regex.exec(src);
if (array !== null) {
const dateStartIndex = array[0].length;
const dateValue = src.substring(dateStartIndex);
textSearch = dateValue.trim().split('–')[0];
const monthNames = getMonthNames(lang);
for (const month of monthNames) {
const monthLang = month.name;
const regex = new RegExp(`(${monthLang})`);
const array2 = regex.exec(textSearch);
if (Array.isArray(array2)) {
varDay = +textSearch.match(/(\d+)/)[0];
monthIndex = month.index;
const findYear = /\b\d{4}\b/;
const array3 = findYear.exec(dateValue);
if (array3 !== null) {
varYear = +array3[0];
}
break;
}
}
}
}
if (typeof varDay === 'number' && typeof monthIndex === 'number' && typeof varYear === 'number') {
return { varDay, monthIndex, varYear };
}
throw new JWEPUBParserError('wtstudy', `Parsing failed for Watchtower Study Date. The input was: ${src}`);
};
const getMWBWeekDateEnhanced = (weekDate, mwbYear, lang) => {
const { varDay, monthIndex } = extractMonthName(weekDate, lang);
const schedDate = new Date(mwbYear, monthIndex, varDay);
return dateFormat(schedDate, 'mm/dd/yyyy');
};
const getMWBTGWTalkEnhanced = (src, lang) => {
return extractTGWTalk(src, lang);
};
const getMWBTGWBibleReadingEnhanced = (src, lang) => {
return extractTGWBibleReading(src, lang);
};
const getMWBAYFEnhanced = (src, lang) => {
return extractAYFAssignment(src, lang);
};
const getMWBLCEnhanced = (src, lang) => {
return extractLCAssignment(src, lang);
};
const getMWBCBSEnhanced = (src, lang) => {
return extractCBSSource(src, lang);
};
const getWTStudyDateEnhanced = (src, lang) => {
const { varDay, monthIndex, varYear } = extractWTStudyDate(src, lang);
const schedDate = new Date(varYear, monthIndex, varDay);
return dateFormat(schedDate, 'mm/dd/yyyy');
};
const isValidHTML = (name) => {
let valid = false;
if (name.startsWith('OEBPS') && name.endsWith('.xhtml')) {
const fileName = name.split('/')[1].split('.')[0];
if (!isNaN(fileName)) {
valid = true;
}
}
return valid;
};
const getHTMLString = async (zip, filename) => {
const content = await zip.file(filename).async('string');
return content;
};
const isValidMWBSchedule = (htmlDoc) => {
let valid = false;
const isValidTGW = htmlDoc.querySelector(`[class*=treasures]`) ? true : false;
const isValidAYF = htmlDoc.querySelector(`[class*=ministry]`) ? true : false;
const isValidLC = htmlDoc.querySelector(`[class*=christianLiving]`) ? true : false;
if (isValidTGW === true && isValidAYF === true && isValidLC === true) {
valid = true;
}
return valid;
};
const HTMLParse = (htmlString) => {
const parser = new window.DOMParser();
const htmlDoc = parser.parseFromString(htmlString, 'text/html');
return htmlDoc;
};
const getHTMLDocsFromRaws = (htmlRaws) => {
const files = [];
for (const content of htmlRaws) {
const htmlDoc = HTMLParse(content);
files.push(htmlDoc);
}
return files;
};
const isValidWSchedule = (htmlDoc) => {
const valid = htmlDoc.querySelector('.groupTOC') ? true : false;
return valid;
};
const extractEPUBFiles = async (data) => {
const appZip = new JSZip();
const contents = await appZip.loadAsync(data);
return contents;
};
const validateEPUBContents = async (data) => {
const MAX_FILES = 300;
const MAX_SIZE = 20000000; // 20 MO
let fileCount = 0;
let totalSize = 0;
let targetDirectory = 'archive_tmp';
const result = { isBig: false, isMore: false, isSuspicious: false };
const appZip = new JSZip();
const contents = await appZip.loadAsync(data);
for (let [filename] of Object.entries(contents.files)) {
fileCount++;
if (fileCount > MAX_FILES) {
result.isMore = true;
}
// Prevent ZipSlip path traversal (S6096)
const resolvedPath = window.path.join(targetDirectory, filename);
if (!resolvedPath.startsWith(targetDirectory)) {
result.isSuspicious = true;
}
const contentSize = await appZip.file(filename).async('ArrayBuffer');
totalSize += contentSize.byteLength;
if (totalSize > MAX_SIZE) {
result.isBig = true;
}
}
fileCount = 0;
totalSize = 0;
return result;
};
const getHTMLDocs = async (zip, isMWB, isW) => {
const files = [];
for (let [filename] of Object.entries(zip.files)) {
const isValidFile = isValidHTML(filename);
if (isValidFile) {
const content = await getHTMLString(zip, filename);
const htmlDoc = HTMLParse(content);
const isValidSchedule = isMWB ? isValidMWBSchedule(htmlDoc) : isW ? isValidWSchedule(htmlDoc) : false;
if (isValidSchedule) {
files.push(htmlDoc);
}
}
}
return files;
};
const getHTMLWTArticleDoc = async (zip, articleFilename) => {
let article;
for (let [filename] of Object.entries(zip.files)) {
const shortName = window.path.basename(filename);
if (shortName === articleFilename) {
const content = await getHTMLString(zip, filename);
const htmlDoc = HTMLParse(content);
return htmlDoc;
}
}
return article;
};
const isMWBEpub = (name) => {
let regex = /^mwb_[A-Z][A-Z]?[A-Z]?_202\d(0[1-9]|1[0-2])\.epub$/i;
return regex.test(name);
};
const isWEpub = (name) => {
let regex = /^w_[A-Z][A-Z]?[A-Z]?_202\d(0[1-9]|1[0-2])\.epub$/i;
return regex.test(name);
};
const getEPUBFileName = (input) => {
const filename = input.name || input.url || input;
return window.path.basename(filename);
};
const isValidEPUB = (input) => {
const epubFilename = getEPUBFileName(input);
const isMWB = isMWBEpub(epubFilename);
const isW = isWEpub(epubFilename);
return isMWB || isW;
};
const isValidEPUBIssue = (input) => {
let valid = true;
const epubFilename = getEPUBFileName(input);
const isMWB = isMWBEpub(epubFilename);
const isW = isWEpub(epubFilename);
const type = isMWB ? 'mwb' : isW ? 'w' : undefined;
const issue = +epubFilename.split('_')[2].split('.epub')[0];
if (type === 'mwb' && issue < 202207) valid = false;
if (type === 'w' && issue < 202304) valid = false;
return valid;
};
const getEPUBYear = (input) => {
const filename = getEPUBFileName(input);
return filename.split('_')[2].substring(0, 4);
};
const getEPUBLanguage = (input) => {
const filename = getEPUBFileName(input);
return filename.split('_')[1];
};
const getEPUBData = async (input) => {
if (input.name) {
return input;
}
if (input.url) {
const epubRes = await window.fetch(input.url);
if (epubRes.status !== 200) {
throw new Error('EPUB file could not be downloaded. Check the URL you provided.');
}
const epubData = await epubRes.blob();
const data = await epubData.arrayBuffer();
return data;
}
const data = await window.readFile(input);
return data;
};
const getMWBWeekDate = (htmlItem, fromHTML) => {
const wdHtml = fromHTML
? htmlItem.querySelector('article').querySelector('header').querySelector('h1')
: htmlItem.getElementsByTagName('h1').item(0);
const weekDate = wdHtml.textContent.replaceAll(/\u00A0/g, ' ');
return weekDate;
};
const getMWBWeeklyBibleReading = (htmlItem, fromHTML) => {
const wbHtml = fromHTML
? htmlItem.querySelector('article').querySelector('header').querySelector('h2')
: htmlItem.getElementsByTagName('h2').item(0);
const weeklyBibleReading = wbHtml.textContent.replaceAll(/\u00A0/g, ' ');
return weeklyBibleReading;
};
const getMWBAYFCount = (htmlItem) => {
return htmlItem.querySelector('#section3').querySelectorAll('li').length;
};
const getMWBLCCount = (htmlItem) => {
const itemsCn = htmlItem.querySelector('#section4').querySelectorAll('li').length;
return itemsCn === 6 ? 2 : 1;
};
const getMWBSources = (htmlItem) => {
let src = '';
// get elements with meeting schedule data: pGroup
const pGroupData = htmlItem.querySelectorAll('.pGroup');
pGroupData.forEach((pGroup) => {
const liData = pGroup.querySelectorAll('li');
liData.forEach((li) => {
const firstP = li.querySelector('p');
src += '|' + firstP.textContent;
});
});
src = src.replaceAll(/\u00A0/g, ' '); // remove non-breaking space
return src;
};
const getWStudyArticles = (htmlItem) => {
return htmlItem.querySelectorAll('h3');
};
const getWStudyDate = (htmlItem) => {
return htmlItem.textContent.replaceAll(/\u00A0/g, ' '); // remove non-breaking space;
};
const getWSTudySongs = async ({ htmlItem, zip, fromHTML, htmlArticles, index }) => {
let article;
const articleLink = htmlItem.nextElementSibling.querySelector('a').getAttribute('href');
if (!fromHTML) {
article = await getHTMLWTArticleDoc(zip, articleLink);
}
if (fromHTML) {
const wtArticle = htmlArticles[index];
article = HTMLParse(wtArticle);
}
if (article) {
const themeScrp = article.querySelector('.themeScrp');
const WTOpeningSong = extractSongNumber(themeScrp.nextElementSibling.querySelector('a').textContent);
const blockTeach = article.querySelector('.blockTeach');
const WTConcludingSong = extractSongNumber(blockTeach.nextElementSibling.querySelector('a').textContent);
return { WTOpeningSong, WTConcludingSong };
}
};
const getWStudyTitle = (htmlItem) => {
const articleLink = htmlItem.nextElementSibling.querySelector('a');
const studyTitle = articleLink.textContent.replaceAll(/\u00A0/g, ' '); // remove non-breaking space;;
return studyTitle;
};
const startParse = async (epubInput) => {
const isRawsHTML = epubInput.htmlRaws ? true : false;
let result = {};
if (!isRawsHTML) {
const isValidName = isValidEPUB(epubInput);
if (!isValidName) {
throw new Error('The selected epub file has an incorrect naming.');
}
const isValiIssue = isValidEPUBIssue(epubInput);
if (!isValiIssue) {
throw new Error(
'EPUB import is only supported for Meeting Workbook starting on July 2022, and for Watchtower Study starting on April 2023.'
);
}
const epubBuffer = await getEPUBData(epubInput);
const epubCheck = await validateEPUBContents(epubBuffer);
if (epubCheck.isBig) {
throw new Error('EPUB file seems to be large. Extract aborted.');
}
if (epubCheck.isMore) {
throw new Error('EPUB file seems to contain more files than expected. Extract aborted.');
}
if (epubCheck.isSuspicious) {
throw new Error('EPUB file seems to be suspicious. Extract aborted.');
}
const epubFilename = getEPUBFileName(epubInput);
const isMWB = isMWBEpub(epubFilename);
const isW = isWEpub(epubFilename);
const epubContents = await extractEPUBFiles(epubBuffer);
const htmlDocs = await getHTMLDocs(epubContents, isMWB, isW);
if (htmlDocs.length === 0) {
throw new Error(
`The file you provided is not a valid ${
isMWB ? 'Meeting Workbook' : 'Watchtower Study'
} EPUB file. Please make sure that the file is correct.`
);
}
if (isW && htmlDocs.length > 1) {
throw new Error(
`The file you provided is not a valid Watchtower Study EPUB file. Please make sure that the file is correct.`
);
}
const epubYear = getEPUBYear(epubInput);
const epubLang = getEPUBLanguage(epubInput);
if (isMWB) {
result = await parseMWBEpub({ htmlDocs, epubYear, epubLang, fromHTML: false });
}
if (isW) {
result = await parseWEpub({ htmlItem: htmlDocs[0], epubLang, fromHTML: false, epubContents });
}
}
if (isRawsHTML) {
const htmlDocs = getHTMLDocsFromRaws(epubInput.htmlRaws);
if (epubInput.isMWB) {
result = await parseMWBEpub({
htmlDocs,
epubYear: epubInput.epubYear,
epubLang: epubInput.epubLang,
fromHTML: true,
});
}
if (epubInput.isW) {
result = await parseWEpub({
htmlItem: htmlDocs[0],
epubYear: epubInput.epubYear,
epubLang: epubInput.epubLang,
fromHTML: true,
htmlArticles: epubInput.htmlArticles,
});
}
}
return result;
};
const parseMWBEpub = async ({ htmlDocs, epubYear, epubLang, fromHTML }) => {
const weeksData = [];
const isEnhancedParsing = languages$1.find((language) => language.code === epubLang);
for (const htmlItem of htmlDocs) {
const weekItem = {};
// get week date
const weekDate = getMWBWeekDate(htmlItem, fromHTML);
if (isEnhancedParsing) {
const weekDateEnhanced = getMWBWeekDateEnhanced(weekDate, epubYear, epubLang);
weekItem.mwb_week_date = weekDateEnhanced;
weekItem.mwb_week_date_locale = weekDate;
} else {
weekItem.mwb_week_date = weekDate;
}
// get weekly Bible Reading
weekItem.mwb_weekly_bible_reading = getMWBWeeklyBibleReading(htmlItem, fromHTML);
// compile all sources
const src = getMWBSources(htmlItem);
let splits = src.split('|');
let tmpSrc = '';
// First song
weekItem.mwb_song_first = extractSongNumber(splits[1]);
// 10min TGW Source
tmpSrc = splits[3].trim();
if (isEnhancedParsing) {
weekItem.mwb_tgw_talk = getMWBTGWTalkEnhanced(tmpSrc, epubLang);
} else {
weekItem.mwb_tgw_talk = tmpSrc;
}
//Bible Reading Source
tmpSrc = splits[7].trim();
if (isEnhancedParsing) {
weekItem.mwb_tgw_bread = getMWBTGWBibleReadingEnhanced(tmpSrc, epubLang);
} else {
weekItem.mwb_tgw_bread = tmpSrc;
}
// get number of assignments in Apply Yourself Parts
const cnAYF = getMWBAYFCount(htmlItem);
// AYF Part Count
weekItem.mwb_ayf_count = cnAYF;
//AYF1 Source
tmpSrc = splits[8].trim();
if (isEnhancedParsing) {
const partEnhanced = getMWBAYFEnhanced(tmpSrc, epubLang);
weekItem.mwb_ayf_part1 = partEnhanced.src;
weekItem.mwb_ayf_part1_time = partEnhanced.time;
weekItem.mwb_ayf_part1_type = partEnhanced.type;
} else {
weekItem.mwb_ayf_part1 = tmpSrc;
}
//AYF2 Source
if (cnAYF > 1) {
tmpSrc = splits[9].trim();
if (isEnhancedParsing) {
const partEnhanced = getMWBAYFEnhanced(tmpSrc, epubLang);
weekItem.mwb_ayf_part2 = partEnhanced.src;
weekItem.mwb_ayf_part2_time = partEnhanced.time;
weekItem.mwb_ayf_part2_type = partEnhanced.type;
} else {
weekItem.mwb_ayf_part2 = tmpSrc;
}
}
//AYF3 Source
if (cnAYF > 2) {
tmpSrc = splits[10].trim();
if (isEnhancedParsing) {
const partEnhanced = getMWBAYFEnhanced(tmpSrc, epubLang);
weekItem.mwb_ayf_part3 = partEnhanced.src;
weekItem.mwb_ayf_part3_time = partEnhanced.time;
weekItem.mwb_ayf_part3_type = partEnhanced.type;
} else {
weekItem.mwb_ayf_part3 = tmpSrc;
}
}
// AYF4 Source
if (cnAYF > 3) {
tmpSrc = splits[11].trim();
if (isEnhancedParsing) {
const partEnhanced = getMWBAYFEnhanced(tmpSrc, epubLang);
weekItem.mwb_ayf_part4 = partEnhanced.src;
weekItem.mwb_ayf_part4_time = partEnhanced.time;
weekItem.mwb_ayf_part4_type = partEnhanced.type;
} else {
weekItem.mwb_ayf_part4 = tmpSrc;
}
}
// Middle song
let nextIndex = cnAYF > 3 ? 12 : cnAYF > 2 ? 11 : cnAYF > 1 ? 10 : 9;
weekItem.mwb_song_middle = extractSongNumber(splits[nextIndex]);
// get number of assignments in Living as Christians Parts
const cnLC = getMWBLCCount(htmlItem);
// LC Part Count
weekItem.mwb_lc_count = cnLC;
// 1st LC part
nextIndex++;
tmpSrc = splits[nextIndex].trim();
if (isEnhancedParsing) {
const lcEnhanced = getMWBLCEnhanced(tmpSrc, epubLang);
weekItem.mwb_lc_part1 = lcEnhanced.title;
weekItem.mwb_lc_part1Time = lcEnhanced.time;
if (lcEnhanced.content && lcEnhanced.content !== '') {
weekItem.mwb_lc_part1Content = lcEnhanced.content;
}
} else {
weekItem.mwb_lc_part1 = tmpSrc;
}
// 2nd LC part
if (cnLC === 2) {
nextIndex++;
tmpSrc = splits[nextIndex].trim();
if (isEnhancedParsing) {
const lcEnhanced = getMWBLCEnhanced(tmpSrc, epubLang);
weekItem.mwb_lc_part2 = lcEnhanced.title;
weekItem.mwb_lc_part2Time = lcEnhanced.time;
if (lcEnhanced.content && lcEnhanced.content !== '') {
weekItem.mwb_lc_part2Content = lcEnhanced.content;
}
} else {
weekItem.mwb_lc_part2 = tmpSrc;
}
}
// CBS Source
nextIndex++;
tmpSrc = splits[nextIndex].trim();
if (isEnhancedParsing) {
weekItem.mwb_lc_cbs = getMWBCBSEnhanced(tmpSrc, epubLang);
} else {
weekItem.mwb_lc_cbs = tmpSrc;
}
// Concluding Song
nextIndex++;
nextIndex++;
tmpSrc = splits[nextIndex].trim();
weekItem.mwb_song_conclude = extractLastSong(tmpSrc);
weeksData.push(weekItem);
}
return weeksData;
};
const parseWEpub = async ({ htmlItem, epubLang, fromHTML, epubContents, htmlArticles }) => {
const weeksData = [];
const isEnhancedParsing = languages$1.find((language) => language.code === epubLang);
const studyArticles = getWStudyArticles(htmlItem);
for (const [index, studyArticle] of studyArticles.entries()) {
const weekItem = {};
const studyDate = getWStudyDate(studyArticle);
if (isEnhancedParsing) {
const wStudyEnhanced = getWTStudyDateEnhanced(studyDate, epubLang);
weekItem.w_study_date = wStudyEnhanced;
weekItem.w_study_date_locale = studyDate;
} else {
weekItem.w_study_date = studyDate;
}
const studyTitle = getWStudyTitle(studyArticle);
weekItem.w_study_title = studyTitle;
const songs = await getWSTudySongs({ fromHTML, zip: epubContents, htmlArticles, htmlItem: studyArticle, index });
if (songs) {
weekItem.w_study_opening_song = songs.WTOpeningSong;
weekItem.w_study_concluding_song = songs.WTConcludingSong;
}
weeksData.push(weekItem);
}
return weeksData;
};
const loadEPUB = async (epubInput) => {
try {
const data = await startParse(epubInput);
return data;
} catch (err) {
throw new Error(err);
}
};
export { loadEPUB };
import"global-jsdom/register";import a from"node-fetch";import*as i from"path";import{readFile as t}from"fs/promises";import e from"dateformat";import r from"jszip";var n={januaryVariations:"January",februaryVariations:"February",marchVariations:"March",aprilVariations:"April",mayVariations:"May",juneVariations:"June",julyVariations:"July",augustVariations:"August",septemberVariations:"September",octoberVariations:"October",novemberVariations:"November",decemberVariations:"December",tgwTalk10Variations:"{{ title }}: (10 min.)",tgwBibleReadingVariations:"Bible Reading: (4 min.) {{ source }}",initialCallVideoVariations:"Initial Call Video",returnVisitVideoVariations:"Return Visit Video",memorialInvitationVideoVariations:"Memorial Invitation Video",initialCallVariations:"Initial Call",returnVisitVariations:"Return Visit",bibleStudyVariations:"Bible Study",talkVariations:"Talk",memorialInvitationVariations:"Memorial Invitation",assignmentAyfVariations:"{{ assignment }}: ({{ duration }} min.) {{ source }}",assignmentLcVariations:"{{ source }}: ({{ duration }} min.) {{ content }}",cbsVariations:"Congregation Bible Study: (30 min.) {{ source }}",studyArticleDateVariations:"Study Article {{ number }}: {{ date }}"},o={januaryVariations:"janvier",februaryVariations:"février",marchVariations:"mars",aprilVariations:"avril",mayVariations:"mai",juneVariations:"juin",julyVariations:"juillet",augustVariations:"août",septemberVariations:"septembre",octoberVariations:"octobre",novemberVariations:"novembre",decemberVariations:"décembre",tgwTalk10Variations:"{{ title }} (10 min)",tgwBibleReadingVariations:"Lecture de la Bible (4 min) : {{ source }}",initialCallVideoVariations:"Vidéo du premier contact",returnVisitVideoVariations:"Vidéo de la nouvelle visite",memorialInvitationVideoVariations:"Vidéo d’invitation au Mémorial",initialCallVariations:"Premier contact",returnVisitVariations:"Nouvelle visite",bibleStudyVariations:"Cours biblique",talkVariations:"Discours",memorialInvitationVariations:"Invitation au Mémorial",assignmentAyfVariations:"{{ assignment }} ({{ duration }} min) : {{ source }}",assignmentLcVariations:"{{ source }} ({{ duration }} min) : {{ content }}|{{ source }} ({{ duration }} min)",cbsVariations:"Étude biblique de l’assemblée (30 min) : {{ source }}",studyArticleDateVariations:"Article d’étude no {{ number }} : {{ date }}"},s={januaryVariations:"Janoary",februaryVariations:"Febroary",marchVariations:"Martsa",aprilVariations:"Aprily",mayVariations:"Mey",juneVariations:"Jona",julyVariations:"Jolay",augustVariations:"Aogositra",septemberVariations:"Septambra",octoberVariations:"Oktobra",novemberVariations:"Novambra",decemberVariations:"Desambra",tgwTalk10Variations:"{{ title }}: (10 min.)",tgwBibleReadingVariations:"Famakiana Baiboly: (4 min.) {{ source }}",initialCallVideoVariations:"Video Fitoriana",returnVisitVideoVariations:"Video Fiverenana Mitsidika",memorialInvitationVideoVariations:"Video Fanasana Fahatsiarovana",initialCallVariations:"Fitoriana",returnVisitVariations:"Fiverenana Mitsidika",bibleStudyVariations:"Fampianarana Baiboly",talkVariations:"Lahateny",memorialInvitationVariations:"Fanasana Fahatsiarovana",assignmentAyfVariations:"{{ assignment }}: ({{ duration }} min.) {{ source }}",assignmentLcVariations:"{{ source }}: ({{ duration }} min.) {{ content }}",cbsVariations:"Fianarana Baiboly: (30 min.) {{ source }}",studyArticleDateVariations:"Lahatsoratra Fianarana {{ number }}: {{ date }}"},l={januaryVariations:"de janeiro|janeiro",februaryVariations:"de fevereiro|fevereiro",marchVariations:"de março|março",aprilVariations:"de abril|abril",mayVariations:"de maio|maio",juneVariations:"de junho|junho",julyVariations:"de julho|julho",augustVariations:"de agosto|agosto",septemberVariations:"de setembro|setembro",octoberVariations:"de outubro|outubro",novemberVariations:"de novembro|novembro",decemberVariations:"de dezembro|dezembro",tgwTalk10Variations:"{{ title }}: (10 min)|{{ title }} (10 min)|{{ title }} (10min)",tgwBibleReadingVariations:"Leitura da Bíblia: (4 min) {{ source }}",initialCallVideoVariations:"Vídeo da primeira conversa",returnVisitVideoVariations:"Vídeo da revisita",memorialInvitationVideoVariations:"Vídeo do convite da Celebração",initialCallVariations:"Primeira conversa — designação 1|Primeira conversa — designação 2|Primeira conversa",returnVisitVariations:"Revisita — designação 1|Revisita — designação 2|Revisita",bibleStudyVariations:"Estudo bíblico",talkVariations:"Discurso",memorialInvitationVariations:"Convite da Celebração",assignmentAyfVariations:"{{ assignment }}: ({{ duration }} min) {{ source }}",assignmentLcVariations:"{{ source }}: ({{ duration }} min) {{ content }}|{{ source }}: ({{ duration }} min.) {{ content }}",cbsVariations:"Estudo bíblico de congregação: (30 min) {{ source }}",studyArticleDateVariations:"Estudo {{ number }} | {{ date }}"},c={januaryVariations:"Janvie",februaryVariations:"Fevrie",marchVariations:"Marsa",aprilVariations:"Avrily",mayVariations:"Mey",juneVariations:"Jona",julyVariations:"Jolay",augustVariations:"Aogositra",septemberVariations:"Septambra",octoberVariations:"Oktobra|Okotobra",novemberVariations:"Novambra",decemberVariations:"Desambra",tgwTalk10Variations:"{{ title }}: (10 min.)",tgwBibleReadingVariations:"Famakiagne Baiboly: (4 min.) {{ source }}",initialCallVideoVariations:"Fitoriagne Alefa Video",returnVisitVideoVariations:"Fiheregnagne Mitilike Alefa Video",memorialInvitationVideoVariations:"Fanasagne amy ty Fahatsiarovagne Alefa Video",initialCallVariations:"Fitoriagne",returnVisitVariations:"Fiheregnagne Mitilike",bibleStudyVariations:"Fampianaragne Baiboly",talkVariations:"Lahajaka",memorialInvitationVariations:"Fanasagne amy ty Fahatsiarovagne",assignmentAyfVariations:"{{ assignment }}: ({{ duration }} min.) {{ source }}|{{ assignment }}: ({{ duration }} min) {{ source }}|{{ assignment }}: ({{ duration }} min.). {{ source }}|{{ assignment }}: ({{ duration }} min.) {{ source }}",assignmentLcVariations:"{{ source }}: ({{ duration }} min.) {{ content }}|{{ source }}: ({{ duration }} min.). {{ content }}|{{ source }} ({{ duration }} min.) {{ content }}",cbsVariations:"Fianaragne Baiboly Anoe ty Fiangonagne: (30 min.) {{ source }}",studyArticleDateVariations:"Lahatsoratse Fianaragne {{ number }}: {{ date }}"},m={januaryVariations:"Zanvie",februaryVariations:"Fevrie",marchVariations:"Marsy",aprilVariations:"Avrily",mayVariations:"May",juneVariations:"Ziain",julyVariations:"Zie|ZIE",augustVariations:"Aoty",septemberVariations:"Septambra",octoberVariations:"Oktobra",novemberVariations:"Novambra",decemberVariations:"Desambra",tgwTalk10Variations:"{{ title }}: (10 min.)",tgwBibleReadingVariations:"Vaky Baiboly: (4 min.) {{ source }}",initialCallVideoVariations:"Video Fitorian̈a",returnVisitVideoVariations:"Video Lera Mitsidiky",memorialInvitationVideoVariations:"Video Invitasiony Fahatsiarovan̈a",initialCallVariations:"Fitorian̈a",returnVisitVariations:"Lera Mitsidiky|Lera mitsidiky",bibleStudyVariations:"Lera Mampianatra|Fianaran̈a Baiboly",talkVariations:"Kabaro",memorialInvitationVariations:"Invitasiony Fahatsiarovan̈a",assignmentAyfVariations:"{{ assignment }}: ({{ duration }} min.) {{ source }}",assignmentLcVariations:"{{ source }}: ({{ duration }} min.) {{ content }}",cbsVariations:"Fianaran̈a Baiboly Ataony Fiangonan̈a: (30 min.) {{ source }}|Fianaran̈a Baiboly Ataony Fiangonan̈a: (30min.) {{ source }}",studyArticleDateVariations:"Lahatsoratra Fianaran̈a {{ number }}: {{ date }}"},u={januaryVariations:"Zanviè",februaryVariations:"Fevriè",marchVariations:"Marsa",aprilVariations:"Avrily",mayVariations:"Mey",juneVariations:"Ziein",julyVariations:"Ziè",augustVariations:"Oòh",septemberVariations:"Septambra",octoberVariations:"Oktobra",novemberVariations:"Novambra",decemberVariations:"Desambra",tgwTalk10Variations:"{{ title }}: (10 min.)",tgwBibleReadingVariations:"Famakia Baiboly: (4 min.) {{ source }}",initialCallVideoVariations:"Video Fitoria",returnVisitVideoVariations:"Video Fimpolia Mitsidiky",memorialInvitationVideoVariations:"Video Fanasà Fahatiarova",initialCallVariations:"Fitoria|Fianara",returnVisitVariations:"Fimpolia Mitsidiky",bibleStudyVariations:"Fampianara Baiboly",talkVariations:"Lahateny",memorialInvitationVariations:"Fanasà amy Fahatiarova",assignmentAyfVariations:"{{ assignment }}: ({{ duration }} min.) {{ source }}|{{ assignment }} ({{ duration }} min.) {{ source }}",assignmentLcVariations:"{{ source }}: ({{ duration }} min.) {{ content }}|{{ source }} ({{ duration }} min.) {{ content }}",cbsVariations:"Fianara Baiboly: (30 min.) {{ source }}",studyArticleDateVariations:"Lahatsoratsy Fianara {{ number }}: {{ date }}"};window.path=i,window.fetch=a,window.readFile=t,window.jw_epub_parser={languages:{E:n,F:o,MG:s,T:l,TND:c,TNK:m,VZ:u}};var d=[{locale:"en",code:"E"},{locale:"fr-FR",code:"F"},{locale:"mg-MG",code:"MG"},{locale:"pt-BR",code:"T"},{locale:"mg-TND",code:"TND"},{locale:"mg-TNK",code:"TNK"},{locale:"mg-VZ",code:"VZ"}];class V extends Error{constructor(a,i){super(i),this.code=`jw-epub-parser/failed-${a}`}}const b=window.jw_epub_parser.languages,y=a=>[{index:0,name:b[a].januaryVariations},{index:1,name:b[a].februaryVariations},{index:2,name:b[a].marchVariations},{index:3,name:b[a].aprilVariations},{index:4,name:b[a].mayVariations},{index:5,name:b[a].juneVariations},{index:6,name:b[a].julyVariations},{index:7,name:b[a].augustVariations},{index:8,name:b[a].septemberVariations},{index:9,name:b[a].octoberVariations},{index:10,name:b[a].novemberVariations},{index:11,name:b[a].decemberVariations}],p=a=>+a.match(/(\d+)/)[0],g=(a,i)=>{const t=(a=>b[a].tgwTalk10Variations)(i).split("|"),e="{{ title }}";let r;for(const i of t){const t=i.indexOf(e),n=a.length-i.replace(e,"").length+t,o=a.substring(t,n);if(i.replace(e,o)===a){r=o;break}}if(r)return r;throw new V("tgw-talk",`Parsing failed for Treasures from God’s Word part. The input was: ${a}`)},f=(a,i)=>{const t=(a=>b[a].tgwBibleReadingVariations)(i).split("|"),e="{{ source }}";let r;for(const i of t){const t=i.indexOf(e),n=a.length-i.replace(e,"").length+t,o=a.substring(t,n);if(i.replace(e,o)===a){r=o;break}}if(r)return r;throw new V("tgw-bibleReading","Parsing failed for Bible Reading part")},w=(a,i)=>{const t=(a=>b[a].assignmentAyfVariations)(i).split("|"),e=(a=>[b[a].initialCallVideoVariations,b[a].returnVisitVideoVariations,b[a].memorialInvitationVideoVariations,b[a].initialCallVariations,b[a].returnVisitVariations,b[a].bibleStudyVariations,b[a].talkVariations,b[a].memorialInvitationVariations])(i);let r;for(const i of t){const t=i.indexOf("{{ source }}"),n=i.substring(0,t).trim();let o="(";for(let a=0;a<e.length;a++)o+=e[a],a<e.length-1&&(o+="|");o+=")";let s=n.replace("{{ duration }}","\\d+");s=s.replace("(","(\\("),s=s.replace(")",")\\)"),s=s.replace(" :"," ?:?"),s=s.replace(") ",") ?"),s=s.replace("??","?"),s=s.replace("{{ assignment }}",o);const l=new RegExp(s.trim()).exec(a);if(null!==l){const t=+l[2].match(/(\d+)/)[0];let e=n.replace("{{ assignment }}","");e=e.replace("{{ duration }}",t);const o=a.split(e.trim());if(2===o.length){const e=o[0].trim();let n=i.replace("{{ assignment }}",e);n=n.replace("{{ duration }}",t);const s=n.indexOf("{{ source }}"),l={src:a.substring(s),type:e,time:t};let c=i.replace("{{ assignment }}",l.type);if(c=c.replace("{{ duration }}",l.time),c=c.replace("{{ source }}",l.src),c===a){r=l;break}}}}if(r)return r;throw new V("ayf-part",`Parsing failed for Apply Yourself to the Field Ministry part. The input was: ${a}`)},h=(a,i)=>{const t=(a=>b[a].assignmentLcVariations)(i).split("|"),e="{{ source }}",r="{{ content }}";let n;for(const i of t){const t=i.indexOf(e),o=i.indexOf(r);let s=i.replace(e,"");s=s.replace(r,"");let l=s.replace("{{ duration }}","\\d+");l=l.replace("(","(\\("),l=l.replace(")",")\\)"),l=l.replace(" :"," ?:?"),l=l.replace(") ",") ?"),l=l.replace("??","?");const c=new RegExp(l.trim()).exec(a);if(null!==c){const e=+c[0].match(/(\d+)/)[0],r=s.replace("{{ duration }}",e);let l=a.split(r);if(1===l.length&&(l=a.split(r.trim())),2===l.length){let r,s;""===l[1]&&(r=l[0].trim(),s=""),""!==l[1]&&(t<o&&(r=l[0].trim(),s=l[1].trim()),t>o&&(r=l[1].trim(),s=l[0].trim()));let c=i.replace("{{ source }}",r);if(c=c.replace("{{ duration }}",e),c=c.replace("{{ content }}",s),""===l[1]&&(c=c.trim()),c===a){n={time:e,title:r,content:s};break}}}}if(n)return n;throw new V("lc-part",`Parsing failed for Living as Christians part. The input was: ${a}`)},_=(a,i)=>{const t=(a=>b[a].cbsVariations)(i).split("|");let e;for(const i of t){const t=i.indexOf("{{ source }}"),r=a.length-i.replace("{{ source }}","").length+t,n=a.substring(t,r);if(i.replace("{{ source }}",n)===a){e=n;break}}if(e)return e;throw new V("lc-cbs",`Parsing failed for Congregation Bible Study part. The input was: ${a}`)},v=a=>{const i=p(a);return i>151?a:i},A=(a,i)=>{const t=(a=>b[a].studyArticleDateVariations)(i).split("|");let e,r,n;for(const o of t){let t=o.replace("{{ date }}","");t=t.replace("{{ number }}","\\d+");const s=new RegExp(t.trim()).exec(a);if(null!==s){const o=s[0].length,l=a.substring(o);t=l.trim().split("–")[0];const c=y(i);for(const a of c){const i=a.name,o=new RegExp(`(${i})`).exec(t);if(Array.isArray(o)){e=+t.match(/(\d+)/)[0],r=a.index;const i=/\b\d{4}\b/.exec(l);null!==i&&(n=+i[0]);break}}}}if("number"==typeof e&&"number"==typeof r&&"number"==typeof n)return{varDay:e,monthIndex:r,varYear:n};throw new V("wtstudy",`Parsing failed for Watchtower Study Date. The input was: ${a}`)},F=(a,i,t)=>{const{varDay:r,monthIndex:n}=((a,i)=>{let t,e;a=a.split("–")[0];const r=y(i);for(const i of r){const r=i.name,n=new RegExp(`(${r})`).exec(a);if(Array.isArray(n)){t=+a.match(/(\d+)/)[0],e=i.index;break}}if("number"==typeof t&&"number"==typeof e)return{varDay:t,monthIndex:e};throw new V("week-date",`Parsing failed when extracting the week date. The input was: ${a}`)})(a,t),o=new Date(i,n,r);return e(o,"mm/dd/yyyy")},k=(a,i)=>g(a,i),S=(a,i)=>f(a,i),x=(a,i)=>w(a,i),B=(a,i)=>h(a,i),T=(a,i)=>_(a,i),j=(a,i)=>{const{varDay:t,monthIndex:r,varYear:n}=A(a,i),o=new Date(n,r,t);return e(o,"mm/dd/yyyy")},M=a=>{let i=!1;if(a.startsWith("OEBPS")&&a.endsWith(".xhtml")){const t=a.split("/")[1].split(".")[0];isNaN(t)||(i=!0)}return i},E=async(a,i)=>await a.file(i).async("string"),L=a=>{let i=!1;const t=!!a.querySelector("[class*=treasures]"),e=!!a.querySelector("[class*=ministry]"),r=!!a.querySelector("[class*=christianLiving]");return!0===t&&!0===e&&!0===r&&(i=!0),i},C=a=>(new window.DOMParser).parseFromString(a,"text/html"),I=a=>!!a.querySelector(".groupTOC"),D=a=>/^mwb_[A-Z][A-Z]?[A-Z]?_202\d(0[1-9]|1[0-2])\.epub$/i.test(a),q=a=>/^w_[A-Z][A-Z]?[A-Z]?_202\d(0[1-9]|1[0-2])\.epub$/i.test(a),R=a=>{const i=a.name||a.url||a;return window.path.basename(i)},P=(a,i)=>(i?a.querySelector("article").querySelector("header").querySelector("h1"):a.getElementsByTagName("h1").item(0)).textContent.replaceAll(/\u00A0/g," "),O=(a,i)=>(i?a.querySelector("article").querySelector("header").querySelector("h2"):a.getElementsByTagName("h2").item(0)).textContent.replaceAll(/\u00A0/g," "),N=a=>a.querySelector("#section3").querySelectorAll("li").length,W=a=>6===a.querySelector("#section4").querySelectorAll("li").length?2:1,Z=a=>{let i="";return a.querySelectorAll(".pGroup").forEach((a=>{a.querySelectorAll("li").forEach((a=>{const t=a.querySelector("p");i+="|"+t.textContent}))})),i=i.replaceAll(/\u00A0/g," "),i},$=a=>a.textContent.replaceAll(/\u00A0/g," "),J=async({htmlItem:a,zip:i,fromHTML:t,htmlArticles:e,index:r})=>{let n;const o=a.nextElementSibling.querySelector("a").getAttribute("href");if(t||(n=await(async(a,i)=>{for(let[t]of Object.entries(a.files))if(window.path.basename(t)===i){const i=await E(a,t);return C(i)}})(i,o)),t){const a=e[r];n=C(a)}if(n){const a=n.querySelector(".themeScrp"),i=p(a.nextElementSibling.querySelector("a").textContent),t=n.querySelector(".blockTeach");return{WTOpeningSong:i,WTConcludingSong:p(t.nextElementSibling.querySelector("a").textContent)}}},Y=a=>a.nextElementSibling.querySelector("a").textContent.replaceAll(/\u00A0/g," "),U=async a=>{const i=!!a.htmlRaws;let t={};if(!i){const i=(a=>{const i=R(a),t=D(i),e=q(i);return t||e})(a);if(!i)throw new Error("The selected epub file has an incorrect naming.");const e=(a=>{let i=!0;const t=R(a),e=D(t),r=q(t),n=e?"mwb":r?"w":void 0,o=+t.split("_")[2].split(".epub")[0];return"mwb"===n&&o<202207&&(i=!1),"w"===n&&o<202304&&(i=!1),i})(a);if(!e)throw new Error("EPUB import is only supported for Meeting Workbook starting on July 2022, and for Watchtower Study starting on April 2023.");const n=await(async a=>{if(a.name)return a;if(a.url){const i=await window.fetch(a.url);if(200!==i.status)throw new Error("EPUB file could not be downloaded. Check the URL you provided.");const t=await i.blob();return await t.arrayBuffer()}return await window.readFile(a)})(a),o=await(async a=>{let i=0,t=0,e="archive_tmp";const n={isBig:!1,isMore:!1,isSuspicious:!1},o=new r,s=await o.loadAsync(a);for(let[a]of Object.entries(s.files))i++,i>300&&(n.isMore=!0),window.path.join(e,a).startsWith(e)||(n.isSuspicious=!0),t+=(await o.file(a).async("ArrayBuffer")).byteLength,t>2e7&&(n.isBig=!0);return i=0,t=0,n})(n);if(o.isBig)throw new Error("EPUB file seems to be large. Extract aborted.");if(o.isMore)throw new Error("EPUB file seems to contain more files than expected. Extract aborted.");if(o.isSuspicious)throw new Error("EPUB file seems to be suspicious. Extract aborted.");const s=R(a),l=D(s),c=q(s),m=await(async a=>{const i=new r;return await i.loadAsync(a)})(n),u=await(async(a,i,t)=>{const e=[];for(let[r]of Object.entries(a.files))if(M(r)){const n=await E(a,r),o=C(n);(i?L(o):t&&I(o))&&e.push(o)}return e})(m,l,c);if(0===u.length)throw new Error(`The file you provided is not a valid ${l?"Meeting Workbook":"Watchtower Study"} EPUB file. Please make sure that the file is correct.`);if(c&&u.length>1)throw new Error("The file you provided is not a valid Watchtower Study EPUB file. Please make sure that the file is correct.");const d=R(a).split("_")[2].substring(0,4),V=(a=>R(a).split("_")[1])(a);l&&(t=await H({htmlDocs:u,epubYear:d,epubLang:V,fromHTML:!1})),c&&(t=await z({htmlItem:u[0],epubLang:V,fromHTML:!1,epubContents:m}))}if(i){const i=(a=>{const i=[];for(const t of a){const a=C(t);i.push(a)}return i})(a.htmlRaws);a.isMWB&&(t=await H({htmlDocs:i,epubYear:a.epubYear,epubLang:a.epubLang,fromHTML:!0})),a.isW&&(t=await z({htmlItem:i[0],epubYear:a.epubYear,epubLang:a.epubLang,fromHTML:!0,htmlArticles:a.htmlArticles}))}return t},H=async({htmlDocs:a,epubYear:i,epubLang:t,fromHTML:e})=>{const r=[],n=d.find((a=>a.code===t));for(const o of a){const a={},s=P(o,e);if(n){const e=F(s,i,t);a.mwb_week_date=e,a.mwb_week_date_locale=s}else a.mwb_week_date=s;a.mwb_weekly_bible_reading=O(o,e);let l=Z(o).split("|"),c="";a.mwb_song_first=p(l[1]),c=l[3].trim(),a.mwb_tgw_talk=n?k(c,t):c,c=l[7].trim(),a.mwb_tgw_bread=n?S(c,t):c;const m=N(o);if(a.mwb_ayf_count=m,c=l[8].trim(),n){const i=x(c,t);a.mwb_ayf_part1=i.src,a.mwb_ayf_part1_time=i.time,a.mwb_ayf_part1_type=i.type}else a.mwb_ayf_part1=c;if(m>1)if(c=l[9].trim(),n){const i=x(c,t);a.mwb_ayf_part2=i.src,a.mwb_ayf_part2_time=i.time,a.mwb_ayf_part2_type=i.type}else a.mwb_ayf_part2=c;if(m>2)if(c=l[10].trim(),n){const i=x(c,t);a.mwb_ayf_part3=i.src,a.mwb_ayf_part3_time=i.time,a.mwb_ayf_part3_type=i.type}else a.mwb_ayf_part3=c;if(m>3)if(c=l[11].trim(),n){const i=x(c,t);a.mwb_ayf_part4=i.src,a.mwb_ayf_part4_time=i.time,a.mwb_ayf_part4_type=i.type}else a.mwb_ayf_part4=c;let u=m>3?12:m>2?11:m>1?10:9;a.mwb_song_middle=p(l[u]);const d=W(o);if(a.mwb_lc_count=d,u++,c=l[u].trim(),n){const i=B(c,t);a.mwb_lc_part1=i.title,a.mwb_lc_part1Time=i.time,i.content&&""!==i.content&&(a.mwb_lc_part1Content=i.content)}else a.mwb_lc_part1=c;if(2===d)if(u++,c=l[u].trim(),n){const i=B(c,t);a.mwb_lc_part2=i.title,a.mwb_lc_part2Time=i.time,i.content&&""!==i.content&&(a.mwb_lc_part2Content=i.content)}else a.mwb_lc_part2=c;u++,c=l[u].trim(),a.mwb_lc_cbs=n?T(c,t):c,u++,u++,c=l[u].trim(),a.mwb_song_conclude=v(c),r.push(a)}return r},z=async({htmlItem:a,epubLang:i,fromHTML:t,epubContents:e,htmlArticles:r})=>{const n=[],o=d.find((a=>a.code===i)),s=(a=>a.querySelectorAll("h3"))(a);for(const[a,l]of s.entries()){const s={},c=$(l);if(o){const a=j(c,i);s.w_study_date=a,s.w_study_date_locale=c}else s.w_study_date=c;const m=Y(l);s.w_study_title=m;const u=await J({fromHTML:t,zip:e,htmlArticles:r,htmlItem:l,index:a});u&&(s.w_study_opening_song=u.WTOpeningSong,s.w_study_concluding_song=u.WTConcludingSong),n.push(s)}return n},G=async a=>{try{(a=>{if(!a)throw new Error("You did not pass anything to the loadEPUB function.")})(a);return await U(a)}catch(a){console.error(a)}};export{G as loadEPUB};
//# sourceMappingURL=index.js.map
{
"name": "jw-epub-parser",
"version": "2.0.0-beta.2",
"version": "2.0.0-beta.3",
"type": "module",

@@ -39,2 +39,3 @@ "description": "This tool will help you to parse and extract the needed source materials from Meeting Workbook EPUB file. Support for parsing Watchtower Study will be added in future release.",

"@rollup/plugin-node-resolve": "^15.0.0",
"@rollup/plugin-terser": "^0.4.3",
"@semantic-release/changelog": "^6.0.1",

@@ -41,0 +42,0 @@ "@semantic-release/exec": "^6.0.3",

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc