@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,61 @@
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 ListingElementNode extends ManuscriptNode {
26
+ attrs: Attrs
27
+ }
28
+
29
+ export const listingElement: NodeSpec = {
30
+ content: '(listing | placeholder) caption_title caption',
31
+ attrs: {
32
+ id: { default: '' },
33
+ dataTracked: { default: null },
34
+ },
35
+ group: 'block element',
36
+ selectable: false,
37
+ parseDOM: [
38
+ {
39
+ tag: 'figure.listing',
40
+ getAttrs: (p) => {
41
+ const dom = p as HTMLElement
42
+
43
+ return {
44
+ id: dom.getAttribute('id'),
45
+ }
46
+ },
47
+ },
48
+ ],
49
+ toDOM: (node) => {
50
+ const listingElementNode = node as ListingElementNode
51
+
52
+ return [
53
+ 'figure',
54
+ {
55
+ class: 'listing', // TODO: suppress-caption?
56
+ id: listingElementNode.attrs.id,
57
+ },
58
+ 0,
59
+ ]
60
+ },
61
+ }
@@ -0,0 +1,36 @@
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 type { NodeSpec } from 'prosemirror-model'
18
+
19
+ import type { ManuscriptNode } from '../types'
20
+
21
+ export interface LongDescAttrs {
22
+ id: string
23
+ }
24
+
25
+ export interface LongDescNode extends ManuscriptNode {
26
+ attrs: LongDescAttrs
27
+ }
28
+
29
+ export const longDesc: NodeSpec = {
30
+ content: 'text*',
31
+ attrs: {
32
+ id: { default: '' },
33
+ },
34
+ parseDOM: [{ tag: 'div' }],
35
+ toDOM: () => ['div', 0],
36
+ }
@@ -0,0 +1,86 @@
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 ActualManuscriptNode extends ManuscriptNode {
22
+ attrs: ManuscriptAttrs
23
+ }
24
+
25
+ export interface ManuscriptAttrs {
26
+ id: string
27
+ doi: string
28
+ articleType: string
29
+ prototype: string
30
+ primaryLanguageCode: string
31
+ acceptanceDate?: number
32
+ correctionDate?: number
33
+ retractionDate?: number
34
+ revisionRequestDate?: number
35
+ revisionReceiveDate?: number
36
+ receiveDate?: number
37
+ }
38
+
39
+ // The direct children of this node do not have a json-schema representation
40
+ // They exist for the purpose of styling in the UI
41
+
42
+ export const manuscript: NodeSpec = {
43
+ content:
44
+ 'title subtitles? alt_titles? contributors? affiliations? author_notes? awards? keywords? abstracts body backmatter supplements? hero_image? comments attachments?',
45
+ attrs: {
46
+ id: { default: '' },
47
+ doi: { default: '' },
48
+ prototype: { default: '' },
49
+ primaryLanguageCode: { default: '' },
50
+ articleType: { default: '' },
51
+ acceptanceDate: { default: undefined },
52
+ correctionDate: { default: undefined },
53
+ retractionDate: { default: undefined },
54
+ revisionRequestDate: { default: undefined },
55
+ revisionReceiveDate: { default: undefined },
56
+ receiveDate: { default: undefined },
57
+ },
58
+ group: 'block',
59
+ parseDOM: [
60
+ {
61
+ tag: 'article',
62
+ getAttrs: (p) => {
63
+ const dom = p as HTMLElement
64
+
65
+ return {
66
+ id: dom.getAttribute('id'),
67
+ }
68
+ },
69
+ },
70
+ ],
71
+ toDOM: (node) => {
72
+ const manuscriptNode = node as ActualManuscriptNode
73
+
74
+ return [
75
+ 'article',
76
+ {
77
+ id: manuscriptNode.attrs.id,
78
+ },
79
+ 0,
80
+ ]
81
+ },
82
+ }
83
+
84
+ export const isManuscriptNode = (
85
+ node: ManuscriptNode
86
+ ): node is ManuscriptNode => node.type === node.type.schema.nodes.manuscript
@@ -0,0 +1,59 @@
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 MissingFigureNode extends ManuscriptNode {
22
+ attrs: {
23
+ id: string
24
+ }
25
+ }
26
+
27
+ export const missingFigure: NodeSpec = {
28
+ attrs: {
29
+ id: { default: '' },
30
+ dataTracked: { default: null },
31
+ },
32
+ selectable: false,
33
+ group: 'block',
34
+ parseDOM: [
35
+ {
36
+ tag: 'figure',
37
+ context: 'figure_element/',
38
+ getAttrs: (dom) => {
39
+ const element = dom as HTMLElement
40
+
41
+ return {
42
+ id: element.getAttribute('id'),
43
+ }
44
+ },
45
+ },
46
+ ],
47
+ toDOM: (node) => {
48
+ const missingFigureNode = node as MissingFigureNode
49
+
50
+ return [
51
+ 'figure',
52
+ {
53
+ class: 'figure',
54
+ id: missingFigureNode.attrs.id,
55
+ },
56
+ 0,
57
+ ]
58
+ },
59
+ }
@@ -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
+ interface Attrs {
22
+ id: string
23
+ placeholder: string
24
+ }
25
+
26
+ export interface ParagraphNode extends ManuscriptNode {
27
+ attrs: Attrs
28
+ }
29
+
30
+ export const paragraph: NodeSpec = {
31
+ content: 'inline*',
32
+ attrs: {
33
+ id: { default: '' },
34
+ placeholder: { default: '' }, // TODO: 'List item' if inside a list
35
+ dataTracked: { default: null },
36
+ },
37
+ group: 'block element',
38
+ selectable: false,
39
+ parseDOM: [
40
+ {
41
+ tag: 'p',
42
+ getAttrs: (p) => {
43
+ const dom = p as HTMLParagraphElement
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 paragraphNode = node as ParagraphNode
61
+
62
+ const attrs: { [key: string]: string } = {}
63
+
64
+ if (paragraphNode.attrs.id) {
65
+ attrs.id = paragraphNode.attrs.id
66
+ }
67
+
68
+ if (paragraphNode.attrs.placeholder) {
69
+ attrs['data-placeholder-text'] = paragraphNode.attrs.placeholder
70
+ }
71
+
72
+ return ['p', attrs, 0]
73
+ },
74
+ }
75
+
76
+ export const isParagraphNode = (node: ManuscriptNode): node is ParagraphNode =>
77
+ node.type === node.type.schema.nodes.paragraph
@@ -0,0 +1,62 @@
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
+ label: string
24
+ }
25
+
26
+ export interface PlaceholderNode extends ManuscriptNode {
27
+ attrs: Attrs
28
+ }
29
+
30
+ export const placeholder: NodeSpec = {
31
+ atom: true,
32
+ selectable: false,
33
+ attrs: {
34
+ id: { default: '' },
35
+ label: { default: '' },
36
+ dataTracked: { default: null },
37
+ },
38
+ group: 'block',
39
+ parseDOM: [
40
+ {
41
+ tag: 'div.placeholder',
42
+ getAttrs: (p) => {
43
+ const dom = p as HTMLDivElement
44
+
45
+ return {
46
+ id: dom.getAttribute('id'),
47
+ }
48
+ },
49
+ },
50
+ ],
51
+ toDOM: (node) => {
52
+ const placeholderNode = node as PlaceholderNode
53
+
54
+ return [
55
+ 'div',
56
+ {
57
+ class: 'placeholder-item',
58
+ id: placeholderNode.attrs.id,
59
+ },
60
+ ]
61
+ },
62
+ }
@@ -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 PlaceholderElementNode extends ManuscriptNode {
26
+ attrs: Attrs
27
+ }
28
+
29
+ export const placeholderElement: NodeSpec = {
30
+ atom: true,
31
+ selectable: false,
32
+ attrs: {
33
+ id: { default: '' },
34
+ dataTracked: { default: null },
35
+ },
36
+ group: 'block element',
37
+ parseDOM: [
38
+ {
39
+ tag: 'div.placeholder-element',
40
+ getAttrs: (p) => {
41
+ const dom = p as HTMLDivElement
42
+
43
+ return {
44
+ id: dom.getAttribute('id'),
45
+ }
46
+ },
47
+ },
48
+ ],
49
+ toDOM: (node) => {
50
+ const placeholderElementNode = node as PlaceholderElementNode
51
+
52
+ return [
53
+ 'div',
54
+ {
55
+ class: 'placeholder-element',
56
+ id: placeholderElementNode.attrs.id,
57
+ },
58
+ ]
59
+ },
60
+ }
@@ -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