feat: Rediseño completo de UI, SCORM y ajustes de experiencia
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
import { readdirSync, statSync, readFileSync, writeFileSync } from 'fs'
|
||||
import { join, relative, sep } from 'path'
|
||||
|
||||
const DIST = join(import.meta.dirname, '..', 'dist')
|
||||
const MANIFEST_TEMPLATE = join(import.meta.dirname, '..', 'public', 'imsmanifest.xml')
|
||||
const MANIFEST_OUT = join(DIST, 'imsmanifest.xml')
|
||||
|
||||
/**
|
||||
* Escanea recursivamente dist/ y genera un <file href="..."/> por cada archivo,
|
||||
* usando '/' como separador (requerido por SCORM).
|
||||
*/
|
||||
function scanFiles(dir, basePath = '') {
|
||||
const entries = readdirSync(dir)
|
||||
const files = []
|
||||
|
||||
for (const entry of entries) {
|
||||
const full = join(dir, entry)
|
||||
const relativePath = basePath ? `${basePath}/${entry}` : entry
|
||||
|
||||
if (statSync(full).isDirectory()) {
|
||||
files.push(...scanFiles(full, relativePath))
|
||||
} else if (entry !== 'imsmanifest.xml') {
|
||||
// SCORM usa '/' como separador de ruta
|
||||
files.push(relativePath.split(sep).join('/'))
|
||||
}
|
||||
}
|
||||
|
||||
return files
|
||||
}
|
||||
|
||||
// Leer template del manifiesto
|
||||
let manifest = readFileSync(MANIFEST_TEMPLATE, 'utf-8')
|
||||
|
||||
// Escanear archivos en dist/
|
||||
const distFiles = scanFiles(DIST)
|
||||
console.log(`📁 Archivos encontrados en dist/: ${distFiles.length}`)
|
||||
|
||||
// Generar los <file> elements
|
||||
const fileElements = distFiles
|
||||
.map((f) => ` <file href="${f}"/>`)
|
||||
.join('\n')
|
||||
|
||||
// Reemplazar el bloque de resources en el manifiesto
|
||||
// Busca <resource ...> y reemplaza su contenido de <file> manteniendo el resto
|
||||
const resourceRegex = /(<resource\s+identifier="resource_1"[^>]*>)([\s\S]*?)(<\/resource>)/
|
||||
manifest = manifest.replace(resourceRegex, (_, open, _inner, close) => {
|
||||
return `${open}\n${fileElements}\n ${close}`
|
||||
})
|
||||
|
||||
// Escribir manifiesto actualizado en dist/
|
||||
writeFileSync(MANIFEST_OUT, manifest, 'utf-8')
|
||||
console.log('✅ imsmanifest.xml generado con todos los archivos del build')
|
||||
console.log(` → ${MANIFEST_OUT}`)
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
// @ts-nocheck
|
||||
import{readdirSync,statSync,readFileSync,writeFileSync}from"fs";import{join,relative,sep}from"path";const DIST=join(import.meta.dirname,"..","dist"),MANIFEST_TEMPLATE=join(import.meta.dirname,"..","public","imsmanifest.xml"),MANIFEST_OUT=join(DIST,"imsmanifest.xml");function scanFiles(e,i=""){const s=readdirSync(e),n=[];for(const o of s){const s=join(e,o),t=i?`${i}/${o}`:o;statSync(s).isDirectory()?n.push(...scanFiles(s,t)):"imsmanifest.xml"!==o&&n.push(t.split(sep).join("/"))}return n}let manifest=readFileSync(MANIFEST_TEMPLATE,"utf-8");const distFiles=scanFiles(DIST);console.log(`📁 Archivos encontrados en dist/: ${distFiles.length}`);const fileElements=distFiles.map(e=>` <file href="${e}"/>`).join("\n"),resourceRegex=/(<resource\s+identifier="resource_1"[^>]*>)([\s\S]*?)(<\/resource>)/;manifest=manifest.replace(resourceRegex,(e,i,s,n)=>`${i}\n${fileElements}\n ${n}`),writeFileSync(MANIFEST_OUT,manifest,"utf-8"),console.log("✅ imsmanifest.xml generado con todos los archivos del build"),console.log(` → ${MANIFEST_OUT}`);
|
||||
Reference in New Issue
Block a user