prefatory-matter-parser.service.ts 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. import { Injectable } from '@angular/core';
  2. import { map, shareReplay } from 'rxjs/operators';
  3. import { EncodingDesc, FileDesc, ProfileDesc, ProjectInfo, RevisionDesc, XMLElement } from '../../models/evt-models';
  4. import { EditionDataService } from '../edition-data.service';
  5. import { queryAndParseElement } from './basic-parsers';
  6. @Injectable({
  7. providedIn: 'root',
  8. })
  9. export class PrefatoryMatterParserService {
  10. public readonly title$ = this.editionDataService.parsedEditionSource$.pipe(
  11. map((source) => this.parseEditionTitle(source)),
  12. shareReplay(1),
  13. );
  14. public readonly projectInfo$ = this.editionDataService.parsedEditionSource$.pipe(
  15. map((source) => this.parseProjectInfo(source)),
  16. shareReplay(1),
  17. );
  18. constructor(
  19. private editionDataService: EditionDataService,
  20. ) {
  21. }
  22. parseEditionTitle(source: XMLElement) {
  23. const titleElems = source.querySelectorAll('titleStmt title');
  24. return titleElems[0]?.textContent;
  25. }
  26. parseProjectInfo(source: XMLElement): ProjectInfo {
  27. return {
  28. fileDesc: queryAndParseElement<FileDesc>(source, 'fileDesc', true),
  29. encodingDesc: queryAndParseElement<EncodingDesc>(source, 'encodingDesc', true),
  30. profileDesc: queryAndParseElement<ProfileDesc>(source, 'profileDesc', true),
  31. revisionDesc: queryAndParseElement<RevisionDesc>(source, 'revisionDesc', true),
  32. };
  33. }
  34. }