@manuscripts/transform 4.3.53 → 4.4.1

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 (196) hide show
  1. package/dist/cjs/jats/__tests__/jats-roundtrip.test.js +3 -3
  2. package/dist/cjs/jats/exporter/jats-exporter.js +3 -0
  3. package/dist/cjs/jats/importer/jats-dom-parser.js +41 -1
  4. package/dist/cjs/schema/index.js +9 -0
  5. package/dist/cjs/schema/nodes/headshot_element.js +38 -0
  6. package/dist/cjs/schema/nodes/headshot_grid.js +37 -0
  7. package/dist/cjs/schema/nodes/headshot_image.js +51 -0
  8. package/dist/cjs/transformer/node-names.js +2 -0
  9. package/dist/cjs/transformer/node-title.js +6 -0
  10. package/dist/cjs/version.js +1 -1
  11. package/dist/es/jats/__tests__/jats-roundtrip.test.js +3 -3
  12. package/dist/es/jats/exporter/jats-exporter.js +3 -0
  13. package/dist/es/jats/importer/jats-dom-parser.js +41 -1
  14. package/dist/es/schema/index.js +9 -0
  15. package/dist/es/schema/nodes/headshot_element.js +34 -0
  16. package/dist/es/schema/nodes/headshot_grid.js +33 -0
  17. package/dist/es/schema/nodes/headshot_image.js +48 -0
  18. package/dist/es/transformer/node-names.js +2 -0
  19. package/dist/es/transformer/node-title.js +6 -0
  20. package/dist/es/version.js +1 -1
  21. package/dist/types/jats/__tests__/utils.d.ts +1 -1
  22. package/dist/types/schema/index.d.ts +3 -0
  23. package/dist/types/schema/nodes/headshot_element.d.ts +25 -0
  24. package/dist/types/schema/nodes/headshot_grid.d.ts +24 -0
  25. package/dist/types/schema/nodes/headshot_image.d.ts +26 -0
  26. package/dist/types/schema/types.d.ts +1 -1
  27. package/dist/types/version.d.ts +1 -1
  28. package/package.json +22 -21
  29. package/src/errors.ts +28 -0
  30. package/src/getVersion.ts +21 -0
  31. package/src/index.ts +28 -0
  32. package/src/jats/__tests__/__fixtures__/debug-example.xml +136 -0
  33. package/src/jats/__tests__/__fixtures__/jats-abstract-no-body.xml +163 -0
  34. package/src/jats/__tests__/__fixtures__/jats-citations.xml +472 -0
  35. package/src/jats/__tests__/__fixtures__/jats-comments.xml +46 -0
  36. package/src/jats/__tests__/__fixtures__/jats-document.xml +134 -0
  37. package/src/jats/__tests__/__fixtures__/jats-example-doc.xml +1235 -0
  38. package/src/jats/__tests__/__fixtures__/jats-example-front-only.xml +26 -0
  39. package/src/jats/__tests__/__fixtures__/jats-example-full.xml +209 -0
  40. package/src/jats/__tests__/__fixtures__/jats-example-no-back.xml +156 -0
  41. package/src/jats/__tests__/__fixtures__/jats-example-no-body.xml +91 -0
  42. package/src/jats/__tests__/__fixtures__/jats-example.xml +221 -0
  43. package/src/jats/__tests__/__fixtures__/jats-fn-group.xml +60 -0
  44. package/src/jats/__tests__/__fixtures__/jats-import-no-refs.xml +1077 -0
  45. package/src/jats/__tests__/__fixtures__/jats-import.xml +1578 -0
  46. package/src/jats/__tests__/__fixtures__/jats-roundtrip.xml +133 -0
  47. package/src/jats/__tests__/__fixtures__/jats-tables-example.xml +2043 -0
  48. package/src/jats/__tests__/__fixtures__/math-fragment.xml +12 -0
  49. package/src/jats/__tests__/__snapshots__/citeproc.test.ts.snap +57 -0
  50. package/src/jats/__tests__/__snapshots__/create-article-node.test.ts.snap +65 -0
  51. package/src/jats/__tests__/__snapshots__/jats-exporter.test.ts.snap +7 -0
  52. package/src/jats/__tests__/__snapshots__/jats-importer.test.ts.snap +59796 -0
  53. package/src/jats/__tests__/__snapshots__/jats-roundtrip.test.ts.snap +18 -0
  54. package/src/jats/__tests__/citations.ts +25 -0
  55. package/src/jats/__tests__/citeproc.test.ts +195 -0
  56. package/src/jats/__tests__/create-article-node.test.ts +29 -0
  57. package/src/jats/__tests__/data/section-categories.ts +212 -0
  58. package/src/jats/__tests__/files.ts +24 -0
  59. package/src/jats/__tests__/jats-exporter.test.ts +223 -0
  60. package/src/jats/__tests__/jats-importer.test.ts +567 -0
  61. package/src/jats/__tests__/jats-roundtrip.test.ts +66 -0
  62. package/src/jats/__tests__/utils.ts +90 -0
  63. package/src/jats/exporter/citeproc.ts +265 -0
  64. package/src/jats/exporter/jats-exporter.ts +2093 -0
  65. package/src/jats/exporter/jats-versions.ts +50 -0
  66. package/src/jats/exporter/labels.ts +101 -0
  67. package/src/jats/importer/create-article-node.ts +52 -0
  68. package/src/jats/importer/jats-comments.ts +111 -0
  69. package/src/jats/importer/jats-dom-parser.ts +1306 -0
  70. package/src/jats/importer/jats-parser-utils.ts +234 -0
  71. package/src/jats/importer/jats-transformations.ts +591 -0
  72. package/src/jats/importer/parse-jats-article.ts +106 -0
  73. package/src/jats/index.ts +21 -0
  74. package/src/jats/types.ts +16 -0
  75. package/src/lib/__tests__/footnotes.test.ts +36 -0
  76. package/src/lib/citeproc.ts +30 -0
  77. package/src/lib/credit-roles.ts +91 -0
  78. package/src/lib/deafults.ts +17 -0
  79. package/src/lib/footnotes.ts +85 -0
  80. package/src/lib/html.ts +56 -0
  81. package/src/lib/section-categories.ts +27 -0
  82. package/src/lib/utils.ts +145 -0
  83. package/src/lib/xml.ts +28 -0
  84. package/src/schema/__tests__/docs.ts +1911 -0
  85. package/src/schema/__tests__/groups.test.ts +61 -0
  86. package/src/schema/__tests__/migration.test.ts +23 -0
  87. package/src/schema/groups.ts +36 -0
  88. package/src/schema/index.ts +295 -0
  89. package/src/schema/marks.ts +254 -0
  90. package/src/schema/migration/migrate.ts +77 -0
  91. package/src/schema/migration/migration-script.ts +26 -0
  92. package/src/schema/migration/migration-scripts/1.2.5.ts +44 -0
  93. package/src/schema/migration/migration-scripts/2.3.22.ts +52 -0
  94. package/src/schema/migration/migration-scripts/3.0.12.ts +33 -0
  95. package/src/schema/migration/migration-scripts/3.0.21.ts +50 -0
  96. package/src/schema/migration/migration-scripts/3.0.30.ts +65 -0
  97. package/src/schema/migration/migration-scripts/3.0.31.ts +40 -0
  98. package/src/schema/migration/migration-scripts/3.0.41.ts +37 -0
  99. package/src/schema/migration/migration-scripts/3.0.55.ts +42 -0
  100. package/src/schema/migration/migration-scripts/3.0.56.ts +114 -0
  101. package/src/schema/migration/migration-scripts/4.2.13.ts +37 -0
  102. package/src/schema/migration/migration-scripts/4.2.15.ts +48 -0
  103. package/src/schema/migration/migration-scripts/4.3.23.ts +55 -0
  104. package/src/schema/migration/migration-scripts/4.3.34.ts +132 -0
  105. package/src/schema/migration/migration-scripts/4.3.35.ts +41 -0
  106. package/src/schema/migration/migration-scripts/index.ts +49 -0
  107. package/src/schema/nodes/abstracts.ts +29 -0
  108. package/src/schema/nodes/affiliation.ts +88 -0
  109. package/src/schema/nodes/affiliations.ts +30 -0
  110. package/src/schema/nodes/alt_text.ts +36 -0
  111. package/src/schema/nodes/alt_title.ts +40 -0
  112. package/src/schema/nodes/alt_titles_section.ts +58 -0
  113. package/src/schema/nodes/attachment.ts +46 -0
  114. package/src/schema/nodes/attachments.ts +45 -0
  115. package/src/schema/nodes/attribution.ts +38 -0
  116. package/src/schema/nodes/author_notes.ts +44 -0
  117. package/src/schema/nodes/award.ts +52 -0
  118. package/src/schema/nodes/awards.ts +45 -0
  119. package/src/schema/nodes/backmatter.ts +31 -0
  120. package/src/schema/nodes/bibliography_element.ts +58 -0
  121. package/src/schema/nodes/bibliography_item.ts +108 -0
  122. package/src/schema/nodes/bibliography_section.ts +60 -0
  123. package/src/schema/nodes/blockquote_element.ts +79 -0
  124. package/src/schema/nodes/body.ts +29 -0
  125. package/src/schema/nodes/box_element.ts +67 -0
  126. package/src/schema/nodes/caption.ts +67 -0
  127. package/src/schema/nodes/caption_title.ts +67 -0
  128. package/src/schema/nodes/citation.ts +70 -0
  129. package/src/schema/nodes/comment.ts +50 -0
  130. package/src/schema/nodes/comments.ts +28 -0
  131. package/src/schema/nodes/contributor.ts +87 -0
  132. package/src/schema/nodes/contributors.ts +40 -0
  133. package/src/schema/nodes/core_section.ts +27 -0
  134. package/src/schema/nodes/corresp.ts +49 -0
  135. package/src/schema/nodes/cross_reference.ts +64 -0
  136. package/src/schema/nodes/doc.ts +21 -0
  137. package/src/schema/nodes/embed.ts +55 -0
  138. package/src/schema/nodes/equation.ts +65 -0
  139. package/src/schema/nodes/equation_element.ts +61 -0
  140. package/src/schema/nodes/figure.ts +65 -0
  141. package/src/schema/nodes/figure_element.ts +73 -0
  142. package/src/schema/nodes/footnote.ts +95 -0
  143. package/src/schema/nodes/footnotes_element.ts +69 -0
  144. package/src/schema/nodes/footnotes_section.ts +61 -0
  145. package/src/schema/nodes/general_table_footnote.ts +42 -0
  146. package/src/schema/nodes/graphical_abstract_section.ts +62 -0
  147. package/src/schema/nodes/hard_break.ts +36 -0
  148. package/src/schema/nodes/headshot_element.ts +48 -0
  149. package/src/schema/nodes/headshot_grid.ts +46 -0
  150. package/src/schema/nodes/headshot_image.ts +65 -0
  151. package/src/schema/nodes/hero_image.ts +46 -0
  152. package/src/schema/nodes/highlight_marker.ts +68 -0
  153. package/src/schema/nodes/image_element.ts +49 -0
  154. package/src/schema/nodes/inline_equation.ts +68 -0
  155. package/src/schema/nodes/inline_footnote.ts +66 -0
  156. package/src/schema/nodes/keyword.ts +61 -0
  157. package/src/schema/nodes/keyword_group.ts +63 -0
  158. package/src/schema/nodes/keywords.ts +59 -0
  159. package/src/schema/nodes/keywords_element.ts +64 -0
  160. package/src/schema/nodes/link.ts +79 -0
  161. package/src/schema/nodes/list.ts +134 -0
  162. package/src/schema/nodes/listing.ts +91 -0
  163. package/src/schema/nodes/listing_element.ts +61 -0
  164. package/src/schema/nodes/long_desc.ts +36 -0
  165. package/src/schema/nodes/manuscript.ts +86 -0
  166. package/src/schema/nodes/missing_figure.ts +59 -0
  167. package/src/schema/nodes/paragraph.ts +77 -0
  168. package/src/schema/nodes/placeholder.ts +62 -0
  169. package/src/schema/nodes/placeholder_element.ts +60 -0
  170. package/src/schema/nodes/pullquote_element.ts +81 -0
  171. package/src/schema/nodes/quote_image.ts +64 -0
  172. package/src/schema/nodes/section.ts +69 -0
  173. package/src/schema/nodes/section_label.ts +39 -0
  174. package/src/schema/nodes/section_title.ts +58 -0
  175. package/src/schema/nodes/subtitle.ts +40 -0
  176. package/src/schema/nodes/subtitles.ts +51 -0
  177. package/src/schema/nodes/supplement.ts +77 -0
  178. package/src/schema/nodes/supplements.ts +60 -0
  179. package/src/schema/nodes/table.ts +144 -0
  180. package/src/schema/nodes/table_col.ts +76 -0
  181. package/src/schema/nodes/table_element.ts +67 -0
  182. package/src/schema/nodes/table_element_footer.ts +42 -0
  183. package/src/schema/nodes/text.ts +31 -0
  184. package/src/schema/nodes/title.ts +43 -0
  185. package/src/schema/nodes/trans_abstract.ts +58 -0
  186. package/src/schema/nodes/trans_graphical_abstract.ts +67 -0
  187. package/src/schema/types.ts +243 -0
  188. package/src/tests.ts +33 -0
  189. package/src/transformer/id.ts +23 -0
  190. package/src/transformer/index.ts +21 -0
  191. package/src/transformer/node-names.ts +75 -0
  192. package/src/transformer/node-title.ts +116 -0
  193. package/src/transformer/node-types.ts +39 -0
  194. package/src/transformer/node-validator.ts +82 -0
  195. package/src/types.ts +25 -0
  196. package/src/version.ts +1 -0
@@ -0,0 +1,81 @@
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
+ placeholder: string
24
+ }
25
+
26
+ export interface PullquoteElementNode extends ManuscriptNode {
27
+ attrs: Attrs
28
+ }
29
+
30
+ export const pullquoteElement: NodeSpec = {
31
+ content: 'quote_image? text_block+ attribution',
32
+ attrs: {
33
+ id: { default: '' },
34
+ placeholder: { default: '' },
35
+ dataTracked: { default: null },
36
+ },
37
+ group: 'block element',
38
+ selectable: false,
39
+ parseDOM: [
40
+ {
41
+ tag: 'aside.pullquote',
42
+ getAttrs: (aside) => {
43
+ const dom = aside as HTMLElement
44
+
45
+ const attrs: Partial<Attrs> = {
46
+ id: dom.getAttribute('id') || undefined,
47
+ }
48
+
49
+ const placeholder = dom.getAttribute('data-placeholder-text')
50
+
51
+ if (placeholder) {
52
+ attrs.placeholder = placeholder
53
+ }
54
+
55
+ return attrs
56
+ },
57
+ },
58
+ ],
59
+ toDOM: (node) => {
60
+ const pullquoteElementNode = node as PullquoteElementNode
61
+
62
+ const attrs: { [key: string]: string } = {}
63
+
64
+ if (pullquoteElementNode.attrs.id) {
65
+ attrs.id = pullquoteElementNode.attrs.id
66
+ }
67
+
68
+ attrs.class = 'pullquote'
69
+
70
+ if (pullquoteElementNode.attrs.placeholder) {
71
+ attrs['data-placeholder-text'] = pullquoteElementNode.attrs.placeholder
72
+ }
73
+
74
+ return ['aside', attrs, 0]
75
+ },
76
+ }
77
+
78
+ export const isPullquoteElement = (
79
+ node: ManuscriptNode
80
+ ): node is PullquoteElementNode =>
81
+ node.type === node.type.schema.nodes.pullquote_element
@@ -0,0 +1,64 @@
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 QuoteImageAttrs {
22
+ id: string
23
+ src: string
24
+ type: string
25
+ }
26
+
27
+ export interface QuoteImageNode extends ManuscriptNode {
28
+ attrs: QuoteImageAttrs
29
+ }
30
+
31
+ export const quoteImage: NodeSpec = {
32
+ attrs: {
33
+ id: { default: '' },
34
+ src: { default: '' },
35
+ dataTracked: { default: null },
36
+ },
37
+ selectable: false,
38
+ group: 'block',
39
+ parseDOM: [
40
+ {
41
+ tag: 'figure',
42
+ context: 'pullquote_element/',
43
+ getAttrs: (dom) => {
44
+ const element = dom as HTMLElement
45
+
46
+ return {
47
+ id: element.getAttribute('id'),
48
+ src: element.getAttribute('src'),
49
+ }
50
+ },
51
+ },
52
+ ],
53
+ toDOM: (node) => {
54
+ const imageNode = node as QuoteImageNode
55
+
56
+ return [
57
+ 'figure',
58
+ {
59
+ class: 'pullquote-figure',
60
+ id: imageNode.attrs.id,
61
+ },
62
+ ]
63
+ },
64
+ }
@@ -0,0 +1,69 @@
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
+ category: string
24
+ }
25
+
26
+ export interface SectionNode extends ManuscriptNode {
27
+ attrs: Attrs
28
+ }
29
+
30
+ export const section: NodeSpec = {
31
+ // NOTE: the schema needs paragraphs to be the default type, so they must explicitly come first
32
+ content: 'section_label? section_title (paragraph | element)* sections*',
33
+ attrs: {
34
+ id: { default: '' },
35
+ category: { default: '' },
36
+ dataTracked: { default: null },
37
+ },
38
+ group: 'block sections',
39
+ selectable: false,
40
+ parseDOM: [
41
+ {
42
+ tag: 'section',
43
+ getAttrs: (dom) => {
44
+ const element = dom as HTMLElement
45
+
46
+ return {
47
+ id: element.getAttribute('id') || '',
48
+ category: element.getAttribute('data-category') || '',
49
+ }
50
+ },
51
+ },
52
+ ],
53
+ toDOM: (node) => {
54
+ const sectionNode = node as SectionNode
55
+
56
+ const { id, category } = sectionNode.attrs
57
+
58
+ const attrs: { [key: string]: string } = { id }
59
+
60
+ if (category) {
61
+ attrs['data-category'] = node.attrs.category
62
+ }
63
+
64
+ return ['section', attrs, 0]
65
+ },
66
+ }
67
+
68
+ export const isSectionNode = (node: ManuscriptNode): node is SectionNode =>
69
+ node.type === node.type.schema.nodes.section
@@ -0,0 +1,39 @@
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 SectionLabelNode extends ManuscriptNode {
22
+ attrs: Record<string, unknown>
23
+ }
24
+
25
+ export const sectionLabel: NodeSpec = {
26
+ content: 'inline*',
27
+ group: 'block',
28
+ attrs: { dataTracked: { default: null } },
29
+ selectable: false,
30
+ parseDOM: [{ tag: 'label' }],
31
+ toDOM() {
32
+ return ['label', 0]
33
+ },
34
+ }
35
+
36
+ export const isSectionLabelNode = (
37
+ node: ManuscriptNode
38
+ ): node is SectionLabelNode =>
39
+ node.type === node.type.schema.nodes.section_label
@@ -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
+ }