@manuscripts/transform 2.1.1-LEAN-3377-1 → 2.1.1-LEAN-3377-2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -265,6 +265,16 @@ exports.jatsBodyTransformations = {
265
265
  }
266
266
  });
267
267
  },
268
+ orderTableFootnote(doc, body) {
269
+ const tableInlineFootnotesIds = new Set(Array.from(body.querySelectorAll('tbody > tr > td > xref[ref-type="fn"]').values()).map((inlineFootnote) => inlineFootnote.getAttribute('rid')));
270
+ const fnGroups = doc.querySelectorAll('table-wrap-foot > fn-group');
271
+ fnGroups.forEach((fnGroup) => {
272
+ const orderedFootnotes = Array.from(fnGroup.querySelectorAll('fn')).sort((fn) => tableInlineFootnotesIds.has(fn.getAttribute('id'))
273
+ ? -1
274
+ : 0);
275
+ fnGroup.replaceChildren(...orderedFootnotes);
276
+ });
277
+ },
268
278
  moveFloatsGroupToBody(doc, body, createElement) {
269
279
  const group = doc.querySelector('floats-group');
270
280
  if (group) {
@@ -67,6 +67,7 @@ const parseJATSBody = (doc, body, references) => {
67
67
  jats_body_transformations_1.jatsBodyTransformations.createBackmatter(doc, body, createElement);
68
68
  jats_body_transformations_1.jatsBodyTransformations.createSuppleMaterials(doc, body, createElement);
69
69
  jats_body_transformations_1.jatsBodyTransformations.createKeywords(doc, body, createElement);
70
+ jats_body_transformations_1.jatsBodyTransformations.orderTableFootnote(doc, body);
70
71
  const node = jats_body_dom_parser_1.jatsBodyDOMParser.parse(body).firstChild;
71
72
  if (!node) {
72
73
  throw new Error('No content was parsed from the JATS article body');
@@ -130,10 +130,11 @@ const buildFootnote = (containingObject, contents, kind = 'footnote') => ({
130
130
  kind,
131
131
  });
132
132
  exports.buildFootnote = buildFootnote;
133
- const buildFootnotesOrder = (footnotesList) => ({
133
+ const buildFootnotesOrder = (footnotesList, containedObjectID) => ({
134
134
  _id: (0, id_1.generateID)(json_schema_1.ObjectTypes.FootnotesOrder),
135
135
  objectType: json_schema_1.ObjectTypes.FootnotesOrder,
136
136
  footnotesList,
137
+ containedObjectID,
137
138
  });
138
139
  exports.buildFootnotesOrder = buildFootnotesOrder;
139
140
  const buildCorresp = (contents) => ({
@@ -68,7 +68,6 @@ const getSupplements = (modelMap) => (0, exports.getModelsByType)(modelMap, json
68
68
  const getKeywordGroups = (modelMap) => (0, exports.getModelsByType)(modelMap, json_schema_1.ObjectTypes.KeywordGroup);
69
69
  const getKeywords = (modelMap) => (0, exports.getModelsByType)(modelMap, json_schema_1.ObjectTypes.Keyword);
70
70
  const getTitles = (modelMap) => (0, exports.getModelsByType)(modelMap, json_schema_1.ObjectTypes.Titles)[0];
71
- const isFootnote = (0, object_types_1.hasObjectType)(json_schema_1.ObjectTypes.Footnote);
72
71
  const hasParentSection = (id) => (section) => section.path &&
73
72
  section.path.length > 1 &&
74
73
  section.path[section.path.length - 2] === id;
@@ -311,23 +310,25 @@ class Decoder {
311
310
  },
312
311
  [json_schema_1.ObjectTypes.FootnotesElement]: (data) => {
313
312
  const foonotesElementModel = data;
314
- const collateByKind = foonotesElementModel.collateByKind || 'footnote';
315
313
  const footnotesOfKind = [];
316
- for (const model of this.modelMap.values()) {
317
- if (isFootnote(model) &&
318
- model.kind === collateByKind &&
319
- model.containingObject === foonotesElementModel._id) {
320
- const comments = this.createCommentNodes(model);
321
- comments.forEach((c) => this.comments.set(c.attrs.id, c));
322
- const footnote = this.parseContents(model.contents || '<div></div>', undefined, this.getComments(model), {
323
- topNode: schema_1.schema.nodes.footnote.create({
324
- id: model._id,
325
- kind: model.kind,
326
- comments: comments.map((c) => c.attrs.id),
327
- }),
328
- });
329
- footnotesOfKind.push(footnote);
330
- }
314
+ const footnoteOrder = (0, exports.getModelsByType)(this.modelMap, json_schema_1.ObjectTypes.FootnotesOrder).find((model) => model.containedObjectID === data._id);
315
+ if (footnoteOrder) {
316
+ footnoteOrder.footnotesList.map(({ id }) => {
317
+ const model = this.modelMap.get(id);
318
+ const collateByKind = foonotesElementModel.collateByKind || 'footnote';
319
+ if (model.kind === collateByKind) {
320
+ const comments = this.createCommentNodes(model);
321
+ comments.forEach((c) => this.comments.set(c.attrs.id, c));
322
+ const footnote = this.parseContents(model.contents || '<div></div>', undefined, this.getComments(model), {
323
+ topNode: schema_1.schema.nodes.footnote.create({
324
+ id: model._id,
325
+ kind: model.kind,
326
+ comments: comments.map((c) => c.attrs.id),
327
+ }),
328
+ });
329
+ footnotesOfKind.push(footnote);
330
+ }
331
+ });
331
332
  }
332
333
  return schema_1.schema.nodes.footnotes_element.create({
333
334
  id: foonotesElementModel._id,
@@ -569,7 +570,7 @@ class Decoder {
569
570
  [json_schema_1.ObjectTypes.TableElement]: (data) => {
570
571
  const model = data;
571
572
  const table = this.createTable(model);
572
- const tableElementFooter = this.createTableElementFooter(model, table);
573
+ const tableElementFooter = this.createTableElementFooter(model);
573
574
  const figcaption = this.getFigcaption(model);
574
575
  const comments = this.createCommentNodes(model);
575
576
  comments.forEach((c) => this.comments.set(c.attrs.id, c));
@@ -789,14 +790,14 @@ class Decoder {
789
790
  }
790
791
  return table;
791
792
  }
792
- createTableElementFooter(model, table) {
793
+ createTableElementFooter(model) {
793
794
  const tableElementFooterID = model.tableElementFooterID;
794
795
  if (!tableElementFooterID) {
795
796
  return undefined;
796
797
  }
797
798
  const tableElementFooterModel = this.getModel(tableElementFooterID);
798
799
  return tableElementFooterModel
799
- ? this.moveUncitedFootnoteAtEnd(this.decode(tableElementFooterModel), table)
800
+ ? this.decode(tableElementFooterModel)
800
801
  : undefined;
801
802
  }
802
803
  createListing(id) {
@@ -814,24 +815,5 @@ class Decoder {
814
815
  throw new errors_1.MissingElement(id);
815
816
  }
816
817
  }
817
- moveUncitedFootnoteAtEnd(tableElementFooter, table) {
818
- const tableInlineFootnoteIds = new Set();
819
- table.descendants((node) => {
820
- if (node.type === schema_1.schema.nodes.inline_footnote) {
821
- ;
822
- node.attrs.rids.map((rid) => tableInlineFootnoteIds.add(rid));
823
- }
824
- });
825
- tableElementFooter.forEach((footnoteElement, offset) => {
826
- if (footnoteElement.type !== schema_1.schema.nodes.footnotes_element) {
827
- return;
828
- }
829
- const children = [];
830
- footnoteElement.content.forEach((node) => children.push(node));
831
- children.sort((child) => tableInlineFootnoteIds.has(child.attrs.id) ? -1 : 0);
832
- tableElementFooter = tableElementFooter.replace(offset, offset + footnoteElement.nodeSize, new prosemirror_model_1.Slice(prosemirror_model_1.Fragment.from(footnoteElement.copy(prosemirror_model_1.Fragment.from(children))), tableElementFooter.resolve(offset).depth, tableElementFooter.resolve(offset + footnoteElement.nodeSize).depth));
833
- });
834
- return tableElementFooter;
835
- }
836
818
  }
837
819
  exports.Decoder = Decoder;
@@ -596,6 +596,9 @@ const encode = (node) => {
596
596
  child.type !== schema_1.schema.nodes.inline_equation) {
597
597
  return;
598
598
  }
599
+ if (child.type === schema_1.schema.nodes.footnotes_element) {
600
+ addFootnotesOrderModel(child, models);
601
+ }
599
602
  const { model, markers } = (0, exports.modelFromNode)(child, parent, path, priority);
600
603
  markers.forEach((marker) => {
601
604
  const comment = models.get(marker._id);
@@ -647,3 +650,9 @@ const generateElementOrder = (node, nodeType) => {
647
650
  order.elements = ids;
648
651
  return order;
649
652
  };
653
+ const addFootnotesOrderModel = (child, models) => {
654
+ const footnoteList = [];
655
+ child.forEach((footnote, _, index) => footnoteList.push({ id: footnote.attrs.id, index }));
656
+ const footnotesOrder = (0, builders_1.buildFootnotesOrder)(footnoteList, child.attrs.id);
657
+ models.set(footnotesOrder._id, footnotesOrder);
658
+ };
@@ -15,8 +15,7 @@
15
15
  * limitations under the License.
16
16
  */
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.createEmptyFootnotesOrder = exports.handleFootnotesOrder = exports.createOrderedFootnotesIDs = void 0;
19
- const builders_1 = require("./builders");
18
+ exports.handleFootnotesOrder = exports.createOrderedFootnotesIDs = void 0;
20
19
  const createOrderedFootnotesIDs = (doc) => {
21
20
  const footnotesRefs = [...doc.querySelectorAll('xref[ref-type="fn"][rid]')];
22
21
  const footnotes = [...doc.querySelectorAll('fn:not([fn-type])')];
@@ -59,5 +58,3 @@ const handleFootnotesOrder = (orderedFootnotesIDs, replacements, footnotesOrder)
59
58
  footnotesOrder.footnotesList = footnotesList;
60
59
  };
61
60
  exports.handleFootnotesOrder = handleFootnotesOrder;
62
- const createEmptyFootnotesOrder = () => (0, builders_1.buildFootnotesOrder)([]);
63
- exports.createEmptyFootnotesOrder = createEmptyFootnotesOrder;
@@ -262,6 +262,16 @@ export const jatsBodyTransformations = {
262
262
  }
263
263
  });
264
264
  },
265
+ orderTableFootnote(doc, body) {
266
+ const tableInlineFootnotesIds = new Set(Array.from(body.querySelectorAll('tbody > tr > td > xref[ref-type="fn"]').values()).map((inlineFootnote) => inlineFootnote.getAttribute('rid')));
267
+ const fnGroups = doc.querySelectorAll('table-wrap-foot > fn-group');
268
+ fnGroups.forEach((fnGroup) => {
269
+ const orderedFootnotes = Array.from(fnGroup.querySelectorAll('fn')).sort((fn) => tableInlineFootnotesIds.has(fn.getAttribute('id'))
270
+ ? -1
271
+ : 0);
272
+ fnGroup.replaceChildren(...orderedFootnotes);
273
+ });
274
+ },
265
275
  moveFloatsGroupToBody(doc, body, createElement) {
266
276
  const group = doc.querySelector('floats-group');
267
277
  if (group) {
@@ -63,6 +63,7 @@ export const parseJATSBody = (doc, body, references) => {
63
63
  jatsBodyTransformations.createBackmatter(doc, body, createElement);
64
64
  jatsBodyTransformations.createSuppleMaterials(doc, body, createElement);
65
65
  jatsBodyTransformations.createKeywords(doc, body, createElement);
66
+ jatsBodyTransformations.orderTableFootnote(doc, body);
66
67
  const node = jatsBodyDOMParser.parse(body).firstChild;
67
68
  if (!node) {
68
69
  throw new Error('No content was parsed from the JATS article body');
@@ -108,10 +108,11 @@ export const buildFootnote = (containingObject, contents, kind = 'footnote') =>
108
108
  contents,
109
109
  kind,
110
110
  });
111
- export const buildFootnotesOrder = (footnotesList) => ({
111
+ export const buildFootnotesOrder = (footnotesList, containedObjectID) => ({
112
112
  _id: generateID(ObjectTypes.FootnotesOrder),
113
113
  objectType: ObjectTypes.FootnotesOrder,
114
114
  footnotesList,
115
+ containedObjectID,
115
116
  });
116
117
  export const buildCorresp = (contents) => ({
117
118
  _id: generateID(ObjectTypes.Corresponding),
@@ -26,13 +26,13 @@ var __rest = (this && this.__rest) || function (s, e) {
26
26
  };
27
27
  import { ObjectTypes, } from '@manuscripts/json-schema';
28
28
  import debug from 'debug';
29
- import { DOMParser, Fragment, Slice } from 'prosemirror-model';
29
+ import { DOMParser } from 'prosemirror-model';
30
30
  import { MissingElement } from '../errors';
31
31
  import { abstractsType, backmatterType, bodyType, } from '../lib/section-group-type';
32
32
  import { schema, } from '../schema';
33
33
  import { buildTitles } from './builders';
34
34
  import { insertHighlightMarkers } from './highlight-markers';
35
- import { ExtraObjectTypes, hasObjectType, isCommentAnnotation, isManuscript, } from './object-types';
35
+ import { ExtraObjectTypes, isCommentAnnotation, isManuscript, } from './object-types';
36
36
  import { chooseSectionLableName, chooseSectionNodeType, chooseSecType, getSectionGroupType, guessSectionCategory, } from './section-category';
37
37
  import { timestamp } from './timestamp';
38
38
  const warn = debug('manuscripts-transform');
@@ -59,7 +59,6 @@ const getSupplements = (modelMap) => getModelsByType(modelMap, ObjectTypes.Suppl
59
59
  const getKeywordGroups = (modelMap) => getModelsByType(modelMap, ObjectTypes.KeywordGroup);
60
60
  const getKeywords = (modelMap) => getModelsByType(modelMap, ObjectTypes.Keyword);
61
61
  const getTitles = (modelMap) => getModelsByType(modelMap, ObjectTypes.Titles)[0];
62
- const isFootnote = hasObjectType(ObjectTypes.Footnote);
63
62
  const hasParentSection = (id) => (section) => section.path &&
64
63
  section.path.length > 1 &&
65
64
  section.path[section.path.length - 2] === id;
@@ -302,23 +301,25 @@ export class Decoder {
302
301
  },
303
302
  [ObjectTypes.FootnotesElement]: (data) => {
304
303
  const foonotesElementModel = data;
305
- const collateByKind = foonotesElementModel.collateByKind || 'footnote';
306
304
  const footnotesOfKind = [];
307
- for (const model of this.modelMap.values()) {
308
- if (isFootnote(model) &&
309
- model.kind === collateByKind &&
310
- model.containingObject === foonotesElementModel._id) {
311
- const comments = this.createCommentNodes(model);
312
- comments.forEach((c) => this.comments.set(c.attrs.id, c));
313
- const footnote = this.parseContents(model.contents || '<div></div>', undefined, this.getComments(model), {
314
- topNode: schema.nodes.footnote.create({
315
- id: model._id,
316
- kind: model.kind,
317
- comments: comments.map((c) => c.attrs.id),
318
- }),
319
- });
320
- footnotesOfKind.push(footnote);
321
- }
305
+ const footnoteOrder = getModelsByType(this.modelMap, ObjectTypes.FootnotesOrder).find((model) => model.containedObjectID === data._id);
306
+ if (footnoteOrder) {
307
+ footnoteOrder.footnotesList.map(({ id }) => {
308
+ const model = this.modelMap.get(id);
309
+ const collateByKind = foonotesElementModel.collateByKind || 'footnote';
310
+ if (model.kind === collateByKind) {
311
+ const comments = this.createCommentNodes(model);
312
+ comments.forEach((c) => this.comments.set(c.attrs.id, c));
313
+ const footnote = this.parseContents(model.contents || '<div></div>', undefined, this.getComments(model), {
314
+ topNode: schema.nodes.footnote.create({
315
+ id: model._id,
316
+ kind: model.kind,
317
+ comments: comments.map((c) => c.attrs.id),
318
+ }),
319
+ });
320
+ footnotesOfKind.push(footnote);
321
+ }
322
+ });
322
323
  }
323
324
  return schema.nodes.footnotes_element.create({
324
325
  id: foonotesElementModel._id,
@@ -560,7 +561,7 @@ export class Decoder {
560
561
  [ObjectTypes.TableElement]: (data) => {
561
562
  const model = data;
562
563
  const table = this.createTable(model);
563
- const tableElementFooter = this.createTableElementFooter(model, table);
564
+ const tableElementFooter = this.createTableElementFooter(model);
564
565
  const figcaption = this.getFigcaption(model);
565
566
  const comments = this.createCommentNodes(model);
566
567
  comments.forEach((c) => this.comments.set(c.attrs.id, c));
@@ -780,14 +781,14 @@ export class Decoder {
780
781
  }
781
782
  return table;
782
783
  }
783
- createTableElementFooter(model, table) {
784
+ createTableElementFooter(model) {
784
785
  const tableElementFooterID = model.tableElementFooterID;
785
786
  if (!tableElementFooterID) {
786
787
  return undefined;
787
788
  }
788
789
  const tableElementFooterModel = this.getModel(tableElementFooterID);
789
790
  return tableElementFooterModel
790
- ? this.moveUncitedFootnoteAtEnd(this.decode(tableElementFooterModel), table)
791
+ ? this.decode(tableElementFooterModel)
791
792
  : undefined;
792
793
  }
793
794
  createListing(id) {
@@ -805,23 +806,4 @@ export class Decoder {
805
806
  throw new MissingElement(id);
806
807
  }
807
808
  }
808
- moveUncitedFootnoteAtEnd(tableElementFooter, table) {
809
- const tableInlineFootnoteIds = new Set();
810
- table.descendants((node) => {
811
- if (node.type === schema.nodes.inline_footnote) {
812
- ;
813
- node.attrs.rids.map((rid) => tableInlineFootnoteIds.add(rid));
814
- }
815
- });
816
- tableElementFooter.forEach((footnoteElement, offset) => {
817
- if (footnoteElement.type !== schema.nodes.footnotes_element) {
818
- return;
819
- }
820
- const children = [];
821
- footnoteElement.content.forEach((node) => children.push(node));
822
- children.sort((child) => tableInlineFootnoteIds.has(child.attrs.id) ? -1 : 0);
823
- tableElementFooter = tableElementFooter.replace(offset, offset + footnoteElement.nodeSize, new Slice(Fragment.from(footnoteElement.copy(Fragment.from(children))), tableElementFooter.resolve(offset).depth, tableElementFooter.resolve(offset + footnoteElement.nodeSize).depth));
824
- });
825
- return tableElementFooter;
826
- }
827
809
  }
@@ -17,7 +17,7 @@ import { DOMSerializer } from 'prosemirror-model';
17
17
  import serializeToXML from 'w3c-xmlserializer';
18
18
  import { iterateChildren } from '../lib/utils';
19
19
  import { hasGroup, isHighlightMarkerNode, isManuscriptNode, isSectionNode, schema, } from '../schema';
20
- import { auxiliaryObjectTypes, buildAttribution, buildElementsOrder, } from './builders';
20
+ import { auxiliaryObjectTypes, buildAttribution, buildElementsOrder, buildFootnotesOrder, } from './builders';
21
21
  import { extractCommentMarkers } from './highlight-markers';
22
22
  import { nodeTypesMap } from './node-types';
23
23
  import { buildSectionCategory } from './section-category';
@@ -587,6 +587,9 @@ export const encode = (node) => {
587
587
  child.type !== schema.nodes.inline_equation) {
588
588
  return;
589
589
  }
590
+ if (child.type === schema.nodes.footnotes_element) {
591
+ addFootnotesOrderModel(child, models);
592
+ }
590
593
  const { model, markers } = modelFromNode(child, parent, path, priority);
591
594
  markers.forEach((marker) => {
592
595
  const comment = models.get(marker._id);
@@ -637,3 +640,9 @@ const generateElementOrder = (node, nodeType) => {
637
640
  order.elements = ids;
638
641
  return order;
639
642
  };
643
+ const addFootnotesOrderModel = (child, models) => {
644
+ const footnoteList = [];
645
+ child.forEach((footnote, _, index) => footnoteList.push({ id: footnote.attrs.id, index }));
646
+ const footnotesOrder = buildFootnotesOrder(footnoteList, child.attrs.id);
647
+ models.set(footnotesOrder._id, footnotesOrder);
648
+ };
@@ -13,7 +13,6 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { buildFootnotesOrder } from './builders';
17
16
  export const createOrderedFootnotesIDs = (doc) => {
18
17
  const footnotesRefs = [...doc.querySelectorAll('xref[ref-type="fn"][rid]')];
19
18
  const footnotes = [...doc.querySelectorAll('fn:not([fn-type])')];
@@ -54,4 +53,3 @@ export const handleFootnotesOrder = (orderedFootnotesIDs, replacements, footnote
54
53
  });
55
54
  footnotesOrder.footnotesList = footnotesList;
56
55
  };
57
- export const createEmptyFootnotesOrder = () => buildFootnotesOrder([]);
@@ -32,6 +32,7 @@ export declare const jatsBodyTransformations: {
32
32
  moveFootnotes(doc: Document, group: Element, createElement: (tagName: string) => HTMLElement): void;
33
33
  moveCaptionsToEnd(body: Element): void;
34
34
  fixTables(body: Element, createElement: (tagName: string) => HTMLElement): void;
35
+ orderTableFootnote(doc: Document, body: Element): void;
35
36
  moveFloatsGroupToBody(doc: Document, body: Element, createElement: (tagName: string) => HTMLElement): void;
36
37
  createKeywords(document: Document, body: Element, createElement: (tagName: string) => HTMLElement): void;
37
38
  createSuppleMaterials(document: Document, body: Element, createElement: (tagName: string) => HTMLElement): void;
@@ -46,7 +46,7 @@ export declare const buildComment: (target: string, contents?: string, selector?
46
46
  export declare const buildNote: (target: string, source: 'EMAIL' | 'EDITOR' | 'DASHBOARD', contents?: string) => Build<ManuscriptNote>;
47
47
  export declare const buildInlineMathFragment: (containingObject: string, TeXRepresentation: string) => Build<InlineMathFragment>;
48
48
  export declare const buildFootnote: (containingObject: string, contents: string, kind?: 'footnote' | 'endnote') => Build<Footnote>;
49
- export declare const buildFootnotesOrder: (footnotesList: FootnotesOrderIndexList) => Build<FootnotesOrder>;
49
+ export declare const buildFootnotesOrder: (footnotesList: FootnotesOrderIndexList, containedObjectID: string) => Build<FootnotesOrder>;
50
50
  export declare const buildCorresp: (contents: string) => Build<Corresponding>;
51
51
  export declare const buildSection: (priority?: number, path?: string[]) => Build<Section>;
52
52
  export declare const buildParagraph: (placeholderInnerHTML: string) => Build<ParagraphElement>;
@@ -45,5 +45,4 @@ export declare class Decoder {
45
45
  private createTable;
46
46
  private createTableElementFooter;
47
47
  private createListing;
48
- private moveUncitedFootnoteAtEnd;
49
48
  }
@@ -20,4 +20,3 @@ export type FootnotesOrderIndexList = {
20
20
  }[];
21
21
  export declare const createOrderedFootnotesIDs: (doc: Document) => string[];
22
22
  export declare const handleFootnotesOrder: (orderedFootnotesIDs: Array<string>, replacements: Map<string, string>, footnotesOrder: FootnotesOrder) => void;
23
- export declare const createEmptyFootnotesOrder: () => import("./builders").Build<FootnotesOrder>;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@manuscripts/transform",
3
3
  "description": "ProseMirror transformer for Manuscripts applications",
4
- "version": "2.1.1-LEAN-3377-1",
4
+ "version": "2.1.1-LEAN-3377-2",
5
5
  "repository": "github:Atypon-OpenSource/manuscripts-transform",
6
6
  "license": "Apache-2.0",
7
7
  "main": "dist/cjs",
@@ -29,8 +29,8 @@
29
29
  "version": "yarn build"
30
30
  },
31
31
  "dependencies": {
32
- "@manuscripts/json-schema": "^2.2.2",
33
- "@manuscripts/library": "1.3.2",
32
+ "@manuscripts/json-schema": "2.2.3-LEAN-3377-0",
33
+ "@manuscripts/library": "1.3.2-LEAN-3377-0",
34
34
  "debug": "^4.3.4",
35
35
  "jszip": "^3.10.1",
36
36
  "mathjax-full": "^3.2.2",