coursecode 0.1.57 → 0.1.59

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/README.md +8 -1
  2. package/bin/cli.js +16 -0
  3. package/framework/css/components/accordions.css +117 -31
  4. package/framework/css/layouts/article.css +7 -0
  5. package/framework/docs/COURSE_AUTHORING_GUIDE.md +4 -2
  6. package/framework/docs/FRAMEWORK_GUIDE.md +25 -7
  7. package/framework/docs/USER_GUIDE.md +14 -0
  8. package/framework/js/app/AppActions.js +17 -23
  9. package/framework/js/app/AppUI.js +7 -4
  10. package/framework/js/assessment/AssessmentActions.js +16 -15
  11. package/framework/js/assessment/AssessmentFactory.js +44 -15
  12. package/framework/js/automation/api-engagement.js +6 -3
  13. package/framework/js/components/interactions/drag-drop.js +4 -4
  14. package/framework/js/components/interactions/fill-in.js +7 -4
  15. package/framework/js/components/interactions/hotspot.js +2 -2
  16. package/framework/js/components/interactions/matching.js +4 -3
  17. package/framework/js/components/ui-components/audio-player.js +30 -8
  18. package/framework/js/components/ui-components/collapse.js +4 -2
  19. package/framework/js/components/ui-components/dropdown.js +7 -3
  20. package/framework/js/components/ui-components/embed-frame.js +5 -1
  21. package/framework/js/components/ui-components/flip-card.js +12 -6
  22. package/framework/js/components/ui-components/interactive-image.js +28 -52
  23. package/framework/js/components/ui-components/lightbox.js +19 -5
  24. package/framework/js/components/ui-components/modal.js +20 -7
  25. package/framework/js/components/ui-components/notifications.js +8 -3
  26. package/framework/js/components/ui-components/video-player.js +46 -20
  27. package/framework/js/core/event-bus.js +31 -28
  28. package/framework/js/dev/runtime-linter.js +6 -2
  29. package/framework/js/drivers/cmi5-driver.js +186 -83
  30. package/framework/js/drivers/driver-factory.js +7 -1
  31. package/framework/js/drivers/driver-interface.js +1 -1
  32. package/framework/js/drivers/http-driver-base.js +6 -0
  33. package/framework/js/drivers/lti-driver.js +112 -47
  34. package/framework/js/drivers/proxy-driver.js +347 -49
  35. package/framework/js/drivers/scorm-12-driver.js +213 -130
  36. package/framework/js/drivers/scorm-2004-driver.js +32 -19
  37. package/framework/js/drivers/scorm-driver-base.js +12 -0
  38. package/framework/js/drivers/standalone-driver.js +139 -0
  39. package/framework/js/engagement/engagement-trackers.js +38 -13
  40. package/framework/js/engagement/requirement-strategies.js +5 -1
  41. package/framework/js/main.js +7 -0
  42. package/framework/js/managers/assessment-manager.js +16 -1
  43. package/framework/js/managers/audio-manager.js +50 -16
  44. package/framework/js/managers/flag-manager.js +5 -1
  45. package/framework/js/managers/objective-manager.js +15 -7
  46. package/framework/js/managers/score-manager.js +27 -6
  47. package/framework/js/managers/video-manager.js +149 -70
  48. package/framework/js/navigation/NavigationActions.js +18 -4
  49. package/framework/js/navigation/document-gallery.js +7 -2
  50. package/framework/js/navigation/navigation-validators.js +3 -2
  51. package/framework/js/state/lms-connection.js +41 -16
  52. package/framework/js/state/state-commits.js +10 -5
  53. package/framework/js/state/state-manager.js +95 -9
  54. package/framework/js/state/state-validation.js +44 -11
  55. package/framework/js/utilities/course-helpers.js +3 -2
  56. package/framework/js/utilities/media-utils.js +28 -0
  57. package/framework/js/utilities/portable-assets.js +151 -0
  58. package/framework/js/utilities/ui-initializer.js +79 -5
  59. package/framework/js/utilities/utilities.js +32 -20
  60. package/framework/js/utilities/view-manager.js +16 -1
  61. package/framework/js/validation/scorm-validators.js +69 -0
  62. package/framework/version.json +2 -2
  63. package/lib/authoring-api.js +37 -18
  64. package/lib/build-linter.js +192 -2
  65. package/lib/build-packaging.js +47 -3
  66. package/lib/build.js +69 -8
  67. package/lib/cloud.js +40 -11
  68. package/lib/convert.js +30 -2
  69. package/lib/create.js +5 -3
  70. package/lib/dev.js +1 -1
  71. package/lib/headless-browser.js +66 -14
  72. package/lib/manifest/cmi5-manifest.js +26 -4
  73. package/lib/manifest/lti-tool-config.js +7 -2
  74. package/lib/manifest/manifest-factory.d.ts +1 -1
  75. package/lib/manifest/manifest-factory.js +3 -2
  76. package/lib/manifest/scorm-12-manifest.js +2 -2
  77. package/lib/manifest/scorm-2004-manifest.js +3 -28
  78. package/lib/manifest/scorm-proxy-manifest.js +37 -32
  79. package/lib/manifest/xml-utils.js +10 -0
  80. package/lib/narration.js +2 -2
  81. package/lib/portable-html.js +196 -0
  82. package/lib/preview-export.js +1 -1
  83. package/lib/preview-server.js +27 -6
  84. package/lib/project-utils.js +9 -1
  85. package/lib/proxy-templates/proxy.html +4 -1
  86. package/lib/proxy-templates/scorm-bridge.js +82 -10
  87. package/lib/scaffold.js +9 -4
  88. package/lib/stub-player/lms-api.js +63 -8
  89. package/package.json +5 -1
  90. package/schemas/adlcp_rootv1p2.xsd +110 -0
  91. package/schemas/coursecode_scorm12_package.xsd +5 -0
  92. package/schemas/coursecode_scorm2004_package.xsd +8 -0
  93. package/schemas/imscp_rootv1p1p2.xsd +304 -0
  94. package/template/course/slides/example-ui-showcase.js +1 -1
  95. package/template/vite.config.js +50 -22
@@ -82,7 +82,8 @@ const READ_ONLY_2004 = new Set([
82
82
  const READ_ONLY_12 = new Set([
83
83
  'cmi.core.student_id', 'cmi.core.student_name', 'cmi.core.credit',
84
84
  'cmi.core.entry', 'cmi.core.total_time', 'cmi.core.lesson_mode',
85
- 'cmi.launch_data', 'cmi.core.score._children',
85
+ 'cmi.launch_data', 'cmi._children', 'cmi.core.score._children',
86
+ 'cmi.objectives._count', 'cmi.interactions._count',
86
87
  'cmi.comments_from_lms._count'
87
88
  ]);
88
89
 
@@ -90,6 +91,10 @@ const READ_ONLY_12 = new Set([
90
91
  const SCORM12_LESSON_STATUS = new Set([
91
92
  'passed', 'completed', 'failed', 'incomplete', 'browsed', 'not attempted'
92
93
  ]);
94
+ const SCORM12_INTERACTION_TYPES = new Set([
95
+ 'true-false', 'choice', 'fill-in', 'matching', 'performance', 'likert', 'sequencing', 'numeric'
96
+ ]);
97
+ const SCORM12_INTERACTION_RESULTS = new Set(['correct', 'wrong', 'unanticipated', 'neutral']);
93
98
 
94
99
  // Valid cmi5 verbs (AU-allowed)
95
100
  const CMI5_ALLOWED_VERBS = new Set([
@@ -157,7 +162,9 @@ export function getDefaultCMI() {
157
162
  'cmi.mode': 'normal',
158
163
  'cmi.credit': 'credit',
159
164
  '_objectives': {},
160
- '_interactions': []
165
+ '_interactions': [],
166
+ 'cmi._children': 'core,suspend_data,launch_data,objectives,interactions,student_data,student_preference',
167
+ 'cmi.core.score._children': 'raw,min,max'
161
168
  };
162
169
  }
163
170
 
@@ -430,6 +437,32 @@ function validateSetValue(element, value) {
430
437
  return true;
431
438
  }
432
439
 
440
+ function validateScorm12InteractionValue(element, value) {
441
+ const match = element.match(/^cmi\.interactions\.(\d+)\.(.+)$/);
442
+ if (!match) return true;
443
+ const [, index, property] = match;
444
+ const row = cmiData._interactions?.[Number(index)] || {};
445
+ let valid = true;
446
+
447
+ if (property === 'type') valid = SCORM12_INTERACTION_TYPES.has(value);
448
+ else if (property === 'result') valid = SCORM12_INTERACTION_RESULTS.has(value) || Number.isFinite(Number(value));
449
+ else if (property === 'time') valid = /^\d{2}:\d{2}:\d{2}$/.test(value);
450
+ else if (property === 'latency') valid = /^\d{2,4}:\d{2}:\d{2}(?:\.\d+)?$/.test(value);
451
+ else if (property === 'student_response' || /^correct_responses\.\d+\.pattern$/.test(property)) {
452
+ if (/[^\x00-\x7F]/.test(value)) valid = false;
453
+ if (row.type === 'true-false') valid = /^[01tf]$/.test(value);
454
+ if (row.type === 'choice' || row.type === 'sequencing') valid = !value.includes('[,]');
455
+ if (row.type === 'matching') valid = !value.includes('[.]') && !value.includes('[,]');
456
+ }
457
+
458
+ if (!valid) {
459
+ logError('SCORM 1.2 Interaction Format', `${element} = "${value}"`, `Invalid value for interaction type ${row.type || 'unknown'}`);
460
+ if (strictMode) setError(405);
461
+ return !strictMode;
462
+ }
463
+ return true;
464
+ }
465
+
433
466
  function checkSuspendDataSize(value) {
434
467
  const size = value ? value.length : 0;
435
468
  const limit = SUSPEND_DATA_LIMITS[activeFormat] || 64000;
@@ -746,15 +779,22 @@ const API = {
746
779
  }
747
780
 
748
781
  // Strict: reject SCORM 2004 elements in SCORM 1.2 context
749
- if (strictMode && !element.startsWith('cmi.core.') && !element.startsWith('cmi.suspend_data') && !element.startsWith('cmi.launch_data') && !element.startsWith('cmi.objectives.') && !element.startsWith('cmi.interactions.') && !element.startsWith('cmi.student_data.') && !element.startsWith('cmi.comments')) {
782
+ if (strictMode && element !== 'cmi._children' && !element.startsWith('cmi.core.') && !element.startsWith('cmi.suspend_data') && !element.startsWith('cmi.launch_data') && !element.startsWith('cmi.objectives.') && !element.startsWith('cmi.interactions.') && !element.startsWith('cmi.student_data.') && !element.startsWith('cmi.comments')) {
750
783
  logError('Wrong Format', 'SCORM 1.2 does not support element: ' + element, 'Use SCORM 1.2 element names (cmi.core.*).');
751
784
  setError(201);
752
785
  logApiCall('LMSGetValue', element, '', true);
753
786
  return '';
754
787
  }
755
788
 
756
- const mapped = mapScorm12Element(element);
757
- let value = cmiData[mapped] !== undefined ? cmiData[mapped] : '';
789
+ let value = '';
790
+ if (element === 'cmi.objectives._count') value = String(Object.keys(cmiData._objectives || {}).length);
791
+ else if (element === 'cmi.interactions._count') value = String((cmiData._interactions || []).length);
792
+ else if (element.startsWith('cmi.objectives.')) value = handleObjectiveGet(element);
793
+ else if (element.startsWith('cmi.interactions.')) value = handleInteractionGet(element);
794
+ else {
795
+ const mapped = mapScorm12Element(element);
796
+ value = cmiData[mapped] !== undefined ? cmiData[mapped] : '';
797
+ }
758
798
  logApiCall('LMSGetValue', element, value);
759
799
  return value;
760
800
  },
@@ -780,6 +820,12 @@ const API = {
780
820
  logApiCall('LMSSetValue', element + ' = [' + value.length + ' chars]', 'false (too large)', true);
781
821
  return 'false';
782
822
  }
823
+ if (strictMode && /[^\x00-\x7F]/.test(value)) {
824
+ logError('SCORM 1.2 String Format', 'cmi.suspend_data contains non-ASCII characters', 'CMIString4096 is restricted to ASCII.');
825
+ setError(405);
826
+ logApiCall('LMSSetValue', element, 'false (non-ASCII)', true);
827
+ return 'false';
828
+ }
783
829
  }
784
830
 
785
831
  if (element === 'cmi.core.lesson_status') {
@@ -812,15 +858,24 @@ const API = {
812
858
  }
813
859
 
814
860
  // Strict: reject SCORM 2004-only elements in SCORM 1.2 context
815
- if (strictMode && !element.startsWith('cmi.core.') && !element.startsWith('cmi.suspend_data') && !element.startsWith('cmi.launch_data') && !element.startsWith('cmi.objectives.') && !element.startsWith('cmi.interactions.') && !element.startsWith('cmi.student_data.') && !element.startsWith('cmi.comments')) {
861
+ if (strictMode && element !== 'cmi._children' && !element.startsWith('cmi.core.') && !element.startsWith('cmi.suspend_data') && !element.startsWith('cmi.launch_data') && !element.startsWith('cmi.objectives.') && !element.startsWith('cmi.interactions.') && !element.startsWith('cmi.student_data.') && !element.startsWith('cmi.comments')) {
816
862
  logError('Wrong Format', 'SCORM 1.2 does not support element: ' + element, 'Use SCORM 1.2 element names (cmi.core.*).');
817
863
  setError(201);
818
864
  logApiCall('LMSSetValue', element + ' = ' + value, 'false', true);
819
865
  return 'false';
820
866
  }
821
867
 
822
- const mapped = mapScorm12Element(element);
823
- cmiData[mapped] = value;
868
+ if (!validateScorm12InteractionValue(element, value)) {
869
+ logApiCall('LMSSetValue', element + ' = ' + value, 'false (invalid interaction format)', true);
870
+ return 'false';
871
+ }
872
+
873
+ if (element.startsWith('cmi.objectives.')) handleObjectiveSet(element, value);
874
+ else if (element.startsWith('cmi.interactions.')) handleInteractionSet(element, value);
875
+ else {
876
+ const mapped = mapScorm12Element(element);
877
+ cmiData[mapped] = value;
878
+ }
824
879
  if (element === 'cmi.core.lesson_location') notifySlideChange(value);
825
880
  logApiCall('LMSSetValue', element + ' = ' + value, 'true');
826
881
  if (uiCallbacks.onStateChange) uiCallbacks.onStateChange('data');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "coursecode",
3
- "version": "0.1.57",
3
+ "version": "0.1.59",
4
4
  "description": "Multi-format course authoring framework with CLI tools (SCORM 2004, SCORM 1.2, cmi5, LTI 1.3)",
5
5
  "type": "module",
6
6
  "bin": {
@@ -37,6 +37,9 @@
37
37
  },
38
38
  "./vite-plugin-content-discovery": {
39
39
  "default": "./lib/vite-plugin-content-discovery.js"
40
+ },
41
+ "./portable-html": {
42
+ "default": "./lib/portable-html.js"
40
43
  }
41
44
  },
42
45
  "scripts": {
@@ -114,6 +117,7 @@
114
117
  "pdf2json": "^4.0.3",
115
118
  "pdf2md": "^1.0.2",
116
119
  "puppeteer-core": "^24.43.1",
120
+ "vite-plugin-singlefile": "^2.3.3",
117
121
  "win-ca": "^3.5.1",
118
122
  "ws": "^8.21.0"
119
123
  },
@@ -0,0 +1,110 @@
1
+ <?xml version="1.0"?>
2
+ <!-- filename=adlcp_rootv1p2.xsd -->
3
+ <!-- Conforms to w3c http://www.w3.org/TR/xmlschema-1/ 2000-10-24-->
4
+
5
+ <xsd:schema xmlns="http://www.adlnet.org/xsd/adlcp_rootv1p2"
6
+ targetNamespace="http://www.adlnet.org/xsd/adlcp_rootv1p2"
7
+ xmlns:xml="http://www.w3.org/XML/1998/namespace"
8
+ xmlns:imscp="http://www.imsproject.org/xsd/imscp_rootv1p1p2"
9
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
10
+ elementFormDefault="unqualified"
11
+ version="ADL Version 1.2">
12
+
13
+ <xsd:import namespace="http://www.imsproject.org/xsd/imscp_rootv1p1p2"
14
+ schemaLocation="imscp_rootv1p1p2.xsd"/>
15
+
16
+ <xsd:element name="location" type="locationType"/>
17
+ <xsd:element name="prerequisites" type="prerequisitesType"/>
18
+ <xsd:element name="maxtimeallowed" type="maxtimeallowedType"/>
19
+ <xsd:element name="timelimitaction" type="timelimitactionType"/>
20
+ <xsd:element name="datafromlms" type="datafromlmsType"/>
21
+ <xsd:element name="masteryscore" type="masteryscoreType"/>
22
+
23
+
24
+ <xsd:element name="schema" type="newSchemaType"/>
25
+ <xsd:simpleType name="newSchemaType">
26
+ <xsd:restriction base="imscp:schemaType">
27
+ <xsd:enumeration value="ADL SCORM"/>
28
+ </xsd:restriction>
29
+ </xsd:simpleType>
30
+
31
+ <xsd:element name="schemaversion" type="newSchemaversionType"/>
32
+ <xsd:simpleType name="newSchemaversionType">
33
+ <xsd:restriction base="imscp:schemaversionType">
34
+ <xsd:enumeration value="1.2"/>
35
+ </xsd:restriction>
36
+ </xsd:simpleType>
37
+
38
+
39
+ <xsd:attribute name="scormtype">
40
+ <xsd:simpleType>
41
+ <xsd:restriction base="xsd:string">
42
+ <xsd:enumeration value="asset"/>
43
+ <xsd:enumeration value="sco"/>
44
+ </xsd:restriction>
45
+ </xsd:simpleType>
46
+ </xsd:attribute>
47
+
48
+ <xsd:simpleType name="locationType">
49
+ <xsd:restriction base="xsd:string">
50
+ <xsd:maxLength value="2000"/>
51
+ </xsd:restriction>
52
+ </xsd:simpleType>
53
+
54
+
55
+ <xsd:complexType name="prerequisitesType">
56
+ <xsd:simpleContent>
57
+ <xsd:extension base="prerequisiteStringType">
58
+ <xsd:attributeGroup ref="attr.prerequisitetype"/>
59
+ </xsd:extension>
60
+ </xsd:simpleContent>
61
+ </xsd:complexType>
62
+
63
+ <xsd:attributeGroup name="attr.prerequisitetype">
64
+ <xsd:attribute name="type" use="required">
65
+ <xsd:simpleType>
66
+ <xsd:restriction base="xsd:string">
67
+ <xsd:enumeration value="aicc_script"/>
68
+ </xsd:restriction>
69
+ </xsd:simpleType>
70
+ </xsd:attribute>
71
+ </xsd:attributeGroup>
72
+
73
+ <xsd:simpleType name="maxtimeallowedType">
74
+ <xsd:restriction base="xsd:string">
75
+ <xsd:maxLength value="13"/>
76
+ </xsd:restriction>
77
+ </xsd:simpleType>
78
+
79
+ <xsd:simpleType name="timelimitactionType">
80
+ <xsd:restriction base="stringType">
81
+ <xsd:enumeration value="exit,no message"/>
82
+ <xsd:enumeration value="exit,message"/>
83
+ <xsd:enumeration value="continue,no message"/>
84
+ <xsd:enumeration value="continue,message"/>
85
+ </xsd:restriction>
86
+ </xsd:simpleType>
87
+
88
+ <xsd:simpleType name="datafromlmsType">
89
+ <xsd:restriction base="xsd:string">
90
+ <xsd:maxLength value="255"/>
91
+ </xsd:restriction>
92
+ </xsd:simpleType>
93
+
94
+ <xsd:simpleType name="masteryscoreType">
95
+ <xsd:restriction base="xsd:string">
96
+ <xsd:maxLength value="200"/>
97
+ </xsd:restriction>
98
+ </xsd:simpleType>
99
+
100
+ <xsd:simpleType name="stringType">
101
+ <xsd:restriction base="xsd:string"/>
102
+ </xsd:simpleType>
103
+
104
+ <xsd:simpleType name="prerequisiteStringType">
105
+ <xsd:restriction base="xsd:string">
106
+ <xsd:maxLength value="200"/>
107
+ </xsd:restriction>
108
+ </xsd:simpleType>
109
+
110
+ </xsd:schema>
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
3
+ <xsd:import namespace="http://www.imsproject.org/xsd/imscp_rootv1p1p2" schemaLocation="imscp_rootv1p1p2.xsd"/>
4
+ <xsd:import namespace="http://www.adlnet.org/xsd/adlcp_rootv1p2" schemaLocation="adlcp_rootv1p2.xsd"/>
5
+ </xsd:schema>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
3
+ <xsd:import namespace="http://www.imsglobal.org/xsd/imscp_v1p1" schemaLocation="imscp_v1p1.xsd"/>
4
+ <xsd:import namespace="http://www.imsglobal.org/xsd/imsss" schemaLocation="imsss_v1p0.xsd"/>
5
+ <xsd:import namespace="http://www.adlnet.org/xsd/adlcp_v1p3" schemaLocation="adlcp_v1p3.xsd"/>
6
+ <xsd:import namespace="http://www.adlnet.org/xsd/adlseq_v1p3" schemaLocation="adlseq_v1p3.xsd"/>
7
+ <xsd:import namespace="http://www.adlnet.org/xsd/adlnav_v1p3" schemaLocation="adlnav_v1p3.xsd"/>
8
+ </xsd:schema>
@@ -0,0 +1,304 @@
1
+ <?xml version="1.0"?>
2
+ <!-- edited with XMLSPY v5 rel. 4 U (http://www.xmlspy.com) by Pascal FERTON (AISAKOS) -->
3
+ <!-- edited with XML Spy v4.4 U (http://www.xmlspy.com) by sa (li) -->
4
+ <!-- filename=ims_cp_rootv1p1p2.xsd -->
5
+ <!-- Copyright (2) 2001 IMS Global Learning Consortium, Inc. -->
6
+ <!-- edited by Thomas Wason -->
7
+ <!-- Conforms to w3c http://www.w3.org/TR/xmlschema-1/ 2000-10-24-->
8
+ <xsd:schema targetNamespace="http://www.imsproject.org/xsd/imscp_rootv1p1p2" xmlns="http://www.imsproject.org/xsd/imscp_rootv1p1p2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified" version="IMS CP 1.1.2">
9
+ <!-- ******************** -->
10
+ <!-- ** Change History ** -->
11
+ <!-- ******************** -->
12
+ <xsd:annotation>
13
+ <xsd:documentation xml:lang="en">DRAFT XSD for IMS Content Packaging version 1.1 DRAFT</xsd:documentation>
14
+ <xsd:documentation> Copyright (c) 2001 IMS GLC, Inc. </xsd:documentation>
15
+ <xsd:documentation>2000-04-21, Adjustments by T.D. Wason from CP 1.0.</xsd:documentation>
16
+ <xsd:documentation>2001-02-22, T.D.Wason: Modify for 2000-10-24 XML-Schema version. Modified to support extension.</xsd:documentation>
17
+ <xsd:documentation>2001-03-12, T.D.Wason: Change filename, target and meta-data namespaces and meta-data fielname. Add meta-data to itemType, fileType and organizationType.</xsd:documentation>
18
+ <xsd:documentation>Do not define namespaces for xml in XML instances generated from this xsd.</xsd:documentation>
19
+ <xsd:documentation>Imports IMS meta-data xsd, lower case element names. </xsd:documentation>
20
+ <xsd:documentation>This XSD provides a reference to the IMS meta-data root element as imsmd:record</xsd:documentation>
21
+ <xsd:documentation>If the IMS meta-data is to be used in the XML instance then the instance must define an IMS meta-data prefix with a namespace. The meta-data targetNamespace should be used. </xsd:documentation>
22
+ <xsd:documentation>2001-03-20, Thor Anderson: Remove manifestref, change resourceref back to identifierref, change manifest back to contained by manifest. --Tom Wason: manifest may contain _none_ or more manifests.</xsd:documentation>
23
+ <xsd:documentation>2001-04-13 Tom Wason: corrected attirbute name structure. Was misnamed type. </xsd:documentation>
24
+ <xsd:documentation>2001-05-14 Schawn Thropp: Made all complexType extensible with the group.any</xsd:documentation>
25
+ <xsd:documentation>Added the anyAttribute to all complexTypes. Changed the href attribute on the fileType and resourceType to xsd:string</xsd:documentation>
26
+ <xsd:documentation>Changed the maxLength of the href, identifierref, parameters, structure attributes to match the Information model.</xsd:documentation>
27
+ <xsd:documentation>2001-07-25 Schawn Thropp: Changed the namespace for the Schema of Schemas to the 5/2/2001 W3C XML Schema</xsd:documentation>
28
+ <xsd:documentation>Recommendation. attributeGroup attr.imsmd deleted, was not used anywhere. Any attribute declarations that have</xsd:documentation>
29
+ <xsd:documentation>use = "default" changed to use="optional" - attr.structure.req.</xsd:documentation>
30
+ <xsd:documentation>Any attribute declarations that have value="somevalue" changed to default="somevalue",</xsd:documentation>
31
+ <xsd:documentation>attr.structure.req (hierarchical). Removed references to IMS MD Version 1.1.</xsd:documentation>
32
+ <xsd:documentation>Modified attribute group "attr.resourcetype.req" to change use from optional</xsd:documentation>
33
+ <xsd:documentation>to required to match the information model. As a result the default value also needed to be removed</xsd:documentation>
34
+ <xsd:documentation>Name change for XSD. Changed to match version of CP Spec </xsd:documentation>
35
+ </xsd:annotation>
36
+ <xsd:annotation>
37
+ <xsd:documentation>Inclusions and Imports</xsd:documentation>
38
+ </xsd:annotation>
39
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="xml.xsd"/>
40
+ <xsd:annotation>
41
+ <xsd:documentation>Attribute Declarations</xsd:documentation>
42
+ </xsd:annotation>
43
+ <!-- **************************** -->
44
+ <!-- ** Attribute Declarations ** -->
45
+ <!-- **************************** -->
46
+ <xsd:attributeGroup name="attr.base">
47
+ <xsd:attribute ref="xml:base" use="optional"/>
48
+ </xsd:attributeGroup>
49
+ <xsd:attributeGroup name="attr.default">
50
+ <xsd:attribute name="default" type="xsd:IDREF" use="optional"/>
51
+ </xsd:attributeGroup>
52
+ <xsd:attributeGroup name="attr.href">
53
+ <xsd:attribute name="href" use="optional">
54
+ <xsd:simpleType>
55
+ <xsd:restriction base="xsd:anyURI">
56
+ <xsd:maxLength value="2000"/>
57
+ </xsd:restriction>
58
+ </xsd:simpleType>
59
+ </xsd:attribute>
60
+ </xsd:attributeGroup>
61
+ <xsd:attributeGroup name="attr.href.req">
62
+ <xsd:attribute name="href" use="required">
63
+ <xsd:simpleType>
64
+ <xsd:restriction base="xsd:anyURI">
65
+ <xsd:maxLength value="2000"/>
66
+ </xsd:restriction>
67
+ </xsd:simpleType>
68
+ </xsd:attribute>
69
+ </xsd:attributeGroup>
70
+ <xsd:attributeGroup name="attr.identifier.req">
71
+ <xsd:attribute name="identifier" type="xsd:ID" use="required"/>
72
+ </xsd:attributeGroup>
73
+ <xsd:attributeGroup name="attr.identifier">
74
+ <xsd:attribute name="identifier" type="xsd:ID" use="optional"/>
75
+ </xsd:attributeGroup>
76
+ <xsd:attributeGroup name="attr.isvisible">
77
+ <xsd:attribute name="isvisible" type="xsd:boolean" use="optional"/>
78
+ </xsd:attributeGroup>
79
+ <xsd:attributeGroup name="attr.parameters">
80
+ <xsd:attribute name="parameters" use="optional">
81
+ <xsd:simpleType>
82
+ <xsd:restriction base="xsd:string">
83
+ <xsd:maxLength value="1000"/>
84
+ </xsd:restriction>
85
+ </xsd:simpleType>
86
+ </xsd:attribute>
87
+ </xsd:attributeGroup>
88
+ <xsd:attributeGroup name="attr.identifierref">
89
+ <xsd:attribute name="identifierref" use="optional">
90
+ <xsd:simpleType>
91
+ <xsd:restriction base="xsd:string">
92
+ <xsd:maxLength value="2000"/>
93
+ </xsd:restriction>
94
+ </xsd:simpleType>
95
+ </xsd:attribute>
96
+ </xsd:attributeGroup>
97
+ <xsd:attributeGroup name="attr.identifierref.req">
98
+ <xsd:attribute name="identifierref" use="required">
99
+ <xsd:simpleType>
100
+ <xsd:restriction base="xsd:string">
101
+ <xsd:maxLength value="2000"/>
102
+ </xsd:restriction>
103
+ </xsd:simpleType>
104
+ </xsd:attribute>
105
+ </xsd:attributeGroup>
106
+ <xsd:attributeGroup name="attr.resourcetype.req">
107
+ <xsd:attribute name="type" use="required">
108
+ <xsd:simpleType>
109
+ <xsd:restriction base="xsd:string">
110
+ <xsd:maxLength value="1000"/>
111
+ </xsd:restriction>
112
+ </xsd:simpleType>
113
+ </xsd:attribute>
114
+ </xsd:attributeGroup>
115
+ <xsd:attributeGroup name="attr.structure.req">
116
+ <xsd:attribute name="structure" use="optional" default="hierarchical">
117
+ <xsd:simpleType>
118
+ <xsd:restriction base="xsd:string">
119
+ <xsd:maxLength value="200"/>
120
+ </xsd:restriction>
121
+ </xsd:simpleType>
122
+ </xsd:attribute>
123
+ </xsd:attributeGroup>
124
+ <xsd:attributeGroup name="attr.version">
125
+ <xsd:attribute name="version" use="optional">
126
+ <xsd:simpleType>
127
+ <xsd:restriction base="xsd:string">
128
+ <xsd:maxLength value="20"/>
129
+ </xsd:restriction>
130
+ </xsd:simpleType>
131
+ </xsd:attribute>
132
+ </xsd:attributeGroup>
133
+ <xsd:annotation>
134
+ <xsd:documentation>element groups</xsd:documentation>
135
+ </xsd:annotation>
136
+ <xsd:group name="grp.any">
137
+ <xsd:annotation>
138
+ <xsd:documentation>Any namespaced element from any namespace may be included within an &quot;any&quot; element. The namespace for the imported element must be defined in the instance, and the schema must be imported. </xsd:documentation>
139
+ </xsd:annotation>
140
+ <xsd:sequence>
141
+ <xsd:any namespace="##other" processContents="strict" minOccurs="0" maxOccurs="unbounded"/>
142
+ </xsd:sequence>
143
+ </xsd:group>
144
+ <!-- ************************** -->
145
+ <!-- ** Element Declarations ** -->
146
+ <!-- ************************** -->
147
+ <xsd:element name="dependency" type="dependencyType"/>
148
+ <xsd:element name="file" type="fileType"/>
149
+ <xsd:element name="item" type="itemType"/>
150
+ <xsd:element name="manifest" type="manifestType"/>
151
+ <xsd:element name="metadata" type="metadataType"/>
152
+ <xsd:element name="organization" type="organizationType"/>
153
+ <xsd:element name="organizations" type="organizationsType"/>
154
+ <xsd:element name="resource" type="resourceType"/>
155
+ <xsd:element name="resources" type="resourcesType"/>
156
+ <xsd:element name="schema" type="schemaType"/>
157
+ <xsd:element name="schemaversion" type="schemaversionType"/>
158
+ <xsd:element name="title" type="titleType"/>
159
+ <!-- ******************* -->
160
+ <!-- ** Complex Types ** -->
161
+ <!-- ******************* -->
162
+ <!-- **************** -->
163
+ <!-- ** dependency ** -->
164
+ <!-- **************** -->
165
+ <xsd:complexType name="dependencyType">
166
+ <xsd:sequence>
167
+ <xsd:group ref="grp.any"/>
168
+ </xsd:sequence>
169
+ <xsd:attributeGroup ref="attr.identifierref.req"/>
170
+ <xsd:anyAttribute namespace="##other" processContents="strict"/>
171
+ </xsd:complexType>
172
+ <!-- ********** -->
173
+ <!-- ** file ** -->
174
+ <!-- ********** -->
175
+ <xsd:complexType name="fileType">
176
+ <xsd:sequence>
177
+ <xsd:element ref="metadata" minOccurs="0"/>
178
+ <xsd:group ref="grp.any"/>
179
+ </xsd:sequence>
180
+ <xsd:attributeGroup ref="attr.href.req"/>
181
+ <xsd:anyAttribute namespace="##other" processContents="strict"/>
182
+ </xsd:complexType>
183
+ <!-- ********** -->
184
+ <!-- ** item ** -->
185
+ <!-- ********** -->
186
+ <xsd:complexType name="itemType">
187
+ <xsd:sequence>
188
+ <xsd:element ref="title" minOccurs="0"/>
189
+ <xsd:element ref="item" minOccurs="0" maxOccurs="unbounded"/>
190
+ <xsd:element ref="metadata" minOccurs="0"/>
191
+ <xsd:group ref="grp.any"/>
192
+ </xsd:sequence>
193
+ <xsd:attributeGroup ref="attr.identifier.req"/>
194
+ <xsd:attributeGroup ref="attr.identifierref"/>
195
+ <xsd:attributeGroup ref="attr.isvisible"/>
196
+ <xsd:attributeGroup ref="attr.parameters"/>
197
+ <xsd:anyAttribute namespace="##other" processContents="strict"/>
198
+ </xsd:complexType>
199
+ <!-- ************** -->
200
+ <!-- ** manifest ** -->
201
+ <!-- ************** -->
202
+ <xsd:complexType name="manifestType">
203
+ <xsd:sequence>
204
+ <xsd:element ref="metadata" minOccurs="0"/>
205
+ <xsd:element ref="organizations"/>
206
+ <xsd:element ref="resources"/>
207
+ <xsd:element ref="manifest" minOccurs="0" maxOccurs="unbounded"/>
208
+ <xsd:group ref="grp.any"/>
209
+ </xsd:sequence>
210
+ <xsd:attributeGroup ref="attr.identifier.req"/>
211
+ <xsd:attributeGroup ref="attr.version"/>
212
+ <xsd:attribute ref="xml:base"/>
213
+ <xsd:anyAttribute namespace="##other" processContents="strict"/>
214
+ </xsd:complexType>
215
+ <!-- ************** -->
216
+ <!-- ** metadata ** -->
217
+ <!-- ************** -->
218
+ <xsd:complexType name="metadataType">
219
+ <xsd:sequence>
220
+ <xsd:element ref="schema" minOccurs="0"/>
221
+ <xsd:element ref="schemaversion" minOccurs="0"/>
222
+ <xsd:group ref="grp.any"/>
223
+ </xsd:sequence>
224
+ </xsd:complexType>
225
+ <!-- ******************* -->
226
+ <!-- ** organizations ** -->
227
+ <!-- ******************* -->
228
+ <xsd:complexType name="organizationsType">
229
+ <xsd:sequence>
230
+ <xsd:element ref="organization" minOccurs="0" maxOccurs="unbounded"/>
231
+ <xsd:group ref="grp.any"/>
232
+ </xsd:sequence>
233
+ <xsd:attributeGroup ref="attr.default"/>
234
+ <xsd:anyAttribute namespace="##other" processContents="strict"/>
235
+ </xsd:complexType>
236
+ <!-- ****************** -->
237
+ <!-- ** organization ** -->
238
+ <!-- ****************** -->
239
+ <xsd:complexType name="organizationType">
240
+ <xsd:sequence>
241
+ <xsd:element ref="title" minOccurs="0"/>
242
+ <xsd:element ref="item" minOccurs="0" maxOccurs="unbounded"/>
243
+ <xsd:element ref="metadata" minOccurs="0"/>
244
+ <xsd:group ref="grp.any"/>
245
+ </xsd:sequence>
246
+ <xsd:attributeGroup ref="attr.identifier.req"/>
247
+ <xsd:attributeGroup ref="attr.structure.req"/>
248
+ <xsd:anyAttribute namespace="##other" processContents="strict"/>
249
+ </xsd:complexType>
250
+ <!-- *************** -->
251
+ <!-- ** resources ** -->
252
+ <!-- *************** -->
253
+ <xsd:complexType name="resourcesType">
254
+ <xsd:sequence>
255
+ <xsd:element ref="resource" minOccurs="0" maxOccurs="unbounded"/>
256
+ <xsd:group ref="grp.any"/>
257
+ </xsd:sequence>
258
+ <xsd:attributeGroup ref="attr.base"/>
259
+ <xsd:anyAttribute namespace="##other" processContents="strict"/>
260
+ </xsd:complexType>
261
+ <!-- ************** -->
262
+ <!-- ** resource ** -->
263
+ <!-- ************** -->
264
+ <xsd:complexType name="resourceType">
265
+ <xsd:sequence>
266
+ <xsd:element ref="metadata" minOccurs="0"/>
267
+ <xsd:element ref="file" minOccurs="0" maxOccurs="unbounded"/>
268
+ <xsd:element ref="dependency" minOccurs="0" maxOccurs="unbounded"/>
269
+ <xsd:group ref="grp.any"/>
270
+ </xsd:sequence>
271
+ <xsd:attributeGroup ref="attr.identifier.req"/>
272
+ <xsd:attributeGroup ref="attr.resourcetype.req"/>
273
+ <xsd:attributeGroup ref="attr.base"/>
274
+ <xsd:attributeGroup ref="attr.href"/>
275
+ <xsd:anyAttribute namespace="##other" processContents="strict"/>
276
+ </xsd:complexType>
277
+ <!-- ****************** -->
278
+ <!-- ** Simple Types ** -->
279
+ <!-- ****************** -->
280
+ <!-- ************ -->
281
+ <!-- ** schema ** -->
282
+ <!-- ************ -->
283
+ <xsd:simpleType name="schemaType">
284
+ <xsd:restriction base="xsd:string">
285
+ <xsd:maxLength value="100"/>
286
+ </xsd:restriction>
287
+ </xsd:simpleType>
288
+ <!-- ******************* -->
289
+ <!-- ** schemaversion ** -->
290
+ <!-- ******************* -->
291
+ <xsd:simpleType name="schemaversionType">
292
+ <xsd:restriction base="xsd:string">
293
+ <xsd:maxLength value="20"/>
294
+ </xsd:restriction>
295
+ </xsd:simpleType>
296
+ <!-- *********** -->
297
+ <!-- ** title ** -->
298
+ <!-- *********** -->
299
+ <xsd:simpleType name="titleType">
300
+ <xsd:restriction base="xsd:string">
301
+ <xsd:maxLength value="200"/>
302
+ </xsd:restriction>
303
+ </xsd:simpleType>
304
+ </xsd:schema>
@@ -1386,7 +1386,7 @@ export const slide = {
1386
1386
  <div class="flex gap-4 flex-wrap items-start justify-between">
1387
1387
  <a href="assets/docs/example_md_1.md" data-component="lightbox" data-lightbox-caption="Sample Document" data-lightbox-subtitle="Sample Document" style="width: 200px; height: 150px;"></a>
1388
1388
  <a href="assets/docs/example_md_2.md" data-component="lightbox" data-lightbox-caption="Reference Table" data-lightbox-subtitle="Reference Table" style="width: 200px; height: 150px;"></a>
1389
- <a href="assets/docs/example_pdf_1.pdf" data-component="lightbox" data-lightbox-caption="Quick Reference Guide" data-lightbox-thumbnail="assets/docs/example_pdf_1_thumbnail.png" data-lightbox-subtitle="Quick Reference Guide" style="width: 200px; height: 150px;"></a>
1389
+ <a href="assets/docs/example_pdf_2.pdf" data-component="lightbox" data-lightbox-caption="Quick Reference Guide" data-lightbox-thumbnail="assets/docs/example_pdf_1_thumbnail.png" data-lightbox-subtitle="Quick Reference Guide" style="width: 200px; height: 150px;"></a>
1390
1390
  </div>
1391
1391
  </section>
1392
1392