From 979652b028afa0d18fcb457e2f489071bff9a9c1 Mon Sep 17 00:00:00 2001 From: Chaitanya Date: Sat, 3 Aug 2024 02:17:55 +0530 Subject: [PATCH 1/5] Adding Support for Scorm --- _sources/lectures/TWP52_en.rst | 3 +- _templates/layout.html | 2 + scorm_package/imsmanifest.xml | 21 +++++++ scorm_package/index.html | 32 ++++++++++ scorm_package/scripts/scorm_functions.js | 76 ++++++++++++++++++++++++ scorm_package/server.py | 38 ++++++++++++ 6 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 scorm_package/imsmanifest.xml create mode 100644 scorm_package/index.html create mode 100644 scorm_package/scripts/scorm_functions.js create mode 100644 scorm_package/server.py 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) From 73f24da05aeb65e9fbd77249a1ae4e00c8fd8e11 Mon Sep 17 00:00:00 2001 From: Chaitanya Date: Sat, 17 Aug 2024 03:04:26 +0530 Subject: [PATCH 2/5] Integrated SCORM Package --- _sources/lectures/TWP52_en.rst | 2 +- _static/APIWrapper.js | 45 ++++++++++++++ _static/SCORMFunctions.js | 40 ++++++++++++ scorm_package/chapter1.html | 16 +++++ scorm_package/chapter2.html | 15 +++++ scorm_package/imsmanifest.xml | 57 +++++++++++------ scorm_package/index.html | 32 ---------- scorm_package/scorm_package.zip | Bin 0 -> 3031 bytes scorm_package/scripts/scorm_functions.js | 76 ----------------------- scorm_package/server.py | 38 ------------ 10 files changed, 154 insertions(+), 167 deletions(-) create mode 100644 _static/APIWrapper.js create mode 100644 _static/SCORMFunctions.js create mode 100644 scorm_package/chapter1.html create mode 100644 scorm_package/chapter2.html delete mode 100644 scorm_package/index.html create mode 100644 scorm_package/scorm_package.zip delete mode 100644 scorm_package/scripts/scorm_functions.js delete mode 100644 scorm_package/server.py diff --git a/_sources/lectures/TWP52_en.rst b/_sources/lectures/TWP52_en.rst index b64d5a3fbb..b2c46915e8 100644 --- a/_sources/lectures/TWP52_en.rst +++ b/_sources/lectures/TWP52_en.rst @@ -306,7 +306,7 @@ Review .. raw:: html - :file: ../../scorm_package/index.html + :file: ../../scorm_package/chapter1.html .. disqus:: :shortname: pyzombis diff --git a/_static/APIWrapper.js b/_static/APIWrapper.js new file mode 100644 index 0000000000..4f1753ddb1 --- /dev/null +++ b/_static/APIWrapper.js @@ -0,0 +1,45 @@ +// SCORM API Wrapper +var findAPITries = 0; +var API = null; + +function findAPI(win) { + while ((win.API == null) && (win.parent != null) && (win.parent != win)) { + findAPITries++; + if (findAPITries > 7) { + return null; + } + win = win.parent; + } + return win.API; +} + +function getAPI() { + var theAPI = findAPI(window); + if ((theAPI == null) && (window.opener != null) && (typeof(window.opener) != "undefined")) { + theAPI = findAPI(window.opener); + } + if (theAPI == null) { + alert("Unable to find an API adapter"); + } + return theAPI; +} + +function initializeAPI() { + API = getAPI(); + if (API != null) { + API.LMSInitialize(""); + } +} + +function terminateAPI() { + if (API != null) { + API.LMSFinish(""); + } +} + +function setProgress(progress) { + if (API != null) { + API.LMSSetValue("cmi.core.lesson_status", progress); + API.LMSCommit(""); + } +} diff --git a/_static/SCORMFunctions.js b/_static/SCORMFunctions.js new file mode 100644 index 0000000000..e94380937f --- /dev/null +++ b/_static/SCORMFunctions.js @@ -0,0 +1,40 @@ +// SCORM Functions +function loadPage() { + initializeAPI(); + console.log("SCORM API initialized."); +} + +function unloadPage() { + terminateAPI(); + console.log("SCORM API terminated."); +} + +function loadChapter(chapter) { + loadPage(); + + var completionStatus = API.LMSGetValue("cmi.core.lesson_status"); + + if (completionStatus === "completed") { + document.getElementById("completion-status").innerText = "This chapter has been completed."; + document.getElementById("complete-button").style.display = "none"; + } else { + document.getElementById("completion-status").innerText = "This chapter has not been completed."; + document.getElementById("reset-button").style.display = "none"; + } +} + +function completeChapter(chapter) { + setProgress("completed"); + alert(chapter + " completed! Progress recorded."); + document.getElementById("completion-status").innerText = "This chapter has been completed."; + document.getElementById("complete-button").style.display = "none"; + document.getElementById("reset-button").style.display = "block"; +} + +function resetChapter(chapter) { + setProgress("incomplete"); + alert(chapter + " reset to incomplete."); + document.getElementById("completion-status").innerText = "This chapter has not been completed."; + document.getElementById("complete-button").style.display = "block"; + document.getElementById("reset-button").style.display = "none"; +} diff --git a/scorm_package/chapter1.html b/scorm_package/chapter1.html new file mode 100644 index 0000000000..75a19d5582 --- /dev/null +++ b/scorm_package/chapter1.html @@ -0,0 +1,16 @@ + + + + + + Chapter 1 + + + + +

Chapter 1: Introduction

+

Checking completion status...

+ + + + diff --git a/scorm_package/chapter2.html b/scorm_package/chapter2.html new file mode 100644 index 0000000000..9ebae3f91b --- /dev/null +++ b/scorm_package/chapter2.html @@ -0,0 +1,15 @@ + + + + + + Chapter 2 + + + + +

Chapter 2: Uff

+

Complete this chapter by clicking the button below.

+ + + diff --git a/scorm_package/imsmanifest.xml b/scorm_package/imsmanifest.xml index 5af91efd24..8fed7e6a0c 100644 --- a/scorm_package/imsmanifest.xml +++ b/scorm_package/imsmanifest.xml @@ -1,21 +1,38 @@ - - - ADL SCORM - 1.2 - - - - SCORM Course - - Lesson 1 - - - - - - - - - - + + + ADL SCORM + 1.2 + metadata.xml + + + + Your Course Title + + Chapter 1 + + + Chapter 2 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/scorm_package/index.html b/scorm_package/index.html deleted file mode 100644 index 6cd5672653..0000000000 --- a/scorm_package/index.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - SCORM Course - - - - -

Welcome to the SCORM Course

-

-
- -
- - - - diff --git a/scorm_package/scorm_package.zip b/scorm_package/scorm_package.zip new file mode 100644 index 0000000000000000000000000000000000000000..2fde2189910928efbb178cdc9d7fde1721f4044c GIT binary patch literal 3031 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 E15okvUH||9 literal 0 HcmV?d00001 diff --git a/scorm_package/scripts/scorm_functions.js b/scorm_package/scripts/scorm_functions.js deleted file mode 100644 index 47d8f9c8c7..0000000000 --- a/scorm_package/scripts/scorm_functions.js +++ /dev/null @@ -1,76 +0,0 @@ -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 deleted file mode 100644 index 23d5fe6ba2..0000000000 --- a/scorm_package/server.py +++ /dev/null @@ -1,38 +0,0 @@ -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) From 5f727fa0fba11133a961917e6f04fab50827109e Mon Sep 17 00:00:00 2001 From: Chaitanya Date: Mon, 19 Aug 2024 04:27:36 +0530 Subject: [PATCH 3/5] Updated SCORM Package --- _sources/lectures/TWP52_en.rst | 5 +++- _static/APIWrapper.js | 14 +++++++++ _static/SCORMFunctions.js | 22 ++++++++++++++ _static/auth.js | 52 ++++++++++++++++++++++++++++++++++ scorm_package/chapter1.html | 5 ++++ scorm_package/chapter2.html | 12 ++++++-- scorm_package/imsmanifest.xml | 26 +++++++++++------ scorm_package/login.html | 21 ++++++++++++++ scorm_package/signup.html | 20 +++++++++++++ 9 files changed, 165 insertions(+), 12 deletions(-) create mode 100644 _static/auth.js create mode 100644 scorm_package/login.html create mode 100644 scorm_package/signup.html diff --git a/_sources/lectures/TWP52_en.rst b/_sources/lectures/TWP52_en.rst index b2c46915e8..518fd3b8c2 100644 --- a/_sources/lectures/TWP52_en.rst +++ b/_sources/lectures/TWP52_en.rst @@ -306,7 +306,10 @@ Review .. raw:: html - :file: ../../scorm_package/chapter1.html + + .. disqus:: :shortname: pyzombis diff --git a/_static/APIWrapper.js b/_static/APIWrapper.js index 4f1753ddb1..b37d2f2daa 100644 --- a/_static/APIWrapper.js +++ b/_static/APIWrapper.js @@ -43,3 +43,17 @@ function setProgress(progress) { API.LMSCommit(""); } } + +function setSuspendData(data) { + if (API != null) { + API.LMSSetValue("cmi.suspend_data", data); + API.LMSCommit(""); + } +} + +function getSuspendData() { + if (API != null) { + return API.LMSGetValue("cmi.suspend_data"); + } + return ""; +} diff --git a/_static/SCORMFunctions.js b/_static/SCORMFunctions.js index e94380937f..30f1f62fa8 100644 --- a/_static/SCORMFunctions.js +++ b/_static/SCORMFunctions.js @@ -1,10 +1,12 @@ // SCORM Functions + function loadPage() { initializeAPI(); console.log("SCORM API initialized."); } function unloadPage() { + saveTextBoxData(); // Save data when the page is unloaded terminateAPI(); console.log("SCORM API terminated."); } @@ -12,6 +14,13 @@ function unloadPage() { function loadChapter(chapter) { loadPage(); + var suspendData = getSuspendData(); + if (suspendData) { + console.log("Suspend data retrieved:", suspendData); + // Restore the text data in the textbox + document.getElementById("chapter-textbox").value = suspendData; + } + var completionStatus = API.LMSGetValue("cmi.core.lesson_status"); if (completionStatus === "completed") { @@ -29,6 +38,9 @@ function completeChapter(chapter) { document.getElementById("completion-status").innerText = "This chapter has been completed."; document.getElementById("complete-button").style.display = "none"; document.getElementById("reset-button").style.display = "block"; + + // Optionally save some suspend data when the chapter is completed + setSuspendData(document.getElementById("chapter-textbox").value); } function resetChapter(chapter) { @@ -37,4 +49,14 @@ function resetChapter(chapter) { document.getElementById("completion-status").innerText = "This chapter has not been completed."; document.getElementById("complete-button").style.display = "block"; document.getElementById("reset-button").style.display = "none"; + + // Clear the suspend data if the chapter is reset + setSuspendData(""); + document.getElementById("chapter-textbox").value = ""; // Clear the textbox as well +} + +function saveTextBoxData() { + // Save the current state of the textbox into suspend data + var textBoxData = document.getElementById("chapter-textbox").value; + setSuspendData(textBoxData); } diff --git a/_static/auth.js b/_static/auth.js new file mode 100644 index 0000000000..1b478cfddf --- /dev/null +++ b/_static/auth.js @@ -0,0 +1,52 @@ +// auth.js + +function registerUser() { + const username = document.getElementById('newUsername').value; + const password = document.getElementById('newPassword').value; + + // Store the new user in local storage + localStorage.setItem('username', username); + localStorage.setItem('password', password); + + alert('Registration successful! Please log in.'); + window.location.href = '../scorm_package/login.html'; + return false; +} + +function loginUser() { + const username = document.getElementById('username').value; + const password = document.getElementById('password').value; + const rememberMe = document.getElementById('rememberMe').checked; + + const storedUsername = localStorage.getItem('username'); + const storedPassword = localStorage.getItem('password'); + + if (username === storedUsername && password === storedPassword) { + if (rememberMe) { + localStorage.setItem('loggedInUser', username); + } + sessionStorage.setItem('loggedInUser', username); + alert('Login successful!'); + window.location.href = '../scorm_package/chapter1.html'; // Redirect to the first chapter + } else { + alert('Invalid username or password!'); + } + return false; +} + +function logoutUser() { + sessionStorage.removeItem('loggedInUser'); + alert('You have been logged out.'); + window.location.href = '../scorm_package/login.html'; +} + +function checkLogin() { + const loggedInUser = sessionStorage.getItem('loggedInUser') || localStorage.getItem('loggedInUser'); + + if (!loggedInUser) { + alert('You are not logged in. Please log in first.'); + window.location.href = '../scorm_package/login.html'; + } +} + +window.onload = checkLogin; diff --git a/scorm_package/chapter1.html b/scorm_package/chapter1.html index 75a19d5582..6d51ab2a9a 100644 --- a/scorm_package/chapter1.html +++ b/scorm_package/chapter1.html @@ -6,11 +6,16 @@ Chapter 1 +

Chapter 1: Introduction

+

Checking completion status...

+ + + diff --git a/scorm_package/chapter2.html b/scorm_package/chapter2.html index 9ebae3f91b..f3e3f9f554 100644 --- a/scorm_package/chapter2.html +++ b/scorm_package/chapter2.html @@ -6,10 +6,16 @@ Chapter 2 + - +

Chapter 2: Uff

-

Complete this chapter by clicking the button below.

- + +

Checking completion status...

+ + + + + diff --git a/scorm_package/imsmanifest.xml b/scorm_package/imsmanifest.xml index 8fed7e6a0c..59ef4aba7c 100644 --- a/scorm_package/imsmanifest.xml +++ b/scorm_package/imsmanifest.xml @@ -24,15 +24,25 @@ - - - + + + + - - - + + + + - - + + + + + + + + + + \ No newline at end of file diff --git a/scorm_package/login.html b/scorm_package/login.html new file mode 100644 index 0000000000..5c1416ca4c --- /dev/null +++ b/scorm_package/login.html @@ -0,0 +1,21 @@ + + + + + + Login + + + +

Login

+
+
+
+
+
+ Remember Me

+ +
+

Don't have an account? Sign Up

+ + diff --git a/scorm_package/signup.html b/scorm_package/signup.html new file mode 100644 index 0000000000..43f2e7651e --- /dev/null +++ b/scorm_package/signup.html @@ -0,0 +1,20 @@ + + + + + + Sign Up + + + +

Sign Up

+
+
+
+
+

+ +
+

Already have an account? Login

+ + From f4a489ba7a410ef6639ed0b58e39064d4df1ab62 Mon Sep 17 00:00:00 2001 From: Chaitanya Date: Fri, 23 Aug 2024 17:11:54 +0530 Subject: [PATCH 4/5] trying to build --- _sources/lectures/TWP52_en.rst | 30 +++++++++-- _static/auth.js | 52 ------------------- .../imsmanifest.xml => imsmanifest.xml | 34 ++++++------ scorm_package/chapter1.html | 2 - scorm_package/chapter2.html | 2 - scorm_package/login.html | 21 -------- scorm_package/signup.html | 20 ------- 7 files changed, 42 insertions(+), 119 deletions(-) delete mode 100644 _static/auth.js rename scorm_package/imsmanifest.xml => imsmanifest.xml (62%) delete mode 100644 scorm_package/login.html delete mode 100644 scorm_package/signup.html diff --git a/_sources/lectures/TWP52_en.rst b/_sources/lectures/TWP52_en.rst index 518fd3b8c2..fed4cc4929 100644 --- a/_sources/lectures/TWP52_en.rst +++ b/_sources/lectures/TWP52_en.rst @@ -306,10 +306,34 @@ Review .. raw:: html + :file: ../_static/APIWrapper.js + +.. raw:: html + :file: ../_static/SCORMFunctions.js + +.. raw:: html + + - .. disqus:: :shortname: pyzombis diff --git a/_static/auth.js b/_static/auth.js deleted file mode 100644 index 1b478cfddf..0000000000 --- a/_static/auth.js +++ /dev/null @@ -1,52 +0,0 @@ -// auth.js - -function registerUser() { - const username = document.getElementById('newUsername').value; - const password = document.getElementById('newPassword').value; - - // Store the new user in local storage - localStorage.setItem('username', username); - localStorage.setItem('password', password); - - alert('Registration successful! Please log in.'); - window.location.href = '../scorm_package/login.html'; - return false; -} - -function loginUser() { - const username = document.getElementById('username').value; - const password = document.getElementById('password').value; - const rememberMe = document.getElementById('rememberMe').checked; - - const storedUsername = localStorage.getItem('username'); - const storedPassword = localStorage.getItem('password'); - - if (username === storedUsername && password === storedPassword) { - if (rememberMe) { - localStorage.setItem('loggedInUser', username); - } - sessionStorage.setItem('loggedInUser', username); - alert('Login successful!'); - window.location.href = '../scorm_package/chapter1.html'; // Redirect to the first chapter - } else { - alert('Invalid username or password!'); - } - return false; -} - -function logoutUser() { - sessionStorage.removeItem('loggedInUser'); - alert('You have been logged out.'); - window.location.href = '../scorm_package/login.html'; -} - -function checkLogin() { - const loggedInUser = sessionStorage.getItem('loggedInUser') || localStorage.getItem('loggedInUser'); - - if (!loggedInUser) { - alert('You are not logged in. Please log in first.'); - window.location.href = '../scorm_package/login.html'; - } -} - -window.onload = checkLogin; diff --git a/scorm_package/imsmanifest.xml b/imsmanifest.xml similarity index 62% rename from scorm_package/imsmanifest.xml rename to imsmanifest.xml index 59ef4aba7c..518e96d049 100644 --- a/scorm_package/imsmanifest.xml +++ b/imsmanifest.xml @@ -1,4 +1,3 @@ - Your Course Title - Chapter 1 + TWP15_3 - Chapter 2 + TWP15_4 + + + TWP15_5 - - + + - - - + + - - - - - - - - + + + + - - - \ No newline at end of file + + diff --git a/scorm_package/chapter1.html b/scorm_package/chapter1.html index 6d51ab2a9a..2d49c98d66 100644 --- a/scorm_package/chapter1.html +++ b/scorm_package/chapter1.html @@ -6,11 +6,9 @@ Chapter 1 -

Chapter 1: Introduction

-

Checking completion status...

diff --git a/scorm_package/chapter2.html b/scorm_package/chapter2.html index f3e3f9f554..2c9cff346a 100644 --- a/scorm_package/chapter2.html +++ b/scorm_package/chapter2.html @@ -6,11 +6,9 @@ Chapter 2 -

Chapter 2: Uff

-

Checking completion status...

diff --git a/scorm_package/login.html b/scorm_package/login.html deleted file mode 100644 index 5c1416ca4c..0000000000 --- a/scorm_package/login.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - Login - - - -

Login

-
-
-
-
-
- Remember Me

- -
-

Don't have an account? Sign Up

- - diff --git a/scorm_package/signup.html b/scorm_package/signup.html deleted file mode 100644 index 43f2e7651e..0000000000 --- a/scorm_package/signup.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - Sign Up - - - -

Sign Up

-
-
-
-
-

- -
-

Already have an account? Login

- - From ab75d720b75692f348ad91572ef23050f59f4493 Mon Sep 17 00:00:00 2001 From: Chaitanya Date: Sat, 24 Aug 2024 20:58:27 +0530 Subject: [PATCH 5/5] Building Package --- _sources/lectures/TWP50/TWP50_1_en.rst | 17 +++++++++++--- _sources/lectures/TWP52_en.rst | 31 ------------------------- imsmanifest.xml | 26 ++++----------------- scorm_package/chapter1.html | 19 --------------- scorm_package/chapter2.html | 19 --------------- scorm_package/scorm_package.zip | Bin 3031 -> 0 bytes 6 files changed, 19 insertions(+), 93 deletions(-) delete mode 100644 scorm_package/chapter1.html delete mode 100644 scorm_package/chapter2.html delete mode 100644 scorm_package/scorm_package.zip diff --git a/_sources/lectures/TWP50/TWP50_1_en.rst b/_sources/lectures/TWP50/TWP50_1_en.rst index 72dea04b2e..7463f8716f 100644 --- a/_sources/lectures/TWP50/TWP50_1_en.rst +++ b/_sources/lectures/TWP50/TWP50_1_en.rst @@ -1,4 +1,10 @@ -Introduction to a Graphical User Interface +.. raw:: html + :file: ../_static/APIWrapper.js + +.. raw:: html + :file: ../_static/SCORMFunctions.js + +|Introduction to a Graphical User Interface =========================================== + In programming, just writing code is not enough. @@ -39,7 +45,6 @@ Playing Audio :language: python3 :python3_interpreter: brython - from browser import document, html url_audio = "" # Add a link of an audio to play it @@ -58,7 +63,6 @@ Playing Audio from browser import document, html, timer - def create_element(url_audio, audio_name): print(f"Creating the audio element {url_audio}") document <= html.AUDIO(id=audio_name, src=url_audio) @@ -101,3 +105,10 @@ Playing Audio :width: 10.688cm :align: center :alt: + +.. raw:: html + + diff --git a/_sources/lectures/TWP52_en.rst b/_sources/lectures/TWP52_en.rst index fed4cc4929..13ba5d525d 100644 --- a/_sources/lectures/TWP52_en.rst +++ b/_sources/lectures/TWP52_en.rst @@ -304,37 +304,6 @@ Review + RadioButton() + OptionMenu() - -.. raw:: html - :file: ../_static/APIWrapper.js - -.. raw:: html - :file: ../_static/SCORMFunctions.js - -.. raw:: html - - - - .. disqus:: :shortname: pyzombis :identifier: lecture19 diff --git a/imsmanifest.xml b/imsmanifest.xml index 518e96d049..62324c50e9 100644 --- a/imsmanifest.xml +++ b/imsmanifest.xml @@ -13,32 +13,16 @@ Your Course Title - TWP15_3 - - - TWP15_4 - - - TWP15_5 + TWP50_1_en - - - - - - - - - - - - - - + + + + diff --git a/scorm_package/chapter1.html b/scorm_package/chapter1.html deleted file mode 100644 index 2d49c98d66..0000000000 --- a/scorm_package/chapter1.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - Chapter 1 - - - - -

Chapter 1: Introduction

-

Checking completion status...

- - - - - - - diff --git a/scorm_package/chapter2.html b/scorm_package/chapter2.html deleted file mode 100644 index 2c9cff346a..0000000000 --- a/scorm_package/chapter2.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - Chapter 2 - - - - -

Chapter 2: Uff

-

Checking completion status...

- - - - - - - diff --git a/scorm_package/scorm_package.zip b/scorm_package/scorm_package.zip deleted file mode 100644 index 2fde2189910928efbb178cdc9d7fde1721f4044c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3031 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 E15okvUH||9