pro-editor-schema 1.4.1 → 1.6.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/index.js CHANGED
@@ -50,6 +50,13 @@ __export(index_exports, {
50
50
  LAYOUT_USER_ATTRIBUTE: () => LAYOUT_USER_ATTRIBUTE,
51
51
  LEFT_INDENT_ATTRIBUTE: () => LEFT_INDENT_ATTRIBUTE,
52
52
  LINKEND_ATTRIBUTE: () => LINKEND_ATTRIBUTE,
53
+ LINK_BLOCKER_ROLES: () => LINK_BLOCKER_ROLES,
54
+ LINK_TO_CROSS_CHECK: () => LINK_TO_CROSS_CHECK,
55
+ POSSIBLE_WEBLINK_CLASS: () => POSSIBLE_WEBLINK_CLASS,
56
+ POSSIBLE_WEBLINK_EXCLUDE_SELECTORS: () => POSSIBLE_WEBLINK_EXCLUDE_SELECTORS,
57
+ REFERENCE_FIELD_SCHEMAS: () => REFERENCE_FIELD_SCHEMAS,
58
+ REFERENCE_PART_SELECTOR: () => REFERENCE_PART_SELECTOR,
59
+ REFERENCE_TYPE_SCHEMAS: () => REFERENCE_TYPE_SCHEMAS,
53
60
  RIGHT_INDENT_ATTRIBUTE: () => RIGHT_INDENT_ATTRIBUTE,
54
61
  SCHEMAS: () => SCHEMAS,
55
62
  SPACE_ABOVE_ATTRIBUTE: () => SPACE_ABOVE_ATTRIBUTE,
@@ -62,23 +69,46 @@ __export(index_exports, {
62
69
  TRACK_CHANGES_ATTR_DATA_TIME: () => TRACK_CHANGES_ATTR_DATA_TIME,
63
70
  TRACK_CHANGES_ATTR_DATA_USERID: () => TRACK_CHANGES_ATTR_DATA_USERID,
64
71
  TRACK_CHANGES_ATTR_DATA_USERNAME: () => TRACK_CHANGES_ATTR_DATA_USERNAME,
72
+ VALIDATION_IGNORED_ATTRIBUTE: () => VALIDATION_IGNORED_ATTRIBUTE,
65
73
  XMLID_ATTRIBUTE: () => XMLID_ATTRIBUTE,
74
+ clearWeblinkMatches: () => clearWeblinkMatches,
66
75
  closestElementBySchema: () => closestElementBySchema,
67
76
  createElement: () => createElement,
77
+ extractFootnoteNumber: () => extractFootnoteNumber,
68
78
  findAttributeDefinitionByName: () => findAttributeDefinitionByName,
79
+ findElementLinkedTo: () => findElementLinkedTo,
80
+ findReferenceFieldByElement: () => findReferenceFieldByElement,
81
+ findReferenceTypeSchemaByElement: () => findReferenceTypeSchemaByElement,
69
82
  findSchemaByCode: () => findSchemaByCode,
70
83
  findSchemaByElement: () => findSchemaByElement,
71
84
  getAdjacentElement: () => getAdjacentElement,
72
85
  getAttributeName: () => getAttributeName,
86
+ getEffectiveChildElements: () => getEffectiveChildElements,
73
87
  getElementLinks: () => getElementLinks,
88
+ getPossibleWeblinks: () => getPossibleWeblinks,
89
+ getReferenceFieldElements: () => getReferenceFieldElements,
90
+ getReferenceParts: () => getReferenceParts,
91
+ getReferenceStructureIssueElements: () => getReferenceStructureIssueElements,
74
92
  getStore: () => getStore,
75
93
  isAttributeRestricted: () => isAttributeRestricted,
76
94
  isDeletedElement: () => isDeletedElement,
77
95
  isIgnoredAttribute: () => isIgnoredAttribute,
78
96
  isIgnoredElement: () => isIgnoredElement,
79
97
  isTrackChangesSchema: () => isTrackChangesSchema,
98
+ markPossibleWeblinks: () => markPossibleWeblinks,
80
99
  queryAllElementsBySchema: () => queryAllElementsBySchema,
81
100
  queryElementBySchema: () => queryElementBySchema,
101
+ validateAttributes: () => validateAttributes,
102
+ validateConsecutiveFootnoteCues: () => validateConsecutiveFootnoteCues,
103
+ validateConsecutiveFootnotes: () => validateConsecutiveFootnotes,
104
+ validateElementAgainstSchema: () => validateElementAgainstSchema,
105
+ validateElementToLinkTo: () => validateElementToLinkTo,
106
+ validateFootnoteNumber: () => validateFootnoteNumber,
107
+ validateHierarchy: () => validateHierarchy,
108
+ validateLinkend: () => validateLinkend,
109
+ validateOlink: () => validateOlink,
110
+ validatePossibleWeblinks: () => validatePossibleWeblinks,
111
+ validateReferenceStructure: () => validateReferenceStructure,
82
112
  validateXml: () => validateXml
83
113
  });
84
114
  module.exports = __toCommonJS(index_exports);
@@ -102,6 +132,7 @@ var FIGURE_PLACEMENT_ATTRIBUTE = "data-figure-placement";
102
132
  var LAYOUT_CELL_WIDTH_ATTRIBUTE = "data-cell-width";
103
133
  var LAYOUT_TABLE_ORIENTATION_ATTRIBUTE = "data-table-orientation";
104
134
  var LAYOUT_TABLE_PLACEMENT_ATTRIBUTE = "data-table-placement";
135
+ var VALIDATION_IGNORED_ATTRIBUTE = "data-validation-ignored";
105
136
  var LAYOUT_ATTRIBUTES = [
106
137
  ALIGNMENT_ATTRIBUTE,
107
138
  LEFT_INDENT_ATTRIBUTE,
@@ -231,7 +262,7 @@ var EMPHASIS_SCHEMA = createSchema({
231
262
  ...TRACK_CHANGES_ATTRS,
232
263
  {
233
264
  name: "role",
234
- values: ["lowercase", "uppercase", "initialcaps"],
265
+ values: ["lowercase", "uppercase", "initialcaps", "Non breaking space"],
235
266
  defaultValue: "lowercase"
236
267
  }
237
268
  ],
@@ -731,6 +762,27 @@ var POEM_TAG = "POEM";
731
762
  var BIBLIOMIXED_TAG = "BIBLIOMIXED";
732
763
  var REFERENCE_BIBLIOGRAPHY_TAG = "BIBLIOGRAPHY";
733
764
  var BIBLIODIV_TAG = "BIBLIODIV";
765
+ var BIBLIOMSET_TAG = "BIBLIOMSET";
766
+ var EDITOR_TAG = "EDITOR";
767
+ var OTHERCREDIT_TAG = "OTHERCREDIT";
768
+ var TRANSLATOR_TAG = "TRANSLATOR";
769
+ var COLLAB_TAG = "COLLAB";
770
+ var PUBDATE_TAG = "PUBDATE";
771
+ var DATE_TAG = "DATE";
772
+ var PUBLISHERNAME_TAG = "PUBLISHERNAME";
773
+ var ADDRESS_TAG = "ADDRESS";
774
+ var CITY_TAG = "CITY";
775
+ var VOLUMENUM_TAG = "VOLUMENUM";
776
+ var ISSUENUM_TAG = "ISSUENUM";
777
+ var PAGENUMS_TAG = "PAGENUMS";
778
+ var PAGENUM_TAG = "PAGENUM";
779
+ var EDITION_TAG = "EDITION";
780
+ var PUB_ID_TAG = "PUB-ID";
781
+ var BIBLIOID_TAG = "BIBLIOID";
782
+ var BIBLIOMISC_TAG = "BIBLIOMISC";
783
+ var CONFGROUP_TAG = "CONFGROUP";
784
+ var CONFTITLE_TAG = "CONFTITLE";
785
+ var CONFDATES_TAG = "CONFDATES";
734
786
  var MATHPHRASE_TAG = "MATHPHRASE";
735
787
  var MATH_TAG = "MATH";
736
788
  var MERROR_TAG = "MERROR";
@@ -951,7 +1003,8 @@ var EQUATION_SCHEMA = createSchema({
951
1003
  ],
952
1004
  allowedChildrenCodes: [
953
1005
  { code: "mathphrase", required: true },
954
- { code: "caption1", required: false }
1006
+ { code: "caption1", required: false },
1007
+ { code: "tag", required: false }
955
1008
  ]
956
1009
  });
957
1010
 
@@ -1876,6 +1929,82 @@ var TABLE_SCHEMA = createSchema({
1876
1929
  ]
1877
1930
  });
1878
1931
 
1932
+ // src/schema/elementSchemas/elements/heading.ts
1933
+ var HEADING_LEVEL = ["H0", "H1", "H2", "H3", "H4", "H5", "H6"];
1934
+ var HEADING_ROLES = [...HEADING_LEVEL, "vignette_group"];
1935
+ var HEADING_SCHEMA = createSchema({
1936
+ code: "heading",
1937
+ kind: "element",
1938
+ tag: SECTION_TAG,
1939
+ matchesElement: (element) => {
1940
+ const role = element.getAttribute("role");
1941
+ if (!role) return false;
1942
+ return HEADING_ROLES.includes(role);
1943
+ },
1944
+ requiredAttributes: [
1945
+ ...ID_ATTRS,
1946
+ "xmlid",
1947
+ {
1948
+ name: "role",
1949
+ values: HEADING_ROLES,
1950
+ defaultValue: "H1"
1951
+ }
1952
+ ],
1953
+ optionalAttributes: [...TRACK_CHANGES_ATTRS],
1954
+ defaultChildCode: "para",
1955
+ allowedChildrenCodes: [
1956
+ { code: "title1", required: false },
1957
+ { code: "label1", required: false },
1958
+ { code: "para", required: false },
1959
+ { code: "subtitle1", required: false },
1960
+ { code: "sidebar", required: false },
1961
+ { code: "epigraph", required: false },
1962
+ { code: "blockquote", required: false },
1963
+ { code: "ul", required: false },
1964
+ { code: "ol", required: false },
1965
+ { code: "poem", required: false },
1966
+ { code: "dialogue", required: false },
1967
+ { code: "appendix", required: false },
1968
+ { code: "table1", required: false },
1969
+ { code: "figure1", required: false },
1970
+ { code: "heading", required: false },
1971
+ { code: "footnoteSection", required: false },
1972
+ { code: "info1", required: false },
1973
+ { code: "equation", required: false }
1974
+ ]
1975
+ });
1976
+
1977
+ // src/schema/elementSchemas/elements/box.ts
1978
+ var BOX_LEVEL = ["box1", "box2", "box3", "box4", "box5"];
1979
+ var BOX_SCHEMA = createSchema({
1980
+ code: "sidebar",
1981
+ kind: "element",
1982
+ tag: SIDEBAR_TAG,
1983
+ requiredAttributes: [
1984
+ ...ID_ATTRS,
1985
+ {
1986
+ name: "status",
1987
+ values: BOX_LEVEL,
1988
+ defaultValue: "box1"
1989
+ }
1990
+ ],
1991
+ optionalAttributes: [
1992
+ ...TRACK_CHANGES_ATTRS,
1993
+ "xmlid",
1994
+ {
1995
+ name: "role",
1996
+ values: ["add-element", "change-para-box"],
1997
+ defaultValue: "add-element"
1998
+ }
1999
+ ],
2000
+ defaultChildCode: "para",
2001
+ allowedChildrenCodes: [
2002
+ { code: "para", required: false },
2003
+ { code: "title1", required: false },
2004
+ { code: "sidebar", required: false }
2005
+ ]
2006
+ });
2007
+
1879
2008
  // src/schema/elementSchemas/elements/title.ts
1880
2009
  var TITLE_SCHEMA = createSchema({
1881
2010
  code: "title1",
@@ -1893,7 +2022,7 @@ var TITLE_SCHEMA = createSchema({
1893
2022
  },
1894
2023
  {
1895
2024
  name: "title",
1896
- values: ["H1", "H2", "H3", "H4", "H5", "H6", "foot_note"],
2025
+ values: [...HEADING_LEVEL, ...BOX_LEVEL, "foot_note"],
1897
2026
  defaultValue: "H1"
1898
2027
  }
1899
2028
  ],
@@ -1971,36 +2100,8 @@ var BLOCKQUOTE_SCHEMA = createSchema({
1971
2100
  { code: "ul", required: false },
1972
2101
  { code: "ol", required: false },
1973
2102
  { code: "sidebar", required: false },
1974
- { code: "source1", required: false }
1975
- ]
1976
- });
1977
-
1978
- // src/schema/elementSchemas/elements/box.ts
1979
- var BOX_SCHEMA = createSchema({
1980
- code: "sidebar",
1981
- kind: "element",
1982
- tag: SIDEBAR_TAG,
1983
- requiredAttributes: [
1984
- ...ID_ATTRS,
1985
- {
1986
- name: "status",
1987
- values: ["box1", "box2", "box3", "box4", "box5"],
1988
- defaultValue: "box1"
1989
- }
1990
- ],
1991
- optionalAttributes: [
1992
- ...TRACK_CHANGES_ATTRS,
1993
- "xmlid",
1994
- {
1995
- name: "role",
1996
- values: ["add-element", "change-para-box"],
1997
- defaultValue: "add-element"
1998
- }
1999
- ],
2000
- defaultChildCode: "para",
2001
- allowedChildrenCodes: [
2002
- { code: "para", required: false },
2003
- { code: "title1", required: false }
2103
+ { code: "source1", required: false },
2104
+ { code: "tag", required: false }
2004
2105
  ]
2005
2106
  });
2006
2107
 
@@ -2057,7 +2158,10 @@ var EPIGRAPH_SCHEMA = createSchema({
2057
2158
  }
2058
2159
  ],
2059
2160
  defaultChildCode: "para",
2060
- allowedChildrenCodes: [{ code: "para", required: false }]
2161
+ allowedChildrenCodes: [
2162
+ { code: "para", required: false },
2163
+ { code: "tag", required: false }
2164
+ ]
2061
2165
  });
2062
2166
 
2063
2167
  // src/schema/elementSchemas/elements/footnoteSection.ts
@@ -2087,51 +2191,6 @@ var FOOTNOTE_SECTION_SCHEMA = createSchema({
2087
2191
  ]
2088
2192
  });
2089
2193
 
2090
- // src/schema/elementSchemas/elements/heading.ts
2091
- var HEADING_LEVEL = ["H0", "H1", "H2", "H3", "H4", "H5", "H6"];
2092
- var HEADING_ROLES = [...HEADING_LEVEL, "vignette_group"];
2093
- var HEADING_SCHEMA = createSchema({
2094
- code: "heading",
2095
- kind: "element",
2096
- tag: SECTION_TAG,
2097
- matchesElement: (element) => {
2098
- const role = element.getAttribute("role");
2099
- if (!role) return false;
2100
- return HEADING_ROLES.includes(role);
2101
- },
2102
- requiredAttributes: [
2103
- ...ID_ATTRS,
2104
- "xmlid",
2105
- {
2106
- name: "role",
2107
- values: HEADING_ROLES,
2108
- defaultValue: "H1"
2109
- }
2110
- ],
2111
- optionalAttributes: [...TRACK_CHANGES_ATTRS],
2112
- defaultChildCode: "para",
2113
- allowedChildrenCodes: [
2114
- { code: "title1", required: false },
2115
- { code: "label1", required: false },
2116
- { code: "para", required: false },
2117
- { code: "subtitle1", required: false },
2118
- { code: "sidebar", required: false },
2119
- { code: "epigraph", required: false },
2120
- { code: "blockquote", required: false },
2121
- { code: "ul", required: false },
2122
- { code: "ol", required: false },
2123
- { code: "poem", required: false },
2124
- { code: "dialogue", required: false },
2125
- { code: "appendix", required: false },
2126
- { code: "table1", required: false },
2127
- { code: "figure1", required: false },
2128
- { code: "heading", required: false },
2129
- { code: "footnoteSection", required: false },
2130
- { code: "info1", required: false },
2131
- { code: "equation", required: false }
2132
- ]
2133
- });
2134
-
2135
2194
  // src/schema/elementSchemas/elements/info.ts
2136
2195
  var INFO_SCHEMA = createSchema({
2137
2196
  code: "info1",
@@ -2176,28 +2235,6 @@ var MATHPHRASE_SCHEMA = createSchema({
2176
2235
  allowedChildrenCodes: [{ code: MATH_SCHEMA.code, required: true }]
2177
2236
  });
2178
2237
 
2179
- // src/schema/elementSchemas/elements/reference/bibliodiv.ts
2180
- var BIBLIODIV_SCHEMA = createSchema({
2181
- code: "bibliodiv",
2182
- kind: "element",
2183
- tag: BIBLIODIV_TAG,
2184
- requiredAttributes: [
2185
- ...ID_ATTRS,
2186
- {
2187
- name: "role",
2188
- values: ["H1", "H2", "H3", "H4", "H5", "H6"],
2189
- defaultValue: "H1"
2190
- }
2191
- ],
2192
- optionalAttributes: [],
2193
- allowedChildrenCodes: [
2194
- { code: "bibliodiv", required: false },
2195
- { code: "referenceBibliomixed", required: false },
2196
- { code: "para", required: false },
2197
- { code: "title1", required: false }
2198
- ]
2199
- });
2200
-
2201
2238
  // src/schema/elementSchemas/elements/reference/bibliography.ts
2202
2239
  var REFERENCE_BIBLIOGRAPHY_SCHEMA = createSchema({
2203
2240
  code: "referenceBibliography",
@@ -2226,6 +2263,31 @@ var REFERENCE_BIBLIOGRAPHY_SCHEMA = createSchema({
2226
2263
  ]
2227
2264
  });
2228
2265
 
2266
+ // src/schema/shared/allowedReferenceChildren.ts
2267
+ var REFERENCE_PART_CODES_ALLOWED_CHILDREN = [
2268
+ { code: "author", required: false },
2269
+ { code: "editor", required: false },
2270
+ { code: "othercredit", required: false },
2271
+ { code: "translator", required: false },
2272
+ { code: "collab", required: false },
2273
+ { code: "title1", required: false },
2274
+ { code: "pubdate", required: false },
2275
+ { code: "date", required: false },
2276
+ { code: "publishername", required: false },
2277
+ { code: "orgname", required: false },
2278
+ { code: "address", required: false },
2279
+ { code: "volumenum", required: false },
2280
+ { code: "issuenum", required: false },
2281
+ { code: "pagenums", required: false },
2282
+ { code: "pagenum", required: false },
2283
+ { code: "edition", required: false },
2284
+ { code: "link", required: false },
2285
+ { code: "pubId", required: false },
2286
+ { code: "biblioid", required: false },
2287
+ { code: "bibliomisc", required: false },
2288
+ { code: "confgroup", required: false }
2289
+ ];
2290
+
2229
2291
  // src/schema/elementSchemas/elements/reference/bibliomixed.ts
2230
2292
  var BIBLIOMIXED_SCHEMA = createSchema({
2231
2293
  code: "referenceBibliomixed",
@@ -2237,82 +2299,390 @@ var BIBLIOMIXED_SCHEMA = createSchema({
2237
2299
  TRACK_CHANGES_ATTR_DATA_USERID,
2238
2300
  TRACK_CHANGES_ATTR_DATA_DATE
2239
2301
  ],
2240
- allowedChildrenCodes: []
2302
+ allowedChildrenCodes: [
2303
+ { code: "bibliomset", required: false },
2304
+ ...REFERENCE_PART_CODES_ALLOWED_CHILDREN,
2305
+ ...ATOM_CODES_ALLOWED_CHILDREN
2306
+ ]
2241
2307
  });
2242
2308
 
2243
- // src/schema/elementSchemas/elements/index.ts
2244
- var ELEMENT_SCHEMAS = {
2245
- bibliodiv: BIBLIODIV_SCHEMA,
2246
- referenceBibliography: REFERENCE_BIBLIOGRAPHY_SCHEMA,
2247
- referenceBibliomixed: BIBLIOMIXED_SCHEMA,
2248
- para: PARA_SCHEMA,
2249
- title1: TITLE_SCHEMA,
2250
- footnote: FOOTNOTE_SCHEMA,
2251
- footnoteno: FOOTNOTE_NUMBER_SCHEMA,
2252
- olink: OLINK_SCHEMA,
2253
- firstname: FIRSTNAME_SCHEMA,
2254
- surname: SURNAME_SCHEMA,
2255
- honorific: HONORIFIC_SCHEMA,
2256
- orgname: ORGNAME_SCHEMA,
2257
- email: EMAIL_SCHEMA,
2258
- org: ORG_SCHEMA,
2259
- degrees: DEGREES_SCHEMA,
2260
- dialogue: DIALOGUE_SCHEMA,
2261
- line: LINE_SCHEMA,
2262
- linegroup: LINE_GROUP_SCHEMA,
2263
- speaker: SPEAKER_SCHEMA,
2264
- equation: EQUATION_SCHEMA,
2265
- math: MATH_SCHEMA,
2266
- mathphrase: MATHPHRASE_SCHEMA,
2267
- merror: MERROR_SCHEMA,
2268
- mfrac: MFRAC_SCHEMA,
2269
- mi: MI_SCHEMA,
2270
- mmultiscripts: MMULTISCRIPTS_SCHEMA,
2271
- mn: MN_SCHEMA,
2272
- mo: MO_SCHEMA,
2273
- mover: MOVER_SCHEMA,
2274
- mpadded: MPADDED_SCHEMA,
2275
- mphantom: MPHANTOM_SCHEMA,
2276
- mprescripts: MPRESCRIPTS_SCHEMA,
2277
- mroot: MROOT_SCHEMA,
2278
- mrow: MROW_SCHEMA,
2279
- ms: MS_SCHEMA,
2280
- mspace: MSPACE_SCHEMA,
2281
- msqrt: MSQRT_SCHEMA,
2282
- mstyle: MSTYLE_SCHEMA,
2283
- msub: MSUB_SCHEMA,
2284
- msubsup: MSUBSUP_SCHEMA,
2285
- msup: MSUP_SCHEMA,
2286
- mtable: MTABLE_SCHEMA,
2287
- mtd: MTD_SCHEMA,
2288
- mtext: MTEXT_SCHEMA,
2289
- mtr: MTR_SCHEMA,
2290
- munder: MUNDER_SCHEMA,
2291
- munderover: MUNDEROVER_SCHEMA,
2292
- img: IMG_SCHEMA,
2293
- alttext: ALTTEXT_SCHEMA,
2294
- imageobject: IMAGEOBJECT_SCHEMA,
2295
- mediaobject: MEDIAOBJECT_SCHEMA,
2296
- caption1: CAPTION_SCHEMA,
2297
- figsource: FIGSOURCE_SCHEMA,
2298
- fignote: FIGNOTE_SCHEMA,
2299
- figure1: FIGURE_SCHEMA,
2300
- informalfigure: INFORMALFIGURE_SCHEMA,
2301
- keywordset: KEYWORDSET_SCHEMA,
2302
- keyword: KEYWORD_SCHEMA,
2303
- punc: PUNC_SCHEMA,
2304
- label1: LABEL_SCHEMA,
2305
- li: LI_SCHEMA,
2306
- ol: OL_SCHEMA,
2307
- ul: UL_SCHEMA,
2308
- token: TOKEN_SCHEMA,
2309
- tag: TAG_SCHEMA,
2310
- lrh: LRH_SCHEMA,
2311
- rrh: RRH_SCHEMA,
2312
- source1: SOURCE_SCHEMA,
2313
- subtitle1: SUBTITLE_SCHEMA,
2314
- table1: TABLE_SCHEMA,
2315
- tgroup: TGROUP_SCHEMA,
2309
+ // src/schema/elementSchemas/elements/reference/bibliodiv.ts
2310
+ var BIBLIODIV_SCHEMA = createSchema({
2311
+ code: "bibliodiv",
2312
+ kind: "element",
2313
+ tag: BIBLIODIV_TAG,
2314
+ requiredAttributes: [
2315
+ ...ID_ATTRS,
2316
+ "role"
2317
+ ],
2318
+ optionalAttributes: [],
2319
+ allowedChildrenCodes: [
2320
+ { code: "bibliodiv", required: false },
2321
+ { code: "referenceBibliomixed", required: false },
2322
+ { code: "para", required: false },
2323
+ { code: "title1", required: false }
2324
+ ]
2325
+ });
2326
+
2327
+ // src/schema/elementSchemas/elements/reference/bibliomset.ts
2328
+ var CONTAINER_BIBLIOMSET_RELATIONS = ["book", "journal"];
2329
+ var PART_BIBLIOMSET_RELATION = "part";
2330
+ var BIBLIOMSET_SCHEMA = createSchema({
2331
+ code: "bibliomset",
2332
+ kind: "element",
2333
+ tag: BIBLIOMSET_TAG,
2334
+ requiredAttributes: [
2335
+ {
2336
+ name: "relation",
2337
+ values: [
2338
+ PART_BIBLIOMSET_RELATION,
2339
+ "article",
2340
+ ...CONTAINER_BIBLIOMSET_RELATIONS
2341
+ ],
2342
+ defaultValue: PART_BIBLIOMSET_RELATION
2343
+ }
2344
+ ],
2345
+ optionalAttributes: [...ID_ATTRS],
2346
+ allowedChildrenCodes: [
2347
+ ...REFERENCE_PART_CODES_ALLOWED_CHILDREN,
2348
+ ...ATOM_CODES_ALLOWED_CHILDREN
2349
+ ]
2350
+ });
2351
+
2352
+ // src/schema/elementSchemas/elements/reference/editor.ts
2353
+ var EDITOR_SCHEMA = createSchema({
2354
+ code: "editor",
2355
+ kind: "element",
2356
+ tag: EDITOR_TAG,
2357
+ requiredAttributes: [],
2358
+ optionalAttributes: [...ID_ATTRS],
2359
+ allowedChildrenCodes: [
2360
+ { code: "personname", required: false },
2361
+ { code: "orgname", required: false },
2362
+ ...ATOM_CODES_ALLOWED_CHILDREN
2363
+ ]
2364
+ });
2365
+
2366
+ // src/schema/elementSchemas/elements/reference/othercredit.ts
2367
+ var OTHERCREDIT_SCHEMA = createSchema({
2368
+ code: "othercredit",
2369
+ kind: "element",
2370
+ tag: OTHERCREDIT_TAG,
2371
+ requiredAttributes: [],
2372
+ optionalAttributes: [...ID_ATTRS, "class", "otherclass"],
2373
+ allowedChildrenCodes: [
2374
+ { code: "personname", required: false },
2375
+ { code: "orgname", required: false },
2376
+ ...ATOM_CODES_ALLOWED_CHILDREN
2377
+ ]
2378
+ });
2379
+
2380
+ // src/schema/elementSchemas/elements/reference/translator.ts
2381
+ var TRANSLATOR_SCHEMA = createSchema({
2382
+ code: "translator",
2383
+ kind: "element",
2384
+ tag: TRANSLATOR_TAG,
2385
+ requiredAttributes: [],
2386
+ optionalAttributes: [...ID_ATTRS],
2387
+ allowedChildrenCodes: [
2388
+ { code: "personname", required: false },
2389
+ { code: "orgname", required: false },
2390
+ ...ATOM_CODES_ALLOWED_CHILDREN
2391
+ ]
2392
+ });
2393
+
2394
+ // src/schema/elementSchemas/elements/reference/collab.ts
2395
+ var COLLAB_SCHEMA = createSchema({
2396
+ code: "collab",
2397
+ kind: "element",
2398
+ tag: COLLAB_TAG,
2399
+ requiredAttributes: [],
2400
+ optionalAttributes: [...ID_ATTRS],
2401
+ allowedChildrenCodes: [
2402
+ { code: "orgname", required: false },
2403
+ { code: "personname", required: false },
2404
+ ...ATOM_CODES_ALLOWED_CHILDREN
2405
+ ]
2406
+ });
2407
+
2408
+ // src/schema/elementSchemas/elements/reference/pubdate.ts
2409
+ var PUBDATE_SCHEMA = createSchema({
2410
+ code: "pubdate",
2411
+ kind: "element",
2412
+ tag: PUBDATE_TAG,
2413
+ requiredAttributes: [],
2414
+ optionalAttributes: [...ID_ATTRS],
2415
+ allowedChildrenCodes: [
2416
+ ...ATOM_CODES_ALLOWED_CHILDREN
2417
+ ]
2418
+ });
2419
+
2420
+ // src/schema/elementSchemas/elements/reference/date.ts
2421
+ var ACCESSED_DATE_ROLE = "accessed";
2422
+ var DATE_SCHEMA = createSchema({
2423
+ code: "date",
2424
+ kind: "element",
2425
+ tag: DATE_TAG,
2426
+ requiredAttributes: [],
2427
+ optionalAttributes: [...ID_ATTRS, "role"],
2428
+ allowedChildrenCodes: [...ATOM_CODES_ALLOWED_CHILDREN]
2429
+ });
2430
+
2431
+ // src/schema/elementSchemas/elements/reference/publishername.ts
2432
+ var PUBLISHERNAME_SCHEMA = createSchema({
2433
+ code: "publishername",
2434
+ kind: "element",
2435
+ tag: PUBLISHERNAME_TAG,
2436
+ requiredAttributes: [],
2437
+ optionalAttributes: [...ID_ATTRS],
2438
+ allowedChildrenCodes: [
2439
+ ...ATOM_CODES_ALLOWED_CHILDREN
2440
+ ]
2441
+ });
2442
+
2443
+ // src/schema/elementSchemas/elements/reference/address.ts
2444
+ var ADDRESS_SCHEMA = createSchema({
2445
+ code: "address",
2446
+ kind: "element",
2447
+ tag: ADDRESS_TAG,
2448
+ requiredAttributes: [],
2449
+ optionalAttributes: [...ID_ATTRS],
2450
+ allowedChildrenCodes: [
2451
+ { code: "city", required: false },
2452
+ ...ATOM_CODES_ALLOWED_CHILDREN
2453
+ ]
2454
+ });
2455
+
2456
+ // src/schema/elementSchemas/elements/reference/city.ts
2457
+ var CITY_SCHEMA = createSchema({
2458
+ code: "city",
2459
+ kind: "element",
2460
+ tag: CITY_TAG,
2461
+ requiredAttributes: [],
2462
+ optionalAttributes: [...ID_ATTRS],
2463
+ allowedChildrenCodes: [
2464
+ ...ATOM_CODES_ALLOWED_CHILDREN
2465
+ ]
2466
+ });
2467
+
2468
+ // src/schema/elementSchemas/elements/reference/volumenum.ts
2469
+ var VOLUMENUM_SCHEMA = createSchema({
2470
+ code: "volumenum",
2471
+ kind: "element",
2472
+ tag: VOLUMENUM_TAG,
2473
+ requiredAttributes: [],
2474
+ optionalAttributes: [...ID_ATTRS],
2475
+ allowedChildrenCodes: [
2476
+ ...ATOM_CODES_ALLOWED_CHILDREN
2477
+ ]
2478
+ });
2479
+
2480
+ // src/schema/elementSchemas/elements/reference/issuenum.ts
2481
+ var ISSUENUM_SCHEMA = createSchema({
2482
+ code: "issuenum",
2483
+ kind: "element",
2484
+ tag: ISSUENUM_TAG,
2485
+ requiredAttributes: [],
2486
+ optionalAttributes: [...ID_ATTRS],
2487
+ allowedChildrenCodes: [
2488
+ ...ATOM_CODES_ALLOWED_CHILDREN
2489
+ ]
2490
+ });
2491
+
2492
+ // src/schema/elementSchemas/elements/reference/pagenums.ts
2493
+ var PAGENUMS_SCHEMA = createSchema({
2494
+ code: "pagenums",
2495
+ kind: "element",
2496
+ tag: PAGENUMS_TAG,
2497
+ requiredAttributes: [],
2498
+ optionalAttributes: [...ID_ATTRS],
2499
+ allowedChildrenCodes: [
2500
+ ...ATOM_CODES_ALLOWED_CHILDREN
2501
+ ]
2502
+ });
2503
+
2504
+ // src/schema/elementSchemas/elements/reference/pagenum.ts
2505
+ var PAGENUM_SCHEMA = createSchema({
2506
+ code: "pagenum",
2507
+ kind: "element",
2508
+ tag: PAGENUM_TAG,
2509
+ requiredAttributes: [],
2510
+ optionalAttributes: [...ID_ATTRS],
2511
+ allowedChildrenCodes: [
2512
+ ...ATOM_CODES_ALLOWED_CHILDREN
2513
+ ]
2514
+ });
2515
+
2516
+ // src/schema/elementSchemas/elements/reference/edition.ts
2517
+ var EDITION_SCHEMA = createSchema({
2518
+ code: "edition",
2519
+ kind: "element",
2520
+ tag: EDITION_TAG,
2521
+ requiredAttributes: [],
2522
+ optionalAttributes: [...ID_ATTRS],
2523
+ allowedChildrenCodes: [
2524
+ ...ATOM_CODES_ALLOWED_CHILDREN
2525
+ ]
2526
+ });
2527
+
2528
+ // src/schema/elementSchemas/elements/reference/pubId.ts
2529
+ var PUB_ID_SCHEMA = createSchema({
2530
+ code: "pubId",
2531
+ kind: "element",
2532
+ tag: PUB_ID_TAG,
2533
+ requiredAttributes: [],
2534
+ optionalAttributes: [...ID_ATTRS, "pub-id-type", "assigning-authority"],
2535
+ allowedChildrenCodes: [
2536
+ ...ATOM_CODES_ALLOWED_CHILDREN
2537
+ ]
2538
+ });
2539
+
2540
+ // src/schema/helpers/matchesSchemaTag.ts
2541
+ var matchesSchemaTag = (element, tag) => element.tagName.toUpperCase() === tag.toUpperCase();
2542
+
2543
+ // src/schema/elementSchemas/elements/reference/biblioid.ts
2544
+ var PUBMED_ID_BIBLIOID_CLASS = "other";
2545
+ var PUBMED_ID_BIBLIOID_OTHERCLASS = "pmid";
2546
+ var BIBLIOID_SCHEMA = createSchema({
2547
+ code: "biblioid",
2548
+ kind: "element",
2549
+ tag: BIBLIOID_TAG,
2550
+ requiredAttributes: [],
2551
+ optionalAttributes: [...ID_ATTRS, "class", "otherclass"],
2552
+ allowedChildrenCodes: [...ATOM_CODES_ALLOWED_CHILDREN]
2553
+ });
2554
+ var isPubMedIdBiblioid = (element) => matchesSchemaTag(element, BIBLIOID_TAG) && element.classList.contains(PUBMED_ID_BIBLIOID_CLASS) && element.getAttribute("otherclass") === PUBMED_ID_BIBLIOID_OTHERCLASS;
2555
+
2556
+ // src/schema/elementSchemas/elements/reference/bibliomisc.ts
2557
+ var LEGAL_REFERENCE_BIBLIOMISC_ROLE = "legalRef";
2558
+ var BIBLIOMISC_SCHEMA = createSchema({
2559
+ code: "bibliomisc",
2560
+ kind: "element",
2561
+ tag: BIBLIOMISC_TAG,
2562
+ requiredAttributes: [],
2563
+ optionalAttributes: [...ID_ATTRS, "role"],
2564
+ allowedChildrenCodes: [...ATOM_CODES_ALLOWED_CHILDREN]
2565
+ });
2566
+
2567
+ // src/schema/elementSchemas/elements/reference/confgroup.ts
2568
+ var CONFGROUP_SCHEMA = createSchema({
2569
+ code: "confgroup",
2570
+ kind: "element",
2571
+ tag: CONFGROUP_TAG,
2572
+ requiredAttributes: [],
2573
+ optionalAttributes: [...ID_ATTRS],
2574
+ allowedChildrenCodes: [
2575
+ { code: "conftitle", required: false },
2576
+ { code: "address", required: false },
2577
+ ...ATOM_CODES_ALLOWED_CHILDREN
2578
+ ]
2579
+ });
2580
+
2581
+ // src/schema/elementSchemas/elements/reference/conftitle.ts
2582
+ var CONFTITLE_SCHEMA = createSchema({
2583
+ code: "conftitle",
2584
+ kind: "element",
2585
+ tag: CONFTITLE_TAG,
2586
+ requiredAttributes: [],
2587
+ optionalAttributes: [...ID_ATTRS],
2588
+ allowedChildrenCodes: [
2589
+ ...ATOM_CODES_ALLOWED_CHILDREN
2590
+ ]
2591
+ });
2592
+
2593
+ // src/schema/elementSchemas/elements/index.ts
2594
+ var ELEMENT_SCHEMAS = {
2595
+ bibliodiv: BIBLIODIV_SCHEMA,
2596
+ referenceBibliography: REFERENCE_BIBLIOGRAPHY_SCHEMA,
2597
+ referenceBibliomixed: BIBLIOMIXED_SCHEMA,
2598
+ bibliomset: BIBLIOMSET_SCHEMA,
2599
+ editor: EDITOR_SCHEMA,
2600
+ othercredit: OTHERCREDIT_SCHEMA,
2601
+ translator: TRANSLATOR_SCHEMA,
2602
+ collab: COLLAB_SCHEMA,
2603
+ pubdate: PUBDATE_SCHEMA,
2604
+ date: DATE_SCHEMA,
2605
+ publishername: PUBLISHERNAME_SCHEMA,
2606
+ address: ADDRESS_SCHEMA,
2607
+ city: CITY_SCHEMA,
2608
+ volumenum: VOLUMENUM_SCHEMA,
2609
+ issuenum: ISSUENUM_SCHEMA,
2610
+ pagenums: PAGENUMS_SCHEMA,
2611
+ pagenum: PAGENUM_SCHEMA,
2612
+ edition: EDITION_SCHEMA,
2613
+ pubId: PUB_ID_SCHEMA,
2614
+ biblioid: BIBLIOID_SCHEMA,
2615
+ bibliomisc: BIBLIOMISC_SCHEMA,
2616
+ confgroup: CONFGROUP_SCHEMA,
2617
+ conftitle: CONFTITLE_SCHEMA,
2618
+ para: PARA_SCHEMA,
2619
+ title1: TITLE_SCHEMA,
2620
+ footnote: FOOTNOTE_SCHEMA,
2621
+ footnoteno: FOOTNOTE_NUMBER_SCHEMA,
2622
+ olink: OLINK_SCHEMA,
2623
+ firstname: FIRSTNAME_SCHEMA,
2624
+ surname: SURNAME_SCHEMA,
2625
+ honorific: HONORIFIC_SCHEMA,
2626
+ orgname: ORGNAME_SCHEMA,
2627
+ email: EMAIL_SCHEMA,
2628
+ org: ORG_SCHEMA,
2629
+ degrees: DEGREES_SCHEMA,
2630
+ dialogue: DIALOGUE_SCHEMA,
2631
+ line: LINE_SCHEMA,
2632
+ linegroup: LINE_GROUP_SCHEMA,
2633
+ speaker: SPEAKER_SCHEMA,
2634
+ equation: EQUATION_SCHEMA,
2635
+ math: MATH_SCHEMA,
2636
+ mathphrase: MATHPHRASE_SCHEMA,
2637
+ merror: MERROR_SCHEMA,
2638
+ mfrac: MFRAC_SCHEMA,
2639
+ mi: MI_SCHEMA,
2640
+ mmultiscripts: MMULTISCRIPTS_SCHEMA,
2641
+ mn: MN_SCHEMA,
2642
+ mo: MO_SCHEMA,
2643
+ mover: MOVER_SCHEMA,
2644
+ mpadded: MPADDED_SCHEMA,
2645
+ mphantom: MPHANTOM_SCHEMA,
2646
+ mprescripts: MPRESCRIPTS_SCHEMA,
2647
+ mroot: MROOT_SCHEMA,
2648
+ mrow: MROW_SCHEMA,
2649
+ ms: MS_SCHEMA,
2650
+ mspace: MSPACE_SCHEMA,
2651
+ msqrt: MSQRT_SCHEMA,
2652
+ mstyle: MSTYLE_SCHEMA,
2653
+ msub: MSUB_SCHEMA,
2654
+ msubsup: MSUBSUP_SCHEMA,
2655
+ msup: MSUP_SCHEMA,
2656
+ mtable: MTABLE_SCHEMA,
2657
+ mtd: MTD_SCHEMA,
2658
+ mtext: MTEXT_SCHEMA,
2659
+ mtr: MTR_SCHEMA,
2660
+ munder: MUNDER_SCHEMA,
2661
+ munderover: MUNDEROVER_SCHEMA,
2662
+ img: IMG_SCHEMA,
2663
+ alttext: ALTTEXT_SCHEMA,
2664
+ imageobject: IMAGEOBJECT_SCHEMA,
2665
+ mediaobject: MEDIAOBJECT_SCHEMA,
2666
+ caption1: CAPTION_SCHEMA,
2667
+ figsource: FIGSOURCE_SCHEMA,
2668
+ fignote: FIGNOTE_SCHEMA,
2669
+ figure1: FIGURE_SCHEMA,
2670
+ informalfigure: INFORMALFIGURE_SCHEMA,
2671
+ keywordset: KEYWORDSET_SCHEMA,
2672
+ keyword: KEYWORD_SCHEMA,
2673
+ punc: PUNC_SCHEMA,
2674
+ label1: LABEL_SCHEMA,
2675
+ li: LI_SCHEMA,
2676
+ ol: OL_SCHEMA,
2677
+ ul: UL_SCHEMA,
2678
+ token: TOKEN_SCHEMA,
2679
+ tag: TAG_SCHEMA,
2680
+ lrh: LRH_SCHEMA,
2681
+ rrh: RRH_SCHEMA,
2682
+ source1: SOURCE_SCHEMA,
2683
+ subtitle1: SUBTITLE_SCHEMA,
2684
+ table1: TABLE_SCHEMA,
2685
+ tgroup: TGROUP_SCHEMA,
2316
2686
  table: HTML_TABLE_SCHEMA,
2317
2687
  thead: THEAD_SCHEMA,
2318
2688
  tbody: TBODY_SCHEMA,
@@ -2384,7 +2754,10 @@ var INLINEEQUATION_SCHEMA = createSchema({
2384
2754
  defaultValue: "added"
2385
2755
  }
2386
2756
  ],
2387
- allowedChildrenCodes: [{ code: "mathphrase", required: true }]
2757
+ allowedChildrenCodes: [
2758
+ { code: "mathphrase", required: true },
2759
+ { code: "tag", required: false }
2760
+ ]
2388
2761
  });
2389
2762
 
2390
2763
  // src/schema/elementSchemas/inlineElements/link.ts
@@ -2471,9 +2844,6 @@ var findAttributeDefinitionByName = (definitions, name) => {
2471
2844
  // src/schema/helpers/findSchemaByCode.ts
2472
2845
  var findSchemaByCode = (code) => SCHEMAS[code];
2473
2846
 
2474
- // src/schema/helpers/matchesSchemaTag.ts
2475
- var matchesSchemaTag = (element, tag) => element.tagName.toUpperCase() === tag.toUpperCase();
2476
-
2477
2847
  // src/schema/helpers/findSchemaByElement.ts
2478
2848
  var findSchemaByElement = (element) => {
2479
2849
  const schema = Object.values(SCHEMAS).find(
@@ -2488,12 +2858,402 @@ var isAttributeRestricted = (attr) => typeof attr !== "string";
2488
2858
  // src/schema/helpers/isTrackChangesSchema.ts
2489
2859
  var isTrackChangesSchema = (schema) => schema.code === "insertion" || schema.code === "deletion" || schema.code === "lineGroupRemoval";
2490
2860
 
2861
+ // src/schema/referenceSchemas/referenceTypeSchemas.ts
2862
+ var LINK_FIELDS = ["doi", "url"];
2863
+ var OTHER_MATERIAL_FIELDS = [
2864
+ "author",
2865
+ "editor",
2866
+ "title",
2867
+ "year",
2868
+ "containerTitle",
2869
+ "publisherPlace",
2870
+ "publisher",
2871
+ "volume",
2872
+ "issue",
2873
+ "pages",
2874
+ "accessDate",
2875
+ "genre",
2876
+ "eventTitle",
2877
+ "eventPlace",
2878
+ "documentNumber",
2879
+ "pubmedId",
2880
+ ...LINK_FIELDS
2881
+ ];
2882
+ var REFERENCE_TYPE_SCHEMAS = {
2883
+ monograph: {
2884
+ code: "monograph",
2885
+ label: "Book",
2886
+ legacyRoles: ["book"],
2887
+ allowedFields: [
2888
+ "author",
2889
+ "editor",
2890
+ "title",
2891
+ "year",
2892
+ "volume",
2893
+ "publisherPlace",
2894
+ "publisher",
2895
+ ...LINK_FIELDS
2896
+ ],
2897
+ requiredFields: ["title", "creators"],
2898
+ fieldLabels: { title: "Book title" }
2899
+ },
2900
+ serial: {
2901
+ code: "serial",
2902
+ label: "Journal issue",
2903
+ legacyRoles: [],
2904
+ allowedFields: ["title", "year", "volume", "issue", ...LINK_FIELDS],
2905
+ requiredFields: ["title"]
2906
+ },
2907
+ contribution: {
2908
+ code: "contribution",
2909
+ label: "Contributed book",
2910
+ legacyRoles: ["chapter"],
2911
+ allowedFields: [
2912
+ "author",
2913
+ "editor",
2914
+ "title",
2915
+ "year",
2916
+ "containerTitle",
2917
+ "publisherPlace",
2918
+ "publisher",
2919
+ "pages",
2920
+ ...LINK_FIELDS
2921
+ ],
2922
+ requiredFields: ["title", "containerTitle", "creators"],
2923
+ bibliomsetRelations: ["part", "book"],
2924
+ fieldLabels: { title: "Chapter title", containerTitle: "Book title" }
2925
+ },
2926
+ article: {
2927
+ code: "article",
2928
+ label: "Journal article",
2929
+ legacyRoles: ["journal", "article-journal"],
2930
+ allowedFields: [
2931
+ "author",
2932
+ "editor",
2933
+ "title",
2934
+ "year",
2935
+ "containerTitle",
2936
+ "volume",
2937
+ "issue",
2938
+ "pages",
2939
+ "genre",
2940
+ "publisher",
2941
+ "publisherPlace",
2942
+ "pubmedId",
2943
+ "accessDate",
2944
+ ...LINK_FIELDS
2945
+ ],
2946
+ requiredFields: ["title", "containerTitle"],
2947
+ bibliomsetRelations: ["article", "journal"],
2948
+ fieldLabels: { title: "Article title", containerTitle: "Journal title" }
2949
+ },
2950
+ message: {
2951
+ code: "message",
2952
+ label: "Email message",
2953
+ legacyRoles: [],
2954
+ allowedFields: ["author", "title", "year", ...LINK_FIELDS],
2955
+ requiredFields: ["title"]
2956
+ },
2957
+ website: {
2958
+ code: "website",
2959
+ label: "Website",
2960
+ legacyRoles: [],
2961
+ allowedFields: ["author", "title", "year", "accessDate", ...LINK_FIELDS],
2962
+ requiredFields: ["title"]
2963
+ },
2964
+ unpublished: {
2965
+ code: "unpublished",
2966
+ label: "Unpublished material",
2967
+ legacyRoles: [],
2968
+ allowedFields: [
2969
+ "author",
2970
+ "title",
2971
+ "year",
2972
+ "publisher",
2973
+ "genre",
2974
+ "eventTitle",
2975
+ "eventPlace",
2976
+ ...LINK_FIELDS
2977
+ ],
2978
+ requiredFields: ["title"],
2979
+ replacedElements: [
2980
+ { tag: "pubdate", replacement: "date" },
2981
+ { tag: "publishername", replacement: "orgname" }
2982
+ ]
2983
+ },
2984
+ case: {
2985
+ code: "case",
2986
+ label: "Case",
2987
+ legacyRoles: [],
2988
+ allowedFields: ["title", "year", "documentNumber", ...LINK_FIELDS],
2989
+ requiredFields: ["title"]
2990
+ },
2991
+ legislation: {
2992
+ code: "legislation",
2993
+ label: "Legislation",
2994
+ legacyRoles: [],
2995
+ allowedFields: [
2996
+ "title",
2997
+ "year",
2998
+ "documentNumber",
2999
+ "publisherPlace",
3000
+ ...LINK_FIELDS
3001
+ ],
3002
+ requiredFields: ["title"]
3003
+ },
3004
+ other: {
3005
+ code: "other",
3006
+ label: "Other material",
3007
+ legacyRoles: [],
3008
+ allowedFields: OTHER_MATERIAL_FIELDS,
3009
+ requiredFields: ["title"]
3010
+ },
3011
+ recording: {
3012
+ code: "recording",
3013
+ label: "Recording",
3014
+ legacyRoles: [],
3015
+ allowedFields: ["author", "title", "year", ...LINK_FIELDS],
3016
+ requiredFields: ["title", "year"],
3017
+ replacedElements: [{ tag: "author", replacement: "othercredit" }]
3018
+ },
3019
+ film: {
3020
+ code: "film",
3021
+ label: "Film",
3022
+ legacyRoles: [],
3023
+ allowedFields: ["title", "year", ...LINK_FIELDS],
3024
+ requiredFields: ["title"]
3025
+ }
3026
+ };
3027
+
3028
+ // src/schema/helpers/findReferenceTypeSchemaByElement.ts
3029
+ var findReferenceTypeSchemaByElement = (reference) => {
3030
+ const role = reference.getAttribute("role")?.trim().toLowerCase() ?? "";
3031
+ const schemas = Object.values(REFERENCE_TYPE_SCHEMAS);
3032
+ return schemas.find(
3033
+ (schema) => schema.code === role || schema.legacyRoles.includes(role)
3034
+ );
3035
+ };
3036
+
3037
+ // src/helpers/isDeletedElement.ts
3038
+ var isDeletedElement = (element) => {
3039
+ return !!closestElementBySchema({
3040
+ element,
3041
+ code: "deletion"
3042
+ });
3043
+ };
3044
+
3045
+ // src/helpers/closestElementBySchema.ts
3046
+ var closestElementBySchema = ({
3047
+ element,
3048
+ code,
3049
+ ignoreDeletedElements = false
3050
+ }) => {
3051
+ const schema = findSchemaByCode(code);
3052
+ if (!schema) return;
3053
+ const closestElement = element.closest(
3054
+ schema.tag.toLowerCase()
3055
+ );
3056
+ if (!closestElement) return;
3057
+ if (schema.matchesElement && !schema.matchesElement(closestElement)) {
3058
+ return;
3059
+ }
3060
+ if (ignoreDeletedElements && isDeletedElement(closestElement)) {
3061
+ return closestElementBySchema({
3062
+ element: closestElement,
3063
+ code,
3064
+ ignoreDeletedElements
3065
+ });
3066
+ }
3067
+ return closestElement;
3068
+ };
3069
+
3070
+ // src/helpers/isInTrackedDeletion.ts
3071
+ var isInTrackedDeletion = (element) => !!element.closest("span.del");
3072
+
3073
+ // src/helpers/hasLiveUri.ts
3074
+ var hasLiveUri = (link) => Array.from(link.querySelectorAll("uri")).some(
3075
+ (uri) => !isInTrackedDeletion(uri)
3076
+ );
3077
+
3078
+ // src/schema/helpers/findReferenceFieldByElement.ts
3079
+ var isContainerTitle = (title) => {
3080
+ const relation = closestElementBySchema({
3081
+ element: title,
3082
+ code: "bibliomset"
3083
+ })?.getAttribute("relation");
3084
+ return CONTAINER_BIBLIOMSET_RELATIONS.some(
3085
+ (containerRelation) => containerRelation === relation
3086
+ );
3087
+ };
3088
+ var isUnpublishedReference = (element) => {
3089
+ const reference = closestElementBySchema({
3090
+ element,
3091
+ code: "referenceBibliomixed"
3092
+ });
3093
+ return !!reference && findReferenceTypeSchemaByElement(reference)?.code === "unpublished";
3094
+ };
3095
+ var hasAcceptedChild = (element, tag) => Array.from(element.querySelectorAll(tag.toLowerCase())).some(
3096
+ (child) => !isInTrackedDeletion(child)
3097
+ );
3098
+ var isConferenceDates = (confgroup) => hasAcceptedChild(confgroup, CONFDATES_TAG) && !hasAcceptedChild(confgroup, CONFTITLE_TAG);
3099
+ var findReferenceFieldByElement = (element) => {
3100
+ switch (findSchemaByElement(element)?.code) {
3101
+ case "author":
3102
+ case "othercredit":
3103
+ return "author";
3104
+ case "editor":
3105
+ return "editor";
3106
+ case "title1":
3107
+ return isContainerTitle(element) ? "containerTitle" : "title";
3108
+ case "pubdate":
3109
+ return "year";
3110
+ case "date":
3111
+ return element.getAttribute("role") === ACCESSED_DATE_ROLE ? "accessDate" : "year";
3112
+ case "publishername":
3113
+ case "orgname":
3114
+ return "publisher";
3115
+ case "address":
3116
+ return isUnpublishedReference(element) ? "eventPlace" : "publisherPlace";
3117
+ case "volumenum":
3118
+ return "volume";
3119
+ case "issuenum":
3120
+ return "issue";
3121
+ case "pagenums":
3122
+ return "pages";
3123
+ case "link":
3124
+ if (element.hasAttribute(LINKEND_ATTRIBUTE)) return void 0;
3125
+ return hasLiveUri(element) ? "url" : "doi";
3126
+ case "bibliomisc":
3127
+ return element.getAttribute("role") === LEGAL_REFERENCE_BIBLIOMISC_ROLE ? "documentNumber" : "genre";
3128
+ case "confgroup":
3129
+ return isConferenceDates(element) ? "year" : "eventTitle";
3130
+ case "biblioid":
3131
+ return isPubMedIdBiblioid(element) ? "pubmedId" : void 0;
3132
+ default:
3133
+ return void 0;
3134
+ }
3135
+ };
3136
+
3137
+ // src/schema/referenceSchemas/referenceFieldSchemas.ts
3138
+ var REFERENCE_FIELD_SCHEMAS = {
3139
+ author: {
3140
+ code: "author",
3141
+ label: "Author",
3142
+ elementCodes: ["author", "othercredit"]
3143
+ },
3144
+ editor: {
3145
+ code: "editor",
3146
+ label: "Editor",
3147
+ elementCodes: ["editor"]
3148
+ },
3149
+ title: {
3150
+ code: "title",
3151
+ label: "Title",
3152
+ elementCodes: ["title1"]
3153
+ },
3154
+ year: {
3155
+ code: "year",
3156
+ label: "Date",
3157
+ elementCodes: ["pubdate", "date", "confgroup"]
3158
+ },
3159
+ containerTitle: {
3160
+ code: "containerTitle",
3161
+ label: "Container title",
3162
+ elementCodes: ["title1"]
3163
+ },
3164
+ publisherPlace: {
3165
+ code: "publisherPlace",
3166
+ label: "Publisher place",
3167
+ elementCodes: ["address"]
3168
+ },
3169
+ publisher: {
3170
+ code: "publisher",
3171
+ label: "Publisher or institution",
3172
+ elementCodes: ["publishername", "orgname"]
3173
+ },
3174
+ volume: {
3175
+ code: "volume",
3176
+ label: "Volume",
3177
+ elementCodes: ["volumenum"]
3178
+ },
3179
+ issue: {
3180
+ code: "issue",
3181
+ label: "Issue",
3182
+ elementCodes: ["issuenum"]
3183
+ },
3184
+ pages: {
3185
+ code: "pages",
3186
+ label: "Pages",
3187
+ elementCodes: ["pagenums"]
3188
+ },
3189
+ doi: {
3190
+ code: "doi",
3191
+ label: "DOI",
3192
+ elementCodes: ["link"]
3193
+ },
3194
+ url: {
3195
+ code: "url",
3196
+ label: "URL",
3197
+ elementCodes: ["link"]
3198
+ },
3199
+ accessDate: {
3200
+ code: "accessDate",
3201
+ label: "Access date",
3202
+ elementCodes: ["date"]
3203
+ },
3204
+ genre: {
3205
+ code: "genre",
3206
+ label: "Description",
3207
+ elementCodes: ["bibliomisc"]
3208
+ },
3209
+ eventTitle: {
3210
+ code: "eventTitle",
3211
+ label: "Conference title",
3212
+ elementCodes: ["confgroup"]
3213
+ },
3214
+ eventPlace: {
3215
+ code: "eventPlace",
3216
+ label: "Conference place",
3217
+ elementCodes: ["address"]
3218
+ },
3219
+ documentNumber: {
3220
+ code: "documentNumber",
3221
+ label: "Legal reference",
3222
+ elementCodes: ["bibliomisc"]
3223
+ },
3224
+ pubmedId: {
3225
+ code: "pubmedId",
3226
+ label: "PubMed ID",
3227
+ elementCodes: ["biblioid"]
3228
+ }
3229
+ };
3230
+
2491
3231
  // src/schema/shared/labelElements.ts
2492
3232
  var ElementLabel = {
2493
3233
  mark: "Mark",
2494
3234
  referenceBibliomixed: "Reference Bibliomixed",
2495
3235
  referenceBibliography: "Reference Bibliography",
2496
3236
  bibliodiv: "Bibliodiv",
3237
+ bibliomset: "Reference Block",
3238
+ editor: "Editor",
3239
+ othercredit: "Other Credit",
3240
+ translator: "Translator",
3241
+ collab: "Collaborator",
3242
+ pubdate: "Publication Date",
3243
+ date: "Date",
3244
+ publishername: "Publisher Name",
3245
+ address: "Address",
3246
+ city: "City",
3247
+ volumenum: "Volume Number",
3248
+ issuenum: "Issue Number",
3249
+ pagenums: "Page Numbers",
3250
+ pagenum: "Page Number",
3251
+ edition: "Edition",
3252
+ pubId: "Publication ID",
3253
+ biblioid: "Bibliographic ID",
3254
+ bibliomisc: "Reference Miscellany",
3255
+ confgroup: "Conference",
3256
+ conftitle: "Conference Title",
2497
3257
  indexterm: "Indexterm",
2498
3258
  primary: "Primary",
2499
3259
  secondary: "Secondary",
@@ -2641,39 +3401,7 @@ var IGNORED_VALIDATION_ELEMENT_SELECTORS = [
2641
3401
  "referenceBibliomixed"
2642
3402
  ];
2643
3403
  var isIgnoredValidation = (code) => IGNORED_VALIDATION_ELEMENT_SELECTORS.includes(code);
2644
-
2645
- // src/helpers/closestElementBySchema.ts
2646
- var closestElementBySchema = ({
2647
- element,
2648
- code,
2649
- ignoreDeletedElements = false
2650
- }) => {
2651
- const schema = findSchemaByCode(code);
2652
- if (!schema) return;
2653
- const closestElement = element.closest(
2654
- schema.tag.toLowerCase()
2655
- );
2656
- if (!closestElement) return;
2657
- if (schema.matchesElement && !schema.matchesElement(closestElement)) {
2658
- return;
2659
- }
2660
- if (ignoreDeletedElements && isDeletedElement(closestElement)) {
2661
- return closestElementBySchema({
2662
- element: closestElement,
2663
- code,
2664
- ignoreDeletedElements
2665
- });
2666
- }
2667
- return closestElement;
2668
- };
2669
-
2670
- // src/helpers/isDeletedElement.ts
2671
- var isDeletedElement = (element) => {
2672
- return !!closestElementBySchema({
2673
- element,
2674
- code: "deletion"
2675
- });
2676
- };
3404
+ var isIgnoredValidationByAttribute = (element) => element.getAttribute(VALIDATION_IGNORED_ATTRIBUTE) === "true";
2677
3405
 
2678
3406
  // src/validation/utils/getElementsSelector.ts
2679
3407
  var getElementsSelector = ({
@@ -2711,12 +3439,14 @@ var generateValidationIssueId = () => {
2711
3439
  };
2712
3440
 
2713
3441
  // src/validation/helpers/addValidationIssue.ts
2714
- var createValidationIssue = (issue) => ({
3442
+ var createValidationIssue = (element, issue) => ({
3443
+ ...issue,
2715
3444
  id: generateValidationIssueId(),
2716
- ...issue
3445
+ store: element ? getStore(element) : issue.store,
3446
+ ignored: element ? isIgnoredValidationByAttribute(element) : false
2717
3447
  });
2718
- var addValidationIssue = (errors, issue) => {
2719
- errors.push(createValidationIssue(issue));
3448
+ var addValidationIssue = (errors, element, issue) => {
3449
+ errors.push(createValidationIssue(element, issue));
2720
3450
  };
2721
3451
 
2722
3452
  // src/validation/validateFootnotes.ts
@@ -2735,8 +3465,7 @@ var validateFootnoteNumber = (footnoteElement) => {
2735
3465
  FOOTNOTE_NUMBER_SCHEMA.tag
2736
3466
  );
2737
3467
  if (!footnoteNumber) {
2738
- addValidationIssue(errors, {
2739
- store: getStore(footnoteElement),
3468
+ addValidationIssue(errors, footnoteElement, {
2740
3469
  title: "Footnote number missing",
2741
3470
  kind: "missing",
2742
3471
  description: "The footnote number is missing. Please add it to the footnote.",
@@ -2767,8 +3496,7 @@ var validateConsecutiveFootnotes = (root) => {
2767
3496
  );
2768
3497
  if (!footnoteNumberElement) {
2769
3498
  errors.push(
2770
- createValidationIssue({
2771
- store: getStore(footnote),
3499
+ createValidationIssue(footnote, {
2772
3500
  title: "Footnote number missing",
2773
3501
  kind: "missing",
2774
3502
  description: "The footnote number is missing. Please add it to the footnote.",
@@ -2781,8 +3509,7 @@ var validateConsecutiveFootnotes = (root) => {
2781
3509
  continue;
2782
3510
  }
2783
3511
  errors.push(
2784
- createValidationIssue({
2785
- store: getStore(footnote),
3512
+ createValidationIssue(footnote, {
2786
3513
  title: "Non-consecutive footnote numbers",
2787
3514
  kind: "missing",
2788
3515
  description: `Footnote numbers must be consecutive, footnote number (${label}) expected to be (${expectedNumber}). Please reorder the footnotes.`,
@@ -2813,8 +3540,7 @@ var validateConsecutiveFootnoteCues = (root) => {
2813
3540
  continue;
2814
3541
  }
2815
3542
  errors.push(
2816
- createValidationIssue({
2817
- store: getStore(footnoteLink),
3543
+ createValidationIssue(footnoteLink, {
2818
3544
  title: "Non-consecutive footnote cues",
2819
3545
  kind: "missing",
2820
3546
  description: "Footnote cues must be consecutive. Please reorder the footnote cues.",
@@ -2858,8 +3584,7 @@ var validateLinkend = (linkElement, elementsToLink) => {
2858
3584
  );
2859
3585
  if (isLinkFootnoteCue) {
2860
3586
  return [
2861
- createValidationIssue({
2862
- store: getStore(linkElement),
3587
+ createValidationIssue(linkElement, {
2863
3588
  title: "Unlinked footnote cue",
2864
3589
  kind: "unlinked",
2865
3590
  description: "This footnote cue is not referenced to any footnote in this chapter. Please link it again manually.",
@@ -2880,8 +3605,7 @@ var validateLinkend = (linkElement, elementsToLink) => {
2880
3605
  }
2881
3606
  const isBlocker = LINK_BLOCKER_ROLES.includes(role.toLowerCase());
2882
3607
  return [
2883
- createValidationIssue({
2884
- store: getStore(linkElement),
3608
+ createValidationIssue(linkElement, {
2885
3609
  title: "Unlinked element",
2886
3610
  kind: "unlinked",
2887
3611
  description: "This link is not referenced to any element in the current chapter or any other chapter. Please link it again manually.",
@@ -2941,8 +3665,7 @@ var validateAttributes = (element, schema) => {
2941
3665
  continue;
2942
3666
  }
2943
3667
  if (!definition.values.includes(value)) {
2944
- addValidationIssue(errors, {
2945
- store: getStore(element),
3668
+ addValidationIssue(errors, element, {
2946
3669
  title: `Invalid attribute value "${value}" in element ${element.tagName}`,
2947
3670
  level: "warning",
2948
3671
  kind: "forbidden",
@@ -2957,8 +3680,7 @@ var validateAttributes = (element, schema) => {
2957
3680
  var validateElementAgainstSchema = (element, schema) => {
2958
3681
  const errors = [];
2959
3682
  if (!matchesSchemaTag(element, schema.tag)) {
2960
- addValidationIssue(errors, {
2961
- store: getStore(element),
3683
+ addValidationIssue(errors, element, {
2962
3684
  title: `Expected ${schema.tag}, got ${element.tagName}`,
2963
3685
  level: "warning",
2964
3686
  kind: "forbidden",
@@ -2988,8 +3710,7 @@ var validateRequiredChildren = (element, schema, childElements) => {
2988
3710
  `Please provide at least one ${elementLabel} in this ${parentLabel}.`,
2989
3711
  extraInstruction
2990
3712
  ].filter(Boolean).join(" ");
2991
- addValidationIssue(errors, {
2992
- store: getStore(element),
3713
+ addValidationIssue(errors, element, {
2993
3714
  title: `${elementLabel} missing`,
2994
3715
  level: "warning",
2995
3716
  kind: "missing",
@@ -3023,8 +3744,7 @@ var validateChildren = (element, schema) => {
3023
3744
  for (const child of childElements) {
3024
3745
  const childSchema = findSchemaByElement(child);
3025
3746
  if (!childSchema) {
3026
- addValidationIssue(errors, {
3027
- store: getStore(child),
3747
+ addValidationIssue(errors, child, {
3028
3748
  title: `No schema found for child element ${child.tagName}`,
3029
3749
  level: "warning",
3030
3750
  kind: "missing",
@@ -3036,8 +3756,7 @@ var validateChildren = (element, schema) => {
3036
3756
  (candidate) => candidate.code === childSchema.code
3037
3757
  );
3038
3758
  if (!allowedChild) {
3039
- addValidationIssue(errors, {
3040
- store: getStore(child),
3759
+ addValidationIssue(errors, child, {
3041
3760
  title: `Forbidden child element ${child.tagName}`,
3042
3761
  level: "warning",
3043
3762
  kind: "forbidden",
@@ -3087,8 +3806,7 @@ var validateElementToLinkTo = (element, linkElements) => {
3087
3806
  if (isFootnote(element)) {
3088
3807
  const label = extractFootnoteNumber(element);
3089
3808
  return [
3090
- createValidationIssue({
3091
- store: getStore(element),
3809
+ createValidationIssue(element, {
3092
3810
  title: "Uncited footnote",
3093
3811
  kind: "uncited",
3094
3812
  description: `The footnote ${label} is not cited to any footnote cue in this chapter. Please reference it in the chapter.`,
@@ -3098,8 +3816,7 @@ var validateElementToLinkTo = (element, linkElements) => {
3098
3816
  }
3099
3817
  if (isReference(element)) {
3100
3818
  return [
3101
- createValidationIssue({
3102
- store: getStore(element),
3819
+ createValidationIssue(element, {
3103
3820
  title: "Uncited reference",
3104
3821
  kind: "uncited",
3105
3822
  description: "This reference is not cited in this chapter or any other chapter. Please add a link to this reference or delete it.",
@@ -3109,8 +3826,7 @@ var validateElementToLinkTo = (element, linkElements) => {
3109
3826
  }
3110
3827
  if (isTable(element)) {
3111
3828
  return [
3112
- createValidationIssue({
3113
- store: getStore(element),
3829
+ createValidationIssue(element, {
3114
3830
  title: "Uncited table",
3115
3831
  kind: "uncited",
3116
3832
  description: "This table is not cited in this chapter or any other chapter. Please add a link to this table or delete it.",
@@ -3120,8 +3836,7 @@ var validateElementToLinkTo = (element, linkElements) => {
3120
3836
  }
3121
3837
  if (isFigure(element)) {
3122
3838
  return [
3123
- createValidationIssue({
3124
- store: getStore(element),
3839
+ createValidationIssue(element, {
3125
3840
  title: "Uncited figure",
3126
3841
  kind: "uncited",
3127
3842
  description: "This figure is not cited in this chapter or any other chapter. Please add a link to this figure or delete it.",
@@ -3137,6 +3852,7 @@ var import_mark2 = __toESM(require("mark.js"));
3137
3852
  var EDGE_PUNCTUATION = `:;.,\\-\u2013\u2014\u2012_(){}[\\]!'"+=\xAB\xBB\u2039\u203A\u201C\u201D\u2018\u2019<>`;
3138
3853
  var WEB_URI_PATTERN = `(?:(?:https?):\\/\\/|www\\.)(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,}(?::\\d{1,5})?(?:\\/(?:[^\\s]*[^\\s${EDGE_PUNCTUATION}])?)?`;
3139
3854
  var WEB_URI_IN_TEXT_REGEX = new RegExp(WEB_URI_PATTERN, "gi");
3855
+ var POSSIBLE_WEBLINK_CLASS = "possible-weblink";
3140
3856
  var POSSIBLE_WEBLINK_EXCLUDE_SELECTORS = [
3141
3857
  "tag",
3142
3858
  "tag *",
@@ -3148,40 +3864,98 @@ var POSSIBLE_WEBLINK_EXCLUDE_SELECTORS = [
3148
3864
  "query *",
3149
3865
  "comment",
3150
3866
  "comment *",
3867
+ `.${POSSIBLE_WEBLINK_CLASS}`,
3868
+ `.${POSSIBLE_WEBLINK_CLASS} *`,
3151
3869
  ...IGNORED_ELEMENT_SELECTORS
3152
3870
  ];
3153
- var collectPossibleWebLinks = (content) => {
3154
- const clone = content.cloneNode(true);
3155
- const possibleWebLinks = /* @__PURE__ */ new Set();
3156
- const instance = new import_mark2.default(clone);
3871
+ var getPossibleWeblinks = (root) => {
3872
+ const possibleWeblinks = /* @__PURE__ */ new Map();
3873
+ const allWeblinkMatches = Array.from(
3874
+ root.getElementsByClassName(POSSIBLE_WEBLINK_CLASS)
3875
+ );
3876
+ for (const weblinkMatch of allWeblinkMatches) {
3877
+ const storeId = weblinkMatch.getAttribute(STORE_ATTRIBUTE);
3878
+ if (!storeId || possibleWeblinks.has(storeId)) continue;
3879
+ const elements = allWeblinkMatches.filter(
3880
+ (element) => element.getAttribute(STORE_ATTRIBUTE) === storeId
3881
+ );
3882
+ const weblink = elements.map((element) => element.textContent).join("");
3883
+ possibleWeblinks.set(storeId, {
3884
+ weblink,
3885
+ elements
3886
+ });
3887
+ }
3888
+ return possibleWeblinks;
3889
+ };
3890
+ var getWeblinkMatchId = (matchIndex) => `weblink-match-${matchIndex}`;
3891
+ var createWeblinkMatchTracker = () => {
3892
+ const matchedText = [];
3893
+ const matchedElements = [];
3894
+ const possibleWeblinks = /* @__PURE__ */ new Map();
3895
+ let matchIndex = 0;
3896
+ let currentMatchId = getWeblinkMatchId(matchIndex);
3897
+ const resetMatch = () => {
3898
+ matchIndex += 1;
3899
+ currentMatchId = getWeblinkMatchId(matchIndex);
3900
+ matchedText.length = 0;
3901
+ matchedElements.length = 0;
3902
+ };
3903
+ const composeWeblink = (element, url) => {
3904
+ element.setAttribute(STORE_ATTRIBUTE, currentMatchId);
3905
+ matchedText.push(element.textContent);
3906
+ matchedElements.push(element);
3907
+ if (matchedText.join("") !== url) return;
3908
+ possibleWeblinks.set(currentMatchId, {
3909
+ weblink: matchedText.join(""),
3910
+ elements: [...matchedElements]
3911
+ });
3912
+ resetMatch();
3913
+ };
3914
+ return { composeWeblink, possibleWeblinks };
3915
+ };
3916
+ var markPossibleWeblinks = (editor) => {
3917
+ const instance = new import_mark2.default(editor);
3918
+ const { composeWeblink, possibleWeblinks } = createWeblinkMatchTracker();
3919
+ let possibleWebLink = "";
3157
3920
  instance.markRegExp(WEB_URI_IN_TEXT_REGEX, {
3921
+ className: POSSIBLE_WEBLINK_CLASS,
3158
3922
  acrossElements: false,
3159
3923
  exclude: POSSIBLE_WEBLINK_EXCLUDE_SELECTORS,
3160
3924
  filter: (_textNode, term) => {
3161
- possibleWebLinks.add(term);
3925
+ possibleWebLink = term;
3162
3926
  return true;
3163
- }
3927
+ },
3928
+ each: (element) => composeWeblink(element, possibleWebLink)
3164
3929
  });
3165
- return possibleWebLinks;
3930
+ return possibleWeblinks;
3166
3931
  };
3167
3932
  var validatePossibleWeblinks = (root) => {
3168
- const errors = [];
3169
- const possibleWebLinks = collectPossibleWebLinks(root);
3170
- for (const possibleWebLink of possibleWebLinks) {
3171
- errors.push(
3172
- createValidationIssue({
3173
- store: possibleWebLink,
3933
+ const issues = [];
3934
+ const cloneRoot = root.cloneNode(true);
3935
+ clearWeblinkMatches(cloneRoot);
3936
+ const possibleWeblinks = markPossibleWeblinks(cloneRoot);
3937
+ for (const [storeId, { elements }] of Array.from(possibleWeblinks)) {
3938
+ issues.push(
3939
+ createValidationIssue(null, {
3940
+ store: storeId,
3174
3941
  title: "Possible web link",
3175
3942
  kind: "possible-url",
3176
3943
  description: "This looks like a URL. Would you like to add weblink tags?",
3177
- level: "warning"
3944
+ level: "info",
3945
+ elements
3178
3946
  })
3179
3947
  );
3180
3948
  }
3181
- return errors;
3949
+ return issues;
3950
+ };
3951
+ var clearWeblinkMatches = (editor) => {
3952
+ const instance = new import_mark2.default(editor);
3953
+ instance.unmark({
3954
+ className: POSSIBLE_WEBLINK_CLASS
3955
+ });
3182
3956
  };
3183
3957
 
3184
- // src/validation/validateHeadingHierarchy.ts
3958
+ // src/validation/validateHierarchy.ts
3185
3959
  var shouldSuppressWarning = (element) => {
3186
3960
  const closestBox = closestElementBySchema({
3187
3961
  element,
@@ -3190,46 +3964,66 @@ var shouldSuppressWarning = (element) => {
3190
3964
  });
3191
3965
  return !!closestBox;
3192
3966
  };
3193
- var getHierarchyLevel = (element) => {
3194
- const role = element.getAttribute("role");
3967
+ var isHeading = (elementHierarchy) => {
3968
+ return elementHierarchy === "heading";
3969
+ };
3970
+ var getValidLevels = (elementHierarchy) => {
3971
+ return isHeading(elementHierarchy) ? HEADING_LEVEL : BOX_LEVEL;
3972
+ };
3973
+ var getAttributeName2 = (elementHierarchy) => {
3974
+ return isHeading(elementHierarchy) ? "role" : "status";
3975
+ };
3976
+ var getElementSchemaCode = (elementHierarchy) => {
3977
+ return isHeading(elementHierarchy) ? HEADING_SCHEMA.code : BOX_SCHEMA.code;
3978
+ };
3979
+ var getHierarchyLevel = (element, elementHierarchy) => {
3980
+ const role = element.getAttribute(getAttributeName2(elementHierarchy));
3195
3981
  if (!role) return void 0;
3196
- const validHeadingLevel = HEADING_LEVEL.indexOf(role);
3197
- if (validHeadingLevel === -1) return void 0;
3198
- return validHeadingLevel;
3982
+ const index = getValidLevels(elementHierarchy).indexOf(role);
3983
+ if (index === -1) return void 0;
3984
+ return isHeading(elementHierarchy) ? index : index + 1;
3199
3985
  };
3200
- var validateHeadingHierarchy = (element) => {
3986
+ var validateHierarchy = (element, elementHierarchy) => {
3201
3987
  const errors = [];
3202
3988
  if (isDeletedElement(element)) {
3203
3989
  return errors;
3204
3990
  }
3205
- if (shouldSuppressWarning(element)) {
3991
+ if (shouldSuppressWarning(element) && isHeading(elementHierarchy)) {
3206
3992
  return errors;
3207
3993
  }
3208
- const level = getHierarchyLevel(element);
3994
+ const level = getHierarchyLevel(element, elementHierarchy);
3209
3995
  if (level === void 0) {
3210
3996
  return errors;
3211
3997
  }
3212
3998
  if (!element.parentElement) {
3213
3999
  return errors;
3214
4000
  }
3215
- const parentHeading = closestElementBySchema({
4001
+ const parentElement = closestElementBySchema({
3216
4002
  element: element.parentElement,
3217
- code: HEADING_SCHEMA.code,
4003
+ code: getElementSchemaCode(elementHierarchy),
3218
4004
  ignoreDeletedElements: true
3219
4005
  });
3220
- if (!parentHeading) {
4006
+ if (!parentElement) {
3221
4007
  if (level > 1) {
3222
- addValidationIssue(errors, {
3223
- store: getStore(element),
3224
- title: "Missing heading H1",
3225
- kind: "missing",
3226
- description: `H${level} is not under an H1. Please check the heading hierarchy.`,
3227
- level: "warning"
3228
- });
4008
+ if (isHeading(elementHierarchy)) {
4009
+ addValidationIssue(errors, element, {
4010
+ title: "Missing heading H1",
4011
+ kind: "missing",
4012
+ description: `H${level} is not under an H1. Please check the heading hierarchy.`,
4013
+ level: "warning"
4014
+ });
4015
+ } else {
4016
+ addValidationIssue(errors, element, {
4017
+ title: "Missing box level 1",
4018
+ kind: "missing",
4019
+ description: `Box level ${level} is not under a box level. Please check the box hierarchy.`,
4020
+ level: "warning"
4021
+ });
4022
+ }
3229
4023
  }
3230
4024
  return errors;
3231
4025
  }
3232
- const parentLevel = getHierarchyLevel(parentHeading);
4026
+ const parentLevel = getHierarchyLevel(parentElement, elementHierarchy);
3233
4027
  if (parentLevel === void 0) {
3234
4028
  return errors;
3235
4029
  }
@@ -3237,13 +4031,21 @@ var validateHeadingHierarchy = (element) => {
3237
4031
  if (level === expectedLevel) {
3238
4032
  return errors;
3239
4033
  }
3240
- addValidationIssue(errors, {
3241
- store: getStore(element),
3242
- title: "Invalid heading hierarchy",
3243
- kind: "forbidden",
3244
- description: `H${level} cannot follow H${parentLevel} directly. Please check the heading hierarchy.`,
3245
- level: "warning"
3246
- });
4034
+ if (isHeading(elementHierarchy)) {
4035
+ addValidationIssue(errors, element, {
4036
+ title: "Invalid heading hierarchy",
4037
+ kind: "forbidden",
4038
+ description: `H${level} cannot follow H${parentLevel} directly. Please check the heading hierarchy.`,
4039
+ level: "warning"
4040
+ });
4041
+ } else {
4042
+ addValidationIssue(errors, element, {
4043
+ title: "Invalid box hierarchy",
4044
+ kind: "forbidden",
4045
+ description: `Box level ${level} cannot follow box level ${parentLevel} directly. Please check the box hierarchy.`,
4046
+ level: "warning"
4047
+ });
4048
+ }
3247
4049
  return errors;
3248
4050
  };
3249
4051
 
@@ -3260,8 +4062,7 @@ var validateOlink = (element) => {
3260
4062
  if (isEmpty || isValidOrcid) {
3261
4063
  return errors;
3262
4064
  }
3263
- addValidationIssue(errors, {
3264
- store: getStore(element.parentElement ?? element),
4065
+ addValidationIssue(errors, element, {
3265
4066
  title: "Invalid ORCID",
3266
4067
  kind: "forbidden",
3267
4068
  description: "The ORCiD is not the correct format. Please check it and adjust.",
@@ -3270,6 +4071,338 @@ var validateOlink = (element) => {
3270
4071
  return errors;
3271
4072
  };
3272
4073
 
4074
+ // src/helpers/getReferenceFieldElements.ts
4075
+ var REFERENCE_PART_SELECTOR = REFERENCE_PART_CODES_ALLOWED_CHILDREN.map(
4076
+ ({ code }) => findSchemaByCode(code).tag.toLowerCase()
4077
+ ).join(", ");
4078
+ var REFERENCE_PART_OWNER_SELECTOR = `${REFERENCE_PART_SELECTOR}, ${URI_SCHEMA.tag.toLowerCase()}`;
4079
+ var getReferenceParts = (reference) => Array.from(
4080
+ reference.querySelectorAll(REFERENCE_PART_SELECTOR)
4081
+ ).filter((element) => {
4082
+ if (isInTrackedDeletion(element)) return false;
4083
+ const owner = element.parentElement?.closest(REFERENCE_PART_OWNER_SELECTOR);
4084
+ return !owner || !reference.contains(owner);
4085
+ });
4086
+ var getReferenceFieldElements = (reference) => getReferenceParts(reference).flatMap((element) => {
4087
+ const field = findReferenceFieldByElement(element);
4088
+ return field ? [{ field, element }] : [];
4089
+ });
4090
+
4091
+ // src/validation/validateReferenceMarkup.ts
4092
+ var PERSONNAME_ORDER_ROLES = ["first-last", "last-first"];
4093
+ var ARTIST_OTHERCLASS = "artist";
4094
+ var NOT_PERMITTED_ELEMENTS = [
4095
+ { tag: BIBLIOID_TAG.toLowerCase() },
4096
+ { tag: "publisher" },
4097
+ { tag: AUTHORGROUP_TAG.toLowerCase() }
4098
+ ];
4099
+ var BIBLIOMSET = BIBLIOMSET_TAG.toLowerCase();
4100
+ var PERSONNAME = PERSONNAME_TAG.toLowerCase();
4101
+ var CONFGROUP = CONFGROUP_TAG.toLowerCase();
4102
+ var LINK = LINK_TAG.toLowerCase();
4103
+ var URI = URI_SCHEMA.tag.toLowerCase();
4104
+ var NAME_PARTS = [SURNAME_TAG, FIRSTNAME_TAG, HONORIFIC_TAG].map((tag) => tag.toLowerCase()).join(", ");
4105
+ var CONFERENCE_FIELDS_AND_DELETIONS = [
4106
+ CONFTITLE_TAG,
4107
+ CONFDATES_TAG,
4108
+ ADDRESS_TAG
4109
+ ].map((tag) => tag.toLowerCase()).concat("span.del").join(", ");
4110
+ var LOOSE_MARKUP = [
4111
+ BIBLIOMSET,
4112
+ PERSONNAME,
4113
+ URI,
4114
+ NAME_PARTS,
4115
+ CONFDATES_TAG.toLowerCase()
4116
+ ].concat(NOT_PERMITTED_ELEMENTS.map(({ tag }) => tag)).join(", ");
4117
+ var hasValue = (element, attribute) => !!element.getAttribute(attribute)?.trim();
4118
+ var hasUntaggedConferenceText = (element) => Array.from(element.childNodes).some((child) => {
4119
+ if (child.nodeType === Node.TEXT_NODE) return !!child.textContent?.trim();
4120
+ return child instanceof Element && !child.matches(CONFERENCE_FIELDS_AND_DELETIONS) && hasUntaggedConferenceText(child);
4121
+ });
4122
+ var isExternalLink = (link) => !hasValue(link, LINKEND_ATTRIBUTE);
4123
+ var DOI_URL = /^https?:\/\/(?:dx\.)?doi\.org\//i;
4124
+ var pointsAtDoiOrg = (link) => DOI_URL.test(link.getAttribute(LINK_ATTRIBUTE)?.trim() ?? "");
4125
+ var hasNameOrder = (personname) => {
4126
+ const order = personname.getAttribute("role")?.replace(/\s+/g, "");
4127
+ return PERSONNAME_ORDER_ROLES.some((role) => role === order);
4128
+ };
4129
+ var hasLooseReferenceMarkup = (reference) => Array.from(reference.querySelectorAll(LOOSE_MARKUP)).some(
4130
+ (element) => !isInTrackedDeletion(element)
4131
+ );
4132
+ var validateReferenceMarkup = (reference, typeSchema) => {
4133
+ const select = (selector) => Array.from(reference.querySelectorAll(selector)).filter(
4134
+ (element) => !isInTrackedDeletion(element)
4135
+ );
4136
+ const relations = typeSchema.bibliomsetRelations ?? [];
4137
+ const sets = select(BIBLIOMSET);
4138
+ const misrelatedSets = sets.filter(
4139
+ (set) => !relations.some((relation) => relation === set.getAttribute("relation"))
4140
+ );
4141
+ const hasEverySet = relations.every(
4142
+ (relation) => sets.some((set) => set.getAttribute("relation") === relation)
4143
+ );
4144
+ const rules = {
4145
+ missing_id: hasValue(reference, XMLID_ATTRIBUTE) ? [] : [reference],
4146
+ bibliomset_relation: misrelatedSets,
4147
+ bibliomset_missing: hasEverySet || misrelatedSets.length > 0 ? [] : [reference],
4148
+ bibliomset_repeated: sets.filter(
4149
+ (set, index) => sets.slice(0, index).some(
4150
+ (earlier) => earlier.getAttribute("relation") === set.getAttribute("relation")
4151
+ )
4152
+ ),
4153
+ bibliomset_title: sets.filter(
4154
+ (set) => !Array.from(set.querySelectorAll(TITLE_TAG.toLowerCase())).some(
4155
+ (title) => !isInTrackedDeletion(title)
4156
+ )
4157
+ ),
4158
+ bibliomset_nested: sets.filter(
4159
+ (set) => !!set.parentElement?.closest(BIBLIOMSET)
4160
+ ),
4161
+ part_editor: select(EDITOR_TAG.toLowerCase()).filter(
4162
+ (editor) => editor.closest(BIBLIOMSET)?.getAttribute("relation") === PART_BIBLIOMSET_RELATION
4163
+ ),
4164
+ personname_role: select(PERSONNAME).filter(
4165
+ (personname) => !hasNameOrder(personname)
4166
+ ),
4167
+ name_outside_personname: select(NAME_PARTS).filter(
4168
+ (part) => !part.closest(PERSONNAME)
4169
+ ),
4170
+ othercredit_artist: typeSchema.code === "recording" ? select(OTHERCREDIT_TAG.toLowerCase()).filter(
4171
+ (credit) => credit.getAttribute("otherclass") !== ARTIST_OTHERCLASS
4172
+ ) : [],
4173
+ link_without_target: select(LINK).filter(
4174
+ (link) => isExternalLink(link) && !hasValue(link, LINK_ATTRIBUTE)
4175
+ ),
4176
+ doi_inside_uri: select(LINK).filter(
4177
+ (link) => isExternalLink(link) && hasLiveUri(link) && pointsAtDoiOrg(link)
4178
+ ),
4179
+ doi_outside_doi_org: select(LINK).filter(
4180
+ (link) => isExternalLink(link) && hasValue(link, LINK_ATTRIBUTE) && !hasLiveUri(link) && !pointsAtDoiOrg(link)
4181
+ ),
4182
+ uri_outside_link: select(URI).filter(
4183
+ (uri) => !uri.closest(LINK) && !uri.closest(REFERENCE_PART_SELECTOR)
4184
+ ),
4185
+ confgroup_text: select(CONFGROUP).filter(hasUntaggedConferenceText),
4186
+ confdates_outside_confgroup: select(CONFDATES_TAG.toLowerCase()).filter(
4187
+ (dates) => !dates.closest(CONFGROUP)
4188
+ )
4189
+ };
4190
+ const wrongElements = [
4191
+ ...typeSchema.replacedElements ?? [],
4192
+ ...NOT_PERMITTED_ELEMENTS
4193
+ ].map(
4194
+ ({ tag, replacement }) => ({
4195
+ code: "wrong_element",
4196
+ tag,
4197
+ replacement,
4198
+ elements: select(tag).filter((element) => !isPubMedIdBiblioid(element))
4199
+ })
4200
+ );
4201
+ const markup = Object.entries(rules).map(
4202
+ ([rule, elements]) => ({
4203
+ code: "markup",
4204
+ rule,
4205
+ elements
4206
+ })
4207
+ );
4208
+ return [...wrongElements, ...markup].filter(
4209
+ ({ elements }) => elements.length > 0
4210
+ );
4211
+ };
4212
+
4213
+ // src/validation/validateReferenceStructure.ts
4214
+ var validateReferenceStructure = (reference) => {
4215
+ const typeSchema = findReferenceTypeSchemaByElement(reference);
4216
+ if (!typeSchema) return [{ code: "unknown_type" }];
4217
+ const issues = [];
4218
+ const present = /* @__PURE__ */ new Set();
4219
+ for (const { field } of getReferenceFieldElements(reference)) {
4220
+ if (!present.has(field) && !typeSchema.allowedFields.includes(field)) {
4221
+ issues.push({ code: "not_allowed", field });
4222
+ }
4223
+ present.add(field);
4224
+ }
4225
+ for (const field of typeSchema.requiredFields) {
4226
+ const isSatisfied = field === "creators" ? present.has("author") || present.has("editor") : present.has(field);
4227
+ if (!isSatisfied) issues.push({ code: "missing", field });
4228
+ }
4229
+ return [...issues, ...validateReferenceMarkup(reference, typeSchema)];
4230
+ };
4231
+ var isSameMarkupIssue = (candidate, issue) => candidate.code === "markup" && issue.code === "markup" && candidate.rule === issue.rule || candidate.code === "wrong_element" && issue.code === "wrong_element" && candidate.tag === issue.tag;
4232
+ var getReferenceStructureIssueElements = (reference, issue) => {
4233
+ if (issue.code === "not_allowed") {
4234
+ return getReferenceFieldElements(reference).filter(({ field }) => field === issue.field).map(({ element }) => element);
4235
+ }
4236
+ if (issue.code !== "markup" && issue.code !== "wrong_element") return [];
4237
+ const found = validateReferenceStructure(reference).find(
4238
+ (candidate) => isSameMarkupIssue(candidate, issue)
4239
+ );
4240
+ return (found?.elements ?? []).filter((element) => element !== reference);
4241
+ };
4242
+
4243
+ // src/validation/validateReference.ts
4244
+ var getFieldLabel = (field, typeSchema) => {
4245
+ if (field === "creators") {
4246
+ return typeSchema.allowedFields.includes("editor") ? "Author or editor" : "Author";
4247
+ }
4248
+ return typeSchema.fieldLabels?.[field] ?? REFERENCE_FIELD_SCHEMAS[field].label;
4249
+ };
4250
+ var getBibliomsetRelationCopy = (typeSchema) => {
4251
+ const relations = typeSchema.bibliomsetRelations ?? [];
4252
+ return relations.length > 0 ? `${typeSchema.label} references use bibliomset with the relation ${relations.join(" and ")}. Please correct the relation.` : `${typeSchema.label} references do not use bibliomset. Please remove it and keep its contents.`;
4253
+ };
4254
+ var getMarkupCopy = (rule, typeSchema) => {
4255
+ switch (rule) {
4256
+ case "missing_id":
4257
+ return {
4258
+ title: "Reference ID missing",
4259
+ kind: "missing",
4260
+ description: "Every reference needs an xml:id. Please add one."
4261
+ };
4262
+ case "bibliomset_relation":
4263
+ return {
4264
+ title: "Wrong bibliomset for this reference type",
4265
+ kind: "forbidden",
4266
+ description: getBibliomsetRelationCopy(typeSchema)
4267
+ };
4268
+ case "bibliomset_missing":
4269
+ return {
4270
+ title: "Bibliomset missing",
4271
+ kind: "missing",
4272
+ description: `${typeSchema.label} references need one bibliomset with the relation ${(typeSchema.bibliomsetRelations ?? []).join(" and one with ")}. Please wrap the details in them.`
4273
+ };
4274
+ case "bibliomset_repeated":
4275
+ return {
4276
+ title: "Bibliomset repeated",
4277
+ kind: "forbidden",
4278
+ description: "A reference holds one bibliomset of each relation. Please move the details of the repeated bibliomset into the first one."
4279
+ };
4280
+ case "bibliomset_title":
4281
+ return {
4282
+ title: "Bibliomset without a title",
4283
+ kind: "missing",
4284
+ description: "Every bibliomset must contain a title. Please move its title into it or remove the bibliomset."
4285
+ };
4286
+ case "bibliomset_nested":
4287
+ return {
4288
+ title: "Bibliomset inside another bibliomset",
4289
+ kind: "forbidden",
4290
+ description: "A bibliomset cannot sit inside another bibliomset. Please move it out so the two sit side by side."
4291
+ };
4292
+ case "part_editor":
4293
+ return {
4294
+ title: "Editor tagged in the chapter part",
4295
+ kind: "forbidden",
4296
+ description: "The part bibliomset holds the chapter and its author. Please tag the name as an author or move the editor to the book bibliomset."
4297
+ };
4298
+ case "personname_role":
4299
+ return {
4300
+ title: "Name order not set",
4301
+ kind: "missing",
4302
+ description: `Every personname needs a role of ${PERSONNAME_ORDER_ROLES.join(" or ")}. Please set the name order.`
4303
+ };
4304
+ case "name_outside_personname":
4305
+ return {
4306
+ title: "Name not wrapped in personname",
4307
+ kind: "forbidden",
4308
+ description: "A surname, firstname or honorific must sit inside a personname. Please wrap the name parts."
4309
+ };
4310
+ case "othercredit_artist":
4311
+ return {
4312
+ title: "Artist credit not marked",
4313
+ kind: "missing",
4314
+ description: `The othercredit of a recording needs otherclass="${ARTIST_OTHERCLASS}". Please set it.`
4315
+ };
4316
+ case "link_without_target":
4317
+ return {
4318
+ title: "Link incomplete",
4319
+ kind: "missing",
4320
+ description: "A link needs an xlink:href. Please complete the link."
4321
+ };
4322
+ case "doi_outside_doi_org":
4323
+ return {
4324
+ title: "DOI not pointing at doi.org",
4325
+ kind: "forbidden",
4326
+ description: "A DOI link must point at a https://doi.org/ address. Please fix its xlink:href, or tag the address as a URL with a uri inside the link."
4327
+ };
4328
+ case "doi_inside_uri":
4329
+ return {
4330
+ title: "DOI tagged as a URL",
4331
+ kind: "forbidden",
4332
+ description: "A DOI link holds the DOI directly, without a uri inside it. Please remove the uri."
4333
+ };
4334
+ case "uri_outside_link":
4335
+ return {
4336
+ title: "URL not wrapped in a link",
4337
+ kind: "forbidden",
4338
+ description: "A uri must sit inside a link that carries the xlink:href. Please wrap it in a link."
4339
+ };
4340
+ case "confgroup_text":
4341
+ return {
4342
+ title: "Text directly inside confgroup",
4343
+ kind: "forbidden",
4344
+ description: "A confgroup cannot hold text directly. Please tag the text as conftitle or confdates."
4345
+ };
4346
+ case "confdates_outside_confgroup":
4347
+ return {
4348
+ title: "Conference dates outside confgroup",
4349
+ kind: "forbidden",
4350
+ description: "Conference dates must sit inside a confgroup. Please wrap them in one."
4351
+ };
4352
+ }
4353
+ };
4354
+ var getIssueCopy = (issue, typeSchema) => {
4355
+ if (issue.code === "unknown_type" || !typeSchema) {
4356
+ return {
4357
+ title: "Reference type not set",
4358
+ kind: "missing",
4359
+ description: "This reference has no recognised type, so its structure cannot be checked. Please set its reference type."
4360
+ };
4361
+ }
4362
+ const typeLabel = typeSchema.label.toLowerCase();
4363
+ if (issue.code === "markup") return getMarkupCopy(issue.rule, typeSchema);
4364
+ if (issue.code === "wrong_element") {
4365
+ return {
4366
+ title: `${issue.tag} not allowed`,
4367
+ kind: "forbidden",
4368
+ description: issue.replacement ? `${issue.tag} is not used by ${typeLabel} references. Please use ${issue.replacement} instead.` : `${issue.tag} is not used by ${typeLabel} references. Please remove it and keep its contents.`
4369
+ };
4370
+ }
4371
+ const fieldLabel = getFieldLabel(issue.field, typeSchema);
4372
+ switch (issue.code) {
4373
+ case "missing":
4374
+ return {
4375
+ title: `${fieldLabel} missing`,
4376
+ kind: "missing",
4377
+ description: `Please tag the ${fieldLabel.toLowerCase()} in this ${typeLabel} reference.`
4378
+ };
4379
+ case "not_allowed":
4380
+ return {
4381
+ title: `${fieldLabel} not allowed`,
4382
+ kind: "forbidden",
4383
+ description: `${fieldLabel} is not used by ${typeLabel} references. Please untag or delete it.`
4384
+ };
4385
+ }
4386
+ };
4387
+ var validateReference = (reference) => {
4388
+ if (isDeletedElement(reference)) return [];
4389
+ const isBibliographyEntry = !!closestElementBySchema({
4390
+ element: reference,
4391
+ code: "referenceBibliography"
4392
+ });
4393
+ if (!isBibliographyEntry) return [];
4394
+ const isTagged = getReferenceParts(reference).length > 0 || hasLooseReferenceMarkup(reference);
4395
+ if (!isTagged) return [];
4396
+ const typeSchema = findReferenceTypeSchemaByElement(reference);
4397
+ return validateReferenceStructure(reference).map(
4398
+ (issue) => createValidationIssue(reference, {
4399
+ level: "warning",
4400
+ elements: getReferenceStructureIssueElements(reference, issue),
4401
+ ...getIssueCopy(issue, typeSchema)
4402
+ })
4403
+ );
4404
+ };
4405
+
3273
4406
  // src/validation/validateXml.ts
3274
4407
  var validateElement = (element, root, elementsToLink, linkElements, schemasToValidateAgainst) => {
3275
4408
  if (isIgnoredElement(element)) {
@@ -3279,13 +4412,18 @@ var validateElement = (element, root, elementsToLink, linkElements, schemasToVal
3279
4412
  const schema = findSchemaByElement(element);
3280
4413
  if (schema) {
3281
4414
  if (schemasToValidateAgainst.includes(schema.code)) {
3282
- errors.push(...validateElementAgainstSchema(element, schema));
4415
+ errors.push(
4416
+ ...schema.code === BIBLIOMIXED_SCHEMA.code ? validateReference(element) : validateElementAgainstSchema(element, schema)
4417
+ );
3283
4418
  }
3284
4419
  if (schema.tag === FOOTNOTE_SCHEMA.tag) {
3285
4420
  errors.push(...validateFootnoteNumber(element));
3286
4421
  }
3287
4422
  if (schema.code === HEADING_SCHEMA.code) {
3288
- errors.push(...validateHeadingHierarchy(element));
4423
+ errors.push(...validateHierarchy(element, "heading"));
4424
+ }
4425
+ if (schema.code === BOX_SCHEMA.code) {
4426
+ errors.push(...validateHierarchy(element, "box"));
3289
4427
  }
3290
4428
  if (schema.code === OLINK_SCHEMA.code) {
3291
4429
  errors.push(...validateOlink(element));
@@ -3427,6 +4565,13 @@ var getAdjacentElement = ({
3427
4565
  LAYOUT_USER_ATTRIBUTE,
3428
4566
  LEFT_INDENT_ATTRIBUTE,
3429
4567
  LINKEND_ATTRIBUTE,
4568
+ LINK_BLOCKER_ROLES,
4569
+ LINK_TO_CROSS_CHECK,
4570
+ POSSIBLE_WEBLINK_CLASS,
4571
+ POSSIBLE_WEBLINK_EXCLUDE_SELECTORS,
4572
+ REFERENCE_FIELD_SCHEMAS,
4573
+ REFERENCE_PART_SELECTOR,
4574
+ REFERENCE_TYPE_SCHEMAS,
3430
4575
  RIGHT_INDENT_ATTRIBUTE,
3431
4576
  SCHEMAS,
3432
4577
  SPACE_ABOVE_ATTRIBUTE,
@@ -3439,22 +4584,45 @@ var getAdjacentElement = ({
3439
4584
  TRACK_CHANGES_ATTR_DATA_TIME,
3440
4585
  TRACK_CHANGES_ATTR_DATA_USERID,
3441
4586
  TRACK_CHANGES_ATTR_DATA_USERNAME,
4587
+ VALIDATION_IGNORED_ATTRIBUTE,
3442
4588
  XMLID_ATTRIBUTE,
4589
+ clearWeblinkMatches,
3443
4590
  closestElementBySchema,
3444
4591
  createElement,
4592
+ extractFootnoteNumber,
3445
4593
  findAttributeDefinitionByName,
4594
+ findElementLinkedTo,
4595
+ findReferenceFieldByElement,
4596
+ findReferenceTypeSchemaByElement,
3446
4597
  findSchemaByCode,
3447
4598
  findSchemaByElement,
3448
4599
  getAdjacentElement,
3449
4600
  getAttributeName,
4601
+ getEffectiveChildElements,
3450
4602
  getElementLinks,
4603
+ getPossibleWeblinks,
4604
+ getReferenceFieldElements,
4605
+ getReferenceParts,
4606
+ getReferenceStructureIssueElements,
3451
4607
  getStore,
3452
4608
  isAttributeRestricted,
3453
4609
  isDeletedElement,
3454
4610
  isIgnoredAttribute,
3455
4611
  isIgnoredElement,
3456
4612
  isTrackChangesSchema,
4613
+ markPossibleWeblinks,
3457
4614
  queryAllElementsBySchema,
3458
4615
  queryElementBySchema,
4616
+ validateAttributes,
4617
+ validateConsecutiveFootnoteCues,
4618
+ validateConsecutiveFootnotes,
4619
+ validateElementAgainstSchema,
4620
+ validateElementToLinkTo,
4621
+ validateFootnoteNumber,
4622
+ validateHierarchy,
4623
+ validateLinkend,
4624
+ validateOlink,
4625
+ validatePossibleWeblinks,
4626
+ validateReferenceStructure,
3459
4627
  validateXml
3460
4628
  });