@manuscripts/transform 4.3.53 → 4.4.0

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.
Files changed (172) hide show
  1. package/dist/cjs/jats/__tests__/jats-roundtrip.test.js +3 -3
  2. package/dist/cjs/version.js +1 -1
  3. package/dist/es/jats/__tests__/jats-roundtrip.test.js +3 -3
  4. package/dist/es/version.js +1 -1
  5. package/dist/types/jats/__tests__/utils.d.ts +1 -1
  6. package/dist/types/version.d.ts +1 -1
  7. package/package.json +22 -21
  8. package/src/errors.ts +28 -0
  9. package/src/getVersion.ts +21 -0
  10. package/src/index.ts +28 -0
  11. package/src/jats/__tests__/__fixtures__/debug-example.xml +136 -0
  12. package/src/jats/__tests__/__fixtures__/jats-abstract-no-body.xml +163 -0
  13. package/src/jats/__tests__/__fixtures__/jats-citations.xml +472 -0
  14. package/src/jats/__tests__/__fixtures__/jats-comments.xml +46 -0
  15. package/src/jats/__tests__/__fixtures__/jats-document.xml +134 -0
  16. package/src/jats/__tests__/__fixtures__/jats-example-doc.xml +1235 -0
  17. package/src/jats/__tests__/__fixtures__/jats-example-front-only.xml +26 -0
  18. package/src/jats/__tests__/__fixtures__/jats-example-full.xml +209 -0
  19. package/src/jats/__tests__/__fixtures__/jats-example-no-back.xml +156 -0
  20. package/src/jats/__tests__/__fixtures__/jats-example-no-body.xml +91 -0
  21. package/src/jats/__tests__/__fixtures__/jats-example.xml +221 -0
  22. package/src/jats/__tests__/__fixtures__/jats-fn-group.xml +60 -0
  23. package/src/jats/__tests__/__fixtures__/jats-import-no-refs.xml +1077 -0
  24. package/src/jats/__tests__/__fixtures__/jats-import.xml +1561 -0
  25. package/src/jats/__tests__/__fixtures__/jats-roundtrip.xml +133 -0
  26. package/src/jats/__tests__/__fixtures__/jats-tables-example.xml +2043 -0
  27. package/src/jats/__tests__/__fixtures__/math-fragment.xml +12 -0
  28. package/src/jats/__tests__/__snapshots__/citeproc.test.ts.snap +57 -0
  29. package/src/jats/__tests__/__snapshots__/create-article-node.test.ts.snap +65 -0
  30. package/src/jats/__tests__/__snapshots__/jats-exporter.test.ts.snap +7 -0
  31. package/src/jats/__tests__/__snapshots__/jats-importer.test.ts.snap +59605 -0
  32. package/src/jats/__tests__/__snapshots__/jats-roundtrip.test.ts.snap +18 -0
  33. package/src/jats/__tests__/citations.ts +25 -0
  34. package/src/jats/__tests__/citeproc.test.ts +195 -0
  35. package/src/jats/__tests__/create-article-node.test.ts +29 -0
  36. package/src/jats/__tests__/data/section-categories.ts +212 -0
  37. package/src/jats/__tests__/files.ts +24 -0
  38. package/src/jats/__tests__/jats-exporter.test.ts +223 -0
  39. package/src/jats/__tests__/jats-importer.test.ts +567 -0
  40. package/src/jats/__tests__/jats-roundtrip.test.ts +66 -0
  41. package/src/jats/__tests__/utils.ts +90 -0
  42. package/src/jats/exporter/citeproc.ts +265 -0
  43. package/src/jats/exporter/jats-exporter.ts +2090 -0
  44. package/src/jats/exporter/jats-versions.ts +50 -0
  45. package/src/jats/exporter/labels.ts +101 -0
  46. package/src/jats/importer/create-article-node.ts +52 -0
  47. package/src/jats/importer/jats-comments.ts +111 -0
  48. package/src/jats/importer/jats-dom-parser.ts +1260 -0
  49. package/src/jats/importer/jats-parser-utils.ts +234 -0
  50. package/src/jats/importer/jats-transformations.ts +591 -0
  51. package/src/jats/importer/parse-jats-article.ts +106 -0
  52. package/src/jats/index.ts +21 -0
  53. package/src/jats/types.ts +16 -0
  54. package/src/lib/__tests__/footnotes.test.ts +36 -0
  55. package/src/lib/citeproc.ts +30 -0
  56. package/src/lib/credit-roles.ts +91 -0
  57. package/src/lib/deafults.ts +17 -0
  58. package/src/lib/footnotes.ts +85 -0
  59. package/src/lib/html.ts +56 -0
  60. package/src/lib/section-categories.ts +27 -0
  61. package/src/lib/utils.ts +145 -0
  62. package/src/lib/xml.ts +28 -0
  63. package/src/schema/__tests__/docs.ts +1911 -0
  64. package/src/schema/__tests__/groups.test.ts +61 -0
  65. package/src/schema/__tests__/migration.test.ts +23 -0
  66. package/src/schema/groups.ts +36 -0
  67. package/src/schema/index.ts +286 -0
  68. package/src/schema/marks.ts +254 -0
  69. package/src/schema/migration/migrate.ts +77 -0
  70. package/src/schema/migration/migration-script.ts +26 -0
  71. package/src/schema/migration/migration-scripts/1.2.5.ts +44 -0
  72. package/src/schema/migration/migration-scripts/2.3.22.ts +52 -0
  73. package/src/schema/migration/migration-scripts/3.0.12.ts +33 -0
  74. package/src/schema/migration/migration-scripts/3.0.21.ts +50 -0
  75. package/src/schema/migration/migration-scripts/3.0.30.ts +65 -0
  76. package/src/schema/migration/migration-scripts/3.0.31.ts +40 -0
  77. package/src/schema/migration/migration-scripts/3.0.41.ts +37 -0
  78. package/src/schema/migration/migration-scripts/3.0.55.ts +42 -0
  79. package/src/schema/migration/migration-scripts/3.0.56.ts +114 -0
  80. package/src/schema/migration/migration-scripts/4.2.13.ts +37 -0
  81. package/src/schema/migration/migration-scripts/4.2.15.ts +48 -0
  82. package/src/schema/migration/migration-scripts/4.3.23.ts +55 -0
  83. package/src/schema/migration/migration-scripts/4.3.34.ts +132 -0
  84. package/src/schema/migration/migration-scripts/4.3.35.ts +41 -0
  85. package/src/schema/migration/migration-scripts/index.ts +49 -0
  86. package/src/schema/nodes/abstracts.ts +29 -0
  87. package/src/schema/nodes/affiliation.ts +88 -0
  88. package/src/schema/nodes/affiliations.ts +30 -0
  89. package/src/schema/nodes/alt_text.ts +36 -0
  90. package/src/schema/nodes/alt_title.ts +40 -0
  91. package/src/schema/nodes/alt_titles_section.ts +58 -0
  92. package/src/schema/nodes/attachment.ts +46 -0
  93. package/src/schema/nodes/attachments.ts +45 -0
  94. package/src/schema/nodes/attribution.ts +38 -0
  95. package/src/schema/nodes/author_notes.ts +44 -0
  96. package/src/schema/nodes/award.ts +52 -0
  97. package/src/schema/nodes/awards.ts +45 -0
  98. package/src/schema/nodes/backmatter.ts +31 -0
  99. package/src/schema/nodes/bibliography_element.ts +58 -0
  100. package/src/schema/nodes/bibliography_item.ts +108 -0
  101. package/src/schema/nodes/bibliography_section.ts +60 -0
  102. package/src/schema/nodes/blockquote_element.ts +79 -0
  103. package/src/schema/nodes/body.ts +29 -0
  104. package/src/schema/nodes/box_element.ts +67 -0
  105. package/src/schema/nodes/caption.ts +67 -0
  106. package/src/schema/nodes/caption_title.ts +67 -0
  107. package/src/schema/nodes/citation.ts +70 -0
  108. package/src/schema/nodes/comment.ts +50 -0
  109. package/src/schema/nodes/comments.ts +28 -0
  110. package/src/schema/nodes/contributor.ts +87 -0
  111. package/src/schema/nodes/contributors.ts +40 -0
  112. package/src/schema/nodes/core_section.ts +27 -0
  113. package/src/schema/nodes/corresp.ts +49 -0
  114. package/src/schema/nodes/cross_reference.ts +64 -0
  115. package/src/schema/nodes/doc.ts +21 -0
  116. package/src/schema/nodes/embed.ts +55 -0
  117. package/src/schema/nodes/equation.ts +65 -0
  118. package/src/schema/nodes/equation_element.ts +61 -0
  119. package/src/schema/nodes/figure.ts +65 -0
  120. package/src/schema/nodes/figure_element.ts +73 -0
  121. package/src/schema/nodes/footnote.ts +95 -0
  122. package/src/schema/nodes/footnotes_element.ts +69 -0
  123. package/src/schema/nodes/footnotes_section.ts +61 -0
  124. package/src/schema/nodes/general_table_footnote.ts +42 -0
  125. package/src/schema/nodes/graphical_abstract_section.ts +62 -0
  126. package/src/schema/nodes/hard_break.ts +36 -0
  127. package/src/schema/nodes/hero_image.ts +46 -0
  128. package/src/schema/nodes/highlight_marker.ts +68 -0
  129. package/src/schema/nodes/image_element.ts +49 -0
  130. package/src/schema/nodes/inline_equation.ts +68 -0
  131. package/src/schema/nodes/inline_footnote.ts +66 -0
  132. package/src/schema/nodes/keyword.ts +61 -0
  133. package/src/schema/nodes/keyword_group.ts +63 -0
  134. package/src/schema/nodes/keywords.ts +59 -0
  135. package/src/schema/nodes/keywords_element.ts +64 -0
  136. package/src/schema/nodes/link.ts +79 -0
  137. package/src/schema/nodes/list.ts +134 -0
  138. package/src/schema/nodes/listing.ts +91 -0
  139. package/src/schema/nodes/listing_element.ts +61 -0
  140. package/src/schema/nodes/long_desc.ts +36 -0
  141. package/src/schema/nodes/manuscript.ts +86 -0
  142. package/src/schema/nodes/missing_figure.ts +59 -0
  143. package/src/schema/nodes/paragraph.ts +77 -0
  144. package/src/schema/nodes/placeholder.ts +62 -0
  145. package/src/schema/nodes/placeholder_element.ts +60 -0
  146. package/src/schema/nodes/pullquote_element.ts +81 -0
  147. package/src/schema/nodes/quote_image.ts +64 -0
  148. package/src/schema/nodes/section.ts +69 -0
  149. package/src/schema/nodes/section_label.ts +39 -0
  150. package/src/schema/nodes/section_title.ts +58 -0
  151. package/src/schema/nodes/subtitle.ts +40 -0
  152. package/src/schema/nodes/subtitles.ts +51 -0
  153. package/src/schema/nodes/supplement.ts +77 -0
  154. package/src/schema/nodes/supplements.ts +60 -0
  155. package/src/schema/nodes/table.ts +144 -0
  156. package/src/schema/nodes/table_col.ts +76 -0
  157. package/src/schema/nodes/table_element.ts +67 -0
  158. package/src/schema/nodes/table_element_footer.ts +42 -0
  159. package/src/schema/nodes/text.ts +31 -0
  160. package/src/schema/nodes/title.ts +43 -0
  161. package/src/schema/nodes/trans_abstract.ts +58 -0
  162. package/src/schema/nodes/trans_graphical_abstract.ts +67 -0
  163. package/src/schema/types.ts +240 -0
  164. package/src/tests.ts +33 -0
  165. package/src/transformer/id.ts +23 -0
  166. package/src/transformer/index.ts +21 -0
  167. package/src/transformer/node-names.ts +73 -0
  168. package/src/transformer/node-title.ts +111 -0
  169. package/src/transformer/node-types.ts +39 -0
  170. package/src/transformer/node-validator.ts +82 -0
  171. package/src/types.ts +25 -0
  172. package/src/version.ts +1 -0
@@ -0,0 +1,58 @@
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
+
17
+ import { NodeSpec } from 'prosemirror-model'
18
+
19
+ import { ManuscriptNode } from '../types'
20
+
21
+ export interface SectionTitleNode extends ManuscriptNode {
22
+ attrs: Record<string, unknown>
23
+ }
24
+
25
+ export const sectionTitle: NodeSpec = {
26
+ content: '(text | highlight_marker)*',
27
+ marks:
28
+ 'italic superscript subscript smallcaps bold tracked_insert tracked_delete',
29
+ group: 'block',
30
+ attrs: { dataTracked: { default: null } },
31
+ selectable: false,
32
+ parseDOM: [
33
+ {
34
+ tag: 'h1',
35
+ },
36
+ {
37
+ tag: 'h2',
38
+ },
39
+ {
40
+ tag: 'h3',
41
+ },
42
+ {
43
+ tag: 'h4',
44
+ },
45
+ {
46
+ tag: 'h5',
47
+ },
48
+ {
49
+ tag: 'h6',
50
+ },
51
+ ],
52
+ toDOM: () => ['h1', 0],
53
+ }
54
+
55
+ export const isSectionTitleNode = (
56
+ node: ManuscriptNode
57
+ ): node is SectionTitleNode =>
58
+ node.type === node.type.schema.nodes.section_title
@@ -0,0 +1,40 @@
1
+ /*!
2
+ * © 2025 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
+
17
+ import { NodeSpec } from 'prosemirror-model'
18
+
19
+ import { ManuscriptNode } from '../types'
20
+
21
+ export interface SubtitleAttrs {
22
+ id: string
23
+ }
24
+
25
+ export interface SubtitleNode extends ManuscriptNode {
26
+ attrs: SubtitleAttrs
27
+ }
28
+
29
+ export const subtitle: NodeSpec = {
30
+ content: '(text | highlight_marker)*',
31
+ attrs: {
32
+ id: { default: '' },
33
+ dataTracked: { default: null },
34
+ },
35
+ group: 'block element',
36
+ toDOM: () => ['div', 0],
37
+ }
38
+
39
+ export const isSubtitleNode = (node: ManuscriptNode): node is SubtitleNode =>
40
+ node.type === node.type.schema.nodes.subtitle
@@ -0,0 +1,51 @@
1
+ /*!
2
+ * © 2025 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
+
17
+ import { NodeSpec } from 'prosemirror-model'
18
+
19
+ import { ManuscriptNode } from '../types'
20
+
21
+ export interface SubtitlesAttrs {
22
+ id: string
23
+ }
24
+
25
+ export interface SubtitlesNode extends ManuscriptNode {
26
+ attrs: SubtitlesAttrs
27
+ }
28
+
29
+ export const subtitles: NodeSpec = {
30
+ content: 'subtitle*',
31
+ attrs: {
32
+ id: { default: '' },
33
+ dataTracked: { default: null },
34
+ },
35
+ group: 'block sections',
36
+ selectable: false,
37
+ toDOM: (node) => {
38
+ const subtitlesNode = node as SubtitlesNode
39
+ return [
40
+ 'section',
41
+ {
42
+ id: subtitlesNode.attrs.id,
43
+ class: 'subtitles',
44
+ },
45
+ 0,
46
+ ]
47
+ },
48
+ }
49
+
50
+ export const isSubtitlesNode = (node: ManuscriptNode): node is SubtitlesNode =>
51
+ node.type === node.type.schema.nodes.subtitles
@@ -0,0 +1,77 @@
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
+
17
+ import { NodeSpec } from 'prosemirror-model'
18
+
19
+ import { ManuscriptNode } from '../types'
20
+
21
+ export interface SupplementAttrs {
22
+ id: string
23
+ href: string
24
+ mimeType: string
25
+ mimeSubType: string
26
+ }
27
+
28
+ export interface SupplementNode extends ManuscriptNode {
29
+ attrs: SupplementAttrs
30
+ }
31
+
32
+ export const supplement: NodeSpec = {
33
+ content: 'caption_title caption',
34
+ attrs: {
35
+ id: { default: '' },
36
+ href: { default: '' },
37
+ mimeType: { default: '' },
38
+ mimeSubType: { default: '' },
39
+ dataTracked: { default: null },
40
+ },
41
+ group: 'block',
42
+ parseDOM: [
43
+ {
44
+ tag: 'div.supplement',
45
+ getAttrs: (dom) => {
46
+ const el = dom as HTMLElement
47
+ const id = el.getAttribute('id')
48
+ const href = el.getAttribute('href')
49
+ const mimeType = el.getAttribute('mimeType')
50
+ const mimeSubType = el.getAttribute('mimeSubType')
51
+ const title = el.textContent
52
+ return {
53
+ id,
54
+ href,
55
+ mimeType,
56
+ mimeSubType,
57
+ title,
58
+ }
59
+ },
60
+ },
61
+ ],
62
+ toDOM: (node) => {
63
+ const supplement = node as SupplementNode
64
+
65
+ return [
66
+ 'div',
67
+ {
68
+ id: supplement.attrs.id,
69
+ class: 'Supplement',
70
+ href: node.attrs.href,
71
+ mimeType: node.attrs.mimeType,
72
+ mimeSubType: node.attrs.mimeSubType,
73
+ title: node.attrs.title,
74
+ },
75
+ ]
76
+ },
77
+ }
@@ -0,0 +1,60 @@
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
+
17
+ import { NodeSpec } from 'prosemirror-model'
18
+
19
+ import { ManuscriptNode } from '../types'
20
+
21
+ interface Attrs {
22
+ id: string
23
+ }
24
+
25
+ export interface SupplementsNode extends ManuscriptNode {
26
+ attrs: Attrs
27
+ }
28
+
29
+ export const supplements: NodeSpec = {
30
+ content: 'section_title supplement*',
31
+ attrs: {
32
+ id: { default: '' },
33
+ dataTracked: { default: null },
34
+ },
35
+ group: 'block',
36
+ selectable: false,
37
+ parseDOM: [
38
+ {
39
+ tag: 'div.supplements',
40
+ },
41
+ ],
42
+ toDOM: (node) => {
43
+ const supplements = node as SupplementsNode
44
+
45
+ return [
46
+ 'div',
47
+ {
48
+ id: supplements.attrs.id,
49
+ class: 'supplements',
50
+ spellcheck: 'false',
51
+ contenteditable: false,
52
+ },
53
+ 0,
54
+ ]
55
+ },
56
+ }
57
+
58
+ export const isSupplementsNode = (
59
+ node: ManuscriptNode
60
+ ): node is SupplementsNode => node.type === node.type.schema.nodes.supplements
@@ -0,0 +1,144 @@
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
+
17
+ import { NodeSpec } from 'prosemirror-model'
18
+ import {
19
+ CellAttributes,
20
+ MutableAttrs,
21
+ TableNodes,
22
+ tableNodes as createTableNodes,
23
+ TableNodesOptions,
24
+ } from 'prosemirror-tables'
25
+
26
+ type getFromDOM = (dom: HTMLElement) => unknown
27
+ type setDOMAttr = (value: unknown, attrs: MutableAttrs) => void
28
+
29
+ function createCellAttribute(
30
+ attributeName: string,
31
+ defaultValue: unknown = null,
32
+ customGetFromDOM?: getFromDOM,
33
+ customSetDOMAttr?: setDOMAttr
34
+ ): CellAttributes {
35
+ return {
36
+ default: defaultValue,
37
+ getFromDOM(dom) {
38
+ if (customGetFromDOM) {
39
+ return customGetFromDOM(dom)
40
+ }
41
+ return dom.getAttribute(attributeName)
42
+ },
43
+ setDOMAttr(value, attrs) {
44
+ if (customSetDOMAttr) {
45
+ customSetDOMAttr(value, attrs)
46
+ } else if (value) {
47
+ attrs[attributeName] = value
48
+ }
49
+ },
50
+ }
51
+ }
52
+
53
+ const tableOptions: TableNodesOptions = {
54
+ cellContent: 'text_block+',
55
+ cellAttributes: {
56
+ placeholder: createCellAttribute(
57
+ 'data-placeholder-text',
58
+ 'Data',
59
+ (dom) => dom.getAttribute('data-placeholder-text') || ''
60
+ ),
61
+ valign: createCellAttribute('valign'),
62
+ align: createCellAttribute('align'),
63
+ scope: createCellAttribute('scope'),
64
+ style: createCellAttribute('style'),
65
+ colspan: createCellAttribute(
66
+ 'colspan',
67
+ 1,
68
+ (dom) => Number(dom.getAttribute('colspan') || 1),
69
+ (value, attrs) => {
70
+ if (value && value !== 1) {
71
+ attrs['colspan'] = String(value)
72
+ }
73
+ }
74
+ ),
75
+ rowspan: createCellAttribute(
76
+ 'rowspan',
77
+ 1,
78
+ (dom) => Number(dom.getAttribute('rowspan') || 1),
79
+ (value, attrs) => {
80
+ if (value && value !== 1) {
81
+ attrs['rowspan'] = String(value)
82
+ }
83
+ }
84
+ ),
85
+ },
86
+ }
87
+
88
+ const tableNodes: TableNodes = createTableNodes(tableOptions)
89
+
90
+ // this is based on prsemirror-tables schema with our added attributes
91
+ export const table: NodeSpec = {
92
+ attrs: {
93
+ id: { default: '' },
94
+ dataTracked: { default: null },
95
+ },
96
+ content: 'table_row+',
97
+ tableRole: 'table',
98
+ isolating: true,
99
+ group: 'block',
100
+ parseDOM: [
101
+ {
102
+ tag: 'table',
103
+ getAttrs: (p) => {
104
+ const dom = p as HTMLElement
105
+ return {
106
+ id: dom.getAttribute('id'),
107
+ }
108
+ },
109
+ },
110
+ ],
111
+ toDOM(node) {
112
+ return [
113
+ 'table',
114
+ {
115
+ id: node.attrs.id,
116
+ },
117
+ ['tbody', 0],
118
+ ]
119
+ },
120
+ }
121
+ export const tableRow: NodeSpec = {
122
+ ...tableNodes.table_row,
123
+ attrs: {
124
+ ...tableNodes.table_row.attrs,
125
+ id: { default: '' },
126
+ dataTracked: { default: null },
127
+ },
128
+ }
129
+ export const tableCell: NodeSpec = {
130
+ ...tableNodes.table_cell,
131
+ attrs: {
132
+ ...tableNodes.table_cell.attrs,
133
+ id: { default: '' },
134
+ dataTracked: { default: null },
135
+ },
136
+ }
137
+ export const tableHeader: NodeSpec = {
138
+ ...tableNodes.table_header,
139
+ attrs: {
140
+ ...tableNodes.table_header.attrs,
141
+ id: { default: '' },
142
+ dataTracked: { default: null },
143
+ },
144
+ }
@@ -0,0 +1,76 @@
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
+
17
+ // adapted from 'prosemirror-tables'
18
+
19
+ import { NodeSpec } from 'prosemirror-model'
20
+
21
+ import { ManuscriptNode } from '../types'
22
+
23
+ export interface TableColNode extends ManuscriptNode {
24
+ attrs: {
25
+ width: string
26
+ id: string
27
+ }
28
+ }
29
+
30
+ export const tableColGroup: NodeSpec = {
31
+ content: 'table_col+',
32
+ group: 'block',
33
+ parseDOM: [
34
+ {
35
+ tag: 'colgroup',
36
+ },
37
+ ],
38
+ toDOM() {
39
+ return ['colgroup', 0]
40
+ },
41
+ }
42
+
43
+ export const tableCol: NodeSpec = {
44
+ attrs: {
45
+ width: { default: '' },
46
+ id: { default: '' },
47
+ },
48
+ group: 'block',
49
+ parseDOM: [
50
+ {
51
+ tag: 'col',
52
+ getAttrs: (p) => {
53
+ const dom = p as HTMLTableColElement
54
+
55
+ return {
56
+ width: dom.getAttribute('width'),
57
+ id: dom.getAttribute('id'),
58
+ }
59
+ },
60
+ },
61
+ ],
62
+ toDOM: (node) => {
63
+ const tableColNode = node as TableColNode
64
+
65
+ const attrs: { [key: string]: string } = {}
66
+
67
+ if (tableColNode.attrs.width) {
68
+ attrs['width'] = tableColNode.attrs.width
69
+ }
70
+ if (tableColNode.attrs.id) {
71
+ attrs['id'] = tableColNode.attrs.id
72
+ }
73
+
74
+ return ['col', attrs]
75
+ },
76
+ }
@@ -0,0 +1,67 @@
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
+
17
+ import { NodeSpec } from 'prosemirror-model'
18
+
19
+ import { ManuscriptNode } from '../types'
20
+
21
+ export interface TableAttrs {
22
+ id: string
23
+ }
24
+
25
+ export interface TableElementNode extends ManuscriptNode {
26
+ attrs: TableAttrs
27
+ }
28
+
29
+ export const tableElement: NodeSpec = {
30
+ content:
31
+ 'caption_title (table | placeholder) table_colgroup? table_element_footer? alt_text long_desc (listing | placeholder)',
32
+ attrs: {
33
+ id: { default: '' },
34
+ dataTracked: { default: null },
35
+ },
36
+ selectable: false,
37
+ group: 'block element executable',
38
+ parseDOM: [
39
+ {
40
+ tag: 'figure.table',
41
+ getAttrs: (dom) => {
42
+ const element = dom as HTMLTableElement
43
+
44
+ return {
45
+ id: element.getAttribute('id'),
46
+ }
47
+ },
48
+ },
49
+ ],
50
+ toDOM: (node) => {
51
+ const tableElementNode = node as TableElementNode
52
+
53
+ return [
54
+ 'figure',
55
+ {
56
+ class: 'table', // TODO: suppress-header, suppress-footer?
57
+ id: tableElementNode.attrs.id,
58
+ },
59
+ 0,
60
+ ]
61
+ },
62
+ }
63
+
64
+ export const isTableElementNode = (
65
+ node: ManuscriptNode
66
+ ): node is TableElementNode =>
67
+ node.type === node.type.schema.nodes.table_element
@@ -0,0 +1,42 @@
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
+
17
+ import { NodeSpec } from 'prosemirror-model'
18
+
19
+ import { ManuscriptNode } from '../types'
20
+
21
+ interface Attrs {
22
+ id: string
23
+ }
24
+
25
+ export interface TableElementFooterNode extends ManuscriptNode {
26
+ attrs: Attrs
27
+ }
28
+
29
+ export const tableElementFooter: NodeSpec = {
30
+ attrs: {
31
+ id: { default: '' },
32
+ dataTracked: { default: null },
33
+ },
34
+ content: 'general_table_footnote? footnotes_element?',
35
+ group: 'block element',
36
+ toDOM: () => ['table-wrap-foot', 0],
37
+ }
38
+
39
+ export const isTableElementFooter = (
40
+ node: ManuscriptNode
41
+ ): node is TableElementFooterNode =>
42
+ node.type === node.type.schema.nodes.table_element_footer
@@ -0,0 +1,31 @@
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
+
17
+ import { NodeSpec } from 'prosemirror-model'
18
+
19
+ import { paragraph } from './paragraph'
20
+
21
+ export const text: NodeSpec = {
22
+ group: 'inline',
23
+ }
24
+
25
+ export const textBlock: NodeSpec = {
26
+ ...paragraph,
27
+ attrs: {
28
+ dataTracked: { default: null },
29
+ },
30
+ group: 'block',
31
+ }
@@ -0,0 +1,43 @@
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
+
17
+ import { NodeSpec } from 'prosemirror-model'
18
+
19
+ import { ManuscriptNode } from '../types'
20
+
21
+ export interface TitleAttrs {
22
+ id: string
23
+ placeholder: string
24
+ }
25
+
26
+ export interface TitleNode extends ManuscriptNode {
27
+ attrs: TitleAttrs
28
+ }
29
+
30
+ export const title: NodeSpec = {
31
+ content: '(text | highlight_marker)*',
32
+ attrs: {
33
+ id: { default: '' },
34
+ placeholder: { default: 'Insert title here...' },
35
+ dataTracked: { default: null },
36
+ },
37
+ group: 'block element',
38
+ parseDOM: [{ tag: 'div' }],
39
+ toDOM: () => ['div', 0],
40
+ }
41
+
42
+ export const isTitleNode = (node: ManuscriptNode): node is TitleNode =>
43
+ node.type === node.type.schema.nodes.title