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.
- package/README.md +8 -1
- package/bin/cli.js +16 -0
- package/framework/css/components/accordions.css +117 -31
- package/framework/css/layouts/article.css +7 -0
- package/framework/docs/COURSE_AUTHORING_GUIDE.md +4 -2
- package/framework/docs/FRAMEWORK_GUIDE.md +25 -7
- package/framework/docs/USER_GUIDE.md +14 -0
- package/framework/js/app/AppActions.js +17 -23
- package/framework/js/app/AppUI.js +7 -4
- package/framework/js/assessment/AssessmentActions.js +16 -15
- package/framework/js/assessment/AssessmentFactory.js +44 -15
- package/framework/js/automation/api-engagement.js +6 -3
- package/framework/js/components/interactions/drag-drop.js +4 -4
- package/framework/js/components/interactions/fill-in.js +7 -4
- package/framework/js/components/interactions/hotspot.js +2 -2
- package/framework/js/components/interactions/matching.js +4 -3
- package/framework/js/components/ui-components/audio-player.js +30 -8
- package/framework/js/components/ui-components/collapse.js +4 -2
- package/framework/js/components/ui-components/dropdown.js +7 -3
- package/framework/js/components/ui-components/embed-frame.js +5 -1
- package/framework/js/components/ui-components/flip-card.js +12 -6
- package/framework/js/components/ui-components/interactive-image.js +28 -52
- package/framework/js/components/ui-components/lightbox.js +19 -5
- package/framework/js/components/ui-components/modal.js +20 -7
- package/framework/js/components/ui-components/notifications.js +8 -3
- package/framework/js/components/ui-components/video-player.js +46 -20
- package/framework/js/core/event-bus.js +31 -28
- package/framework/js/dev/runtime-linter.js +6 -2
- package/framework/js/drivers/cmi5-driver.js +186 -83
- package/framework/js/drivers/driver-factory.js +7 -1
- package/framework/js/drivers/driver-interface.js +1 -1
- package/framework/js/drivers/http-driver-base.js +6 -0
- package/framework/js/drivers/lti-driver.js +112 -47
- package/framework/js/drivers/proxy-driver.js +347 -49
- package/framework/js/drivers/scorm-12-driver.js +213 -130
- package/framework/js/drivers/scorm-2004-driver.js +32 -19
- package/framework/js/drivers/scorm-driver-base.js +12 -0
- package/framework/js/drivers/standalone-driver.js +139 -0
- package/framework/js/engagement/engagement-trackers.js +38 -13
- package/framework/js/engagement/requirement-strategies.js +5 -1
- package/framework/js/main.js +7 -0
- package/framework/js/managers/assessment-manager.js +16 -1
- package/framework/js/managers/audio-manager.js +50 -16
- package/framework/js/managers/flag-manager.js +5 -1
- package/framework/js/managers/objective-manager.js +15 -7
- package/framework/js/managers/score-manager.js +27 -6
- package/framework/js/managers/video-manager.js +149 -70
- package/framework/js/navigation/NavigationActions.js +18 -4
- package/framework/js/navigation/document-gallery.js +7 -2
- package/framework/js/navigation/navigation-validators.js +3 -2
- package/framework/js/state/lms-connection.js +41 -16
- package/framework/js/state/state-commits.js +10 -5
- package/framework/js/state/state-manager.js +95 -9
- package/framework/js/state/state-validation.js +44 -11
- package/framework/js/utilities/course-helpers.js +3 -2
- package/framework/js/utilities/media-utils.js +28 -0
- package/framework/js/utilities/portable-assets.js +151 -0
- package/framework/js/utilities/ui-initializer.js +79 -5
- package/framework/js/utilities/utilities.js +32 -20
- package/framework/js/utilities/view-manager.js +16 -1
- package/framework/js/validation/scorm-validators.js +69 -0
- package/framework/version.json +2 -2
- package/lib/authoring-api.js +37 -18
- package/lib/build-linter.js +192 -2
- package/lib/build-packaging.js +47 -3
- package/lib/build.js +69 -8
- package/lib/cloud.js +40 -11
- package/lib/convert.js +30 -2
- package/lib/create.js +5 -3
- package/lib/dev.js +1 -1
- package/lib/headless-browser.js +66 -14
- package/lib/manifest/cmi5-manifest.js +26 -4
- package/lib/manifest/lti-tool-config.js +7 -2
- package/lib/manifest/manifest-factory.d.ts +1 -1
- package/lib/manifest/manifest-factory.js +3 -2
- package/lib/manifest/scorm-12-manifest.js +2 -2
- package/lib/manifest/scorm-2004-manifest.js +3 -28
- package/lib/manifest/scorm-proxy-manifest.js +37 -32
- package/lib/manifest/xml-utils.js +10 -0
- package/lib/narration.js +2 -2
- package/lib/portable-html.js +196 -0
- package/lib/preview-export.js +1 -1
- package/lib/preview-server.js +27 -6
- package/lib/project-utils.js +9 -1
- package/lib/proxy-templates/proxy.html +4 -1
- package/lib/proxy-templates/scorm-bridge.js +82 -10
- package/lib/scaffold.js +9 -4
- package/lib/stub-player/lms-api.js +63 -8
- package/package.json +5 -1
- package/schemas/adlcp_rootv1p2.xsd +110 -0
- package/schemas/coursecode_scorm12_package.xsd +5 -0
- package/schemas/coursecode_scorm2004_package.xsd +8 -0
- package/schemas/imscp_rootv1p1p2.xsd +304 -0
- package/template/course/slides/example-ui-showcase.js +1 -1
- 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
|
-
|
|
757
|
-
|
|
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
|
-
|
|
823
|
-
|
|
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.
|
|
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 "any" 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/
|
|
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
|
|