pro-editor-schema 0.2.21 → 0.2.22

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
@@ -244,7 +244,13 @@ var INSERTION_SCHEMA = createSchema({
244
244
  tag: SPAN_TAG,
245
245
  matchesElement: (element) => element.classList.contains("ins"),
246
246
  requiredAttributes: [...TRACK_CHANGES_ATTRS, ...ID_ATTRS],
247
- optionalAttributes: [],
247
+ optionalAttributes: [
248
+ {
249
+ name: "role",
250
+ values: ["web-link", "figure-note-link", "figsource"],
251
+ defaultValue: ""
252
+ }
253
+ ],
248
254
  allowedChildrenCodes: [
249
255
  ...ATOM_CODES_ALLOWED_CHILDREN,
250
256
  ...INLINE_ELEMENT_CODES_ALLOWED_CHILDREN
@@ -2334,8 +2340,8 @@ var URI_SCHEMA = createSchema({
2334
2340
  code: "uri",
2335
2341
  kind: "inline",
2336
2342
  tag: URI_TAG,
2337
- requiredAttributes: [...ID_ATTRS],
2338
- optionalAttributes: ["linkend"],
2343
+ requiredAttributes: [],
2344
+ optionalAttributes: ["xlinkhref"],
2339
2345
  allowedChildrenCodes: [...ATOM_CODES_ALLOWED_CHILDREN]
2340
2346
  });
2341
2347
 
@@ -2601,6 +2607,25 @@ var retrieveTextIgnoringNodesWithSelector = (element, selector = ".del") => {
2601
2607
  return clonedElement.textContent || "";
2602
2608
  };
2603
2609
 
2610
+ // src/validation/utils/getElementsSelector.ts
2611
+ var getElementsSelector = ({
2612
+ element,
2613
+ selector,
2614
+ filterDeletedNodes
2615
+ }) => {
2616
+ const elements = element.querySelectorAll(selector);
2617
+ if (filterDeletedNodes) {
2618
+ return Array.from(elements).filter((element2) => {
2619
+ const hasDeletedParent = element2.closest(".del") !== null;
2620
+ if (hasDeletedParent) {
2621
+ return false;
2622
+ }
2623
+ return true;
2624
+ });
2625
+ }
2626
+ return Array.from(elements);
2627
+ };
2628
+
2604
2629
  // src/validation/validateFootnotes.ts
2605
2630
  var extractFootnoteNumber = (footnote) => {
2606
2631
  if (!footnote) return "no label";
@@ -2643,7 +2668,11 @@ var validateFootnoteCue = (footnoteElement, root) => {
2643
2668
  return errors;
2644
2669
  };
2645
2670
  var validateConsecutiveFootnotes = (root) => {
2646
- const footnotes = Array.from(root.querySelectorAll(FOOTNOTE_SCHEMA.tag));
2671
+ const footnotes = getElementsSelector({
2672
+ element: root,
2673
+ selector: FOOTNOTE_SCHEMA.tag,
2674
+ filterDeletedNodes: true
2675
+ });
2647
2676
  if (footnotes.length === 0) {
2648
2677
  return [];
2649
2678
  }
@@ -2672,9 +2701,11 @@ var validateConsecutiveFootnotes = (root) => {
2672
2701
  return [];
2673
2702
  };
2674
2703
  var validateConsecutiveFootnoteCues = (root) => {
2675
- const footnoteLinks = Array.from(
2676
- root.querySelectorAll(FOOTNOTE_LINK_SCHEMA.tag)
2677
- );
2704
+ const footnoteLinks = getElementsSelector({
2705
+ element: root,
2706
+ selector: FOOTNOTE_LINK_SCHEMA.tag,
2707
+ filterDeletedNodes: true
2708
+ });
2678
2709
  if (footnoteLinks.length === 0) {
2679
2710
  return [];
2680
2711
  }
@@ -2916,6 +2947,33 @@ var validateReferenceCited = (referenceElement, linkElements) => {
2916
2947
  ];
2917
2948
  };
2918
2949
 
2950
+ // src/validation/validateUri.ts
2951
+ var WEB_URI_REGEX = /^(?:(?:https?):\/\/)?(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}(?::\d{1,5})?(?:\/[^\s]*)?$/i;
2952
+ var isValidUri = (uri) => {
2953
+ if (!uri || /\s/.test(uri)) {
2954
+ return false;
2955
+ }
2956
+ if (/^[a-z][a-z0-9+.-]*:/i.test(uri) && !/^https?:\/\//i.test(uri)) {
2957
+ return false;
2958
+ }
2959
+ return WEB_URI_REGEX.test(uri);
2960
+ };
2961
+ var validateUri = (uriElement) => {
2962
+ const url = uriElement.textContent.trim();
2963
+ if (isValidUri(url)) {
2964
+ return [];
2965
+ }
2966
+ return [
2967
+ createValidationIssue({
2968
+ store: getStore(uriElement),
2969
+ title: "URL cannot be reached",
2970
+ kind: "unlinked",
2971
+ description: "URL cannot be reached. Please check and adjust.",
2972
+ level: "warning"
2973
+ })
2974
+ ];
2975
+ };
2976
+
2919
2977
  // src/validation/validateXml.ts
2920
2978
  var validateElement = (element, root, elementsToLink, linkElements, schemasToValidateAgainst) => {
2921
2979
  if (isIgnoredElement(element)) {
@@ -2938,6 +2996,9 @@ var validateElement = (element, root, elementsToLink, linkElements, schemasToVal
2938
2996
  if (schema.tag === FOOTNOTE_SCHEMA.tag) {
2939
2997
  errors.push(...validateFootnoteCue(element, root));
2940
2998
  }
2999
+ if (schema.tag === URI_SCHEMA.tag) {
3000
+ errors.push(...validateUri(element));
3001
+ }
2941
3002
  if (isIgnoredValidation(schema.code)) {
2942
3003
  return errors;
2943
3004
  }
package/dist/index.mjs CHANGED
@@ -176,7 +176,13 @@ var INSERTION_SCHEMA = createSchema({
176
176
  tag: SPAN_TAG,
177
177
  matchesElement: (element) => element.classList.contains("ins"),
178
178
  requiredAttributes: [...TRACK_CHANGES_ATTRS, ...ID_ATTRS],
179
- optionalAttributes: [],
179
+ optionalAttributes: [
180
+ {
181
+ name: "role",
182
+ values: ["web-link", "figure-note-link", "figsource"],
183
+ defaultValue: ""
184
+ }
185
+ ],
180
186
  allowedChildrenCodes: [
181
187
  ...ATOM_CODES_ALLOWED_CHILDREN,
182
188
  ...INLINE_ELEMENT_CODES_ALLOWED_CHILDREN
@@ -2266,8 +2272,8 @@ var URI_SCHEMA = createSchema({
2266
2272
  code: "uri",
2267
2273
  kind: "inline",
2268
2274
  tag: URI_TAG,
2269
- requiredAttributes: [...ID_ATTRS],
2270
- optionalAttributes: ["linkend"],
2275
+ requiredAttributes: [],
2276
+ optionalAttributes: ["xlinkhref"],
2271
2277
  allowedChildrenCodes: [...ATOM_CODES_ALLOWED_CHILDREN]
2272
2278
  });
2273
2279
 
@@ -2533,6 +2539,25 @@ var retrieveTextIgnoringNodesWithSelector = (element, selector = ".del") => {
2533
2539
  return clonedElement.textContent || "";
2534
2540
  };
2535
2541
 
2542
+ // src/validation/utils/getElementsSelector.ts
2543
+ var getElementsSelector = ({
2544
+ element,
2545
+ selector,
2546
+ filterDeletedNodes
2547
+ }) => {
2548
+ const elements = element.querySelectorAll(selector);
2549
+ if (filterDeletedNodes) {
2550
+ return Array.from(elements).filter((element2) => {
2551
+ const hasDeletedParent = element2.closest(".del") !== null;
2552
+ if (hasDeletedParent) {
2553
+ return false;
2554
+ }
2555
+ return true;
2556
+ });
2557
+ }
2558
+ return Array.from(elements);
2559
+ };
2560
+
2536
2561
  // src/validation/validateFootnotes.ts
2537
2562
  var extractFootnoteNumber = (footnote) => {
2538
2563
  if (!footnote) return "no label";
@@ -2575,7 +2600,11 @@ var validateFootnoteCue = (footnoteElement, root) => {
2575
2600
  return errors;
2576
2601
  };
2577
2602
  var validateConsecutiveFootnotes = (root) => {
2578
- const footnotes = Array.from(root.querySelectorAll(FOOTNOTE_SCHEMA.tag));
2603
+ const footnotes = getElementsSelector({
2604
+ element: root,
2605
+ selector: FOOTNOTE_SCHEMA.tag,
2606
+ filterDeletedNodes: true
2607
+ });
2579
2608
  if (footnotes.length === 0) {
2580
2609
  return [];
2581
2610
  }
@@ -2604,9 +2633,11 @@ var validateConsecutiveFootnotes = (root) => {
2604
2633
  return [];
2605
2634
  };
2606
2635
  var validateConsecutiveFootnoteCues = (root) => {
2607
- const footnoteLinks = Array.from(
2608
- root.querySelectorAll(FOOTNOTE_LINK_SCHEMA.tag)
2609
- );
2636
+ const footnoteLinks = getElementsSelector({
2637
+ element: root,
2638
+ selector: FOOTNOTE_LINK_SCHEMA.tag,
2639
+ filterDeletedNodes: true
2640
+ });
2610
2641
  if (footnoteLinks.length === 0) {
2611
2642
  return [];
2612
2643
  }
@@ -2848,6 +2879,33 @@ var validateReferenceCited = (referenceElement, linkElements) => {
2848
2879
  ];
2849
2880
  };
2850
2881
 
2882
+ // src/validation/validateUri.ts
2883
+ var WEB_URI_REGEX = /^(?:(?:https?):\/\/)?(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}(?::\d{1,5})?(?:\/[^\s]*)?$/i;
2884
+ var isValidUri = (uri) => {
2885
+ if (!uri || /\s/.test(uri)) {
2886
+ return false;
2887
+ }
2888
+ if (/^[a-z][a-z0-9+.-]*:/i.test(uri) && !/^https?:\/\//i.test(uri)) {
2889
+ return false;
2890
+ }
2891
+ return WEB_URI_REGEX.test(uri);
2892
+ };
2893
+ var validateUri = (uriElement) => {
2894
+ const url = uriElement.textContent.trim();
2895
+ if (isValidUri(url)) {
2896
+ return [];
2897
+ }
2898
+ return [
2899
+ createValidationIssue({
2900
+ store: getStore(uriElement),
2901
+ title: "URL cannot be reached",
2902
+ kind: "unlinked",
2903
+ description: "URL cannot be reached. Please check and adjust.",
2904
+ level: "warning"
2905
+ })
2906
+ ];
2907
+ };
2908
+
2851
2909
  // src/validation/validateXml.ts
2852
2910
  var validateElement = (element, root, elementsToLink, linkElements, schemasToValidateAgainst) => {
2853
2911
  if (isIgnoredElement(element)) {
@@ -2870,6 +2928,9 @@ var validateElement = (element, root, elementsToLink, linkElements, schemasToVal
2870
2928
  if (schema.tag === FOOTNOTE_SCHEMA.tag) {
2871
2929
  errors.push(...validateFootnoteCue(element, root));
2872
2930
  }
2931
+ if (schema.tag === URI_SCHEMA.tag) {
2932
+ errors.push(...validateUri(element));
2933
+ }
2873
2934
  if (isIgnoredValidation(schema.code)) {
2874
2935
  return errors;
2875
2936
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pro-editor-schema",
3
- "version": "0.2.21",
3
+ "version": "0.2.22",
4
4
  "description": "Pro Editor XML schemas",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",