header-parser.ts 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876
  1. import { isNestedInElem } from 'src/app/utils/dom-utils';
  2. import { isBoolString } from 'src/app/utils/js-utils';
  3. import { xmlParser } from '.';
  4. import {
  5. Abstract, Calendar, CalendarDesc, CatRef, Change, Channel, ChannelMode, ClassCode, Constitution,
  6. Correction, CorrectionMethod, CorrectionStatus, CorrespAction, CorrespActionType, CorrespContext, CorrespDesc, Creation, CRefPattern,
  7. Degree, Derivation, Description, Domain, EditionStmt, EditorialDecl, EncodingDesc, Extent, Factuality, FileDesc, GenericElement,
  8. HandNote, HandNotes, HandNoteScope, Hyphenation, HyphenationEol, Interaction, Interpretation,
  9. Keywords, Language, LangUsage, ListChange, ListTranspose, MsDesc, NamedEntitiesList, NamedEntityRef, Namespace, Normalization,
  10. NormalizationMethod, Note, NotesStmt, Paragraph, ParticDesc, Preparedness, ProfileDesc, ProjectDesc, Ptr, PublicationStmt,
  11. Punctuation, PunctuationMarks, PunctuationPlacement,
  12. Purpose, Quotation, QuotationMarks, RefsDecl, RefState, Rendition, RenditionScope, Resp, RespStmt, RevisionDesc,
  13. SamplingDecl, Scheme, Segmentation, SeriesStmt, Setting, SettingDesc, SourceDesc, Status, StdVals,
  14. TagsDecl, TagUsage, Term, TextClass, TextDesc, TitleStmt, Transpose, XMLElement,
  15. } from '../../models/evt-models';
  16. import { GenericElemParser, GenericParser, parseElement, queryAndParseElement, queryAndParseElements } from './basic-parsers';
  17. import { NamedEntityRefParser } from './named-entity-parsers';
  18. import { complexElements, createParser, getDefaultAttr, getID, Parser } from './parser-models';
  19. @xmlParser('resp', RespParser)
  20. export class RespParser extends GenericElemParser implements Parser<XMLElement> {
  21. parse(xml: XMLElement): Resp {
  22. const { ref, when } = this.attributeParser.parse(xml);
  23. const normalizedResp = ref?.indexOf('http://') < 0 && ref?.indexOf('https://') < 0 ? `http://${ref}` : ref ?? '';
  24. return {
  25. ...super.parse(xml),
  26. type: Resp,
  27. normalizedResp,
  28. date: when || '',
  29. };
  30. }
  31. }
  32. @xmlParser('respStmt', RespStmtParser)
  33. export class RespStmtParser extends GenericElemParser implements Parser<XMLElement> {
  34. private namedEntityRefParser = createParser(NamedEntityRefParser, this.genericParse);
  35. parse(xml: XMLElement): RespStmt {
  36. const people = Array.from(xml.querySelectorAll<XMLElement>(':scope > name, :scope > orgName, :scope > persName'))
  37. .map(p => {
  38. if (['orgName', 'persName'].includes(p.tagName)) {
  39. return this.namedEntityRefParser.parse(p) as NamedEntityRef;
  40. }
  41. return this.genericParse(p) as GenericElement;
  42. });
  43. return {
  44. ...super.parse(xml),
  45. type: RespStmt,
  46. responsibility: queryAndParseElement<Resp>(xml, 'resp'),
  47. notes: queryAndParseElements<Note>(xml, 'note'),
  48. people,
  49. };
  50. }
  51. }
  52. @xmlParser('titleStmt', TitleStmtParser)
  53. export class TitleStmtParser extends GenericParser implements Parser<XMLElement> {
  54. parse(xml: XMLElement): TitleStmt {
  55. const title = queryAndParseElements<GenericElement>(xml, 'title[type="main"]');
  56. return {
  57. ...super.parse(xml),
  58. type: TitleStmt,
  59. titles: title.length > 0 ? title : queryAndParseElements<GenericElement>(xml, 'title:not([type="sub"])'),
  60. subtitles: queryAndParseElements<GenericElement>(xml, 'title[type="sub"]'),
  61. authors: queryAndParseElements<GenericElement>(xml, 'author'),
  62. editors: queryAndParseElements<GenericElement>(xml, 'editor'),
  63. sponsors: queryAndParseElements<GenericElement>(xml, 'sponsor'),
  64. funders: queryAndParseElements<GenericElement>(xml, 'funder'),
  65. principals: queryAndParseElements<GenericElement>(xml, 'principal'),
  66. respStmts: queryAndParseElements<RespStmt>(xml, 'respStmt'),
  67. };
  68. }
  69. }
  70. @xmlParser('editionStmt', EditionStmtParser)
  71. export class EditionStmtParser extends GenericParser implements Parser<XMLElement> {
  72. parse(xml: XMLElement): EditionStmt {
  73. return {
  74. ...super.parse(xml),
  75. type: EditionStmt,
  76. edition: queryAndParseElements<GenericElement>(xml, 'edition'),
  77. respStmt: queryAndParseElements<RespStmt>(xml, 'respStmt'),
  78. structuredData: Array.from(xml.children).filter(el => el.tagName === 'p').length !== xml.children.length,
  79. };
  80. }
  81. }
  82. @xmlParser('publicationStmt', PublicationStmtParser)
  83. export class PublicationStmtParser extends GenericParser implements Parser<XMLElement> {
  84. parse(xml: XMLElement): PublicationStmt {
  85. return {
  86. ...super.parse(xml),
  87. type: PublicationStmt,
  88. structuredData: Array.from(xml.children).filter(el => el.tagName === 'p').length !== xml.children.length,
  89. publisher: queryAndParseElements<GenericElement>(xml, 'publisher'),
  90. distributor: queryAndParseElements<GenericElement>(xml, 'distributor'),
  91. authority: queryAndParseElements<GenericElement>(xml, 'authority'),
  92. pubPlace: queryAndParseElements<GenericElement>(xml, 'pubPlace'),
  93. address: queryAndParseElements<GenericElement>(xml, 'address'),
  94. idno: queryAndParseElements<GenericElement>(xml, 'idno'),
  95. availability: queryAndParseElements<GenericElement>(xml, 'availability'),
  96. date: queryAndParseElements<GenericElement>(xml, 'date'),
  97. licence: queryAndParseElements<GenericElement>(xml, 'licence'),
  98. };
  99. }
  100. }
  101. @xmlParser('seriesStmt', SeriesStmtParser)
  102. export class SeriesStmtParser extends GenericParser implements Parser<XMLElement> {
  103. parse(xml: XMLElement): SeriesStmt {
  104. return {
  105. ...super.parse(xml),
  106. type: SeriesStmt,
  107. structuredData: Array.from(xml.querySelectorAll(':scope > p')).length === 0,
  108. title: queryAndParseElements<GenericElement>(xml, 'title'),
  109. idno: queryAndParseElements<GenericElement>(xml, 'idno'),
  110. respStmt: queryAndParseElements<RespStmt>(xml, 'respStmt'),
  111. editor: queryAndParseElements<GenericElement>(xml, 'editor'),
  112. biblScope: queryAndParseElements<GenericElement>(xml, 'biblScope'),
  113. };
  114. }
  115. }
  116. @xmlParser('notesStmt', NotesStmtParser)
  117. export class NotesStmtParser extends GenericParser implements Parser<XMLElement> {
  118. parse(xml: XMLElement): NotesStmt {
  119. return {
  120. ...super.parse(xml),
  121. type: NotesStmt,
  122. notes: queryAndParseElements<Note>(xml, 'note').map(el => ({
  123. ...el,
  124. noteLayout: 'plain-text',
  125. })),
  126. relatedItems: queryAndParseElements<GenericElement>(xml, 'relatedItem'),
  127. };
  128. }
  129. }
  130. @xmlParser('sourceDesc', SourceDescParser)
  131. export class SourceDescParser extends GenericParser implements Parser<XMLElement> {
  132. parse(xml: XMLElement): SourceDesc {
  133. return {
  134. ...super.parse(xml),
  135. type: SourceDesc,
  136. structuredData: Array.from(xml.children).filter(el => el.tagName === 'p').length !== xml.children.length,
  137. msDescs: queryAndParseElements<MsDesc>(xml, 'msDesc'),
  138. bibl: queryAndParseElements<GenericElement>(xml, 'bibl'),
  139. biblFull: queryAndParseElements<GenericElement>(xml, 'biblFull'),
  140. biblStruct: queryAndParseElements<GenericElement>(xml, 'biblStruct'),
  141. recordingStmt: queryAndParseElements<GenericElement>(xml, 'recordingStmt'),
  142. scriptStmt: queryAndParseElements<GenericElement>(xml, 'scriptStmt'),
  143. };
  144. }
  145. }
  146. @xmlParser('extent', ExtentParser)
  147. export class ExtentParser extends GenericElemParser implements Parser<XMLElement> {
  148. parse(xml: XMLElement): Extent {
  149. return {
  150. ...super.parse(xml),
  151. type: Extent,
  152. };
  153. }
  154. }
  155. @xmlParser('fileDesc', FileDescParser)
  156. export class FileDescParser extends GenericElemParser implements Parser<XMLElement> {
  157. private excludeFromParsing = [
  158. 'listBibl',
  159. 'listEvent',
  160. 'listOrg',
  161. 'listPerson',
  162. 'listPlace',
  163. 'listWit',
  164. // 'sourceDesc list',
  165. // 'list'
  166. ];
  167. parse(xml: XMLElement): FileDesc {
  168. xml = xml.cloneNode(true) as XMLElement;
  169. Array.from(xml.querySelectorAll<XMLElement>(this.excludeFromParsing.toString()))
  170. .filter((list) => !isNestedInElem(list, list.tagName))
  171. .forEach(el => el.remove());
  172. return {
  173. ...super.parse(xml),
  174. type: FileDesc,
  175. titleStmt: queryAndParseElement<TitleStmt>(xml, 'titleStmt'),
  176. editionStmt: queryAndParseElement<EditionStmt>(xml, 'editionStmt'),
  177. publicationStmt: queryAndParseElement<PublicationStmt>(xml, 'publicationStmt'),
  178. sourceDesc: queryAndParseElement<SourceDesc>(xml, 'sourceDesc'),
  179. extent: queryAndParseElement<Extent>(xml, 'extent'),
  180. notesStmt: queryAndParseElement<NotesStmt>(xml, 'notesStmt'),
  181. seriesStmt: queryAndParseElement<SeriesStmt>(xml, 'seriesStmt'),
  182. };
  183. }
  184. }
  185. @xmlParser('projectDesc', ProjectDescParser)
  186. export class ProjectDescParser extends GenericElemParser implements Parser<XMLElement> {
  187. parse(xml: XMLElement): ProjectDesc {
  188. return {
  189. ...super.parse(xml),
  190. type: ProjectDesc,
  191. content: queryAndParseElements<Paragraph>(xml, 'p'),
  192. };
  193. }
  194. }
  195. @xmlParser('samplingDecl', SamplingDeclParser)
  196. export class SamplingDeclParser extends GenericElemParser implements Parser<XMLElement> {
  197. parse(xml: XMLElement): SamplingDecl {
  198. return {
  199. ...super.parse(xml),
  200. type: SamplingDecl,
  201. content: queryAndParseElements<Paragraph>(xml, 'p'),
  202. };
  203. }
  204. }
  205. @xmlParser('correction', CorrectionParser)
  206. export class CorrectionParser extends GenericElemParser implements Parser<XMLElement> {
  207. parse(xml: XMLElement): Correction {
  208. return {
  209. ...super.parse(xml),
  210. type: Correction,
  211. content: queryAndParseElements<Paragraph>(xml, 'p'),
  212. status: xml.getAttribute('status') as CorrectionStatus,
  213. method: xml.getAttribute('method') as CorrectionMethod || 'silent',
  214. };
  215. }
  216. }
  217. @xmlParser('normalization', NormalizationParser)
  218. export class NormalizationParser extends GenericElemParser implements Parser<XMLElement> {
  219. parse(xml: XMLElement): Normalization {
  220. return {
  221. ...super.parse(xml),
  222. type: Normalization,
  223. content: queryAndParseElements<Paragraph>(xml, 'p'),
  224. sources: xml.getAttribute('source')?.split(' ') || [],
  225. method: xml.getAttribute('method') as NormalizationMethod || 'silent',
  226. };
  227. }
  228. }
  229. @xmlParser('punctuation', PunctuationParser)
  230. export class PunctuationParser extends GenericElemParser implements Parser<XMLElement> {
  231. parse(xml: XMLElement): Punctuation {
  232. return {
  233. ...super.parse(xml),
  234. type: Punctuation,
  235. content: queryAndParseElements<Paragraph>(xml, 'p'),
  236. marks: xml.getAttribute('marks') as PunctuationMarks,
  237. placement: xml.getAttribute('placement') as PunctuationPlacement,
  238. };
  239. }
  240. }
  241. @xmlParser('quotation', QuotationParser)
  242. export class QuotationParser extends GenericElemParser implements Parser<XMLElement> {
  243. parse(xml: XMLElement): Quotation {
  244. return {
  245. ...super.parse(xml),
  246. type: Quotation,
  247. content: queryAndParseElements<Paragraph>(xml, 'p'),
  248. marks: xml.getAttribute('marks') as QuotationMarks,
  249. };
  250. }
  251. }
  252. @xmlParser('hyphenation', HyphenationParser)
  253. export class HyphenationParser extends GenericElemParser implements Parser<XMLElement> {
  254. parse(xml: XMLElement): Hyphenation {
  255. return {
  256. ...super.parse(xml),
  257. type: Hyphenation,
  258. content: queryAndParseElements<Paragraph>(xml, 'p'),
  259. eol: xml.getAttribute('eol') as HyphenationEol,
  260. };
  261. }
  262. }
  263. @xmlParser('segmentation', SegmentationParser)
  264. export class SegmentationParser extends GenericElemParser implements Parser<XMLElement> {
  265. parse(xml: XMLElement): Segmentation {
  266. return {
  267. ...super.parse(xml),
  268. type: Segmentation,
  269. content: queryAndParseElements<Paragraph>(xml, 'p'),
  270. };
  271. }
  272. }
  273. @xmlParser('stdVals', StdValsParser)
  274. export class StdValsParser extends GenericElemParser implements Parser<XMLElement> {
  275. parse(xml: XMLElement): StdVals {
  276. return {
  277. ...super.parse(xml),
  278. type: StdVals,
  279. content: queryAndParseElements<Paragraph>(xml, 'p'),
  280. };
  281. }
  282. }
  283. @xmlParser('interpretation', InterpretationParser)
  284. export class InterpretationParser extends GenericElemParser implements Parser<XMLElement> {
  285. parse(xml: XMLElement): Interpretation {
  286. return {
  287. ...super.parse(xml),
  288. type: Interpretation,
  289. content: queryAndParseElements<Paragraph>(xml, 'p'),
  290. };
  291. }
  292. }
  293. @xmlParser('editorialDecl', EditorialDeclParser)
  294. export class EditorialDeclParser extends GenericParser implements Parser<XMLElement> {
  295. parse(xml: XMLElement): EditorialDecl {
  296. return {
  297. ...super.parse(xml),
  298. type: EditorialDecl,
  299. structuredData: Array.from(xml.children).filter(el => el.tagName === 'p').length !== xml.children.length,
  300. correction: queryAndParseElements<Correction>(xml, 'correction'),
  301. hyphenation: queryAndParseElements<Hyphenation>(xml, 'hyphenation'),
  302. interpretation: queryAndParseElements<Interpretation>(xml, 'interpretation'),
  303. normalization: queryAndParseElements<Normalization>(xml, 'normalization'),
  304. punctuation: queryAndParseElements<Punctuation>(xml, 'punctuation'),
  305. quotation: queryAndParseElements<Quotation>(xml, 'quotation'),
  306. segmentation: queryAndParseElements<Segmentation>(xml, 'segmentation'),
  307. stdVals: queryAndParseElements<StdVals>(xml, 'stdVals'),
  308. };
  309. }
  310. }
  311. @xmlParser('rendition', RenditionParser)
  312. export class RenditionParser extends GenericElemParser implements Parser<XMLElement> {
  313. parse(xml: XMLElement): Rendition {
  314. return {
  315. ...super.parse(xml),
  316. type: Rendition,
  317. id: getID(xml),
  318. scope: xml.getAttribute('scope') as RenditionScope || '',
  319. selector: xml.getAttribute('selector') || '',
  320. scheme: xml.getAttribute('scheme') as Scheme || undefined,
  321. schemeVersion: xml.getAttribute('schemeVersion') || '',
  322. };
  323. }
  324. }
  325. @xmlParser('tagUsage', TagUsageParser)
  326. export class TagUsageParser extends GenericElemParser implements Parser<XMLElement> {
  327. parse(xml: XMLElement): TagUsage {
  328. return {
  329. ...super.parse(xml),
  330. type: TagUsage,
  331. gi: xml.getAttribute('gi'),
  332. occurs: parseInt(xml.getAttribute('occurs'), 10) || undefined,
  333. withId: parseInt(xml.getAttribute('withId'), 10) || undefined,
  334. };
  335. }
  336. }
  337. @xmlParser('namespace', NamespaceParser)
  338. export class NamespaceParser extends GenericElemParser implements Parser<XMLElement> {
  339. parse(xml: XMLElement): Namespace {
  340. return {
  341. ...super.parse(xml),
  342. type: Namespace,
  343. name: xml.getAttribute('name') || '',
  344. tagUsage: queryAndParseElements<TagUsage>(xml, 'tagUsage'),
  345. };
  346. }
  347. }
  348. @xmlParser('tagsDecl', TagsDeclParser)
  349. export class TagsDeclParser extends GenericElemParser implements Parser<XMLElement> {
  350. parse(xml: XMLElement): TagsDecl {
  351. return {
  352. ...super.parse(xml),
  353. type: TagsDecl,
  354. rendition: queryAndParseElements<Rendition>(xml, 'rendition'),
  355. namespace: queryAndParseElements<Namespace>(xml, 'namespace'),
  356. };
  357. }
  358. }
  359. @xmlParser('cRefPattern', CRefPatternParser)
  360. export class CRefPatternParser extends GenericElemParser implements Parser<XMLElement> {
  361. parse(xml: XMLElement): CRefPattern {
  362. return {
  363. ...super.parse(xml),
  364. type: CRefPattern,
  365. matchPattern: xml.getAttribute('matchPattern'),
  366. replacementPattern: xml.getAttribute('replacementPattern'),
  367. };
  368. }
  369. }
  370. @xmlParser('refState', RefStateParser)
  371. export class RefStateParser extends GenericElemParser implements Parser<XMLElement> {
  372. parse(xml: XMLElement): RefState {
  373. return {
  374. ...super.parse(xml),
  375. type: RefState,
  376. ed: xml.getAttribute('ed'),
  377. unit: xml.getAttribute('unit'),
  378. length: parseInt(xml.getAttribute('length'), 10) || 0,
  379. delim: xml.getAttribute('delim'),
  380. };
  381. }
  382. }
  383. @xmlParser('refsDecl', RefsDeclParser)
  384. export class RefsDeclParser extends GenericElemParser implements Parser<XMLElement> {
  385. cRefPatternParser = createParser(CRefPatternParser, this.genericParse);
  386. refStateParser = createParser(RefStateParser, this.genericParse);
  387. parse(xml: XMLElement): RefsDecl {
  388. return {
  389. ...super.parse(xml),
  390. type: RefsDecl,
  391. structuredData: Array.from(xml.children).filter(el => el.tagName === 'p').length !== xml.children.length,
  392. cRefPattern: queryAndParseElements<CRefPattern>(xml, 'cRefPattern'),
  393. refState: queryAndParseElements<RefState>(xml, 'refState'),
  394. };
  395. }
  396. }
  397. @xmlParser('encodingDesc', EncodingDescParser)
  398. export class EncodingDescParser extends GenericParser implements Parser<XMLElement> {
  399. parse(xml: XMLElement): EncodingDesc {
  400. return {
  401. ...super.parse(xml),
  402. type: EncodingDesc,
  403. structuredData: Array.from(xml.children).filter(el => el.tagName === 'p').length !== xml.children.length,
  404. projectDesc: queryAndParseElements<ProjectDesc>(xml, 'projectDesc'),
  405. samplingDecl: queryAndParseElements<SamplingDecl>(xml, 'samplingDecl'),
  406. editorialDecl: queryAndParseElements<EditorialDecl>(xml, 'editorialDecl'),
  407. tagsDecl: queryAndParseElements<TagsDecl>(xml, 'tagsDecl'),
  408. styleDefDecl: queryAndParseElement<GenericElement>(xml, 'styleDefDecl'),
  409. refsDecl: queryAndParseElements<RefsDecl>(xml, 'refsDecl'),
  410. classDecl: queryAndParseElements<GenericElement>(xml, 'classDecl'),
  411. geoDecl: queryAndParseElements<GenericElement>(xml, 'geoDecl'),
  412. unitDecl: queryAndParseElements<GenericElement>(xml, 'unitDecl'),
  413. schemaSpec: queryAndParseElements<GenericElement>(xml, 'schemaSpec'),
  414. schemaRef: queryAndParseElements<GenericElement>(xml, 'schemaRef'),
  415. };
  416. }
  417. }
  418. @xmlParser('abstract', AbstractParser)
  419. export class AbstractParser extends GenericElemParser implements Parser<XMLElement> {
  420. parse(xml: XMLElement): Abstract {
  421. return {
  422. ...super.parse(xml),
  423. type: Abstract,
  424. resp: xml.getAttribute('resp'),
  425. lang: xml.getAttribute('xml:lang'),
  426. };
  427. }
  428. }
  429. @xmlParser('calendar', CalendarParser)
  430. export class CalendarParser extends GenericElemParser implements Parser<XMLElement> {
  431. parse(xml: XMLElement): Calendar {
  432. return {
  433. ...super.parse(xml),
  434. type: Calendar,
  435. id: xml.getAttribute('xml:id'),
  436. target: xml.getAttribute('target'),
  437. };
  438. }
  439. }
  440. @xmlParser('calendarDesc', CalendarDescParser)
  441. export class CalendarDescParser extends GenericElemParser implements Parser<XMLElement> {
  442. parse(xml: XMLElement): CalendarDesc {
  443. return {
  444. ...super.parse(xml),
  445. type: CalendarDesc,
  446. calendars: queryAndParseElements<Calendar>(xml, 'calendar'),
  447. };
  448. }
  449. }
  450. @xmlParser('correspAction', CorrespActionParser)
  451. export class CorrespActionParser extends GenericElemParser implements Parser<XMLElement> {
  452. parse(xml: XMLElement): CorrespAction {
  453. return {
  454. ...super.parse(xml),
  455. type: CorrespAction,
  456. actionType: xml.getAttribute('type') as CorrespActionType,
  457. };
  458. }
  459. }
  460. @xmlParser('correspContext', CorrespContextParser)
  461. export class CorrespContextParser extends GenericElemParser implements Parser<XMLElement> {
  462. parse(xml: XMLElement): CorrespContext {
  463. return {
  464. ...super.parse(xml),
  465. type: CorrespContext,
  466. };
  467. }
  468. }
  469. @xmlParser('correspDesc', CorrespDescParser)
  470. export class CorrespDescParser extends GenericParser implements Parser<XMLElement> {
  471. parse(xml: XMLElement): CorrespDesc {
  472. return {
  473. ...super.parse(xml),
  474. type: CorrespDesc,
  475. content: queryAndParseElements<CorrespAction | CorrespContext | Note | Paragraph>(xml, 'correspAction, correspContext, note, p'),
  476. };
  477. }
  478. }
  479. @xmlParser('creation', CreationParser)
  480. export class CreationParser extends GenericElemParser implements Parser<XMLElement> {
  481. parse(xml: XMLElement): Creation {
  482. return {
  483. ...super.parse(xml),
  484. type: Creation,
  485. };
  486. }
  487. }
  488. @xmlParser('language', LanguageParser)
  489. export class LanguageParser extends GenericElemParser implements Parser<XMLElement> {
  490. parse(xml: XMLElement): Language {
  491. return {
  492. ...super.parse(xml),
  493. type: Language,
  494. ident: xml.getAttribute('ident'),
  495. usage: parseInt(xml.getAttribute('usage'), 10) || undefined,
  496. };
  497. }
  498. }
  499. @xmlParser('langUsage', LangUsageParser)
  500. export class LangUsageParser extends GenericElemParser implements Parser<XMLElement> {
  501. parse(xml: XMLElement): LangUsage {
  502. return {
  503. ...super.parse(xml),
  504. type: LangUsage,
  505. structuredData: Array.from(xml.querySelectorAll<XMLElement>(':scope > p')).length > 0,
  506. languages: queryAndParseElements<Language>(xml, 'language'),
  507. };
  508. }
  509. }
  510. @xmlParser('classCode', ClassCodeParser)
  511. export class ClassCodeParser extends GenericElemParser implements Parser<XMLElement> {
  512. parse(xml: XMLElement): ClassCode {
  513. return {
  514. ...super.parse(xml),
  515. type: ClassCode,
  516. scheme: xml.getAttribute('scheme'),
  517. };
  518. }
  519. }
  520. @xmlParser('catRef', CatRefParser)
  521. export class CatRefParser extends GenericElemParser implements Parser<XMLElement> {
  522. parse(xml: XMLElement): CatRef {
  523. return {
  524. ...super.parse(xml),
  525. type: CatRef,
  526. scheme: xml.getAttribute('scheme'),
  527. target: xml.getAttribute('target'),
  528. };
  529. }
  530. }
  531. @xmlParser('keywords', KeywordsParser)
  532. export class KeywordsParser extends GenericElemParser implements Parser<XMLElement> {
  533. parse(xml: XMLElement): Keywords {
  534. return {
  535. ...super.parse(xml),
  536. type: Keywords,
  537. scheme: xml.getAttribute('scheme'),
  538. terms: queryAndParseElements<Term>(xml, 'term'),
  539. };
  540. }
  541. }
  542. @xmlParser('textClass', TextClassParser)
  543. export class TextClassParser extends GenericElemParser implements Parser<XMLElement> {
  544. parse(xml: XMLElement): TextClass {
  545. return {
  546. ...super.parse(xml),
  547. type: TextClass,
  548. keywords: queryAndParseElements<Keywords>(xml, 'keywords'),
  549. catRef: queryAndParseElements<CatRef>(xml, 'catRef'),
  550. classCode: queryAndParseElements<ClassCode>(xml, 'classCode'),
  551. };
  552. }
  553. }
  554. @xmlParser('handNote', HandNoteParser)
  555. export class HandNoteParser extends GenericElemParser implements Parser<XMLElement> {
  556. parse(xml: XMLElement): HandNote {
  557. return {
  558. ...super.parse(xml),
  559. type: HandNote,
  560. id: getID(xml),
  561. scribe: xml.getAttribute('scribe'),
  562. scribeRef: xml.getAttribute('scribeRef'),
  563. script: xml.getAttribute('script'),
  564. scriptRef: xml.getAttribute('scriptRef'),
  565. medium: xml.getAttribute('medium'),
  566. scope: xml.getAttribute('scope') as HandNoteScope,
  567. };
  568. }
  569. }
  570. @xmlParser('handNotes', HandNotesParser)
  571. export class HandNotesParser extends GenericElemParser implements Parser<XMLElement> {
  572. parse(xml: XMLElement): HandNotes {
  573. return {
  574. ...super.parse(xml),
  575. type: HandNotes,
  576. content: queryAndParseElements<HandNote>(xml, 'keywords'),
  577. };
  578. }
  579. }
  580. @xmlParser('transpose', TransposeParser)
  581. export class TransposeParser extends GenericElemParser implements Parser<XMLElement> {
  582. parse(xml: XMLElement): Transpose {
  583. return {
  584. ...super.parse(xml),
  585. type: Transpose,
  586. content: queryAndParseElements<Ptr>(xml, 'ptr'),
  587. };
  588. }
  589. }
  590. @xmlParser('listTranspose', ListTransposeParser)
  591. export class ListTransposeParser extends GenericElemParser implements Parser<XMLElement> {
  592. parse(xml: XMLElement): ListTranspose {
  593. return {
  594. ...super.parse(xml),
  595. type: ListTranspose,
  596. description: queryAndParseElements<Description>(xml, 'desc'),
  597. transposes: queryAndParseElements<Transpose>(xml, 'transpose'),
  598. };
  599. }
  600. }
  601. @xmlParser('channel', ChannelParser)
  602. export class ChannelParser extends GenericElemParser implements Parser<XMLElement> {
  603. parse(xml: XMLElement): Channel {
  604. return {
  605. ...super.parse(xml),
  606. type: Channel,
  607. mode: xml.getAttribute('mode') as ChannelMode,
  608. };
  609. }
  610. }
  611. @xmlParser('constitution', ConstitutionParser)
  612. export class ConstitutionParser extends GenericElemParser implements Parser<XMLElement> {
  613. parse(xml: XMLElement): Constitution {
  614. return {
  615. ...super.parse(xml),
  616. type: Constitution,
  617. constitutionType: xml.getAttribute('type'),
  618. };
  619. }
  620. }
  621. @xmlParser('derivation', DerivationParser)
  622. export class DerivationParser extends GenericElemParser implements Parser<XMLElement> {
  623. parse(xml: XMLElement): Derivation {
  624. return {
  625. ...super.parse(xml),
  626. type: Derivation,
  627. derivationType: xml.getAttribute('type'),
  628. };
  629. }
  630. }
  631. @xmlParser('domain', DomainParser)
  632. export class DomainParser extends GenericElemParser implements Parser<XMLElement> {
  633. parse(xml: XMLElement): Domain {
  634. return {
  635. ...super.parse(xml),
  636. type: Domain,
  637. domainType: xml.getAttribute('type'),
  638. };
  639. }
  640. }
  641. @xmlParser('factuality', FactualityParser)
  642. export class FactualityParser extends GenericElemParser implements Parser<XMLElement> {
  643. parse(xml: XMLElement): Factuality {
  644. return {
  645. ...super.parse(xml),
  646. type: Factuality,
  647. factualityType: xml.getAttribute('type'),
  648. };
  649. }
  650. }
  651. @xmlParser('interaction', InteractionParser)
  652. export class InteractionParser extends GenericElemParser implements Parser<XMLElement> {
  653. parse(xml: XMLElement): Interaction {
  654. return {
  655. ...super.parse(xml),
  656. type: Interaction,
  657. interactionType: xml.getAttribute('type'),
  658. active: xml.getAttribute('type'),
  659. passive: xml.getAttribute('type'),
  660. };
  661. }
  662. }
  663. @xmlParser('preparedness', PreparednessParser)
  664. export class PreparednessParser extends GenericElemParser implements Parser<XMLElement> {
  665. parse(xml: XMLElement): Preparedness {
  666. return {
  667. ...super.parse(xml),
  668. type: Preparedness,
  669. preparednessType: xml.getAttribute('type'),
  670. };
  671. }
  672. }
  673. @xmlParser('purpose', PurposeParser)
  674. export class PurposeParser extends GenericElemParser implements Parser<XMLElement> {
  675. parse(xml: XMLElement): Purpose {
  676. return {
  677. ...super.parse(xml),
  678. type: Purpose,
  679. purposeType: xml.getAttribute('type'),
  680. degree: xml.getAttribute('degree') as Degree,
  681. };
  682. }
  683. }
  684. @xmlParser('change', ChangeParser)
  685. export class ChangeParser extends GenericParser implements Parser<XMLElement> {
  686. parse(xml: XMLElement): Change {
  687. return {
  688. ...super.parse(xml),
  689. type: Change,
  690. id: getID(xml),
  691. who: getDefaultAttr(xml.getAttribute('who')).replace('#', ''),
  692. status: xml.getAttribute('status') as Status,
  693. when: xml.getAttribute('when'),
  694. notBefore: xml.getAttribute('notBefore'),
  695. notAfter: xml.getAttribute('notAfter'),
  696. targets: getDefaultAttr(xml.getAttribute('target')).split(' ').map(t => t.replace('#', '')),
  697. };
  698. }
  699. }
  700. @xmlParser('textDesc', TextDescParser)
  701. export class TextDescParser extends GenericElemParser implements Parser<XMLElement> {
  702. parse(xml: XMLElement): TextDesc {
  703. return {
  704. ...super.parse(xml),
  705. type: TextDesc,
  706. channel: queryAndParseElements<Channel>(xml, 'channel'),
  707. constitution: queryAndParseElements<Constitution>(xml, 'constitution'),
  708. derivation: queryAndParseElements<Derivation>(xml, 'derivation'),
  709. domain: queryAndParseElements<Domain>(xml, 'domain'),
  710. factuality: queryAndParseElements<Factuality>(xml, 'factuality'),
  711. interaction: queryAndParseElements<Interaction>(xml, 'interaction'),
  712. preparedness: queryAndParseElements<Preparedness>(xml, 'preparedness'),
  713. purpose: queryAndParseElements<Purpose>(xml, 'purpose'),
  714. };
  715. }
  716. }
  717. @xmlParser('particDesc', ParticDescParser)
  718. export class ParticDescParser extends GenericElemParser implements Parser<XMLElement> {
  719. parse(xml: XMLElement): ParticDesc {
  720. return {
  721. ...super.parse(xml),
  722. type: ParticDesc,
  723. structuredData: Array.from(xml.children).filter(el => el.tagName === 'p').length !== xml.children.length,
  724. participants: queryAndParseElements<NamedEntitiesList>(xml, 'listPerson').concat(queryAndParseElements<NamedEntitiesList>(xml, 'listOrg')),
  725. };
  726. }
  727. }
  728. @xmlParser('setting', SettingParser)
  729. export class SettingParser extends GenericElemParser implements Parser<XMLElement> {
  730. parse(xml: XMLElement): Setting {
  731. const names = queryAndParseElements<GenericElement>(xml, 'name');
  732. const orgNames = queryAndParseElements<GenericElement>(xml, 'orgName');
  733. const persNames = queryAndParseElements<GenericElement>(xml, 'persName');
  734. const placeNames = queryAndParseElements<GenericElement>(xml, 'placeName');
  735. return {
  736. ...super.parse(xml),
  737. type: Setting,
  738. who: xml.getAttribute('who'),
  739. name: names.concat(orgNames).concat(persNames).concat(placeNames),
  740. date: queryAndParseElements(xml, 'date'),
  741. time: queryAndParseElements(xml, 'time'),
  742. locale: queryAndParseElements(xml, 'locale'),
  743. activity: queryAndParseElements(xml, 'activity'),
  744. };
  745. }
  746. }
  747. @xmlParser('settingDesc', SettingDescParser)
  748. export class SettingDescParser extends GenericElemParser implements Parser<XMLElement> {
  749. parse(xml: XMLElement): SettingDesc {
  750. return {
  751. ...super.parse(xml),
  752. type: SettingDesc,
  753. structuredData: Array.from(xml.children).filter(el => el.tagName === 'p').length !== xml.children.length,
  754. settings: queryAndParseElements<Setting>(xml, 'setting'),
  755. places: queryAndParseElements<NamedEntitiesList>(xml, 'listPlace'),
  756. };
  757. }
  758. }
  759. @xmlParser('listChange', ListChangeParser)
  760. export class ListChangeParser extends GenericParser implements Parser<XMLElement> {
  761. parse(xml: XMLElement): ListChange {
  762. return {
  763. ...super.parse(xml),
  764. type: ListChange,
  765. content: complexElements(xml.childNodes, true).filter((child: XMLElement) => child.tagName !== 'desc')
  766. .map(child => parseElement<ListChange | Change>(child as XMLElement)),
  767. description: queryAndParseElement<Description>(xml, 'desc'),
  768. id: getID(xml),
  769. ordered: isBoolString(xml.getAttribute('ordered')),
  770. };
  771. }
  772. }
  773. @xmlParser('profileDesc', ProfileDescParser)
  774. export class ProfileDescParser extends GenericParser implements Parser<XMLElement> {
  775. parse(xml: XMLElement): ProfileDesc {
  776. return {
  777. ...super.parse(xml),
  778. type: ProfileDesc,
  779. abstract: queryAndParseElements<Abstract>(xml, 'abstract'),
  780. calendarDesc: queryAndParseElements<CalendarDesc>(xml, 'calendarDesc'),
  781. correspDesc: queryAndParseElements<CorrespDesc>(xml, 'correspDesc'),
  782. creation: queryAndParseElements<Creation>(xml, 'creation'),
  783. handNotes: queryAndParseElements<HandNotes>(xml, 'handNotes'),
  784. langUsage: queryAndParseElements<LangUsage>(xml, 'langUsage'),
  785. listTranspose: queryAndParseElements<ListTranspose>(xml, 'listTranspose'),
  786. particDesc: queryAndParseElements<ParticDesc>(xml, 'particDesc'),
  787. settingDesc: queryAndParseElements<SettingDesc>(xml, 'settingDesc'),
  788. textClass: queryAndParseElements<TextClass>(xml, 'textClass'),
  789. textDesc: queryAndParseElements<TextDesc>(xml, 'textDesc'),
  790. };
  791. }
  792. }
  793. @xmlParser('revisionDesc', RevisionDescParser)
  794. export class RevisionDescParser extends GenericParser implements Parser<XMLElement> {
  795. parse(xml: XMLElement): RevisionDesc {
  796. return {
  797. ...super.parse(xml),
  798. type: RevisionDesc,
  799. content: complexElements(xml.childNodes, true).map(child => parseElement<ListChange | Change>(child as XMLElement)),
  800. status: xml.getAttribute('status') as Status,
  801. };
  802. }
  803. }