@manuscripts/transform 1.5.0-LEAN-2852-9 → 1.5.0-LIT-528106

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.
@@ -16,7 +16,6 @@
16
16
  */
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
18
  exports.getElementsOrder = exports.parseJATSArticle = exports.parseJATSBody = exports.parseJATSReferences = exports.parseJATSFront = void 0;
19
- const json_schema_1 = require("@manuscripts/json-schema");
20
19
  const prosemirror_model_1 = require("prosemirror-model");
21
20
  const errors_1 = require("../../errors");
22
21
  const html_1 = require("../../lib/html");
@@ -52,16 +51,9 @@ const parseJATSFront = async (front) => {
52
51
  const title = (_a = articleMeta === null || articleMeta === void 0 ? void 0 : articleMeta.querySelector('title-group > article-title')) === null || _a === void 0 ? void 0 : _a.innerHTML;
53
52
  const subtitle = (_b = articleMeta === null || articleMeta === void 0 ? void 0 : articleMeta.querySelector('title-group > subtitle')) === null || _b === void 0 ? void 0 : _b.innerHTML;
54
53
  const runningTitle = (_c = articleMeta === null || articleMeta === void 0 ? void 0 : articleMeta.querySelector('title-group > alt-title[alt-title-type="right-running"]')) === null || _c === void 0 ? void 0 : _c.innerHTML;
55
- const manuscriptMeta = Object.assign({}, jats_front_parser_1.jatsFrontParser.parseCounts(articleMeta === null || articleMeta === void 0 ? void 0 : articleMeta.querySelector('counts')));
56
- const titles = {
57
- objectType: json_schema_1.ObjectTypes.Titles,
58
- _id: (0, id_1.generateID)(json_schema_1.ObjectTypes.Titles),
59
- title: title ? inlineContentsFromJATSTitle(title) : undefined,
60
- subtitle: subtitle ? inlineContentsFromJATSTitle(subtitle) : undefined,
61
- runningTitle: runningTitle
54
+ const manuscriptMeta = Object.assign({ title: title ? inlineContentsFromJATSTitle(title) : undefined, subtitle: subtitle ? inlineContentsFromJATSTitle(subtitle) : undefined, runningTitle: runningTitle
62
55
  ? inlineContentsFromJATSTitle(runningTitle)
63
- : undefined,
64
- };
56
+ : undefined }, jats_front_parser_1.jatsFrontParser.parseCounts(articleMeta === null || articleMeta === void 0 ? void 0 : articleMeta.querySelector('counts')));
65
57
  const { affiliations, affiliationIDs } = jats_front_parser_1.jatsFrontParser.parseAffiliationNodes([
66
58
  ...front.querySelectorAll('article-meta > contrib-group > aff'),
67
59
  ]);
@@ -81,7 +73,6 @@ const parseJATSFront = async (front) => {
81
73
  const manuscript = Object.assign(Object.assign(Object.assign({}, (0, builders_1.buildManuscript)()), manuscriptMeta), history);
82
74
  return {
83
75
  models: generateModelIDs([
84
- titles,
85
76
  manuscript,
86
77
  ...footnotes,
87
78
  ...correspondingList,
@@ -238,7 +238,6 @@ class JATSExporter {
238
238
  this.buildFront = (doi, id, links) => {
239
239
  var _a, _b, _c, _d;
240
240
  const manuscript = (0, project_bundle_1.findManuscript)(this.modelMap);
241
- const titles = (0, project_bundle_1.findTitles)(this.modelMap);
242
241
  const front = this.document.createElement('front');
243
242
  const journalMeta = this.document.createElement('journal-meta');
244
243
  front.appendChild(journalMeta);
@@ -316,20 +315,20 @@ class JATSExporter {
316
315
  articleMeta.appendChild(link);
317
316
  }
318
317
  }
319
- if (titles.title) {
318
+ if (manuscript.title) {
320
319
  const element = this.document.createElement('article-title');
321
- this.setTitleContent(element, titles.title);
320
+ this.setTitleContent(element, manuscript.title);
322
321
  titleGroup.appendChild(element);
323
322
  }
324
- if (titles.subtitle) {
323
+ if (manuscript.subtitle) {
325
324
  const element = this.document.createElement('subtitle');
326
- this.setTitleContent(element, titles.subtitle);
325
+ this.setTitleContent(element, manuscript.subtitle);
327
326
  titleGroup.appendChild(element);
328
327
  }
329
- if (titles.runningTitle) {
328
+ if (manuscript.runningTitle) {
330
329
  const element = this.document.createElement('alt-title');
331
330
  element.setAttribute('alt-title-type', 'right-running');
332
- this.setTitleContent(element, titles.runningTitle);
331
+ this.setTitleContent(element, manuscript.runningTitle);
333
332
  titleGroup.appendChild(element);
334
333
  }
335
334
  const supplements = [...this.modelMap.values()].filter((model) => model.objectType === json_schema_1.ObjectTypes.Supplement);
@@ -599,7 +598,6 @@ class JATSExporter {
599
598
  this.createSerializer = () => {
600
599
  const getModel = (id) => id ? this.modelMap.get(id) : undefined;
601
600
  const nodes = {
602
- titles: () => '',
603
601
  affiliations_section: () => '',
604
602
  contributors_section: () => '',
605
603
  table_element_footer: () => ['table-wrap-foot', 0],
@@ -15,7 +15,7 @@
15
15
  * limitations under the License.
16
16
  */
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.getTrimmedTextContent = exports.findParentNodeClosestToPos = exports.isInAbstractsSection = exports.isInBibliographySection = exports.isInGraphicalAbstractSection = exports.findNodePositions = exports.iterateChildren = void 0;
18
+ exports.modelsEqual = exports.getTrimmedTextContent = exports.findParentNodeClosestToPos = exports.isInAbstractsSection = exports.isInBibliographySection = exports.isInGraphicalAbstractSection = exports.findNodePositions = exports.iterateChildren = void 0;
19
19
  const bibliography_section_1 = require("../schema/nodes/bibliography_section");
20
20
  const graphical_abstract_section_1 = require("../schema/nodes/graphical_abstract_section");
21
21
  function* iterateChildren(node, recurse = false) {
@@ -94,3 +94,16 @@ const getTrimmedTextContent = (node, querySelector) => {
94
94
  return (_b = (_a = node.querySelector(querySelector)) === null || _a === void 0 ? void 0 : _a.textContent) === null || _b === void 0 ? void 0 : _b.trim();
95
95
  };
96
96
  exports.getTrimmedTextContent = getTrimmedTextContent;
97
+ function modelsEqual(model, model2) {
98
+ for (const v in model) {
99
+ for (const v2 in model2) {
100
+ const prepV = typeof v == 'object' ? JSON.stringify(v) : v;
101
+ const prepV2 = typeof v2 == 'object' ? JSON.stringify(v2) : v2;
102
+ if (prepV !== prepV2) {
103
+ return false;
104
+ }
105
+ }
106
+ }
107
+ return true;
108
+ }
109
+ exports.modelsEqual = modelsEqual;
@@ -85,7 +85,6 @@ const table_element_1 = require("./nodes/table_element");
85
85
  const table_element_footer_1 = require("./nodes/table_element_footer");
86
86
  const table_row_1 = require("./nodes/table_row");
87
87
  const text_1 = require("./nodes/text");
88
- const titles_1 = require("./nodes/titles");
89
88
  const toc_element_1 = require("./nodes/toc_element");
90
89
  const toc_section_1 = require("./nodes/toc_section");
91
90
  __exportStar(require("./groups"), exports);
@@ -141,7 +140,6 @@ __exportStar(require("./nodes/affiliation"), exports);
141
140
  __exportStar(require("./nodes/meta_section"), exports);
142
141
  __exportStar(require("./nodes/contributor"), exports);
143
142
  __exportStar(require("./nodes/table_element_footer"), exports);
144
- __exportStar(require("./nodes/titles"), exports);
145
143
  __exportStar(require("./nodes/affiliations_section"), exports);
146
144
  __exportStar(require("./nodes/contributors_section"), exports);
147
145
  exports.schema = new prosemirror_model_1.Schema({
@@ -218,7 +216,6 @@ exports.schema = new prosemirror_model_1.Schema({
218
216
  meta_section: meta_section_1.metaSection,
219
217
  contributor: contributor_1.contributor,
220
218
  table_element_footer: table_element_footer_1.tableElementFooter,
221
- titles: titles_1.Titles,
222
219
  affiliations_section: affiliations_section_1.affiliationsSection,
223
220
  contributors_section: contributors_section_1.contributorsSection,
224
221
  },
@@ -35,9 +35,10 @@ const buildProject = (owner) => ({
35
35
  title: '',
36
36
  });
37
37
  exports.buildProject = buildProject;
38
- const buildManuscript = () => ({
38
+ const buildManuscript = (title = '') => ({
39
39
  _id: (0, id_1.generateID)(json_schema_1.ObjectTypes.Manuscript),
40
40
  objectType: json_schema_1.ObjectTypes.Manuscript,
41
+ title,
41
42
  });
42
43
  exports.buildManuscript = buildManuscript;
43
44
  const buildContributor = (bibliographicName, role = 'author', priority = 0, userID, invitationID) => ({
@@ -115,16 +115,6 @@ class Decoder {
115
115
  rootSectionNodes.unshift(node);
116
116
  }
117
117
  }
118
- createTitlesNode() {
119
- const titlesModel = (0, exports.getModelsByType)(this.modelMap, json_schema_1.ObjectTypes.Titles)[0];
120
- if (titlesModel) {
121
- const titlesNode = this.decode(titlesModel);
122
- return titlesNode;
123
- }
124
- else {
125
- return null;
126
- }
127
- }
128
118
  createRootSectionNodes() {
129
119
  let rootSections = getSections(this.modelMap).filter((section) => !section.path || section.path.length <= 1);
130
120
  rootSections = this.addGeneratedLabels(rootSections);
@@ -157,15 +147,6 @@ class Decoder {
157
147
  constructor(modelMap, allowMissingElements = false) {
158
148
  this.comments = new Map();
159
149
  this.creators = {
160
- [json_schema_1.ObjectTypes.Titles]: (data) => {
161
- const model = data;
162
- return schema_1.schema.nodes.titles.create({
163
- id: model._id,
164
- title: model.title,
165
- subtitle: model.subtitle,
166
- runningTitle: model.runningTitle,
167
- });
168
- },
169
150
  [json_schema_1.ObjectTypes.BibliographyElement]: (data) => {
170
151
  var _a;
171
152
  const model = data;
@@ -650,13 +631,9 @@ class Decoder {
650
631
  };
651
632
  this.getModel = (id) => this.modelMap.get(id);
652
633
  this.createArticleNode = (manuscriptID) => {
653
- const titlesNode = this.createTitlesNode();
654
634
  const rootSectionNodes = this.createRootSectionNodes();
655
635
  const metaSectionNode = this.createMetaSectionNode();
656
636
  const contents = [...rootSectionNodes, metaSectionNode];
657
- if (titlesNode) {
658
- contents.push(titlesNode);
659
- }
660
637
  return schema_1.schema.nodes.manuscript.create({
661
638
  id: manuscriptID || this.getManuscriptID(),
662
639
  }, contents);
@@ -25,6 +25,7 @@ const utils_1 = require("../lib/utils");
25
25
  const schema_1 = require("../schema");
26
26
  const builders_1 = require("./builders");
27
27
  const highlight_markers_1 = require("./highlight-markers");
28
+ const id_1 = require("./id");
28
29
  const node_types_1 = require("./node-types");
29
30
  const section_category_1 = require("./section-category");
30
31
  const serializer = prosemirror_model_1.DOMSerializer.fromSchema(schema_1.schema);
@@ -263,12 +264,6 @@ function figureElementEncoder(node) {
263
264
  };
264
265
  }
265
266
  const encoders = {
266
- titles: (node) => ({
267
- title: node.attrs.title,
268
- subtitle: node.attrs.subtitle,
269
- runningTitle: node.attrs.runningTitle,
270
- _id: node.attrs._id,
271
- }),
272
267
  bibliography_element: (node) => ({
273
268
  elementType: 'div',
274
269
  contents: '',
@@ -576,7 +571,7 @@ const modelFromNode = (node, parent, path, priority) => {
576
571
  return { model, commentAnnotationsMap };
577
572
  };
578
573
  exports.modelFromNode = modelFromNode;
579
- const encode = (node) => {
574
+ const encode = (node, preserveWithRepeatedID = false) => {
580
575
  const models = new Map();
581
576
  const priority = {
582
577
  value: 1,
@@ -596,8 +591,14 @@ const encode = (node) => {
596
591
  return;
597
592
  }
598
593
  const { model } = (0, exports.modelFromNode)(child, parent, path, priority);
599
- if (models.has(model._id)) {
600
- throw Error(`Encountered duplicate ids in models map while encoding: ${model._id}`);
594
+ const existingModel = models.get(model._id);
595
+ if (existingModel) {
596
+ if (preserveWithRepeatedID && !(0, utils_1.modelsEqual)(model, existingModel)) {
597
+ model._id = (0, id_1.generateID)(model.objectType);
598
+ }
599
+ else {
600
+ throw Error(`Encountered duplicate ids in models map while encoding: ${model._id}`);
601
+ }
601
602
  }
602
603
  models.set(model._id, model);
603
604
  child.forEach(addModel(path.concat(child.attrs.id), child));
@@ -152,7 +152,6 @@ class HTMLTransformer {
152
152
  this.buildFront = () => {
153
153
  const manuscript = (0, project_bundle_1.findManuscript)(this.modelMap);
154
154
  const journal = (0, project_bundle_1.findJournal)(this.modelMap);
155
- const titles = (0, project_bundle_1.findTitles)(this.modelMap);
156
155
  if (!manuscript) {
157
156
  throw new Error('Manuscript not found in project modelMap');
158
157
  }
@@ -171,14 +170,14 @@ class HTMLTransformer {
171
170
  }
172
171
  const articleMeta = this.document.createElement('div');
173
172
  front.appendChild(articleMeta);
174
- const title = this.document.createElement('h1');
175
- if (titles.title) {
176
- title.innerHTML = titles.title;
173
+ const articleTitle = this.document.createElement('h1');
174
+ if (manuscript.title) {
175
+ articleTitle.innerHTML = manuscript.title;
177
176
  }
178
177
  if (journal === null || journal === void 0 ? void 0 : journal.title) {
179
- title.setAttribute('data-journal', journal.title);
178
+ articleTitle.setAttribute('data-journal', journal.title);
180
179
  }
181
- articleMeta.appendChild(title);
180
+ articleMeta.appendChild(articleTitle);
182
181
  if (manuscript.DOI) {
183
182
  const articleID = this.document.createElement('article-id');
184
183
  articleID.setAttribute('pub-id-type', 'doi');
@@ -57,7 +57,6 @@ exports.nodeTypesMap = new Map([
57
57
  [schema_1.schema.nodes.affiliation, json_schema_1.ObjectTypes.Affiliation],
58
58
  [schema_1.schema.nodes.contributor, json_schema_1.ObjectTypes.Contributor],
59
59
  [schema_1.schema.nodes.table_element_footer, json_schema_1.ObjectTypes.TableElementFooter],
60
- [schema_1.schema.nodes.titles, json_schema_1.ObjectTypes.Titles],
61
60
  [schema_1.schema.nodes.contributors_section, json_schema_1.ObjectTypes.Section],
62
61
  [schema_1.schema.nodes.affiliations_section, json_schema_1.ObjectTypes.Section],
63
62
  ]);
@@ -15,7 +15,7 @@
15
15
  * limitations under the License.
16
16
  */
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.findTitles = exports.findManuscriptById = exports.findManuscriptModelByType = exports.findJournal = exports.findManuscript = exports.parseProjectBundle = void 0;
18
+ exports.findManuscriptById = exports.findManuscriptModelByType = exports.findJournal = exports.findManuscript = exports.parseProjectBundle = void 0;
19
19
  const json_schema_1 = require("@manuscripts/json-schema");
20
20
  const decode_1 = require("./decode");
21
21
  const object_types_1 = require("./object-types");
@@ -71,24 +71,3 @@ const findManuscriptById = (modelMap, manuscriptID) => {
71
71
  throw new Error(`There is no manuscript found for the following _id (${manuscriptID})`);
72
72
  };
73
73
  exports.findManuscriptById = findManuscriptById;
74
- const isTitle = (0, object_types_1.hasObjectType)(json_schema_1.ObjectTypes.Titles);
75
- const findTitles = (modelMap) => {
76
- for (const model of modelMap.values()) {
77
- if (isTitle(model)) {
78
- return model;
79
- }
80
- }
81
- const defaultTitle = {
82
- _id: 'MPTitles:8EB79C14-9F61-483A-902F-A0B8EF5973C1',
83
- createdAt: 1538472121.690101,
84
- updatedAt: 1538472121.690101,
85
- objectType: 'MPTitles',
86
- title: 'main title',
87
- subtitle: 'subtitle',
88
- runningTitle: 'running title',
89
- manuscriptID: 'MPManuscript:E3830344-E77B-42BA-BD77-3E95489712A0',
90
- containerID: 'MPProject:1',
91
- };
92
- return defaultTitle;
93
- };
94
- exports.findTitles = findTitles;
@@ -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 { ObjectTypes, } from '@manuscripts/json-schema';
17
16
  import { DOMParser } from 'prosemirror-model';
18
17
  import { InvalidInput } from '../../errors';
19
18
  import { nodeFromHTML } from '../../lib/html';
@@ -49,16 +48,9 @@ export const parseJATSFront = async (front) => {
49
48
  const title = (_a = articleMeta === null || articleMeta === void 0 ? void 0 : articleMeta.querySelector('title-group > article-title')) === null || _a === void 0 ? void 0 : _a.innerHTML;
50
49
  const subtitle = (_b = articleMeta === null || articleMeta === void 0 ? void 0 : articleMeta.querySelector('title-group > subtitle')) === null || _b === void 0 ? void 0 : _b.innerHTML;
51
50
  const runningTitle = (_c = articleMeta === null || articleMeta === void 0 ? void 0 : articleMeta.querySelector('title-group > alt-title[alt-title-type="right-running"]')) === null || _c === void 0 ? void 0 : _c.innerHTML;
52
- const manuscriptMeta = Object.assign({}, jatsFrontParser.parseCounts(articleMeta === null || articleMeta === void 0 ? void 0 : articleMeta.querySelector('counts')));
53
- const titles = {
54
- objectType: ObjectTypes.Titles,
55
- _id: generateID(ObjectTypes.Titles),
56
- title: title ? inlineContentsFromJATSTitle(title) : undefined,
57
- subtitle: subtitle ? inlineContentsFromJATSTitle(subtitle) : undefined,
58
- runningTitle: runningTitle
51
+ const manuscriptMeta = Object.assign({ title: title ? inlineContentsFromJATSTitle(title) : undefined, subtitle: subtitle ? inlineContentsFromJATSTitle(subtitle) : undefined, runningTitle: runningTitle
59
52
  ? inlineContentsFromJATSTitle(runningTitle)
60
- : undefined,
61
- };
53
+ : undefined }, jatsFrontParser.parseCounts(articleMeta === null || articleMeta === void 0 ? void 0 : articleMeta.querySelector('counts')));
62
54
  const { affiliations, affiliationIDs } = jatsFrontParser.parseAffiliationNodes([
63
55
  ...front.querySelectorAll('article-meta > contrib-group > aff'),
64
56
  ]);
@@ -78,7 +70,6 @@ export const parseJATSFront = async (front) => {
78
70
  const manuscript = Object.assign(Object.assign(Object.assign({}, buildManuscript()), manuscriptMeta), history);
79
71
  return {
80
72
  models: generateModelIDs([
81
- titles,
82
73
  manuscript,
83
74
  ...footnotes,
84
75
  ...correspondingList,
@@ -25,7 +25,7 @@ import { generateAttachmentFilename } from '../transformer/filename';
25
25
  import { buildTargets } from '../transformer/labels';
26
26
  import { isExecutableNodeType, isNodeType } from '../transformer/node-types';
27
27
  import { hasObjectType } from '../transformer/object-types';
28
- import { findManuscript, findManuscriptById, findTitles, } from '../transformer/project-bundle';
28
+ import { findManuscript, findManuscriptById, } from '../transformer/project-bundle';
29
29
  import { chooseJatsFnType, chooseSecType, } from '../transformer/section-category';
30
30
  import { selectVersionIds } from './jats-versions';
31
31
  const warn = debug('manuscripts-transform');
@@ -231,7 +231,6 @@ export class JATSExporter {
231
231
  this.buildFront = (doi, id, links) => {
232
232
  var _a, _b, _c, _d;
233
233
  const manuscript = findManuscript(this.modelMap);
234
- const titles = findTitles(this.modelMap);
235
234
  const front = this.document.createElement('front');
236
235
  const journalMeta = this.document.createElement('journal-meta');
237
236
  front.appendChild(journalMeta);
@@ -309,20 +308,20 @@ export class JATSExporter {
309
308
  articleMeta.appendChild(link);
310
309
  }
311
310
  }
312
- if (titles.title) {
311
+ if (manuscript.title) {
313
312
  const element = this.document.createElement('article-title');
314
- this.setTitleContent(element, titles.title);
313
+ this.setTitleContent(element, manuscript.title);
315
314
  titleGroup.appendChild(element);
316
315
  }
317
- if (titles.subtitle) {
316
+ if (manuscript.subtitle) {
318
317
  const element = this.document.createElement('subtitle');
319
- this.setTitleContent(element, titles.subtitle);
318
+ this.setTitleContent(element, manuscript.subtitle);
320
319
  titleGroup.appendChild(element);
321
320
  }
322
- if (titles.runningTitle) {
321
+ if (manuscript.runningTitle) {
323
322
  const element = this.document.createElement('alt-title');
324
323
  element.setAttribute('alt-title-type', 'right-running');
325
- this.setTitleContent(element, titles.runningTitle);
324
+ this.setTitleContent(element, manuscript.runningTitle);
326
325
  titleGroup.appendChild(element);
327
326
  }
328
327
  const supplements = [...this.modelMap.values()].filter((model) => model.objectType === ObjectTypes.Supplement);
@@ -592,7 +591,6 @@ export class JATSExporter {
592
591
  this.createSerializer = () => {
593
592
  const getModel = (id) => id ? this.modelMap.get(id) : undefined;
594
593
  const nodes = {
595
- titles: () => '',
596
594
  affiliations_section: () => '',
597
595
  contributors_section: () => '',
598
596
  table_element_footer: () => ['table-wrap-foot', 0],
@@ -84,3 +84,15 @@ export const getTrimmedTextContent = (node, querySelector) => {
84
84
  }
85
85
  return (_b = (_a = node.querySelector(querySelector)) === null || _a === void 0 ? void 0 : _a.textContent) === null || _b === void 0 ? void 0 : _b.trim();
86
86
  };
87
+ export function modelsEqual(model, model2) {
88
+ for (const v in model) {
89
+ for (const v2 in model2) {
90
+ const prepV = typeof v == 'object' ? JSON.stringify(v) : v;
91
+ const prepV2 = typeof v2 == 'object' ? JSON.stringify(v2) : v2;
92
+ if (prepV !== prepV2) {
93
+ return false;
94
+ }
95
+ }
96
+ }
97
+ return true;
98
+ }
@@ -68,7 +68,6 @@ import { tableElement } from './nodes/table_element';
68
68
  import { tableElementFooter } from './nodes/table_element_footer';
69
69
  import { tableCell, tableRow } from './nodes/table_row';
70
70
  import { text } from './nodes/text';
71
- import { Titles } from './nodes/titles';
72
71
  import { tocElement } from './nodes/toc_element';
73
72
  import { tocSection } from './nodes/toc_section';
74
73
  export * from './groups';
@@ -124,7 +123,6 @@ export * from './nodes/affiliation';
124
123
  export * from './nodes/meta_section';
125
124
  export * from './nodes/contributor';
126
125
  export * from './nodes/table_element_footer';
127
- export * from './nodes/titles';
128
126
  export * from './nodes/affiliations_section';
129
127
  export * from './nodes/contributors_section';
130
128
  export const schema = new Schema({
@@ -201,7 +199,6 @@ export const schema = new Schema({
201
199
  meta_section: metaSection,
202
200
  contributor: contributor,
203
201
  table_element_footer: tableElementFooter,
204
- titles: Titles,
205
202
  affiliations_section: affiliationsSection,
206
203
  contributors_section: contributorsSection,
207
204
  },
@@ -28,9 +28,10 @@ export const buildProject = (owner) => ({
28
28
  viewers: [],
29
29
  title: '',
30
30
  });
31
- export const buildManuscript = () => ({
31
+ export const buildManuscript = (title = '') => ({
32
32
  _id: generateID(ObjectTypes.Manuscript),
33
33
  objectType: ObjectTypes.Manuscript,
34
+ title,
34
35
  });
35
36
  export const buildContributor = (bibliographicName, role = 'author', priority = 0, userID, invitationID) => ({
36
37
  _id: generateID(ObjectTypes.Contributor),
@@ -105,16 +105,6 @@ export class Decoder {
105
105
  rootSectionNodes.unshift(node);
106
106
  }
107
107
  }
108
- createTitlesNode() {
109
- const titlesModel = getModelsByType(this.modelMap, ObjectTypes.Titles)[0];
110
- if (titlesModel) {
111
- const titlesNode = this.decode(titlesModel);
112
- return titlesNode;
113
- }
114
- else {
115
- return null;
116
- }
117
- }
118
108
  createRootSectionNodes() {
119
109
  let rootSections = getSections(this.modelMap).filter((section) => !section.path || section.path.length <= 1);
120
110
  rootSections = this.addGeneratedLabels(rootSections);
@@ -147,15 +137,6 @@ export class Decoder {
147
137
  constructor(modelMap, allowMissingElements = false) {
148
138
  this.comments = new Map();
149
139
  this.creators = {
150
- [ObjectTypes.Titles]: (data) => {
151
- const model = data;
152
- return schema.nodes.titles.create({
153
- id: model._id,
154
- title: model.title,
155
- subtitle: model.subtitle,
156
- runningTitle: model.runningTitle,
157
- });
158
- },
159
140
  [ObjectTypes.BibliographyElement]: (data) => {
160
141
  var _a;
161
142
  const model = data;
@@ -640,13 +621,9 @@ export class Decoder {
640
621
  };
641
622
  this.getModel = (id) => this.modelMap.get(id);
642
623
  this.createArticleNode = (manuscriptID) => {
643
- const titlesNode = this.createTitlesNode();
644
624
  const rootSectionNodes = this.createRootSectionNodes();
645
625
  const metaSectionNode = this.createMetaSectionNode();
646
626
  const contents = [...rootSectionNodes, metaSectionNode];
647
- if (titlesNode) {
648
- contents.push(titlesNode);
649
- }
650
627
  return schema.nodes.manuscript.create({
651
628
  id: manuscriptID || this.getManuscriptID(),
652
629
  }, contents);
@@ -15,10 +15,11 @@
15
15
  */
16
16
  import { DOMSerializer } from 'prosemirror-model';
17
17
  import serializeToXML from 'w3c-xmlserializer';
18
- import { iterateChildren } from '../lib/utils';
18
+ import { iterateChildren, modelsEqual } from '../lib/utils';
19
19
  import { hasGroup, isHighlightMarkerNode, isSectionNode, schema, } from '../schema';
20
20
  import { buildAttribution } from './builders';
21
21
  import { extractHighlightMarkers, isHighlightableModel, } from './highlight-markers';
22
+ import { generateID } from './id';
22
23
  import { nodeTypesMap } from './node-types';
23
24
  import { buildSectionCategory } from './section-category';
24
25
  const serializer = DOMSerializer.fromSchema(schema);
@@ -255,12 +256,6 @@ function figureElementEncoder(node) {
255
256
  };
256
257
  }
257
258
  const encoders = {
258
- titles: (node) => ({
259
- title: node.attrs.title,
260
- subtitle: node.attrs.subtitle,
261
- runningTitle: node.attrs.runningTitle,
262
- _id: node.attrs._id,
263
- }),
264
259
  bibliography_element: (node) => ({
265
260
  elementType: 'div',
266
261
  contents: '',
@@ -567,7 +562,7 @@ export const modelFromNode = (node, parent, path, priority) => {
567
562
  }
568
563
  return { model, commentAnnotationsMap };
569
564
  };
570
- export const encode = (node) => {
565
+ export const encode = (node, preserveWithRepeatedID = false) => {
571
566
  const models = new Map();
572
567
  const priority = {
573
568
  value: 1,
@@ -587,8 +582,14 @@ export const encode = (node) => {
587
582
  return;
588
583
  }
589
584
  const { model } = modelFromNode(child, parent, path, priority);
590
- if (models.has(model._id)) {
591
- throw Error(`Encountered duplicate ids in models map while encoding: ${model._id}`);
585
+ const existingModel = models.get(model._id);
586
+ if (existingModel) {
587
+ if (preserveWithRepeatedID && !modelsEqual(model, existingModel)) {
588
+ model._id = generateID(model.objectType);
589
+ }
590
+ else {
591
+ throw Error(`Encountered duplicate ids in models map while encoding: ${model._id}`);
592
+ }
592
593
  }
593
594
  models.set(model._id, model);
594
595
  child.forEach(addModel(path.concat(child.attrs.id), child));
@@ -23,7 +23,7 @@ import { generateAttachmentFilename } from './filename';
23
23
  import { buildTargets } from './labels';
24
24
  import { isNodeType } from './node-types';
25
25
  import { hasObjectType } from './object-types';
26
- import { findJournal, findManuscript, findTitles } from './project-bundle';
26
+ import { findJournal, findManuscript } from './project-bundle';
27
27
  import { chooseSecType } from './section-category';
28
28
  const chooseNodeName = (element) => {
29
29
  const nodeName = element.nodeName.toLowerCase();
@@ -146,7 +146,6 @@ export class HTMLTransformer {
146
146
  this.buildFront = () => {
147
147
  const manuscript = findManuscript(this.modelMap);
148
148
  const journal = findJournal(this.modelMap);
149
- const titles = findTitles(this.modelMap);
150
149
  if (!manuscript) {
151
150
  throw new Error('Manuscript not found in project modelMap');
152
151
  }
@@ -165,14 +164,14 @@ export class HTMLTransformer {
165
164
  }
166
165
  const articleMeta = this.document.createElement('div');
167
166
  front.appendChild(articleMeta);
168
- const title = this.document.createElement('h1');
169
- if (titles.title) {
170
- title.innerHTML = titles.title;
167
+ const articleTitle = this.document.createElement('h1');
168
+ if (manuscript.title) {
169
+ articleTitle.innerHTML = manuscript.title;
171
170
  }
172
171
  if (journal === null || journal === void 0 ? void 0 : journal.title) {
173
- title.setAttribute('data-journal', journal.title);
172
+ articleTitle.setAttribute('data-journal', journal.title);
174
173
  }
175
- articleMeta.appendChild(title);
174
+ articleMeta.appendChild(articleTitle);
176
175
  if (manuscript.DOI) {
177
176
  const articleID = this.document.createElement('article-id');
178
177
  articleID.setAttribute('pub-id-type', 'doi');
@@ -54,7 +54,6 @@ export const nodeTypesMap = new Map([
54
54
  [schema.nodes.affiliation, ObjectTypes.Affiliation],
55
55
  [schema.nodes.contributor, ObjectTypes.Contributor],
56
56
  [schema.nodes.table_element_footer, ObjectTypes.TableElementFooter],
57
- [schema.nodes.titles, ObjectTypes.Titles],
58
57
  [schema.nodes.contributors_section, ObjectTypes.Section],
59
58
  [schema.nodes.affiliations_section, ObjectTypes.Section],
60
59
  ]);
@@ -63,23 +63,3 @@ export const findManuscriptById = (modelMap, manuscriptID) => {
63
63
  }
64
64
  throw new Error(`There is no manuscript found for the following _id (${manuscriptID})`);
65
65
  };
66
- const isTitle = hasObjectType(ObjectTypes.Titles);
67
- export const findTitles = (modelMap) => {
68
- for (const model of modelMap.values()) {
69
- if (isTitle(model)) {
70
- return model;
71
- }
72
- }
73
- const defaultTitle = {
74
- _id: 'MPTitles:8EB79C14-9F61-483A-902F-A0B8EF5973C1',
75
- createdAt: 1538472121.690101,
76
- updatedAt: 1538472121.690101,
77
- objectType: 'MPTitles',
78
- title: 'main title',
79
- subtitle: 'subtitle',
80
- runningTitle: 'running title',
81
- manuscriptID: 'MPManuscript:E3830344-E77B-42BA-BD77-3E95489712A0',
82
- containerID: 'MPProject:1',
83
- };
84
- return defaultTitle;
85
- };
@@ -13,6 +13,7 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
+ import { Model } from '@manuscripts/json-schema';
16
17
  import { Node as ProsemirrorNode, ResolvedPos } from 'prosemirror-model';
17
18
  import { ManuscriptEditorState, ManuscriptNode } from '../schema';
18
19
  export declare function iterateChildren(node: ManuscriptNode, recurse?: boolean): Iterable<ManuscriptNode>;
@@ -27,3 +28,4 @@ export declare const findParentNodeClosestToPos: ($pos: ResolvedPos, predicate:
27
28
  node: ProsemirrorNode;
28
29
  } | undefined;
29
30
  export declare const getTrimmedTextContent: (node: Element | Document, querySelector: string) => string | null | undefined;
31
+ export declare function modelsEqual(model: Model, model2: Model): boolean;
@@ -68,7 +68,6 @@ export * from './nodes/affiliation';
68
68
  export * from './nodes/meta_section';
69
69
  export * from './nodes/contributor';
70
70
  export * from './nodes/table_element_footer';
71
- export * from './nodes/titles';
72
71
  export * from './nodes/affiliations_section';
73
72
  export * from './nodes/contributors_section';
74
73
  export declare const schema: Schema<Nodes, Marks>;
@@ -17,7 +17,7 @@ import { Fragment, Mark as ProsemirrorMark, MarkType, Node as ProsemirrorNode, N
17
17
  import { EditorState, NodeSelection, Plugin, TextSelection, Transaction } from 'prosemirror-state';
18
18
  import { EditorView, NodeView } from 'prosemirror-view';
19
19
  export type Marks = 'bold' | 'code' | 'italic' | 'smallcaps' | 'strikethrough' | 'styled' | 'subscript' | 'superscript' | 'underline' | 'tracked_insert' | 'tracked_delete';
20
- export type Nodes = 'attribution' | 'bibliography_item' | 'bibliography_element' | 'bibliography_section' | 'blockquote_element' | 'bullet_list' | 'caption' | 'caption_title' | 'comment' | 'comment_list' | 'citation' | 'cross_reference' | 'doc' | 'equation' | 'equation_element' | 'figcaption' | 'figure' | 'graphical_abstract_section' | 'figure_element' | 'footnote' | 'footnotes_element' | 'footnotes_section' | 'hard_break' | 'highlight_marker' | 'inline_equation' | 'inline_footnote' | 'keyword' | 'keywords_element' | 'keywords_group' | 'keywords_section' | 'link' | 'list_item' | 'listing' | 'listing_element' | 'manuscript' | 'missing_figure' | 'ordered_list' | 'paragraph' | 'placeholder' | 'placeholder_element' | 'pullquote_element' | 'section' | 'section_label' | 'section_title' | 'section_title_plain' | 'table' | 'table_body' | 'table_cell' | 'table_element' | 'table_row' | 'table_colgroup' | 'table_col' | 'text' | 'toc_element' | 'toc_section' | 'affiliation' | 'meta_section' | 'contributor' | 'table_element_footer' | 'titles' | 'affiliations_section' | 'contributors_section';
20
+ export type Nodes = 'attribution' | 'bibliography_item' | 'bibliography_element' | 'bibliography_section' | 'blockquote_element' | 'bullet_list' | 'caption' | 'caption_title' | 'comment' | 'comment_list' | 'citation' | 'cross_reference' | 'doc' | 'equation' | 'equation_element' | 'figcaption' | 'figure' | 'graphical_abstract_section' | 'figure_element' | 'footnote' | 'footnotes_element' | 'footnotes_section' | 'hard_break' | 'highlight_marker' | 'inline_equation' | 'inline_footnote' | 'keyword' | 'keywords_element' | 'keywords_group' | 'keywords_section' | 'link' | 'list_item' | 'listing' | 'listing_element' | 'manuscript' | 'missing_figure' | 'ordered_list' | 'paragraph' | 'placeholder' | 'placeholder_element' | 'pullquote_element' | 'section' | 'section_label' | 'section_title' | 'section_title_plain' | 'table' | 'table_body' | 'table_cell' | 'table_element' | 'table_row' | 'table_colgroup' | 'table_col' | 'text' | 'toc_element' | 'toc_section' | 'affiliation' | 'meta_section' | 'contributor' | 'table_element_footer' | 'affiliations_section' | 'contributors_section';
21
21
  export type ManuscriptSchema = Schema<Nodes, Marks>;
22
22
  export type ManuscriptEditorState = EditorState;
23
23
  export type ManuscriptEditorView = EditorView;
@@ -28,7 +28,7 @@ export type BuildEmbedded<T extends EmbeddedModel, O> = Pick<T, Exclude<keyof T,
28
28
  objectType: O;
29
29
  };
30
30
  export declare const buildProject: (owner: string) => Build<Project>;
31
- export declare const buildManuscript: () => Build<Manuscript>;
31
+ export declare const buildManuscript: (title?: string) => Build<Manuscript>;
32
32
  export type ContributorRoleType = 'author';
33
33
  export declare const buildContributor: (bibliographicName: BibliographicName, role?: ContributorRoleType, priority?: number, userID?: string, invitationID?: string) => Build<Contributor>;
34
34
  export declare const buildBibliographyItem: (data: Partial<Build<BibliographyItem>>) => Build<BibliographyItem>;
@@ -30,7 +30,6 @@ export declare class Decoder {
30
30
  private handleMissingRootSectionNodes;
31
31
  private createAffiliationSectionNode;
32
32
  private createContributorSectionNode;
33
- private createTitlesNode;
34
33
  private createRootSectionNodes;
35
34
  private createCommentsNode;
36
35
  private getComments;
@@ -25,5 +25,5 @@ export declare const modelFromNode: (node: ManuscriptNode, parent: ManuscriptNod
25
25
  interface PrioritizedValue {
26
26
  value: number;
27
27
  }
28
- export declare const encode: (node: ManuscriptNode) => Map<string, Model>;
28
+ export declare const encode: (node: ManuscriptNode, preserveWithRepeatedID?: boolean) => Map<string, Model>;
29
29
  export {};
@@ -13,7 +13,7 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { Journal, Manuscript, Model, ObjectTypes, Titles } from '@manuscripts/json-schema';
16
+ import { Journal, Manuscript, Model, ObjectTypes } from '@manuscripts/json-schema';
17
17
  import { ManuscriptModel } from './models';
18
18
  export interface ProjectBundle {
19
19
  version: string;
@@ -27,4 +27,3 @@ export declare const findManuscript: (modelMap: Map<string, Model>) => Manuscrip
27
27
  export declare const findJournal: (modelMap: Map<string, Model>) => Journal | null;
28
28
  export declare const findManuscriptModelByType: <T extends ManuscriptModel>(modelMap: Map<string, Model>, manuscript: Manuscript, objectType: ObjectTypes) => T | undefined;
29
29
  export declare const findManuscriptById: (modelMap: Map<string, Model>, manuscriptID: string) => Manuscript;
30
- export declare const findTitles: (modelMap: Map<string, Model>) => Titles;
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": "1.5.0-LEAN-2852-9",
4
+ "version": "1.5.0-LIT-528106",
5
5
  "repository": "github:Atypon-OpenSource/manuscripts-transform",
6
6
  "license": "Apache-2.0",
7
7
  "main": "dist/cjs",
@@ -29,7 +29,7 @@
29
29
  "version": "yarn build"
30
30
  },
31
31
  "dependencies": {
32
- "@manuscripts/json-schema": "2.2.0-LEAN-2852-5",
32
+ "@manuscripts/json-schema": "^2.2.0",
33
33
  "debug": "^4.3.4",
34
34
  "jszip": "^3.10.1",
35
35
  "mathjax-full": "^3.2.2",
@@ -1,32 +0,0 @@
1
- "use strict";
2
- /*!
3
- * © 2019 Atypon Systems LLC
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License");
6
- * you may not use this file except in compliance with the License.
7
- * You may obtain a copy of the License at
8
- *
9
- * http://www.apache.org/licenses/LICENSE-2.0
10
- *
11
- * Unless required by applicable law or agreed to in writing, software
12
- * distributed under the License is distributed on an "AS IS" BASIS,
13
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- * See the License for the specific language governing permissions and
15
- * limitations under the License.
16
- */
17
- Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.Titles = void 0;
19
- exports.Titles = {
20
- content: 'text*',
21
- marks: 'italic smallcaps subscript superscript',
22
- attrs: {
23
- id: { default: '' },
24
- title: { default: '' },
25
- subtitle: { default: '' },
26
- runningTitle: { default: '' },
27
- dataTracked: { default: null },
28
- },
29
- group: 'block element',
30
- parseDOM: [{ tag: 'div' }],
31
- toDOM: () => ['div', 0],
32
- };
@@ -1,29 +0,0 @@
1
- /*!
2
- * © 2019 Atypon Systems LLC
3
- *
4
- * Licensed under the Apache License, Version 2.0 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * http://www.apache.org/licenses/LICENSE-2.0
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" BASIS,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- export const Titles = {
17
- content: 'text*',
18
- marks: 'italic smallcaps subscript superscript',
19
- attrs: {
20
- id: { default: '' },
21
- title: { default: '' },
22
- subtitle: { default: '' },
23
- runningTitle: { default: '' },
24
- dataTracked: { default: null },
25
- },
26
- group: 'block element',
27
- parseDOM: [{ tag: 'div' }],
28
- toDOM: () => ['div', 0],
29
- };
@@ -1,28 +0,0 @@
1
- /*!
2
- * © 2019 Atypon Systems LLC
3
- *
4
- * Licensed under the Apache License, Version 2.0 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * http://www.apache.org/licenses/LICENSE-2.0
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" BASIS,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- import { NodeSpec } from 'prosemirror-model';
17
- import { ManuscriptNode } from '../types';
18
- interface Attrs {
19
- id: string;
20
- title: string;
21
- subtitle: string;
22
- runningTitle: string;
23
- }
24
- export interface TitlesNode extends ManuscriptNode {
25
- attrs: Attrs;
26
- }
27
- export declare const Titles: NodeSpec;
28
- export {};