@liascript/exporter 3.0.0--1.0.3 → 3.0.2--1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/capacitor/{index.bfe7363b.js → index.44a6a9b3.js} +1 -1
- package/dist/assets/capacitor/index.html +1 -1
- package/dist/assets/capacitor/{jszip.min.f6eda75b.js → jszip.min.2f991499.js} +1 -1
- package/dist/assets/capacitor/{trystero-ipfs.min.b27a61d7.js → trystero-ipfs.min.f25fe3e7.js} +1 -1
- package/dist/assets/indexeddb/{index.599a57d6.js → index.4aceca2f.js} +1 -1
- package/dist/assets/indexeddb/index.html +1 -1
- package/dist/assets/pdf/{index.aa124b49.js → index.49b3a4d9.js} +1 -1
- package/dist/assets/pdf/index.html +1 -1
- package/dist/assets/scorm2004/{index.45f7501b.js → index.031764e4.js} +1 -1
- package/dist/assets/scorm2004/index.html +1 -1
- package/dist/assets/{xapi/jszip.min.eaecf580.js → scorm2004/jszip.min.19c66d77.js} +1 -1
- package/dist/assets/web/{index.39a3e3eb.js → index.98993ded.js} +1 -1
- package/dist/assets/web/{index.1062f2c5.js → index.e84d3f3b.js} +1 -1
- package/dist/assets/web/index.html +1 -1
- package/dist/assets/web/{jszip.min.eaecf580.js → jszip.min.19c66d77.js} +1 -1
- package/dist/assets/xapi/{index.018a032a.js → index.f2e89e49.js} +1 -1
- package/dist/assets/xapi/{index.780a0ec3.js → index.f5402f58.js} +1 -1
- package/dist/assets/xapi/index.html +1 -1
- package/dist/assets/{scorm2004/jszip.min.eaecf580.js → xapi/jszip.min.19c66d77.js} +1 -1
- package/dist/index.js +3 -3
- package/dist/server/presets.json +94 -0
- package/dist/server/presets.yaml +120 -0
- package/dist/server/public/app.js +1 -0
- package/dist/server/public/assets/android.svg +38 -0
- package/dist/server/public/assets/cmi.svg +154 -0
- package/dist/server/public/assets/docx.svg +20 -0
- package/dist/server/public/assets/edX.svg +75 -0
- package/dist/server/public/assets/edx.svg +75 -0
- package/dist/server/public/assets/epub.svg +18 -0
- package/dist/server/public/assets/icon.svg +82 -0
- package/dist/server/public/assets/ilias.png +0 -0
- package/dist/server/public/assets/json.svg +4 -0
- package/dist/server/public/assets/learnworlds.png +0 -0
- package/dist/server/public/assets/moodle.svg +190 -0
- package/dist/server/public/assets/opal.png +0 -0
- package/dist/server/public/assets/openolat.png +0 -0
- package/dist/server/public/assets/pdf.svg +4 -0
- package/dist/server/public/assets/rdf.svg +4 -0
- package/dist/server/public/assets/scorm.png +0 -0
- package/dist/server/public/assets/web.png +0 -0
- package/dist/server/public/assets/xapi.png +0 -0
- package/dist/server/public/i18n.js +1 -0
- package/dist/server/public/index.html +1587 -0
- package/dist/server/public/locales/de.json +247 -0
- package/dist/server/public/locales/en.json +247 -0
- package/dist/server/public/status.html +251 -0
- package/dist/server/public/styles.css +712 -0
- package/package.json +5 -1
- package/.parcelrc +0 -3
- package/DESKTOP_APP_README.md +0 -58
- package/DOCKERHUB_DESCRIPTION.md +0 -52
- package/Dockerfile +0 -129
- package/PLAYSTORE_GUIDE.md +0 -172
- package/action.yml +0 -157
- package/custom.css +0 -10
- package/electron-builder.json +0 -149
- package/src/cli.ts +0 -69
- package/src/colorize.ts +0 -115
- package/src/export/android.ts +0 -419
- package/src/export/docx.ts +0 -1025
- package/src/export/epub.ts +0 -1306
- package/src/export/h5p.ts +0 -390
- package/src/export/helper.ts +0 -360
- package/src/export/ims.ts +0 -191
- package/src/export/pdf.ts +0 -406
- package/src/export/presets.ts +0 -220
- package/src/export/project.ts +0 -829
- package/src/export/rdf.ts +0 -551
- package/src/export/scorm12.ts +0 -167
- package/src/export/scorm2004.ts +0 -140
- package/src/export/web.ts +0 -306
- package/src/export/xapi.ts +0 -424
- package/src/exporter.ts +0 -296
- package/src/index.ts +0 -96
- package/src/parser.ts +0 -373
- package/src/presets.yaml +0 -219
- package/src/types.ts +0 -82
- package/tsconfig.json +0 -24
- /package/dist/assets/{pdf → indexeddb}/jszip.min.4fbcc13f.js +0 -0
- /package/dist/assets/{indexeddb → pdf}/jszip.min.63142cc8.js +0 -0
- /package/dist/assets/{xapi → web}/jszip.min.63142cc8.js +0 -0
- /package/dist/assets/{web → xapi}/jszip.min.4fbcc13f.js +0 -0
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>Export Status - LiaScript Exporter</title>
|
|
7
|
+
|
|
8
|
+
<link rel="stylesheet" href="/styles.css" />
|
|
9
|
+
|
|
10
|
+
<script src="/i18n.js"></script>
|
|
11
|
+
</head>
|
|
12
|
+
<body>
|
|
13
|
+
<nav class="navbar">
|
|
14
|
+
<div class="navbar-container">
|
|
15
|
+
<a href="/" class="navbar-brand">
|
|
16
|
+
<img src="./assets/icon.svg" alt="LiaScript" />
|
|
17
|
+
</a>
|
|
18
|
+
<ul class="navbar-menu">
|
|
19
|
+
<li><a href="/" class="navbar-link" data-i18n="nav.home">Home</a></li>
|
|
20
|
+
<li><a href="/status.html" class="navbar-link active" data-i18n="nav.status">Status</a></li>
|
|
21
|
+
<li class="language-selector-container">
|
|
22
|
+
<select id="language-selector" class="language-selector">
|
|
23
|
+
<option value="en">EN</option>
|
|
24
|
+
<option value="de">DE</option>
|
|
25
|
+
</select>
|
|
26
|
+
</li>
|
|
27
|
+
</ul>
|
|
28
|
+
</div>
|
|
29
|
+
</nav>
|
|
30
|
+
|
|
31
|
+
<div class="container">
|
|
32
|
+
<header>
|
|
33
|
+
<h1 data-i18n="status.title">Export Status</h1>
|
|
34
|
+
<p class="subtitle" data-i18n="status.subtitle">Track the status of your export job</p>
|
|
35
|
+
</header>
|
|
36
|
+
|
|
37
|
+
<main>
|
|
38
|
+
<section class="card">
|
|
39
|
+
<div id="statusContent">
|
|
40
|
+
<p data-i18n="status.loading">Loading status...</p>
|
|
41
|
+
</div>
|
|
42
|
+
<div class="refresh-info" id="refreshInfo">
|
|
43
|
+
<span data-i18n="status.autoRefresh">Page will refresh automatically</span>
|
|
44
|
+
</div>
|
|
45
|
+
</section>
|
|
46
|
+
|
|
47
|
+
<div style="text-align: center; margin-top: 2rem">
|
|
48
|
+
<a href="/" class="btn-secondary" data-i18n="status.backHome">Back to Home</a>
|
|
49
|
+
</div>
|
|
50
|
+
</main>
|
|
51
|
+
|
|
52
|
+
<footer>
|
|
53
|
+
<p data-i18n="footer.copyright">© 2026 LiaScript Exporter</p>
|
|
54
|
+
</footer>
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
<script>
|
|
58
|
+
const urlParams = new URLSearchParams(window.location.search)
|
|
59
|
+
let jobId = urlParams.get('jobId')
|
|
60
|
+
let refreshInterval
|
|
61
|
+
|
|
62
|
+
// Wait for i18n to be ready before loading status
|
|
63
|
+
async function initializeStatus() {
|
|
64
|
+
if (!window.i18n || !window.i18n.translations[window.i18n.currentLanguage]) {
|
|
65
|
+
await new Promise(resolve => {
|
|
66
|
+
const checkI18n = setInterval(() => {
|
|
67
|
+
if (window.i18n && window.i18n.translations[window.i18n.currentLanguage]) {
|
|
68
|
+
clearInterval(checkI18n)
|
|
69
|
+
resolve()
|
|
70
|
+
}
|
|
71
|
+
}, 50)
|
|
72
|
+
})
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (jobId) {
|
|
76
|
+
loadStatus()
|
|
77
|
+
refreshInterval = setInterval(loadStatus, 3000)
|
|
78
|
+
} else {
|
|
79
|
+
// Try to get the last job ID from localStorage
|
|
80
|
+
const lastJobId = localStorage.getItem('lastJobId')
|
|
81
|
+
if (lastJobId) {
|
|
82
|
+
jobId = lastJobId
|
|
83
|
+
window.history.replaceState({}, '', `/status.html?jobId=${jobId}`)
|
|
84
|
+
loadStatus()
|
|
85
|
+
refreshInterval = setInterval(loadStatus, 3000)
|
|
86
|
+
} else {
|
|
87
|
+
// No job found
|
|
88
|
+
document.getElementById('statusContent').innerHTML = `
|
|
89
|
+
<div style="text-align: center; padding: 3rem 1rem;">
|
|
90
|
+
<p style="color: var(--text-muted); margin-bottom: 1rem;" data-i18n="status.noExport">No export found</p>
|
|
91
|
+
<p style="color: var(--text-muted); font-size: 0.9rem;" data-i18n="status.noExportMessage">Start a new export on the home page.</p>
|
|
92
|
+
</div>
|
|
93
|
+
`
|
|
94
|
+
// Re-translate the new content
|
|
95
|
+
if (window.i18n) {
|
|
96
|
+
window.i18n.updatePageTranslations()
|
|
97
|
+
}
|
|
98
|
+
document.getElementById('refreshInfo').style.display = 'none'
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
initializeStatus()
|
|
104
|
+
|
|
105
|
+
async function loadStatus() {
|
|
106
|
+
try {
|
|
107
|
+
const response = await fetch(`/api/job/${jobId}`)
|
|
108
|
+
|
|
109
|
+
if (!response.ok) {
|
|
110
|
+
throw new Error(window.i18n ? window.i18n.t('status.error') : 'Job not found')
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const data = await response.json()
|
|
114
|
+
window.lastJobData = data
|
|
115
|
+
displayStatus(data)
|
|
116
|
+
|
|
117
|
+
// Stop refreshing if job is completed or failed
|
|
118
|
+
if (data.job.status === 'completed' || data.job.status === 'failed') {
|
|
119
|
+
clearInterval(refreshInterval)
|
|
120
|
+
}
|
|
121
|
+
} catch (error) {
|
|
122
|
+
const errorMsg = window.i18n ? window.i18n.t('status.errorMessage') : 'Error loading status'
|
|
123
|
+
document.getElementById('statusContent').innerHTML = `
|
|
124
|
+
<p class="error-message">${errorMsg}: ${error.message}</p>
|
|
125
|
+
`
|
|
126
|
+
clearInterval(refreshInterval)
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Listen for language changes and refresh display (for the card content)
|
|
131
|
+
if (window.i18n) {
|
|
132
|
+
const originalSetLanguage = window.i18n.setLanguage.bind(window.i18n)
|
|
133
|
+
window.i18n.setLanguage = async function(lang) {
|
|
134
|
+
await originalSetLanguage(lang)
|
|
135
|
+
if (jobId && window.lastJobData) {
|
|
136
|
+
displayStatus(window.lastJobData)
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function displayStatus(data) {
|
|
142
|
+
const { job, queuePosition } = data
|
|
143
|
+
const statusClass = `status-${job.status}`
|
|
144
|
+
|
|
145
|
+
// Get translations
|
|
146
|
+
const t = (key, fallback) => window.i18n ? window.i18n.t(key, fallback) : fallback
|
|
147
|
+
|
|
148
|
+
let statusText = {
|
|
149
|
+
queued: t('status.statusQueued', 'Queued'),
|
|
150
|
+
processing: t('status.statusProcessing', 'Processing'),
|
|
151
|
+
completed: t('status.statusCompleted', 'Completed'),
|
|
152
|
+
failed: t('status.statusFailed', 'Failed'),
|
|
153
|
+
}[job.status]
|
|
154
|
+
|
|
155
|
+
let progressPercent = 0
|
|
156
|
+
if (job.status === 'processing') progressPercent = 50
|
|
157
|
+
if (job.status === 'completed') progressPercent = 100
|
|
158
|
+
|
|
159
|
+
const sourceText = job.source.type === 'upload'
|
|
160
|
+
? t('status.sourceUpload', 'File Upload')
|
|
161
|
+
: t('status.sourceGit', 'Git Repository')
|
|
162
|
+
|
|
163
|
+
let content = `
|
|
164
|
+
<h2>${t('status.jobId', 'Job ID')}: ${job.id}</h2>
|
|
165
|
+
<div style="margin: 1.5rem 0;">
|
|
166
|
+
<span class="status-badge ${statusClass}">${statusText}</span>
|
|
167
|
+
</div>
|
|
168
|
+
|
|
169
|
+
${
|
|
170
|
+
queuePosition > 0
|
|
171
|
+
? `
|
|
172
|
+
<p><strong>${t('status.queuePosition', 'Position in queue')}:</strong> ${queuePosition}</p>
|
|
173
|
+
`
|
|
174
|
+
: ''
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
<div class="progress-bar">
|
|
178
|
+
<div class="progress-fill" style="width: ${progressPercent}%"></div>
|
|
179
|
+
</div>
|
|
180
|
+
|
|
181
|
+
<div style="margin-top: 1.5rem;">
|
|
182
|
+
<p><strong>${t('status.source', 'Source')}:</strong> ${sourceText}</p>
|
|
183
|
+
${
|
|
184
|
+
job.source.gitUrl
|
|
185
|
+
? `<p><strong>${t('status.repository', 'Repository')}:</strong> ${job.source.gitUrl}</p>`
|
|
186
|
+
: ''
|
|
187
|
+
}
|
|
188
|
+
${
|
|
189
|
+
job.source.files
|
|
190
|
+
? `<p><strong>${t('status.files', 'Files')}:</strong> ${job.source.files.length} ${t('status.filesCount', 'file(s)')}</p>`
|
|
191
|
+
: ''
|
|
192
|
+
}
|
|
193
|
+
<p><strong>${t('status.format', 'Format')}:</strong> ${
|
|
194
|
+
job.target.preset || job.target.format
|
|
195
|
+
}</p>
|
|
196
|
+
<p><strong>${t('status.createdAt', 'Created')}:</strong> ${new Date(
|
|
197
|
+
job.createdAt
|
|
198
|
+
).toLocaleString()}</p>
|
|
199
|
+
${
|
|
200
|
+
job.startedAt
|
|
201
|
+
? `<p><strong>${t('status.startedAt', 'Started')}:</strong> ${new Date(
|
|
202
|
+
job.startedAt
|
|
203
|
+
).toLocaleString()}</p>`
|
|
204
|
+
: ''
|
|
205
|
+
}
|
|
206
|
+
${
|
|
207
|
+
job.completedAt
|
|
208
|
+
? `<p><strong>${t('status.completedAt', 'Completed')}:</strong> ${new Date(
|
|
209
|
+
job.completedAt
|
|
210
|
+
).toLocaleString()}</p>`
|
|
211
|
+
: ''
|
|
212
|
+
}
|
|
213
|
+
</div>
|
|
214
|
+
|
|
215
|
+
${
|
|
216
|
+
job.status === 'failed' && job.error
|
|
217
|
+
? `
|
|
218
|
+
<div style="margin-top: 1.5rem; padding: 1rem; background: #fee2e2; border-radius: 6px;">
|
|
219
|
+
<strong>${t('status.error', 'Error')}:</strong> ${job.error}
|
|
220
|
+
</div>
|
|
221
|
+
`
|
|
222
|
+
: ''
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
${
|
|
226
|
+
job.status === 'completed'
|
|
227
|
+
? `
|
|
228
|
+
<div style="margin-top: 1.5rem;">
|
|
229
|
+
<button class="btn-primary" onclick="downloadResult()">
|
|
230
|
+
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
231
|
+
<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path>
|
|
232
|
+
<polyline points="7 10 12 15 17 10"></polyline>
|
|
233
|
+
<line x1="12" y1="15" x2="12" y2="3"></line>
|
|
234
|
+
</svg>
|
|
235
|
+
${t('status.downloadButton', 'Download File')}
|
|
236
|
+
</button>
|
|
237
|
+
</div>
|
|
238
|
+
`
|
|
239
|
+
: ''
|
|
240
|
+
}
|
|
241
|
+
`
|
|
242
|
+
|
|
243
|
+
document.getElementById('statusContent').innerHTML = content
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function downloadResult() {
|
|
247
|
+
window.location.href = `/api/download/${jobId}`
|
|
248
|
+
}
|
|
249
|
+
</script>
|
|
250
|
+
</body>
|
|
251
|
+
</html>
|