read.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import {parseString} from 'xml2js';
  2. import {promises} from 'fs';
  3. const {readdir, readFile} = promises;
  4. export async function* eachVestnik (prefix) {
  5. const xmlFileNames = (await readdir(prefix)).filter(each => each.endsWith('.xml'));
  6. for (let xmlFileName of xmlFileNames) {
  7. const contents = await readFile(`${prefix}/${xmlFileName}`, {encoding: 'utf8'});
  8. const object = await new Promise((resolve, reject) =>
  9. parseString(contents, (err, result) => err ? reject(err) : resolve(result)));
  10. yield object.vestnik;
  11. }
  12. }
  13. export function* eachItem (vestnik) {
  14. for (let obsah of vestnik.obsah)
  15. for (let oznamenia_vo of obsah.oznamenia_vo) {
  16. yield* eachItemInTree(oznamenia_vo);
  17. }
  18. }
  19. function* eachItemInTree (folder) {
  20. for (let subFolder of folder.folder || []) yield* eachItemInTree(subFolder);
  21. yield* folder.item;
  22. }
  23. export function* eachFormElement (item) {
  24. for (let content of item.content)
  25. for (let form of content.ZovoForm || [])
  26. yield* eachFormElementInTree(form);
  27. }
  28. const DIVE_TAGS = {Part: true, Repeater: true, RepeatingPart: true};
  29. const IGNORE_TAGS = {SubTitle: true, $: true, _: true};
  30. function* eachFormElementInTree (form) {
  31. for (let tag of Object.keys(form)) {
  32. if (IGNORE_TAGS[tag]) continue;
  33. for (let value of form[tag]) {
  34. let shouldCancel = false;
  35. const cancel = () => shouldCancel = true;
  36. const dive = () => eachFormElementInTree(value);
  37. yield {tag, value, cancel, dive};
  38. if (DIVE_TAGS[tag] && !shouldCancel) yield* dive();
  39. }
  40. }
  41. }