pro-editor-schema 0.2.22 → 0.2.25

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
@@ -2336,12 +2336,13 @@ var LINK_SCHEMA = createSchema({
2336
2336
  });
2337
2337
 
2338
2338
  // src/schema/elementSchemas/inlineElements/uri.ts
2339
+ var LINK_ATTRIBUTE = "xlinkhref";
2339
2340
  var URI_SCHEMA = createSchema({
2340
2341
  code: "uri",
2341
2342
  kind: "inline",
2342
2343
  tag: URI_TAG,
2343
- requiredAttributes: [],
2344
- optionalAttributes: ["xlinkhref"],
2344
+ requiredAttributes: [LINK_ATTRIBUTE],
2345
+ optionalAttributes: [],
2345
2346
  allowedChildrenCodes: [...ATOM_CODES_ALLOWED_CHILDREN]
2346
2347
  });
2347
2348
 
@@ -2626,6 +2627,65 @@ var getElementsSelector = ({
2626
2627
  return Array.from(elements);
2627
2628
  };
2628
2629
 
2630
+ // src/validation/validateLinkend.ts
2631
+ var findElementLinkedTo = (linkend, elementsToLink) => {
2632
+ return elementsToLink.includes(linkend);
2633
+ };
2634
+ var LINK_TO_CROSS_CHECK = [
2635
+ TABLE_LINK_ROLE,
2636
+ FIGURE_LINK_ROLE,
2637
+ EQUATION_LINK_ROLE,
2638
+ FOOTNOTE_LINK_ROLE,
2639
+ REFERENCE_LINK_ROLE
2640
+ ];
2641
+ var LINK_BLOCKER_ROLES = [
2642
+ TABLE_LINK_ROLE,
2643
+ FIGURE_LINK_ROLE,
2644
+ EQUATION_LINK_ROLE,
2645
+ FOOTNOTE_LINK_ROLE
2646
+ ];
2647
+ var validateLinkend = (linkElement, elementsToLink) => {
2648
+ const linkend = linkElement.getAttribute("linkend");
2649
+ if (!linkend) {
2650
+ return [];
2651
+ }
2652
+ const isLinkFootnoteCue = linkElement.tagName.toUpperCase() === FOOTNOTE_LINK_SCHEMA.tag;
2653
+ if (isLinkFootnoteCue) {
2654
+ if (findElementLinkedTo(linkend, elementsToLink)) {
2655
+ return [];
2656
+ }
2657
+ return [
2658
+ createValidationIssue({
2659
+ store: getStore(linkElement),
2660
+ title: "Unlinked footnote cue",
2661
+ kind: "unlinked",
2662
+ description: "This footnote cue is not referenced to any footnote in this chapter. Please link it again manually.",
2663
+ level: "blocker"
2664
+ })
2665
+ ];
2666
+ }
2667
+ const role = linkElement.getAttribute("role");
2668
+ if (!role) {
2669
+ return [];
2670
+ }
2671
+ if (!LINK_TO_CROSS_CHECK.includes(role)) {
2672
+ return [];
2673
+ }
2674
+ if (findElementLinkedTo(linkend, elementsToLink)) {
2675
+ return [];
2676
+ }
2677
+ const isBlocker = LINK_BLOCKER_ROLES.includes(role.toLowerCase());
2678
+ return [
2679
+ createValidationIssue({
2680
+ store: getStore(linkElement),
2681
+ title: "Unlinked element",
2682
+ kind: "unlinked",
2683
+ description: "This link is not referenced to any element in the current chapter or any other chapter. Please link it again manually.",
2684
+ level: isBlocker ? "blocker" : "warning"
2685
+ })
2686
+ ];
2687
+ };
2688
+
2629
2689
  // src/validation/validateFootnotes.ts
2630
2690
  var extractFootnoteNumber = (footnote) => {
2631
2691
  if (!footnote) return "no label";
@@ -2636,16 +2696,13 @@ var extractFootnoteNumber = (footnote) => {
2636
2696
  }
2637
2697
  return footnoteNumber;
2638
2698
  };
2639
- var validateFootnoteCue = (footnoteElement, root) => {
2699
+ var validateFootnoteCue = (footnoteElement, linkElements) => {
2640
2700
  const errors = [];
2641
2701
  const linkend = footnoteElement.getAttribute("xmlid") || "";
2642
2702
  const footnoteNumber = footnoteElement.querySelector(
2643
2703
  FOOTNOTE_NUMBER_SCHEMA.tag
2644
2704
  );
2645
- const footnoteLink = root.querySelector(
2646
- `${FOOTNOTE_LINK_SCHEMA.tag}[linkend='${CSS.escape(linkend)}']`
2647
- );
2648
- if (footnoteLink) {
2705
+ if (findElementLinkedTo(linkend, linkElements)) {
2649
2706
  return errors;
2650
2707
  }
2651
2708
  if (!footnoteNumber) {
@@ -2728,56 +2785,6 @@ var validateConsecutiveFootnoteCues = (root) => {
2728
2785
  return [];
2729
2786
  };
2730
2787
 
2731
- // src/validation/validateLinkend.ts
2732
- var findElementLinkedTo = (linkend, elementsToLink) => {
2733
- return elementsToLink.includes(linkend);
2734
- };
2735
- var LINK_BLOCKER_ROLES = [
2736
- TABLE_LINK_ROLE,
2737
- FIGURE_LINK_ROLE,
2738
- EQUATION_LINK_ROLE,
2739
- FOOTNOTE_LINK_ROLE,
2740
- CHAPTER_LINK_ROLE
2741
- ];
2742
- var validateLinkend = (linkElement, elementsToLink) => {
2743
- const linkend = linkElement.getAttribute("linkend");
2744
- if (!linkend) {
2745
- return [];
2746
- }
2747
- const isLinkFootnoteCue = linkElement.tagName.toUpperCase() === FOOTNOTE_LINK_SCHEMA.tag;
2748
- if (isLinkFootnoteCue) {
2749
- if (findElementLinkedTo(linkend, elementsToLink)) {
2750
- return [];
2751
- }
2752
- return [
2753
- createValidationIssue({
2754
- store: getStore(linkElement),
2755
- title: "Unlinked footnote cue",
2756
- kind: "unlinked",
2757
- description: "This footnote cue is not referenced to any footnote in this chapter. Please link it again manually.",
2758
- level: "blocker"
2759
- })
2760
- ];
2761
- }
2762
- const role = linkElement.getAttribute("role");
2763
- if (!role) {
2764
- return [];
2765
- }
2766
- if (findElementLinkedTo(linkend, elementsToLink)) {
2767
- return [];
2768
- }
2769
- const isBlocker = LINK_BLOCKER_ROLES.includes(role.toLowerCase());
2770
- return [
2771
- createValidationIssue({
2772
- store: getStore(linkElement),
2773
- title: "Unlinked element",
2774
- kind: "unlinked",
2775
- description: "This link is not referenced to any element in the current chapter or any other chapter. Please link it again manually.",
2776
- level: isBlocker ? "blocker" : "warning"
2777
- })
2778
- ];
2779
- };
2780
-
2781
2788
  // src/validation/validateAttributes.ts
2782
2789
  var validateAttributes = (element, schema) => {
2783
2790
  const errors = [];
@@ -2909,21 +2916,6 @@ var validateChildren = (element, schema) => {
2909
2916
  return errors;
2910
2917
  };
2911
2918
 
2912
- // src/validation/utils/getLinkableRoles.ts
2913
- var getLinkableRoles = () => {
2914
- const linkRoleDefinition = findAttributeDefinitionByName(
2915
- LINK_SCHEMA.requiredAttributes,
2916
- "role"
2917
- );
2918
- if (!linkRoleDefinition) {
2919
- return [];
2920
- }
2921
- if (isAttributeRestricted(linkRoleDefinition)) {
2922
- return linkRoleDefinition.values;
2923
- }
2924
- return [];
2925
- };
2926
-
2927
2919
  // src/validation/validateReferences.ts
2928
2920
  var findElementLinkedTo2 = (xmlid, linkElements) => {
2929
2921
  return linkElements.includes(xmlid);
@@ -2959,7 +2951,18 @@ var isValidUri = (uri) => {
2959
2951
  return WEB_URI_REGEX.test(uri);
2960
2952
  };
2961
2953
  var validateUri = (uriElement) => {
2962
- const url = uriElement.textContent.trim();
2954
+ const url = uriElement.getAttribute(LINK_ATTRIBUTE);
2955
+ if (!url) {
2956
+ return [
2957
+ createValidationIssue({
2958
+ store: getStore(uriElement),
2959
+ title: "URL is required",
2960
+ kind: "missing",
2961
+ description: "URL is required. Please check and adjust.",
2962
+ level: "warning"
2963
+ })
2964
+ ];
2965
+ }
2963
2966
  if (isValidUri(url)) {
2964
2967
  return [];
2965
2968
  }
@@ -2985,16 +2988,14 @@ var validateElement = (element, root, elementsToLink, linkElements, schemasToVal
2985
2988
  if (schemasToValidateAgainst.includes(schema.code)) {
2986
2989
  errors.push(...validateElementAgainstSchema(element, schema));
2987
2990
  }
2988
- const role = element.getAttribute("role");
2989
- const linkableRoles = getLinkableRoles();
2990
- if (schema.tag === LINK_SCHEMA.tag && role && linkableRoles.includes(role) || schema.tag === FOOTNOTE_LINK_SCHEMA.tag) {
2991
+ if (schema.tag === LINK_SCHEMA.tag || schema.tag === FOOTNOTE_LINK_SCHEMA.tag) {
2991
2992
  errors.push(...validateLinkend(element, elementsToLink));
2992
2993
  }
2993
2994
  if (schema.tag === BIBLIOMIXED_SCHEMA.tag) {
2994
2995
  errors.push(...validateReferenceCited(element, linkElements));
2995
2996
  }
2996
2997
  if (schema.tag === FOOTNOTE_SCHEMA.tag) {
2997
- errors.push(...validateFootnoteCue(element, root));
2998
+ errors.push(...validateFootnoteCue(element, linkElements));
2998
2999
  }
2999
3000
  if (schema.tag === URI_SCHEMA.tag) {
3000
3001
  errors.push(...validateUri(element));
package/dist/index.mjs CHANGED
@@ -2268,12 +2268,13 @@ var LINK_SCHEMA = createSchema({
2268
2268
  });
2269
2269
 
2270
2270
  // src/schema/elementSchemas/inlineElements/uri.ts
2271
+ var LINK_ATTRIBUTE = "xlinkhref";
2271
2272
  var URI_SCHEMA = createSchema({
2272
2273
  code: "uri",
2273
2274
  kind: "inline",
2274
2275
  tag: URI_TAG,
2275
- requiredAttributes: [],
2276
- optionalAttributes: ["xlinkhref"],
2276
+ requiredAttributes: [LINK_ATTRIBUTE],
2277
+ optionalAttributes: [],
2277
2278
  allowedChildrenCodes: [...ATOM_CODES_ALLOWED_CHILDREN]
2278
2279
  });
2279
2280
 
@@ -2558,6 +2559,65 @@ var getElementsSelector = ({
2558
2559
  return Array.from(elements);
2559
2560
  };
2560
2561
 
2562
+ // src/validation/validateLinkend.ts
2563
+ var findElementLinkedTo = (linkend, elementsToLink) => {
2564
+ return elementsToLink.includes(linkend);
2565
+ };
2566
+ var LINK_TO_CROSS_CHECK = [
2567
+ TABLE_LINK_ROLE,
2568
+ FIGURE_LINK_ROLE,
2569
+ EQUATION_LINK_ROLE,
2570
+ FOOTNOTE_LINK_ROLE,
2571
+ REFERENCE_LINK_ROLE
2572
+ ];
2573
+ var LINK_BLOCKER_ROLES = [
2574
+ TABLE_LINK_ROLE,
2575
+ FIGURE_LINK_ROLE,
2576
+ EQUATION_LINK_ROLE,
2577
+ FOOTNOTE_LINK_ROLE
2578
+ ];
2579
+ var validateLinkend = (linkElement, elementsToLink) => {
2580
+ const linkend = linkElement.getAttribute("linkend");
2581
+ if (!linkend) {
2582
+ return [];
2583
+ }
2584
+ const isLinkFootnoteCue = linkElement.tagName.toUpperCase() === FOOTNOTE_LINK_SCHEMA.tag;
2585
+ if (isLinkFootnoteCue) {
2586
+ if (findElementLinkedTo(linkend, elementsToLink)) {
2587
+ return [];
2588
+ }
2589
+ return [
2590
+ createValidationIssue({
2591
+ store: getStore(linkElement),
2592
+ title: "Unlinked footnote cue",
2593
+ kind: "unlinked",
2594
+ description: "This footnote cue is not referenced to any footnote in this chapter. Please link it again manually.",
2595
+ level: "blocker"
2596
+ })
2597
+ ];
2598
+ }
2599
+ const role = linkElement.getAttribute("role");
2600
+ if (!role) {
2601
+ return [];
2602
+ }
2603
+ if (!LINK_TO_CROSS_CHECK.includes(role)) {
2604
+ return [];
2605
+ }
2606
+ if (findElementLinkedTo(linkend, elementsToLink)) {
2607
+ return [];
2608
+ }
2609
+ const isBlocker = LINK_BLOCKER_ROLES.includes(role.toLowerCase());
2610
+ return [
2611
+ createValidationIssue({
2612
+ store: getStore(linkElement),
2613
+ title: "Unlinked element",
2614
+ kind: "unlinked",
2615
+ description: "This link is not referenced to any element in the current chapter or any other chapter. Please link it again manually.",
2616
+ level: isBlocker ? "blocker" : "warning"
2617
+ })
2618
+ ];
2619
+ };
2620
+
2561
2621
  // src/validation/validateFootnotes.ts
2562
2622
  var extractFootnoteNumber = (footnote) => {
2563
2623
  if (!footnote) return "no label";
@@ -2568,16 +2628,13 @@ var extractFootnoteNumber = (footnote) => {
2568
2628
  }
2569
2629
  return footnoteNumber;
2570
2630
  };
2571
- var validateFootnoteCue = (footnoteElement, root) => {
2631
+ var validateFootnoteCue = (footnoteElement, linkElements) => {
2572
2632
  const errors = [];
2573
2633
  const linkend = footnoteElement.getAttribute("xmlid") || "";
2574
2634
  const footnoteNumber = footnoteElement.querySelector(
2575
2635
  FOOTNOTE_NUMBER_SCHEMA.tag
2576
2636
  );
2577
- const footnoteLink = root.querySelector(
2578
- `${FOOTNOTE_LINK_SCHEMA.tag}[linkend='${CSS.escape(linkend)}']`
2579
- );
2580
- if (footnoteLink) {
2637
+ if (findElementLinkedTo(linkend, linkElements)) {
2581
2638
  return errors;
2582
2639
  }
2583
2640
  if (!footnoteNumber) {
@@ -2660,56 +2717,6 @@ var validateConsecutiveFootnoteCues = (root) => {
2660
2717
  return [];
2661
2718
  };
2662
2719
 
2663
- // src/validation/validateLinkend.ts
2664
- var findElementLinkedTo = (linkend, elementsToLink) => {
2665
- return elementsToLink.includes(linkend);
2666
- };
2667
- var LINK_BLOCKER_ROLES = [
2668
- TABLE_LINK_ROLE,
2669
- FIGURE_LINK_ROLE,
2670
- EQUATION_LINK_ROLE,
2671
- FOOTNOTE_LINK_ROLE,
2672
- CHAPTER_LINK_ROLE
2673
- ];
2674
- var validateLinkend = (linkElement, elementsToLink) => {
2675
- const linkend = linkElement.getAttribute("linkend");
2676
- if (!linkend) {
2677
- return [];
2678
- }
2679
- const isLinkFootnoteCue = linkElement.tagName.toUpperCase() === FOOTNOTE_LINK_SCHEMA.tag;
2680
- if (isLinkFootnoteCue) {
2681
- if (findElementLinkedTo(linkend, elementsToLink)) {
2682
- return [];
2683
- }
2684
- return [
2685
- createValidationIssue({
2686
- store: getStore(linkElement),
2687
- title: "Unlinked footnote cue",
2688
- kind: "unlinked",
2689
- description: "This footnote cue is not referenced to any footnote in this chapter. Please link it again manually.",
2690
- level: "blocker"
2691
- })
2692
- ];
2693
- }
2694
- const role = linkElement.getAttribute("role");
2695
- if (!role) {
2696
- return [];
2697
- }
2698
- if (findElementLinkedTo(linkend, elementsToLink)) {
2699
- return [];
2700
- }
2701
- const isBlocker = LINK_BLOCKER_ROLES.includes(role.toLowerCase());
2702
- return [
2703
- createValidationIssue({
2704
- store: getStore(linkElement),
2705
- title: "Unlinked element",
2706
- kind: "unlinked",
2707
- description: "This link is not referenced to any element in the current chapter or any other chapter. Please link it again manually.",
2708
- level: isBlocker ? "blocker" : "warning"
2709
- })
2710
- ];
2711
- };
2712
-
2713
2720
  // src/validation/validateAttributes.ts
2714
2721
  var validateAttributes = (element, schema) => {
2715
2722
  const errors = [];
@@ -2841,21 +2848,6 @@ var validateChildren = (element, schema) => {
2841
2848
  return errors;
2842
2849
  };
2843
2850
 
2844
- // src/validation/utils/getLinkableRoles.ts
2845
- var getLinkableRoles = () => {
2846
- const linkRoleDefinition = findAttributeDefinitionByName(
2847
- LINK_SCHEMA.requiredAttributes,
2848
- "role"
2849
- );
2850
- if (!linkRoleDefinition) {
2851
- return [];
2852
- }
2853
- if (isAttributeRestricted(linkRoleDefinition)) {
2854
- return linkRoleDefinition.values;
2855
- }
2856
- return [];
2857
- };
2858
-
2859
2851
  // src/validation/validateReferences.ts
2860
2852
  var findElementLinkedTo2 = (xmlid, linkElements) => {
2861
2853
  return linkElements.includes(xmlid);
@@ -2891,7 +2883,18 @@ var isValidUri = (uri) => {
2891
2883
  return WEB_URI_REGEX.test(uri);
2892
2884
  };
2893
2885
  var validateUri = (uriElement) => {
2894
- const url = uriElement.textContent.trim();
2886
+ const url = uriElement.getAttribute(LINK_ATTRIBUTE);
2887
+ if (!url) {
2888
+ return [
2889
+ createValidationIssue({
2890
+ store: getStore(uriElement),
2891
+ title: "URL is required",
2892
+ kind: "missing",
2893
+ description: "URL is required. Please check and adjust.",
2894
+ level: "warning"
2895
+ })
2896
+ ];
2897
+ }
2895
2898
  if (isValidUri(url)) {
2896
2899
  return [];
2897
2900
  }
@@ -2917,16 +2920,14 @@ var validateElement = (element, root, elementsToLink, linkElements, schemasToVal
2917
2920
  if (schemasToValidateAgainst.includes(schema.code)) {
2918
2921
  errors.push(...validateElementAgainstSchema(element, schema));
2919
2922
  }
2920
- const role = element.getAttribute("role");
2921
- const linkableRoles = getLinkableRoles();
2922
- if (schema.tag === LINK_SCHEMA.tag && role && linkableRoles.includes(role) || schema.tag === FOOTNOTE_LINK_SCHEMA.tag) {
2923
+ if (schema.tag === LINK_SCHEMA.tag || schema.tag === FOOTNOTE_LINK_SCHEMA.tag) {
2923
2924
  errors.push(...validateLinkend(element, elementsToLink));
2924
2925
  }
2925
2926
  if (schema.tag === BIBLIOMIXED_SCHEMA.tag) {
2926
2927
  errors.push(...validateReferenceCited(element, linkElements));
2927
2928
  }
2928
2929
  if (schema.tag === FOOTNOTE_SCHEMA.tag) {
2929
- errors.push(...validateFootnoteCue(element, root));
2930
+ errors.push(...validateFootnoteCue(element, linkElements));
2930
2931
  }
2931
2932
  if (schema.tag === URI_SCHEMA.tag) {
2932
2933
  errors.push(...validateUri(element));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pro-editor-schema",
3
- "version": "0.2.22",
3
+ "version": "0.2.25",
4
4
  "description": "Pro Editor XML schemas",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",