index.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import { Type } from '@angular/core';
  2. import { Comment, GenericElement, HTML, XMLElement } from '../../models/evt-models';
  3. import { Map } from '../../utils/js-utils';
  4. import { createParser, Parser, ParseResult } from './parser-models';
  5. export class ParserRegister {
  6. // tslint:disable-next-line: no-any
  7. private static PARSER_MAP: Map<Type<any>> = {};
  8. // tslint:disable-next-line: no-any
  9. static set(tagName: string, parserType: Type<any>) {
  10. ParserRegister.PARSER_MAP[tagName.toLowerCase()] = parserType;
  11. }
  12. static get<T>(tagName: string): Parser<T> {
  13. const name = ParserRegister.mapName(tagName.toLowerCase());
  14. return createParser(ParserRegister.PARSER_MAP[name], parse) as Parser<T>;
  15. }
  16. private static mapName(tagName) {
  17. const nes = ['event', 'geogname', 'orgname', 'persname', 'placename'];
  18. if (nes.includes(tagName)) {
  19. return 'evt-named-entity-parser';
  20. }
  21. const nels = ['listPerson', 'listPlace', 'listOrg', 'listEvent'];
  22. if (nels.includes(tagName)) {
  23. return 'evt-named-entities-list-parser';
  24. }
  25. const crit = ['app'];
  26. if (crit.includes(tagName)) {
  27. return 'evt-apparatus-entry-parser';
  28. }
  29. /* add by FS
  30. const ling = ['rdgGrp'];
  31. if (ling.includes(tagName)) {
  32. return 'evt-lem-entry-parser';
  33. } */
  34. const neslem = ['w', 'lem'];
  35. if (neslem.includes(tagName)) {
  36. return 'evt-lemmatized-entity-parser';
  37. }
  38. const nelslem = ['list'];
  39. if (nelslem.includes(tagName)) {
  40. return 'evt-lemmatized-entities-list-parser';
  41. }
  42. if (!Object.keys(ParserRegister.PARSER_MAP).includes(tagName)) {
  43. return 'evt-generic-elem-parser';
  44. }
  45. return tagName;
  46. }
  47. }
  48. // tslint:disable-next-line: no-any
  49. export function xmlParser(tagName: string, parserType: Type<any>) {
  50. // tslint:disable-next-line: no-any
  51. return (_: Type<any>) => {
  52. ParserRegister.set(tagName, parserType);
  53. };
  54. }
  55. export function parse(xml: XMLElement): ParseResult<GenericElement> {
  56. if (!xml) { return { content: [xml] } as HTML; }
  57. // Text Node
  58. if (xml.nodeType === 3) { return ParserRegister.get('evt-text-parser').parse(xml); }
  59. // Comment
  60. if (xml.nodeType === 8) { return {} as Comment; }
  61. const tagName = xml.tagName.toLowerCase();
  62. const parser: Parser<XMLElement> = ParserRegister.get(tagName);
  63. return parser.parse(xml);
  64. }