123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- 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();
- }
- }
- }
|