@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.
- package/dist/cjs/jats/__tests__/jats-roundtrip.test.js +3 -3
- package/dist/cjs/version.js +1 -1
- package/dist/es/jats/__tests__/jats-roundtrip.test.js +3 -3
- package/dist/es/version.js +1 -1
- package/dist/types/jats/__tests__/utils.d.ts +1 -1
- package/dist/types/version.d.ts +1 -1
- package/package.json +22 -21
- package/src/errors.ts +28 -0
- package/src/getVersion.ts +21 -0
- package/src/index.ts +28 -0
- package/src/jats/__tests__/__fixtures__/debug-example.xml +136 -0
- package/src/jats/__tests__/__fixtures__/jats-abstract-no-body.xml +163 -0
- package/src/jats/__tests__/__fixtures__/jats-citations.xml +472 -0
- package/src/jats/__tests__/__fixtures__/jats-comments.xml +46 -0
- package/src/jats/__tests__/__fixtures__/jats-document.xml +134 -0
- package/src/jats/__tests__/__fixtures__/jats-example-doc.xml +1235 -0
- package/src/jats/__tests__/__fixtures__/jats-example-front-only.xml +26 -0
- package/src/jats/__tests__/__fixtures__/jats-example-full.xml +209 -0
- package/src/jats/__tests__/__fixtures__/jats-example-no-back.xml +156 -0
- package/src/jats/__tests__/__fixtures__/jats-example-no-body.xml +91 -0
- package/src/jats/__tests__/__fixtures__/jats-example.xml +221 -0
- package/src/jats/__tests__/__fixtures__/jats-fn-group.xml +60 -0
- package/src/jats/__tests__/__fixtures__/jats-import-no-refs.xml +1077 -0
- package/src/jats/__tests__/__fixtures__/jats-import.xml +1561 -0
- package/src/jats/__tests__/__fixtures__/jats-roundtrip.xml +133 -0
- package/src/jats/__tests__/__fixtures__/jats-tables-example.xml +2043 -0
- package/src/jats/__tests__/__fixtures__/math-fragment.xml +12 -0
- package/src/jats/__tests__/__snapshots__/citeproc.test.ts.snap +57 -0
- package/src/jats/__tests__/__snapshots__/create-article-node.test.ts.snap +65 -0
- package/src/jats/__tests__/__snapshots__/jats-exporter.test.ts.snap +7 -0
- package/src/jats/__tests__/__snapshots__/jats-importer.test.ts.snap +59605 -0
- package/src/jats/__tests__/__snapshots__/jats-roundtrip.test.ts.snap +18 -0
- package/src/jats/__tests__/citations.ts +25 -0
- package/src/jats/__tests__/citeproc.test.ts +195 -0
- package/src/jats/__tests__/create-article-node.test.ts +29 -0
- package/src/jats/__tests__/data/section-categories.ts +212 -0
- package/src/jats/__tests__/files.ts +24 -0
- package/src/jats/__tests__/jats-exporter.test.ts +223 -0
- package/src/jats/__tests__/jats-importer.test.ts +567 -0
- package/src/jats/__tests__/jats-roundtrip.test.ts +66 -0
- package/src/jats/__tests__/utils.ts +90 -0
- package/src/jats/exporter/citeproc.ts +265 -0
- package/src/jats/exporter/jats-exporter.ts +2090 -0
- package/src/jats/exporter/jats-versions.ts +50 -0
- package/src/jats/exporter/labels.ts +101 -0
- package/src/jats/importer/create-article-node.ts +52 -0
- package/src/jats/importer/jats-comments.ts +111 -0
- package/src/jats/importer/jats-dom-parser.ts +1260 -0
- package/src/jats/importer/jats-parser-utils.ts +234 -0
- package/src/jats/importer/jats-transformations.ts +591 -0
- package/src/jats/importer/parse-jats-article.ts +106 -0
- package/src/jats/index.ts +21 -0
- package/src/jats/types.ts +16 -0
- package/src/lib/__tests__/footnotes.test.ts +36 -0
- package/src/lib/citeproc.ts +30 -0
- package/src/lib/credit-roles.ts +91 -0
- package/src/lib/deafults.ts +17 -0
- package/src/lib/footnotes.ts +85 -0
- package/src/lib/html.ts +56 -0
- package/src/lib/section-categories.ts +27 -0
- package/src/lib/utils.ts +145 -0
- package/src/lib/xml.ts +28 -0
- package/src/schema/__tests__/docs.ts +1911 -0
- package/src/schema/__tests__/groups.test.ts +61 -0
- package/src/schema/__tests__/migration.test.ts +23 -0
- package/src/schema/groups.ts +36 -0
- package/src/schema/index.ts +286 -0
- package/src/schema/marks.ts +254 -0
- package/src/schema/migration/migrate.ts +77 -0
- package/src/schema/migration/migration-script.ts +26 -0
- package/src/schema/migration/migration-scripts/1.2.5.ts +44 -0
- package/src/schema/migration/migration-scripts/2.3.22.ts +52 -0
- package/src/schema/migration/migration-scripts/3.0.12.ts +33 -0
- package/src/schema/migration/migration-scripts/3.0.21.ts +50 -0
- package/src/schema/migration/migration-scripts/3.0.30.ts +65 -0
- package/src/schema/migration/migration-scripts/3.0.31.ts +40 -0
- package/src/schema/migration/migration-scripts/3.0.41.ts +37 -0
- package/src/schema/migration/migration-scripts/3.0.55.ts +42 -0
- package/src/schema/migration/migration-scripts/3.0.56.ts +114 -0
- package/src/schema/migration/migration-scripts/4.2.13.ts +37 -0
- package/src/schema/migration/migration-scripts/4.2.15.ts +48 -0
- package/src/schema/migration/migration-scripts/4.3.23.ts +55 -0
- package/src/schema/migration/migration-scripts/4.3.34.ts +132 -0
- package/src/schema/migration/migration-scripts/4.3.35.ts +41 -0
- package/src/schema/migration/migration-scripts/index.ts +49 -0
- package/src/schema/nodes/abstracts.ts +29 -0
- package/src/schema/nodes/affiliation.ts +88 -0
- package/src/schema/nodes/affiliations.ts +30 -0
- package/src/schema/nodes/alt_text.ts +36 -0
- package/src/schema/nodes/alt_title.ts +40 -0
- package/src/schema/nodes/alt_titles_section.ts +58 -0
- package/src/schema/nodes/attachment.ts +46 -0
- package/src/schema/nodes/attachments.ts +45 -0
- package/src/schema/nodes/attribution.ts +38 -0
- package/src/schema/nodes/author_notes.ts +44 -0
- package/src/schema/nodes/award.ts +52 -0
- package/src/schema/nodes/awards.ts +45 -0
- package/src/schema/nodes/backmatter.ts +31 -0
- package/src/schema/nodes/bibliography_element.ts +58 -0
- package/src/schema/nodes/bibliography_item.ts +108 -0
- package/src/schema/nodes/bibliography_section.ts +60 -0
- package/src/schema/nodes/blockquote_element.ts +79 -0
- package/src/schema/nodes/body.ts +29 -0
- package/src/schema/nodes/box_element.ts +67 -0
- package/src/schema/nodes/caption.ts +67 -0
- package/src/schema/nodes/caption_title.ts +67 -0
- package/src/schema/nodes/citation.ts +70 -0
- package/src/schema/nodes/comment.ts +50 -0
- package/src/schema/nodes/comments.ts +28 -0
- package/src/schema/nodes/contributor.ts +87 -0
- package/src/schema/nodes/contributors.ts +40 -0
- package/src/schema/nodes/core_section.ts +27 -0
- package/src/schema/nodes/corresp.ts +49 -0
- package/src/schema/nodes/cross_reference.ts +64 -0
- package/src/schema/nodes/doc.ts +21 -0
- package/src/schema/nodes/embed.ts +55 -0
- package/src/schema/nodes/equation.ts +65 -0
- package/src/schema/nodes/equation_element.ts +61 -0
- package/src/schema/nodes/figure.ts +65 -0
- package/src/schema/nodes/figure_element.ts +73 -0
- package/src/schema/nodes/footnote.ts +95 -0
- package/src/schema/nodes/footnotes_element.ts +69 -0
- package/src/schema/nodes/footnotes_section.ts +61 -0
- package/src/schema/nodes/general_table_footnote.ts +42 -0
- package/src/schema/nodes/graphical_abstract_section.ts +62 -0
- package/src/schema/nodes/hard_break.ts +36 -0
- package/src/schema/nodes/hero_image.ts +46 -0
- package/src/schema/nodes/highlight_marker.ts +68 -0
- package/src/schema/nodes/image_element.ts +49 -0
- package/src/schema/nodes/inline_equation.ts +68 -0
- package/src/schema/nodes/inline_footnote.ts +66 -0
- package/src/schema/nodes/keyword.ts +61 -0
- package/src/schema/nodes/keyword_group.ts +63 -0
- package/src/schema/nodes/keywords.ts +59 -0
- package/src/schema/nodes/keywords_element.ts +64 -0
- package/src/schema/nodes/link.ts +79 -0
- package/src/schema/nodes/list.ts +134 -0
- package/src/schema/nodes/listing.ts +91 -0
- package/src/schema/nodes/listing_element.ts +61 -0
- package/src/schema/nodes/long_desc.ts +36 -0
- package/src/schema/nodes/manuscript.ts +86 -0
- package/src/schema/nodes/missing_figure.ts +59 -0
- package/src/schema/nodes/paragraph.ts +77 -0
- package/src/schema/nodes/placeholder.ts +62 -0
- package/src/schema/nodes/placeholder_element.ts +60 -0
- package/src/schema/nodes/pullquote_element.ts +81 -0
- package/src/schema/nodes/quote_image.ts +64 -0
- package/src/schema/nodes/section.ts +69 -0
- package/src/schema/nodes/section_label.ts +39 -0
- package/src/schema/nodes/section_title.ts +58 -0
- package/src/schema/nodes/subtitle.ts +40 -0
- package/src/schema/nodes/subtitles.ts +51 -0
- package/src/schema/nodes/supplement.ts +77 -0
- package/src/schema/nodes/supplements.ts +60 -0
- package/src/schema/nodes/table.ts +144 -0
- package/src/schema/nodes/table_col.ts +76 -0
- package/src/schema/nodes/table_element.ts +67 -0
- package/src/schema/nodes/table_element_footer.ts +42 -0
- package/src/schema/nodes/text.ts +31 -0
- package/src/schema/nodes/title.ts +43 -0
- package/src/schema/nodes/trans_abstract.ts +58 -0
- package/src/schema/nodes/trans_graphical_abstract.ts +67 -0
- package/src/schema/types.ts +240 -0
- package/src/tests.ts +33 -0
- package/src/transformer/id.ts +23 -0
- package/src/transformer/index.ts +21 -0
- package/src/transformer/node-names.ts +73 -0
- package/src/transformer/node-title.ts +111 -0
- package/src/transformer/node-types.ts +39 -0
- package/src/transformer/node-validator.ts +82 -0
- package/src/types.ts +25 -0
- package/src/version.ts +1 -0
|
@@ -0,0 +1,68 @@
|
|
|
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
|
+
contents: string
|
|
24
|
+
format: string
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface InlineEquationNode extends ManuscriptNode {
|
|
28
|
+
attrs: Attrs
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export const inlineEquation: NodeSpec = {
|
|
32
|
+
attrs: {
|
|
33
|
+
dataTracked: { default: null },
|
|
34
|
+
id: { default: '' },
|
|
35
|
+
contents: { default: '' },
|
|
36
|
+
format: { default: '' },
|
|
37
|
+
},
|
|
38
|
+
atom: true,
|
|
39
|
+
inline: true,
|
|
40
|
+
draggable: true,
|
|
41
|
+
group: 'inline',
|
|
42
|
+
parseDOM: [
|
|
43
|
+
{
|
|
44
|
+
tag: `span.MPInlineMathFragment`,
|
|
45
|
+
getAttrs: (p) => {
|
|
46
|
+
const dom = p as HTMLElement
|
|
47
|
+
return {
|
|
48
|
+
format: dom.getAttribute('data-equation-format'),
|
|
49
|
+
id: dom.getAttribute('id'),
|
|
50
|
+
contents: dom.innerHTML,
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
toDOM: (node) => {
|
|
56
|
+
const inlineEquationNode = node as InlineEquationNode
|
|
57
|
+
const { id, contents, format } = inlineEquationNode.attrs
|
|
58
|
+
|
|
59
|
+
const dom = document.createElement('span')
|
|
60
|
+
dom.setAttribute('id', id)
|
|
61
|
+
dom.classList.add('MPInlineMathFragment')
|
|
62
|
+
if (format) {
|
|
63
|
+
dom.setAttribute('data-equation-format', format)
|
|
64
|
+
}
|
|
65
|
+
dom.innerHTML = contents
|
|
66
|
+
return dom
|
|
67
|
+
},
|
|
68
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
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
|
+
rids: string[]
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface InlineFootnoteNode extends ManuscriptNode {
|
|
27
|
+
attrs: Attrs
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export const inlineFootnote: NodeSpec = {
|
|
31
|
+
attrs: {
|
|
32
|
+
id: { default: '' },
|
|
33
|
+
rids: { default: [] },
|
|
34
|
+
dataTracked: { default: null },
|
|
35
|
+
},
|
|
36
|
+
atom: true,
|
|
37
|
+
inline: true,
|
|
38
|
+
draggable: true,
|
|
39
|
+
group: 'inline',
|
|
40
|
+
parseDOM: [
|
|
41
|
+
{
|
|
42
|
+
tag: 'span.footnote-marker',
|
|
43
|
+
getAttrs: (p) => {
|
|
44
|
+
const dom = p as HTMLSpanElement
|
|
45
|
+
return {
|
|
46
|
+
id: dom.id,
|
|
47
|
+
rids: dom.getAttribute('data-reference-id')?.split(/\s+/) || [],
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
toDOM: (node) => {
|
|
53
|
+
const footnoteNode = node as InlineFootnoteNode
|
|
54
|
+
const dom = document.createElement('span')
|
|
55
|
+
dom.id = footnoteNode.attrs.id
|
|
56
|
+
dom.className = 'footnote-marker'
|
|
57
|
+
dom.setAttribute('data-reference-id', footnoteNode.attrs.rids.join(' '))
|
|
58
|
+
|
|
59
|
+
return dom
|
|
60
|
+
},
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export const isInlineFootnoteNode = (
|
|
64
|
+
node: ManuscriptNode
|
|
65
|
+
): node is InlineFootnoteNode =>
|
|
66
|
+
node.type === node.type.schema.nodes.inline_footnote
|
|
@@ -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 KeywordNode extends ManuscriptNode {
|
|
26
|
+
attrs: Attrs
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export const keyword: NodeSpec = {
|
|
30
|
+
atom: true,
|
|
31
|
+
content: 'inline*',
|
|
32
|
+
attrs: {
|
|
33
|
+
id: { default: '' },
|
|
34
|
+
dataTracked: { default: null },
|
|
35
|
+
},
|
|
36
|
+
group: 'block',
|
|
37
|
+
selectable: false,
|
|
38
|
+
parseDOM: [
|
|
39
|
+
{
|
|
40
|
+
tag: 'span.keyword',
|
|
41
|
+
getAttrs: (node) => {
|
|
42
|
+
const dom = node as HTMLSpanElement
|
|
43
|
+
|
|
44
|
+
return {
|
|
45
|
+
id: dom.getAttribute('id'),
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
],
|
|
50
|
+
toDOM: (node) => {
|
|
51
|
+
const keywordNode = node as KeywordNode
|
|
52
|
+
return [
|
|
53
|
+
'span',
|
|
54
|
+
{
|
|
55
|
+
class: 'keyword',
|
|
56
|
+
id: keywordNode.attrs.id,
|
|
57
|
+
},
|
|
58
|
+
0,
|
|
59
|
+
]
|
|
60
|
+
},
|
|
61
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
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
|
+
type: string
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface KeywordGroupNode extends ManuscriptNode {
|
|
27
|
+
attrs: Attrs
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export const keywordGroup: NodeSpec = {
|
|
31
|
+
content: 'keyword*',
|
|
32
|
+
attrs: {
|
|
33
|
+
id: { default: '' },
|
|
34
|
+
type: { default: '' },
|
|
35
|
+
dataTracked: { default: null },
|
|
36
|
+
},
|
|
37
|
+
group: 'block',
|
|
38
|
+
selectable: false,
|
|
39
|
+
parseDOM: [
|
|
40
|
+
{
|
|
41
|
+
tag: 'div.keywords',
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
toDOM: (node) => {
|
|
45
|
+
const keywordGroupNode = node as KeywordGroupNode
|
|
46
|
+
|
|
47
|
+
return [
|
|
48
|
+
'div',
|
|
49
|
+
{
|
|
50
|
+
id: keywordGroupNode.attrs.id,
|
|
51
|
+
class: 'keywords',
|
|
52
|
+
spellcheck: 'false',
|
|
53
|
+
contenteditable: false,
|
|
54
|
+
},
|
|
55
|
+
0,
|
|
56
|
+
]
|
|
57
|
+
},
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export const isKeywordGroupNode = (
|
|
61
|
+
node: ManuscriptNode
|
|
62
|
+
): node is KeywordGroupNode =>
|
|
63
|
+
node.type === node.type.schema.nodes.keywords_group
|
|
@@ -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
|
+
interface Attrs {
|
|
22
|
+
id: string
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface KeywordsNode extends ManuscriptNode {
|
|
26
|
+
attrs: Attrs
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export const keywords: NodeSpec = {
|
|
30
|
+
content: 'section_title (keywords_element | placeholder_element)',
|
|
31
|
+
attrs: {
|
|
32
|
+
id: { default: '' },
|
|
33
|
+
dataTracked: { default: null },
|
|
34
|
+
},
|
|
35
|
+
group: 'block',
|
|
36
|
+
selectable: false,
|
|
37
|
+
parseDOM: [
|
|
38
|
+
{
|
|
39
|
+
tag: 'div.keywords',
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
toDOM: (node) => {
|
|
43
|
+
const keywords = node as KeywordsNode
|
|
44
|
+
|
|
45
|
+
return [
|
|
46
|
+
'div',
|
|
47
|
+
{
|
|
48
|
+
id: keywords.attrs.id,
|
|
49
|
+
class: 'keywords',
|
|
50
|
+
spellcheck: 'false',
|
|
51
|
+
contenteditable: false,
|
|
52
|
+
},
|
|
53
|
+
0,
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export const isKeywordsNode = (node: ManuscriptNode): node is KeywordsNode =>
|
|
59
|
+
node.type === node.type.schema.nodes.keywords
|
|
@@ -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
|
+
interface Attrs {
|
|
22
|
+
id: string
|
|
23
|
+
contents: string
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface KeywordsElementNode extends ManuscriptNode {
|
|
27
|
+
attrs: Attrs
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export const keywordsElement: NodeSpec = {
|
|
31
|
+
atom: true,
|
|
32
|
+
content: 'keyword_group*',
|
|
33
|
+
attrs: {
|
|
34
|
+
id: { default: '' },
|
|
35
|
+
contents: { default: '' },
|
|
36
|
+
dataTracked: { default: null },
|
|
37
|
+
},
|
|
38
|
+
group: 'block element',
|
|
39
|
+
selectable: false,
|
|
40
|
+
parseDOM: [
|
|
41
|
+
{
|
|
42
|
+
tag: 'div.manuscript-keywords',
|
|
43
|
+
getAttrs: (div) => {
|
|
44
|
+
const dom = div as HTMLDivElement
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
contents: dom.innerHTML,
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
toDOM: (node) => {
|
|
53
|
+
const keywordsElementNode = node as KeywordsElementNode
|
|
54
|
+
|
|
55
|
+
return [
|
|
56
|
+
'div',
|
|
57
|
+
{
|
|
58
|
+
class: 'manuscript-keywords',
|
|
59
|
+
id: keywordsElementNode.attrs.id,
|
|
60
|
+
},
|
|
61
|
+
0,
|
|
62
|
+
]
|
|
63
|
+
},
|
|
64
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
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
|
+
href: string
|
|
23
|
+
title?: string
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface LinkNode extends ManuscriptNode {
|
|
27
|
+
attrs: Attrs
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export const link: NodeSpec = {
|
|
31
|
+
content: 'inline*',
|
|
32
|
+
attrs: {
|
|
33
|
+
href: { default: '' },
|
|
34
|
+
title: { default: '' },
|
|
35
|
+
dataTracked: { default: null },
|
|
36
|
+
},
|
|
37
|
+
inline: true,
|
|
38
|
+
group: 'inline',
|
|
39
|
+
draggable: true,
|
|
40
|
+
atom: true,
|
|
41
|
+
parseDOM: [
|
|
42
|
+
{
|
|
43
|
+
tag: 'a[href]',
|
|
44
|
+
getAttrs: (a) => {
|
|
45
|
+
const dom = a as HTMLAnchorElement
|
|
46
|
+
|
|
47
|
+
return {
|
|
48
|
+
href: dom.getAttribute('href') || '',
|
|
49
|
+
title: dom.getAttribute('title') || '',
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
tag: 'span.citation[data-href]',
|
|
55
|
+
getAttrs: (span) => {
|
|
56
|
+
const dom = span as HTMLSpanElement
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
href: dom.getAttribute('data-href') || '',
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
priority: 80,
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
toDOM: (node) => {
|
|
66
|
+
const { href, title } = node.attrs
|
|
67
|
+
|
|
68
|
+
const attrs: { [key: string]: string } = { href }
|
|
69
|
+
|
|
70
|
+
if (title) {
|
|
71
|
+
attrs.title = title
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return ['a', attrs, 0]
|
|
75
|
+
},
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export const isLinkNode = (node: ManuscriptNode): node is LinkNode =>
|
|
79
|
+
node.type === node.type.schema.nodes.link
|
|
@@ -0,0 +1,134 @@
|
|
|
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
|
+
|
|
18
|
+
import { ManuscriptNode } from '../types'
|
|
19
|
+
|
|
20
|
+
export type ListStyleType =
|
|
21
|
+
| 'simple'
|
|
22
|
+
| 'bullet'
|
|
23
|
+
| 'order'
|
|
24
|
+
| 'alpha-lower'
|
|
25
|
+
| 'alpha-upper'
|
|
26
|
+
| 'roman-lower'
|
|
27
|
+
| 'roman-upper'
|
|
28
|
+
|
|
29
|
+
export interface ListAttrs {
|
|
30
|
+
id: string
|
|
31
|
+
listStyleType: ListStyleType
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface ListNode extends ManuscriptNode {
|
|
35
|
+
attrs: ListAttrs
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export const list: NodeSpec = {
|
|
39
|
+
content: 'list_item+',
|
|
40
|
+
group: 'block list element',
|
|
41
|
+
attrs: {
|
|
42
|
+
id: { default: '' },
|
|
43
|
+
listStyleType: { default: null },
|
|
44
|
+
dataTracked: { default: null },
|
|
45
|
+
},
|
|
46
|
+
parseDOM: [
|
|
47
|
+
{
|
|
48
|
+
tag: 'ul',
|
|
49
|
+
getAttrs: (p) => {
|
|
50
|
+
const dom = p as HTMLUListElement
|
|
51
|
+
|
|
52
|
+
return {
|
|
53
|
+
id: dom.getAttribute('id'),
|
|
54
|
+
listStyleType: dom.getAttribute('list-type'),
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
tag: 'ol',
|
|
60
|
+
getAttrs: (p) => {
|
|
61
|
+
const dom = p as HTMLOListElement
|
|
62
|
+
|
|
63
|
+
return {
|
|
64
|
+
id: dom.getAttribute('id'),
|
|
65
|
+
listStyleType: dom.getAttribute('list-type'),
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
toDOM: (node) => {
|
|
71
|
+
const list = node as ListNode
|
|
72
|
+
return [
|
|
73
|
+
'ul',
|
|
74
|
+
{
|
|
75
|
+
id: list.attrs.id,
|
|
76
|
+
'list-type': list.attrs.listStyleType,
|
|
77
|
+
},
|
|
78
|
+
0,
|
|
79
|
+
]
|
|
80
|
+
},
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export interface ListItemNode extends ManuscriptNode {
|
|
84
|
+
attrs: {
|
|
85
|
+
placeholder: string
|
|
86
|
+
id: string
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export const listItem: NodeSpec = {
|
|
91
|
+
// NOTE: can't mix inline (text) and block content (list)
|
|
92
|
+
// content: 'paragraph list+',
|
|
93
|
+
content: 'paragraph? (paragraph | list)+',
|
|
94
|
+
group: 'block',
|
|
95
|
+
defining: true,
|
|
96
|
+
attrs: {
|
|
97
|
+
placeholder: { default: 'List item' },
|
|
98
|
+
id: { default: '' },
|
|
99
|
+
dataTracked: { default: null },
|
|
100
|
+
},
|
|
101
|
+
parseDOM: [
|
|
102
|
+
{
|
|
103
|
+
tag: 'li',
|
|
104
|
+
getAttrs: (p) => {
|
|
105
|
+
const dom = p as HTMLLIElement
|
|
106
|
+
|
|
107
|
+
return {
|
|
108
|
+
placeholder: dom.getAttribute('data-placeholder-text') || '',
|
|
109
|
+
id: dom.getAttribute('id') || '',
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
],
|
|
114
|
+
toDOM: (node) => {
|
|
115
|
+
const listItemNode = node as ListItemNode
|
|
116
|
+
|
|
117
|
+
const attrs: { [key: string]: string } = {}
|
|
118
|
+
|
|
119
|
+
if (listItemNode.attrs.placeholder) {
|
|
120
|
+
attrs['data-placeholder-text'] = listItemNode.attrs.placeholder
|
|
121
|
+
}
|
|
122
|
+
if (listItemNode.attrs.id) {
|
|
123
|
+
attrs['id'] = listItemNode.attrs.id
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return ['li', attrs, 0]
|
|
127
|
+
},
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export const isListNode = (node: ManuscriptNode): node is ListNode => {
|
|
131
|
+
const { nodes } = node.type.schema
|
|
132
|
+
|
|
133
|
+
return node.type === nodes.list
|
|
134
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
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
|
+
contents: string
|
|
24
|
+
language: string
|
|
25
|
+
languageKey: string
|
|
26
|
+
isExpanded: boolean
|
|
27
|
+
isExecuting: boolean
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface ListingNode extends ManuscriptNode {
|
|
31
|
+
attrs: Attrs
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export const listing: NodeSpec = {
|
|
35
|
+
attrs: {
|
|
36
|
+
id: { default: '' },
|
|
37
|
+
contents: { default: '' },
|
|
38
|
+
language: { default: '' },
|
|
39
|
+
languageKey: { default: 'null' },
|
|
40
|
+
isExpanded: { default: false },
|
|
41
|
+
isExecuting: { default: false },
|
|
42
|
+
// placeholder: { default: 'Click to edit listing' },
|
|
43
|
+
dataTracked: { default: null },
|
|
44
|
+
},
|
|
45
|
+
draggable: false,
|
|
46
|
+
selectable: false,
|
|
47
|
+
group: 'block',
|
|
48
|
+
parseDOM: [
|
|
49
|
+
{
|
|
50
|
+
tag: 'pre.MPListing',
|
|
51
|
+
preserveWhitespace: 'full',
|
|
52
|
+
getAttrs: (p) => {
|
|
53
|
+
const node = p as HTMLPreElement
|
|
54
|
+
|
|
55
|
+
return {
|
|
56
|
+
contents: node.textContent, // TODO: innerText?
|
|
57
|
+
language: node.getAttribute('language'),
|
|
58
|
+
languageKey: node.getAttribute('languageKey'),
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
priority: 100,
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
tag: 'pre',
|
|
65
|
+
preserveWhitespace: 'full',
|
|
66
|
+
getAttrs: (p) => {
|
|
67
|
+
const node = p as HTMLPreElement
|
|
68
|
+
|
|
69
|
+
return {
|
|
70
|
+
contents: node.getAttribute('code') || node.textContent,
|
|
71
|
+
languageKey: node.getAttribute('language'),
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
priority: 90,
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
toDOM: (node) => {
|
|
78
|
+
const listingNode = node as ListingNode
|
|
79
|
+
|
|
80
|
+
const dom = document.createElement('div')
|
|
81
|
+
dom.setAttribute('id', listingNode.attrs.id)
|
|
82
|
+
dom.setAttribute('data-language', listingNode.attrs.language)
|
|
83
|
+
dom.setAttribute('data-languageKey', listingNode.attrs.languageKey)
|
|
84
|
+
dom.textContent = listingNode.attrs.contents
|
|
85
|
+
|
|
86
|
+
return dom
|
|
87
|
+
},
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export const isListingNode = (node: ManuscriptNode): node is ListingNode =>
|
|
91
|
+
node.type === node.type.schema.nodes.listing
|