import {parseString} from 'xml2js'; import {promises} from 'fs'; const {readdir, readFile} = promises; export async function* eachVestnik (prefix) { const xmlFileNames = (await readdir(prefix)).filter(each => each.endsWith('.xml')); for (let xmlFileName of xmlFileNames) { const contents = await readFile(`${prefix}/${xmlFileName}`, {encoding: 'utf8'}); const object = await new Promise((resolve, reject) => parseString(contents, (err, result) => err ? reject(err) : resolve(result))); yield object.vestnik; } } export function* eachItem (vestnik) { for (let obsah of vestnik.obsah) for (let oznamenia_vo of obsah.oznamenia_vo) { yield* eachItemInTree(oznamenia_vo); } } function* eachItemInTree (folder) { for (let subFolder of folder.folder || []) yield* eachItemInTree(subFolder); yield* folder.item; } export function* eachFormElement (item) { for (let content of item.content) for (let form of content.ZovoForm || []) yield* eachFormElementInTree(form); } const DIVE_TAGS = {Part: true, Repeater: true, RepeatingPart: true}; const IGNORE_TAGS = {SubTitle: true, $: true, _: true}; function* eachFormElementInTree (form) { for (let tag of Object.keys(form)) { if (IGNORE_TAGS[tag]) continue; for (let value of form[tag]) { let shouldCancel = false; const cancel = () => shouldCancel = true; const dive = () => eachFormElementInTree(value); yield {tag, value, cancel, dive}; if (DIVE_TAGS[tag] && !shouldCancel) yield* dive(); } } }