msdesc-parser.ts 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044
  1. import { isBoolString } from 'src/app/utils/js-utils';
  2. import { xmlParser } from '.';
  3. import {
  4. AccMat, Acquisition, Additional, Additions, AdminInfo, AltIdentifier, Binding, BindingDesc, Collation, CollectionEl, Condition,
  5. CustEvent, CustodialHist, DecoDesc, DecoNote, Depth, Dim, Dimensions, Explicit, Filiation, FinalRubric, Foliation,
  6. G, HandDesc, HandNote, Head, Height, History, Identifier, Incipit, Institution, Layout, LayoutDesc, Locus, LocusGrp, MaterialValues,
  7. MsContents, MsDesc, MsFrag, MsIdentifier, MsItem, MsItemStruct, MsName, MsPart, MusicNotation, Note, ObjectDesc, OrigDate,
  8. Origin, OrigPlace, Paragraph, PhysDesc, Provenance, RecordHist, Repository, Rubric, ScriptDesc, Seal, SealDesc, Source, Summary,
  9. Support, SupportDesc, Surrogates, Text, TypeDesc, TypeNote, Width, XMLElement,
  10. } from '../../models/evt-models';
  11. import { GenericElemParser, queryAndParseElement, queryAndParseElements } from './basic-parsers';
  12. import { GParser } from './character-declarations-parser';
  13. import { createParser, getClass, getDefaultN, getID, parseChildren, Parser, unhandledElement } from './parser-models';
  14. class GAttrParser extends GenericElemParser {
  15. protected gParser = createParser(GParser, this.genericParse);
  16. }
  17. @xmlParser('dim', DimParser)
  18. export class DimParser extends GAttrParser implements Parser<XMLElement> {
  19. parse(xml: XMLElement): Dim {
  20. const genericElem = super.parse(xml);
  21. const { dimType, scope, extent, unit, quantity, atLeast, atMost, min, max } = genericElem.attributes;
  22. return {
  23. ...genericElem,
  24. type: Dim,
  25. scope,
  26. extent,
  27. unit,
  28. quantity: quantity ? parseInt(quantity, 10) : undefined,
  29. atLeast: atLeast ? parseInt(atLeast, 10) : undefined,
  30. atMost: atMost ? parseInt(atMost, 10) : undefined,
  31. min: min ? parseInt(min, 10) : undefined,
  32. max: max ? parseInt(max, 10) : undefined,
  33. dimType,
  34. gEl: queryAndParseElements<G>(xml, 'g'),
  35. };
  36. }
  37. }
  38. @xmlParser('depth', DepthParser)
  39. export class DepthParser extends GAttrParser implements Parser<XMLElement> {
  40. parse(xml: XMLElement): Depth {
  41. const genericElem = super.parse(xml);
  42. const { scope, extent, unit, quantity, atLeast, atMost, min, max } = genericElem.attributes;
  43. return {
  44. ...genericElem,
  45. type: Depth,
  46. scope,
  47. extent,
  48. unit,
  49. quantity: quantity ? parseInt(quantity, 10) : undefined,
  50. atLeast: atLeast ? parseInt(atLeast, 10) : undefined,
  51. atMost: atMost ? parseInt(atMost, 10) : undefined,
  52. min: min ? parseInt(min, 10) : undefined,
  53. max: max ? parseInt(max, 10) : undefined,
  54. gEl: queryAndParseElements<G>(xml, 'g'),
  55. };
  56. }
  57. }
  58. @xmlParser('width', WidthParser)
  59. export class WidthParser extends GAttrParser implements Parser<XMLElement> {
  60. parse(xml: XMLElement): Width {
  61. const genericElem = super.parse(xml);
  62. const { scope, extent, unit, quantity, atLeast, atMost, min, max } = genericElem.attributes;
  63. return {
  64. ...genericElem,
  65. type: Width,
  66. scope,
  67. extent,
  68. unit,
  69. quantity: quantity ? parseInt(quantity, 10) : undefined,
  70. atLeast: atLeast ? parseInt(atLeast, 10) : undefined,
  71. atMost: atMost ? parseInt(atMost, 10) : undefined,
  72. min: min ? parseInt(min, 10) : undefined,
  73. max: max ? parseInt(max, 10) : undefined,
  74. gEl: queryAndParseElements<G>(xml, 'g'),
  75. };
  76. }
  77. }
  78. @xmlParser('height', HeightParser)
  79. export class HeightParser extends GAttrParser implements Parser<XMLElement> {
  80. parse(xml: XMLElement): Height {
  81. const genericElem = super.parse(xml);
  82. const { scope, extent, unit, quantity, atLeast, atMost, min, max } = genericElem.attributes;
  83. return {
  84. ...genericElem,
  85. type: Height,
  86. scope,
  87. extent,
  88. unit,
  89. quantity: quantity ? parseInt(quantity, 10) : undefined,
  90. atLeast: atLeast ? parseInt(atLeast, 10) : undefined,
  91. atMost: atMost ? parseInt(atMost, 10) : undefined,
  92. min: min ? parseInt(min, 10) : undefined,
  93. max: max ? parseInt(max, 10) : undefined,
  94. gEl: queryAndParseElements<G>(xml, 'g'),
  95. };
  96. }
  97. }
  98. @xmlParser('dimensions', DimensionsParser)
  99. export class DimensionsParser extends GenericElemParser implements Parser<XMLElement> {
  100. parse(xml: XMLElement): Dimensions {
  101. const genericElem = super.parse(xml);
  102. const { dimensionsType, scope, extent, unit, quantity, atLeast, atMost, min, max } = genericElem.attributes;
  103. return {
  104. ...genericElem,
  105. type: Dimensions,
  106. dimensionsType,
  107. scope,
  108. extent,
  109. unit,
  110. quantity: quantity ? parseInt(quantity, 10) : undefined,
  111. atLeast: atLeast ? parseInt(atLeast, 10) : undefined,
  112. atMost: atMost ? parseInt(atMost, 10) : undefined,
  113. min: min ? parseInt(min, 10) : undefined,
  114. max: max ? parseInt(max, 10) : undefined,
  115. height: queryAndParseElement<Height>(xml, 'height'),
  116. width: queryAndParseElement<Width>(xml, 'width'),
  117. depth: queryAndParseElement<Depth>(xml, 'depth'),
  118. dim: queryAndParseElement<Dim>(xml, 'dim'),
  119. };
  120. }
  121. }
  122. @xmlParser('acquisition', AcquisitionParser)
  123. export class AcquisitionParser extends GenericElemParser implements Parser<XMLElement> {
  124. parse(xml: XMLElement): Acquisition {
  125. const genericElem = super.parse(xml);
  126. const { notBefore, notAfter } = genericElem.attributes;
  127. return {
  128. ...genericElem,
  129. type: Acquisition,
  130. notBefore,
  131. notAfter,
  132. name: unhandledElement(xml, 'name', this.genericParse),
  133. };
  134. }
  135. }
  136. @xmlParser('origDate', OrigDateParser)
  137. export class OrigDateParser extends GenericElemParser implements Parser<XMLElement> {
  138. parse(xml: XMLElement): OrigDate {
  139. const genericElem = super.parse(xml);
  140. const { notBefore, notAfter, when, origDateType } = genericElem.attributes;
  141. return {
  142. ...genericElem,
  143. type: OrigDate,
  144. notBefore,
  145. notAfter,
  146. when,
  147. origDateType,
  148. };
  149. }
  150. }
  151. @xmlParser('origPlace', OrigPlaceParser)
  152. export class OrigPlaceParser extends GenericElemParser implements Parser<XMLElement> {
  153. parse(xml: XMLElement): OrigPlace {
  154. const genericElem = super.parse(xml);
  155. const { key, origPlaceType } = genericElem.attributes;
  156. return {
  157. ...genericElem,
  158. type: OrigPlace,
  159. key,
  160. origPlaceType,
  161. };
  162. }
  163. }
  164. @xmlParser('origin', OriginParser)
  165. export class OriginParser extends GenericElemParser implements Parser<XMLElement> {
  166. parse(xml: XMLElement): Origin {
  167. const genericElem = super.parse(xml);
  168. const { notBefore, notAfter, evidence, resp } = genericElem.attributes;
  169. return {
  170. ...genericElem,
  171. type: Origin,
  172. notBefore,
  173. notAfter,
  174. evidence,
  175. resp,
  176. origDate: queryAndParseElement(xml, 'origDate'),
  177. origPlace: queryAndParseElement(xml, 'origPlace'),
  178. };
  179. }
  180. }
  181. @xmlParser('provenance', ProvenanceParser)
  182. export class ProvenanceParser extends GenericElemParser implements Parser<XMLElement> {
  183. parse(xml: XMLElement): Provenance {
  184. const genericElem = super.parse(xml);
  185. const { when } = genericElem.attributes;
  186. return {
  187. ...genericElem,
  188. type: Acquisition,
  189. when,
  190. };
  191. }
  192. }
  193. @xmlParser('history', HistoryParser)
  194. export class HistoryParser extends GenericElemParser implements Parser<XMLElement> {
  195. parse(xml: XMLElement): History {
  196. return {
  197. ...super.parse(xml),
  198. type: History,
  199. acquisition: queryAndParseElement(xml, 'acquisition'),
  200. origin: queryAndParseElement(xml, 'origin'),
  201. provenance: queryAndParseElements(xml, 'provenance'),
  202. summary: queryAndParseElement(xml, 'summary'),
  203. pEl: queryAndParseElements<Paragraph>(xml, 'p'),
  204. };
  205. }
  206. }
  207. @xmlParser('layout', LayoutParser)
  208. export class LayoutParser extends GenericElemParser implements Parser<XMLElement> {
  209. parse(xml: XMLElement): Layout {
  210. const genericElem = super.parse(xml);
  211. const { columns, streams, ruledLines, writtenLines } = genericElem.attributes;
  212. return {
  213. ...genericElem,
  214. type: LayoutDesc,
  215. columns: columns ? parseInt(columns, 10) : undefined,
  216. streams: streams ? parseInt(streams, 10) : undefined,
  217. ruledLines: ruledLines ? parseInt(ruledLines, 10) : undefined,
  218. writtenLines: writtenLines ? parseInt(writtenLines, 10) : undefined,
  219. pEl: queryAndParseElements<Paragraph>(xml, 'p'),
  220. };
  221. }
  222. }
  223. @xmlParser('layoutDesc', LayoutDescParser)
  224. export class LayoutDescParser extends GenericElemParser implements Parser<XMLElement> {
  225. parse(xml: XMLElement): LayoutDesc {
  226. return {
  227. ...super.parse(xml),
  228. type: LayoutDesc,
  229. pEl: queryAndParseElements<Paragraph>(xml, 'p'),
  230. ab: unhandledElement(xml, 'ab', this.genericParse),
  231. summary: queryAndParseElement(xml, 'provenance'),
  232. layout: queryAndParseElement(xml, 'layout'),
  233. };
  234. }
  235. }
  236. @xmlParser('support', SupportParser)
  237. export class SupportParser extends GenericElemParser implements Parser<XMLElement> {
  238. parse(xml: XMLElement): Support {
  239. return {
  240. ...super.parse(xml),
  241. type: Support,
  242. material: unhandledElement(xml, 'material', this.genericParse),
  243. watermark: unhandledElement(xml, 'watermark', this.genericParse),
  244. };
  245. }
  246. }
  247. @xmlParser('collation', CollationParser)
  248. export class CollationParser extends GenericElemParser implements Parser<XMLElement> {
  249. parse(xml: XMLElement): Collation {
  250. return {
  251. ...super.parse(xml),
  252. type: Collation,
  253. pEl: queryAndParseElements(xml, 'p'),
  254. };
  255. }
  256. }
  257. @xmlParser('condition', ConditionParser)
  258. export class ConditionParser extends GenericElemParser implements Parser<XMLElement> {
  259. parse(xml: XMLElement): Condition {
  260. return {
  261. ...super.parse(xml),
  262. type: Condition,
  263. pEl: queryAndParseElements(xml, 'p'),
  264. };
  265. }
  266. }
  267. @xmlParser('foliation', FoliationParser)
  268. export class FoliationParser extends GenericElemParser implements Parser<XMLElement> {
  269. parse(xml: XMLElement): Foliation {
  270. return {
  271. ...super.parse(xml),
  272. type: Foliation,
  273. id: getID(xml),
  274. pEl: queryAndParseElements(xml, 'p'),
  275. };
  276. }
  277. }
  278. @xmlParser('supportDesc', SupportDescParser)
  279. export class SupportDescParser extends GenericElemParser implements Parser<XMLElement> {
  280. parse(xml: XMLElement): SupportDesc {
  281. return {
  282. ...super.parse(xml),
  283. type: SupportDesc,
  284. material: xml.getAttribute('material') as MaterialValues,
  285. pEl: queryAndParseElements(xml, 'p'),
  286. ab: unhandledElement(xml, 'ab', this.genericParse),
  287. extents: unhandledElement(xml, 'extent', this.genericParse),
  288. support: queryAndParseElement(xml, 'support'),
  289. collation: queryAndParseElement(xml, 'collation'),
  290. foliation: queryAndParseElement(xml, 'foliation'),
  291. condition: queryAndParseElement(xml, 'condition'),
  292. };
  293. }
  294. }
  295. @xmlParser('objectDesc', ObjectDescParser)
  296. export class ObjectDescParser extends GenericElemParser implements Parser<XMLElement> {
  297. parse(xml: XMLElement): ObjectDesc {
  298. const genericElem = super.parse(xml);
  299. const { form } = genericElem.attributes;
  300. return {
  301. ...genericElem,
  302. type: ObjectDesc,
  303. form,
  304. layoutDesc: queryAndParseElement(xml, 'layoutDesc'),
  305. supportDesc: queryAndParseElement(xml, 'supportDesc'),
  306. pEl: queryAndParseElements(xml, 'p'),
  307. };
  308. }
  309. }
  310. @xmlParser('decoNote', DecoNoteParser)
  311. export class DecoNoteParser extends GenericElemParser implements Parser<XMLElement> {
  312. parse(xml: XMLElement): DecoNote {
  313. const genericElem = super.parse(xml);
  314. const { decoNoteType } = genericElem.attributes;
  315. return {
  316. ...genericElem,
  317. type: DecoNote,
  318. decoNoteType,
  319. watermark: unhandledElement(xml, 'watermark', this.genericParse),
  320. };
  321. }
  322. }
  323. @xmlParser('binding', BindingParser)
  324. export class BindingParser extends GenericElemParser implements Parser<XMLElement> {
  325. parse(xml: XMLElement): Binding {
  326. return {
  327. ...super.parse(xml),
  328. type: Binding,
  329. contemporary: true || false,
  330. decoNote: queryAndParseElements(xml, 'decoNote'),
  331. pEl: queryAndParseElements(xml, 'p'),
  332. condition: unhandledElement(xml, 'condition', this.genericParse),
  333. ab: unhandledElement(xml, 'ab', this.genericParse),
  334. };
  335. }
  336. }
  337. @xmlParser('bindingDesc', BindingDescParser)
  338. export class BindingDescParser extends GenericElemParser implements Parser<XMLElement> {
  339. parse(xml: XMLElement): BindingDesc {
  340. return {
  341. ...super.parse(xml),
  342. type: BindingDesc,
  343. condition: unhandledElement(xml, 'condition', this.genericParse),
  344. decoNote: queryAndParseElements(xml, 'decoNote'),
  345. binding: queryAndParseElements(xml, 'binding'),
  346. pEl: queryAndParseElements(xml, 'p'),
  347. };
  348. }
  349. }
  350. @xmlParser('summary', SummaryParser)
  351. export class SummaryParser extends GenericElemParser implements Parser<XMLElement> {
  352. parse(xml: XMLElement): Summary {
  353. return {
  354. ...super.parse(xml),
  355. type: Summary,
  356. pEl: queryAndParseElements(xml, 'p'),
  357. };
  358. }
  359. }
  360. @xmlParser('decoDesc', DecoDescParser)
  361. export class DecoDescParser extends GenericElemParser implements Parser<XMLElement> {
  362. parse(xml: XMLElement): DecoDesc {
  363. return {
  364. ...super.parse(xml),
  365. type: DecoDesc,
  366. decoNote: queryAndParseElement(xml, 'decoNote'),
  367. pEl: queryAndParseElements(xml, 'p'),
  368. summary: queryAndParseElement(xml, 'summary'),
  369. ab: unhandledElement(xml, 'ab', this.genericParse),
  370. };
  371. }
  372. }
  373. @xmlParser('handDesc', HandDescParser)
  374. export class HandDescParser extends GenericElemParser implements Parser<XMLElement> {
  375. parse(xml: XMLElement): HandDesc {
  376. const genericElem = super.parse(xml);
  377. const { hands } = genericElem.attributes;
  378. return {
  379. ...genericElem,
  380. type: HandDesc,
  381. hands,
  382. handNote: queryAndParseElements<HandNote>(xml, 'handNote'),
  383. };
  384. }
  385. }
  386. @xmlParser('additions', AdditionsParser)
  387. export class AdditionsParser extends GenericElemParser implements Parser<XMLElement> {
  388. parse(xml: XMLElement): Additions {
  389. return {
  390. ...super.parse(xml),
  391. type: Additions,
  392. pEl: queryAndParseElements(xml, 'p'),
  393. };
  394. }
  395. }
  396. @xmlParser('scriptDesc', ScriptDescParser)
  397. export class ScriptDescParser extends GenericElemParser implements Parser<XMLElement> {
  398. parse(xml: XMLElement): ScriptDesc {
  399. return {
  400. ...super.parse(xml),
  401. type: ScriptDesc,
  402. content: parseChildren(xml, this.genericParse),
  403. attributes: this.attributeParser.parse(xml),
  404. summary: queryAndParseElement(xml, 'summary'),
  405. scriptNote: unhandledElement(xml, 'scriptNote', this.genericParse),
  406. };
  407. }
  408. }
  409. @xmlParser('seal', SealParser)
  410. export class SealParser extends GenericElemParser implements Parser<XMLElement> {
  411. parse(xml: XMLElement): Seal {
  412. const genericElem = super.parse(xml);
  413. const { n, sealType } = genericElem.attributes;
  414. return {
  415. ...genericElem,
  416. type: Seal,
  417. contemporary: isBoolString(xml.getAttribute('contemporary')),
  418. decoNote: queryAndParseElement(xml, 'decoNote'),
  419. sealType,
  420. n: getDefaultN(n),
  421. pEl: queryAndParseElements(xml, 'p'),
  422. ab: unhandledElement(xml, 'ab', this.genericParse),
  423. };
  424. }
  425. }
  426. @xmlParser('sealDesc', SealDescParser)
  427. export class SealDescParser extends GenericElemParser implements Parser<XMLElement> {
  428. parse(xml: XMLElement): SealDesc {
  429. return {
  430. ...super.parse(xml),
  431. type: SealDesc,
  432. seal: queryAndParseElement(xml, 'seal'),
  433. };
  434. }
  435. }
  436. @xmlParser('typeNote', TypeNoteParser)
  437. export class TypeNoteParser extends GenericElemParser implements Parser<XMLElement> {
  438. parse(xml: XMLElement): TypeNote {
  439. const genericElem = super.parse(xml);
  440. const { scope } = genericElem.attributes;
  441. return {
  442. ...genericElem,
  443. type: TypeNote,
  444. id: getID(xml),
  445. scope,
  446. };
  447. }
  448. }
  449. @xmlParser('typeDesc', TypeDescParser)
  450. export class TypeDescParser extends GenericElemParser implements Parser<XMLElement> {
  451. parse(xml: XMLElement): TypeDesc {
  452. return {
  453. ...super.parse(xml),
  454. type: TypeDesc,
  455. summary: queryAndParseElement(xml, 'summary'),
  456. typeNote: queryAndParseElement(xml, 'typeNote'),
  457. };
  458. }
  459. }
  460. @xmlParser('accMat', AccMatParser)
  461. export class AccMatParser extends GenericElemParser implements Parser<XMLElement> {
  462. parse(xml: XMLElement): AccMat {
  463. return {
  464. ...super.parse(xml),
  465. type: AccMat,
  466. pEl: queryAndParseElements(xml, 'p'),
  467. };
  468. }
  469. }
  470. @xmlParser('musicNotation', MusicNotationParser)
  471. export class MusicNotationParser extends GenericElemParser implements Parser<XMLElement> {
  472. parse(xml: XMLElement): MusicNotation {
  473. return {
  474. ...super.parse(xml),
  475. type: MusicNotation,
  476. term: unhandledElement(xml, 'term', this.genericParse),
  477. };
  478. }
  479. }
  480. @xmlParser('physDesc', PhysDescParser)
  481. export class PhysDescParser extends GenericElemParser implements Parser<XMLElement> {
  482. parse(xml: XMLElement): PhysDesc {
  483. return {
  484. ...super.parse(xml),
  485. type: PhysDesc,
  486. objectDesc: queryAndParseElement(xml, 'objectDesc'),
  487. bindingDesc: queryAndParseElement(xml, 'bindingDesc'),
  488. decoDesc: queryAndParseElement(xml, 'decoDesc'),
  489. handDesc: queryAndParseElement(xml, 'handDesc'),
  490. accMat: queryAndParseElement(xml, 'accMat'),
  491. additions: queryAndParseElement(xml, 'additions'),
  492. musicNotation: queryAndParseElement(xml, 'musicNotation'),
  493. scriptDesc: queryAndParseElement(xml, 'scriptDesc'),
  494. sealDesc: queryAndParseElement(xml, 'sealDesc'),
  495. typeDesc: queryAndParseElement(xml, 'typeDesc'),
  496. pEl: queryAndParseElements<Paragraph>(xml, 'p'),
  497. };
  498. }
  499. }
  500. @xmlParser('finalRubric', FinalRubricParser)
  501. export class FinalRubricParser extends GenericElemParser implements Parser<XMLElement> {
  502. parse(xml: XMLElement): FinalRubric {
  503. return {
  504. ...super.parse(xml),
  505. type: FinalRubric,
  506. lbEl: queryAndParseElements(xml, 'lb'),
  507. };
  508. }
  509. }
  510. @xmlParser('locus', LocusParser)
  511. export class LocusParser extends GenericElemParser implements Parser<XMLElement> {
  512. parse(xml: XMLElement): Locus {
  513. const genericElem = super.parse(xml);
  514. const { scheme, from, to, facs, target } = genericElem.attributes;
  515. return {
  516. ...genericElem,
  517. type: Locus,
  518. scheme,
  519. from,
  520. to,
  521. facs,
  522. target,
  523. gEl: queryAndParseElements(xml, 'g'),
  524. locus: queryAndParseElement(xml, 'locus'),
  525. hi: unhandledElement(xml, 'hi', this.genericParse),
  526. };
  527. }
  528. }
  529. @xmlParser('locusGrp', LocusGrpParser)
  530. export class LocusGrpParser extends GenericElemParser implements Parser<XMLElement> {
  531. parse(xml: XMLElement): LocusGrp {
  532. const genericElem = super.parse(xml);
  533. const { scheme } = genericElem.attributes;
  534. return {
  535. ...genericElem,
  536. type: LocusGrp,
  537. scheme,
  538. locus: queryAndParseElement(xml, 'locus'),
  539. };
  540. }
  541. }
  542. @xmlParser('incipit', IncipitParser)
  543. export class IncipitParser extends GenericElemParser implements Parser<XMLElement> {
  544. parse(xml: XMLElement): Incipit {
  545. const genericElem = super.parse(xml);
  546. const { lang } = genericElem.attributes;
  547. return {
  548. ...genericElem,
  549. type: Incipit,
  550. defective: isBoolString(xml.getAttribute('defective')),
  551. lang,
  552. lbEl: queryAndParseElements(xml, 'lb'),
  553. locus: queryAndParseElement(xml, 'locus'),
  554. };
  555. }
  556. }
  557. @xmlParser('explicit', ExplicitParser)
  558. export class ExplicitParser extends GenericElemParser implements Parser<XMLElement> {
  559. parse(xml: XMLElement): Explicit {
  560. const genericElem = super.parse(xml);
  561. const { lang } = genericElem.attributes;
  562. return {
  563. ...genericElem,
  564. type: Explicit,
  565. defective: isBoolString(xml.getAttribute('defective')),
  566. lang,
  567. locus: queryAndParseElement(xml, 'locus'),
  568. };
  569. }
  570. }
  571. @xmlParser('rubric', RubricParser)
  572. export class RubricParser extends GenericElemParser implements Parser<XMLElement> {
  573. parse(xml: XMLElement): Rubric {
  574. const genericElem = super.parse(xml);
  575. const { lang, rend } = genericElem.attributes;
  576. return {
  577. ...genericElem,
  578. type: Rubric,
  579. lang,
  580. rend,
  581. lbEl: queryAndParseElements(xml, 'lb'),
  582. locus: queryAndParseElement(xml, 'locus'),
  583. stamp: unhandledElement(xml, 'stamp', this.genericParse),
  584. };
  585. }
  586. }
  587. @xmlParser('filiation', FiliationParser)
  588. export class FiliationParser extends GenericElemParser implements Parser<XMLElement> {
  589. parse(xml: XMLElement): Filiation {
  590. const genericElem = super.parse(xml);
  591. const { filiationType } = genericElem.attributes;
  592. return {
  593. ...genericElem,
  594. type: Filiation,
  595. filiationType,
  596. };
  597. }
  598. }
  599. @xmlParser('msItemStruct', MsItemStructParser)
  600. export class MsItemStructParser extends GenericElemParser implements Parser<XMLElement> {
  601. parse(xml: XMLElement): MsItemStruct {
  602. const genericElem = super.parse(xml);
  603. const { n } = genericElem.attributes;
  604. return {
  605. ...genericElem,
  606. type: MsItemStruct,
  607. n: getDefaultN(n),
  608. defective: isBoolString(xml.getAttribute('defective')),
  609. authors: unhandledElement(xml, 'author', this.genericParse),
  610. titles: unhandledElement(xml, 'title', this.genericParse),
  611. textLangs: unhandledElement(xml, 'textLang', this.genericParse),
  612. bibl: unhandledElement(xml, 'bibl', this.genericParse),
  613. respStmt: unhandledElement(xml, 'respStmt', this.genericParse),
  614. quote: unhandledElement(xml, 'quote', this.genericParse),
  615. listBibl: unhandledElement(xml, 'listBibl', this.genericParse),
  616. colophons: unhandledElement(xml, 'colophon', this.genericParse),
  617. rubric: queryAndParseElement<Rubric>(xml, 'rubric'),
  618. incipit: queryAndParseElement<Incipit>(xml, 'incipit'),
  619. explicit: queryAndParseElement<Explicit>(xml, 'explicit'),
  620. finalRubric: queryAndParseElement<FinalRubric>(xml, 'finalRubric'),
  621. decoNote: queryAndParseElement<DecoNote>(xml, 'decoNote'),
  622. filiation: queryAndParseElements<Filiation>(xml, 'filiation'),
  623. locus: queryAndParseElement<Locus>(xml, 'locus'),
  624. noteEl: queryAndParseElements<Note>(xml, 'note'),
  625. };
  626. }
  627. }
  628. @xmlParser('msItem', MsItemParser)
  629. export class MsItemParser extends MsItemStructParser implements Parser<XMLElement> {
  630. parse(xml: XMLElement): MsItem {
  631. return {
  632. ...super.parse(xml),
  633. type: MsItem,
  634. docAuthors: unhandledElement(xml, 'docAuthor', this.genericParse),
  635. docTitles: unhandledElement(xml, 'docTitle', this.genericParse),
  636. docImprints: unhandledElement(xml, 'docImprint', this.genericParse),
  637. docDate: unhandledElement(xml, 'docDate', this.genericParse),
  638. locusGrp: queryAndParseElement<LocusGrp>(xml, 'locusGrp'),
  639. gapEl: queryAndParseElements(xml, 'gap'),
  640. msItem: queryAndParseElements(xml, 'msItem'),
  641. };
  642. }
  643. }
  644. @xmlParser('custEvent', CustEventParser)
  645. export class CustEventParser extends GenericElemParser implements Parser<XMLElement> {
  646. parse(xml: XMLElement): CustEvent {
  647. const genericElem = super.parse(xml);
  648. const { notBefore, notAfter, when, from, to, custEventType } = genericElem.attributes;
  649. return {
  650. ...super.parse(xml),
  651. type: CustEvent,
  652. notBefore,
  653. notAfter,
  654. when,
  655. from,
  656. to,
  657. custEventType,
  658. };
  659. }
  660. }
  661. @xmlParser('custodialHist', CustodialHistParser)
  662. export class CustodialHistParser extends GenericElemParser implements Parser<XMLElement> {
  663. parse(xml: XMLElement): CustodialHist {
  664. return {
  665. ...super.parse(xml),
  666. type: CustodialHist,
  667. custEvent: queryAndParseElements(xml, 'custEvent'),
  668. ab: unhandledElement(xml, 'ab', this.genericParse),
  669. pEl: queryAndParseElements<Paragraph>(xml, 'p'),
  670. };
  671. }
  672. }
  673. @xmlParser('source', SourceParser)
  674. export class SourceParser extends GenericElemParser implements Parser<XMLElement> {
  675. parse(xml: XMLElement): Source {
  676. return {
  677. ...super.parse(xml),
  678. type: Source,
  679. pEl: queryAndParseElements<Paragraph>(xml, 'p'),
  680. };
  681. }
  682. }
  683. @xmlParser('recordHist', RecordHistParser)
  684. export class RecordHistParser extends GenericElemParser implements Parser<XMLElement> {
  685. parse(xml: XMLElement): RecordHist {
  686. return {
  687. ...super.parse(xml),
  688. type: RecordHist,
  689. changes: unhandledElement(xml, 'change', this.genericParse),
  690. source: queryAndParseElements(xml, 'source'),
  691. ab: unhandledElement(xml, 'ab', this.genericParse),
  692. pEl: queryAndParseElements<Paragraph>(xml, 'p'),
  693. };
  694. }
  695. }
  696. @xmlParser('adminInfo', AdminInfoParser)
  697. export class AdminInfoParser extends GenericElemParser implements Parser<XMLElement> {
  698. parse(xml: XMLElement): AdminInfo {
  699. return {
  700. ...super.parse(xml),
  701. type: AdminInfo,
  702. noteEl: queryAndParseElements(xml, 'note'),
  703. availabilities: unhandledElement(xml, 'availability', this.genericParse),
  704. custodialHist: queryAndParseElement(xml, 'custodialHist'),
  705. recordHist: queryAndParseElement(xml, 'recordHist'),
  706. };
  707. }
  708. }
  709. @xmlParser('surrogates', SurrogatesParser)
  710. export class SurrogatesParser extends GenericElemParser implements Parser<XMLElement> {
  711. parse(xml: XMLElement): Surrogates {
  712. return {
  713. ...super.parse(xml),
  714. type: Surrogates,
  715. bibls: unhandledElement(xml, 'bibl', this.genericParse),
  716. pEl: queryAndParseElements<Paragraph>(xml, 'p'),
  717. };
  718. }
  719. }
  720. @xmlParser('additional', AdditionalParser)
  721. export class AdditionalParser extends GenericElemParser implements Parser<XMLElement> {
  722. parse(xml: XMLElement): Additional {
  723. return {
  724. ...super.parse(xml),
  725. type: Summary,
  726. class: getClass(xml),
  727. content: parseChildren(xml, this.genericParse),
  728. attributes: this.attributeParser.parse(xml),
  729. listBibls: unhandledElement(xml, 'listBibl', this.genericParse),
  730. adminInfo: queryAndParseElement(xml, 'adminInfo'),
  731. surrogates: queryAndParseElement(xml, 'surrogates'),
  732. };
  733. }
  734. }
  735. @xmlParser('repository', RepositoryParser)
  736. export class RepositoryParser extends GenericElemParser implements Parser<XMLElement> {
  737. parse(xml: XMLElement): Repository {
  738. const genericElem = super.parse(xml);
  739. const { lang } = genericElem.attributes;
  740. return {
  741. ...genericElem,
  742. type: Repository,
  743. lang,
  744. };
  745. }
  746. }
  747. @xmlParser('msContents', MsContentsParser)
  748. export class MsContentsParser extends GenericElemParser implements Parser<XMLElement> {
  749. parse(xml: XMLElement): MsContents {
  750. return {
  751. ...super.parse(xml),
  752. type: MsContents,
  753. summary: queryAndParseElement(xml, 'summary'),
  754. msItem: queryAndParseElements(xml, 'msItem'),
  755. msItemStruct: queryAndParseElement(xml, 'msItemStruct'),
  756. pEl: queryAndParseElements<Paragraph>(xml, 'p'),
  757. textLangs: unhandledElement(xml, 'textLang', this.genericParse),
  758. };
  759. }
  760. }
  761. @xmlParser('collection', CollectionParser)
  762. export class CollectionParser extends GenericElemParser implements Parser<XMLElement> {
  763. parse(xml: XMLElement): CollectionEl {
  764. const genericElem = super.parse(xml);
  765. const { collectionType } = genericElem.attributes;
  766. return {
  767. ...genericElem,
  768. type: CollectionEl,
  769. collectionType,
  770. };
  771. }
  772. }
  773. @xmlParser('evt-identifier-parser', IdentifierParser)
  774. class IdentifierParser extends GenericElemParser implements Parser<XMLElement> {
  775. parse(xml: XMLElement): Identifier {
  776. return {
  777. ...super.parse(xml),
  778. type: Identifier,
  779. collection: queryAndParseElements(xml, 'collection'),
  780. repository: queryAndParseElement(xml, 'repository'),
  781. idnos: unhandledElement(xml, 'idno', this.genericParse),
  782. regions: unhandledElement(xml, 'region', this.genericParse),
  783. settlements: unhandledElement(xml, 'settlement', this.genericParse),
  784. countries: unhandledElement(xml, 'country', this.genericParse),
  785. };
  786. }
  787. }
  788. @xmlParser('altIdentifier', AltIdentifierParser)
  789. export class AltIdentifierParser extends IdentifierParser implements Parser<XMLElement> {
  790. parse(xml: XMLElement): AltIdentifier {
  791. return {
  792. ...super.parse(xml),
  793. type: AltIdentifier,
  794. noteEl: queryAndParseElements(xml, 'note'),
  795. };
  796. }
  797. }
  798. @xmlParser('msName', MsNameParser)
  799. export class MsNameParser extends GenericElemParser implements Parser<XMLElement> {
  800. parse(xml: XMLElement): MsName {
  801. return {
  802. ...super.parse(xml),
  803. type: AltIdentifier,
  804. name: unhandledElement(xml, 'name', this.genericParse),
  805. rs: unhandledElement(xml, 'rs', this.genericParse),
  806. gEl: queryAndParseElements(xml, 'g'),
  807. };
  808. }
  809. }
  810. @xmlParser('institution', InstitutionParser)
  811. export class InstitutionParser extends GenericElemParser implements Parser<XMLElement> {
  812. parse(xml: XMLElement): Institution {
  813. return {
  814. ...super.parse(xml),
  815. type: Institution,
  816. country: unhandledElement(xml, 'country', this.genericParse),
  817. region: unhandledElement(xml, 'region', this.genericParse),
  818. };
  819. }
  820. }
  821. @xmlParser('msIdentifier', MsIdentifierParser)
  822. export class MsIdentifierParser extends IdentifierParser implements Parser<XMLElement> {
  823. parse(xml: XMLElement): MsIdentifier {
  824. return {
  825. ...super.parse(xml),
  826. type: MsIdentifier,
  827. id: getID(xml),
  828. institution: queryAndParseElement(xml, 'institution'),
  829. altIdentifier: queryAndParseElements(xml, 'altIdentifier'),
  830. msName: queryAndParseElements(xml, 'msName'),
  831. };
  832. }
  833. }
  834. @xmlParser('head', HeadParser)
  835. export class HeadParser extends GenericElemParser implements Parser<XMLElement> {
  836. parse(xml: XMLElement): Head {
  837. const genericElem = super.parse(xml);
  838. const { place, rend, style, rendition, facs, n } = genericElem.attributes;
  839. return {
  840. ...genericElem,
  841. type: Head,
  842. n: getDefaultN(n),
  843. place,
  844. rend,
  845. rendition,
  846. style,
  847. facs,
  848. lbEl: queryAndParseElements(xml, 'lb'),
  849. hi: unhandledElement(xml, 'hi', this.genericParse),
  850. title: unhandledElement(xml, 'title', this.genericParse),
  851. origPlace: queryAndParseElement(xml, 'origPlace'),
  852. origDate: queryAndParseElement(xml, 'origDate'),
  853. };
  854. }
  855. }
  856. @xmlParser('msFrag', MsFragParser)
  857. export class MsFragParser extends GenericElemParser implements Parser<XMLElement> {
  858. parse(xml: XMLElement): MsFrag {
  859. return {
  860. ...super.parse(xml),
  861. type: MsFrag,
  862. additional: queryAndParseElement(xml, 'additional'),
  863. altIdentifier: queryAndParseElement(xml, 'altIdentifier'),
  864. history: queryAndParseElement(xml, 'history'),
  865. msContents: queryAndParseElement(xml, 'msContents'),
  866. msIdentifier: queryAndParseElement(xml, 'msIdentifier'),
  867. physDesc: queryAndParseElement(xml, 'physDesc'),
  868. pEl: queryAndParseElements<Paragraph>(xml, 'p'),
  869. };
  870. }
  871. }
  872. @xmlParser('msPart', MsPartParser)
  873. export class MsPartParser extends MsFragParser implements Parser<XMLElement> {
  874. parse(xml: XMLElement): MsPart {
  875. return {
  876. ...super.parse(xml),
  877. type: MsPart,
  878. msParts: queryAndParseElements(xml, 'msPart'),
  879. head: queryAndParseElement(xml, 'head'),
  880. };
  881. }
  882. }
  883. @xmlParser('msDesc', MsDescParser)
  884. export class MsDescParser extends MsPartParser implements Parser<XMLElement> {
  885. private msDescCounter = 0;
  886. parse(xml: XMLElement): MsDesc {
  887. const genericElem = super.parse(xml);
  888. const { n, label } = genericElem.attributes;
  889. let firstIdnoValue = '';
  890. const msDesc: MsDesc = {
  891. ...super.parse(xml),
  892. type: MsDesc,
  893. id: getID(xml),
  894. n: getDefaultN(n),
  895. label,
  896. msFrags: queryAndParseElements(xml, 'msFrag'),
  897. };
  898. firstIdnoValue = this.getFirstIdnoValue(msDesc);
  899. msDesc.label = xml.getAttribute('n') || xml.getAttribute('xml:id') || firstIdnoValue;
  900. return msDesc;
  901. }
  902. getFirstIdnoValue(ms) {
  903. this.msDescCounter++;
  904. if (ms.msIdentifier.idnos.length > 0) {
  905. const item = ms.msIdentifier.idnos[0].filter((el: Text) => el.text?.trim() || el.content?.length > 0);
  906. if (item[0].text) {
  907. return item[0].text.trim();
  908. }
  909. if (item[0].content.length > 0){
  910. return (item[0].content[0].text);
  911. }
  912. }
  913. return `MS Desc ${this.msDescCounter}`;
  914. }
  915. }