jw-epub-parser
Advanced tools
Comparing version 2.0.0-beta.2 to 2.0.0-beta.3
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", |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
162104
7
1
13
158