diff --git a/_sources/lectures/TWP52_en.rst b/_sources/lectures/TWP52_en.rst
index e19079513c..b64d5a3fbb 100644
--- a/_sources/lectures/TWP52_en.rst
+++ b/_sources/lectures/TWP52_en.rst
@@ -305,7 +305,8 @@ Review
+ OptionMenu()
-
+.. raw:: html
+ :file: ../../scorm_package/index.html
.. disqus::
:shortname: pyzombis
diff --git a/_templates/layout.html b/_templates/layout.html
index 00a8807a4f..68b4225437 100644
--- a/_templates/layout.html
+++ b/_templates/layout.html
@@ -275,6 +275,8 @@
{% endraw %}
{% endif %}
+
+
{% endblock %}
{# Silence the sidebar's, relbar's #}
diff --git a/scorm_package/imsmanifest.xml b/scorm_package/imsmanifest.xml
new file mode 100644
index 0000000000..5af91efd24
--- /dev/null
+++ b/scorm_package/imsmanifest.xml
@@ -0,0 +1,21 @@
+
+
+
+ ADL SCORM
+ 1.2
+
+
+
+ SCORM Course
+ -
+ Lesson 1
+
+
+
+
+
+
+
+
+
+
diff --git a/scorm_package/index.html b/scorm_package/index.html
new file mode 100644
index 0000000000..6cd5672653
--- /dev/null
+++ b/scorm_package/index.html
@@ -0,0 +1,32 @@
+
+
+
+ SCORM Course
+
+
+
+
+ Welcome to the SCORM Course
+
+
+
+
+
+
+
+
diff --git a/scorm_package/scripts/scorm_functions.js b/scorm_package/scripts/scorm_functions.js
new file mode 100644
index 0000000000..47d8f9c8c7
--- /dev/null
+++ b/scorm_package/scripts/scorm_functions.js
@@ -0,0 +1,76 @@
+var scorm = pipwerks.SCORM;
+scorm.version = "1.2";
+
+function initialize() {
+ return new Promise((resolve, reject) => {
+ var result = scorm.init();
+ if (result) {
+ console.log("SCORM initialized");
+ resolve();
+ } else {
+ console.log("SCORM initialization failed");
+ reject();
+ }
+ });
+}
+
+function completeLesson() {
+ console.log("Complete Lesson button clicked");
+ scorm.setValue("cmi.core.lesson_status", "completed").then(() => {
+ fetch('/LMSSetValue', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({ element: "cmi.core.lesson_status", value: "completed" }),
+ })
+ .then(response => response.json())
+ .then(data => {
+ console.log('Success:', data);
+ })
+ .catch((error) => {
+ console.error('Error:', error);
+ });
+ });
+}
+
+scorm.setValue = function(element, value) {
+ return new Promise((resolve, reject) => {
+ fetch('/LMSSetValue', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({ element: element, value: value }),
+ })
+ .then(response => {
+ if (response.ok) {
+ resolve();
+ } else {
+ reject();
+ }
+ })
+ .catch(error => {
+ console.error('Error:', error);
+ reject();
+ });
+ });
+};
+
+scorm.getValue = function(element) {
+ return new Promise((resolve, reject) => {
+ fetch(`/LMSGetValue?element=${element}`)
+ .then(response => response.json())
+ .then(data => {
+ resolve(data[element]);
+ })
+ .catch(error => {
+ console.error('Error:', error);
+ reject();
+ });
+ });
+};
+
+// Expose functions to global scope
+window.completeLesson = completeLesson;
+window.initialize = initialize;
diff --git a/scorm_package/server.py b/scorm_package/server.py
new file mode 100644
index 0000000000..23d5fe6ba2
--- /dev/null
+++ b/scorm_package/server.py
@@ -0,0 +1,38 @@
+from flask import Flask, request, jsonify
+
+app = Flask(__name__)
+
+# Dummy storage for demonstration
+scorm_data = {
+ "student_name": "John Doe", # Example student name
+ "lesson_status": "",
+ "lesson_location": ""
+}
+
+@app.route('/LMSInitialize', methods=['GET'])
+def initialize():
+ print("SCORM initialized")
+ return 'true', 200
+
+@app.route('/LMSGetValue', methods=['GET'])
+def get_value():
+ element = request.args.get('element')
+ print(f"Getting value for: {element}")
+ return jsonify({element: scorm_data.get(element, '')})
+
+@app.route('/LMSSetValue', methods=['POST'])
+def set_value():
+ data = request.get_json()
+ element = data.get('element')
+ value = data.get('value')
+ scorm_data[element] = value
+ print(f"Set {element} to {value}")
+ return 'true', 200
+
+@app.route('/LMSFinish', methods=['GET'])
+def finish():
+ print("SCORM finished")
+ return 'true', 200
+
+if __name__ == '__main__':
+ app.run(debug=True)