diff --git a/app/src/main/kotlin/com/ustadmobile/zim2xapi/AddxAPIStatementUseCase.kt b/app/src/main/kotlin/com/ustadmobile/zim2xapi/AddxAPIStatementUseCase.kt index 395f553..f7bd410 100644 --- a/app/src/main/kotlin/com/ustadmobile/zim2xapi/AddxAPIStatementUseCase.kt +++ b/app/src/main/kotlin/com/ustadmobile/zim2xapi/AddxAPIStatementUseCase.kt @@ -1,5 +1,6 @@ package com.ustadmobile.zim2xapi +import com.ustadmobile.zim2xapi.utils.FileConstants import org.jsoup.Jsoup import java.io.File @@ -27,7 +28,7 @@ class AddxAPIStatementUseCase { // if doesn't exist, presume not a khan exercise if (!perseusFile.exists()) return - val indexFile = File(zimFolder, "index.html") + val indexFile = File(zimFolder, FileConstants.INDEX_HTML_FILE) val indexDoc = Jsoup.parse(indexFile) val scoreScript = indexDoc.createElement("script") diff --git a/app/src/main/kotlin/com/ustadmobile/zim2xapi/App.kt b/app/src/main/kotlin/com/ustadmobile/zim2xapi/App.kt index 40d4a32..f5974ea 100644 --- a/app/src/main/kotlin/com/ustadmobile/zim2xapi/App.kt +++ b/app/src/main/kotlin/com/ustadmobile/zim2xapi/App.kt @@ -167,7 +167,7 @@ class DownloadTopic : CliktCommand(name = "convert") { ShrinkXapiUseCase().invoke(extractedZimFolder) // create the xApi zip file - val xapiFile = CreateXapiFileUseCase(zimDumpProcess, AddxAPIStatementUseCase(), json).invoke( + val xapiFile = CreateXapiFileUseCase(zimDumpProcess, AddxAPIStatementUseCase(), CreateManifestFileUseCase(), json).invoke( extractedZimFolder, outputDir, fileName, diff --git a/app/src/main/kotlin/com/ustadmobile/zim2xapi/CreateManifestFileUseCase.kt b/app/src/main/kotlin/com/ustadmobile/zim2xapi/CreateManifestFileUseCase.kt new file mode 100644 index 0000000..46968b2 --- /dev/null +++ b/app/src/main/kotlin/com/ustadmobile/zim2xapi/CreateManifestFileUseCase.kt @@ -0,0 +1,45 @@ +package com.ustadmobile.zim2xapi + +import com.ustadmobile.zim2xapi.utils.FileConstants +import org.jsoup.Jsoup +import java.io.File + +class CreateManifestFileUseCase { + + operator fun invoke( + zimFolder: File + ): File { + + val manifestFile = File(zimFolder, MANIFEST_FILE) + + manifestFile.bufferedWriter().use { writer -> + zimFolder.walkTopDown().filter { + it.isFile + }.forEach { file -> + writer.write(file.relativeTo(zimFolder).path) + writer.newLine() + } + } + + val indexHtmlFile = File(zimFolder, FileConstants.INDEX_HTML_FILE) + if (indexHtmlFile.exists()) { + val indexDoc = Jsoup.parse(indexHtmlFile) + val linkTag = indexDoc.createElement("link") + linkTag.attr("rel", "manifest") + linkTag.attr("href", MANIFEST_FILE) + indexDoc.head().appendChild(linkTag) + indexHtmlFile.writeText(indexDoc.html()) + } + + + return manifestFile + } + + companion object { + + const val MANIFEST_FILE = "manifest.txt" + + } + + +} \ No newline at end of file diff --git a/app/src/main/kotlin/com/ustadmobile/zim2xapi/CreateXapiFileUseCase.kt b/app/src/main/kotlin/com/ustadmobile/zim2xapi/CreateXapiFileUseCase.kt index 010cf14..beea950 100644 --- a/app/src/main/kotlin/com/ustadmobile/zim2xapi/CreateXapiFileUseCase.kt +++ b/app/src/main/kotlin/com/ustadmobile/zim2xapi/CreateXapiFileUseCase.kt @@ -15,6 +15,7 @@ import java.util.zip.ZipOutputStream class CreateXapiFileUseCase( private val zimDumpProcess: ProcessBuilderUseCase, private val addXApi: AddxAPIStatementUseCase, + private val createManifestFileUseCase: CreateManifestFileUseCase, private val json: Json ) { @@ -70,6 +71,7 @@ class CreateXapiFileUseCase( ) addXApi.invoke(zimFolder, passingGrade) + createManifestFileUseCase.invoke(zimFolder) val xapiFile = File(outputFolder, "$fileName.zip") ZipOutputStream(FileOutputStream(xapiFile)).use { zipOut -> diff --git a/app/src/test/kotlin/com/ustadmobile/zim2xapi/CreateManifestUseCaseTest.kt b/app/src/test/kotlin/com/ustadmobile/zim2xapi/CreateManifestUseCaseTest.kt new file mode 100644 index 0000000..8ff8fe8 --- /dev/null +++ b/app/src/test/kotlin/com/ustadmobile/zim2xapi/CreateManifestUseCaseTest.kt @@ -0,0 +1,75 @@ +package com.ustadmobile.zim2xapi + +import org.jsoup.Jsoup +import org.junit.Before +import org.junit.Test +import java.io.File +import kotlin.io.path.createTempDirectory +import kotlin.test.assertTrue + +class CreateManifestUseCaseTest { + + private val createManifestUseCase = CreateManifestFileUseCase() + + private lateinit var zimFolder: File + + @Before + fun setup(){ + zimFolder = createTemporaryFolder("zimFolder") + } + + + @Test + fun `test generate manifest`() { + val assetsFolder = File(zimFolder, "assets") + assetsFolder.mkdirs() + + val videoFolder = File(assetsFolder, "video") + videoFolder.mkdirs() + + File(assetsFolder, "script.js").writeText("console.log('Hello World')") + File(videoFolder, "style.css").writeText("body { color: red; }") + + val indexHtmlFile = File(zimFolder, "index.html") + indexHtmlFile.writeText(""" + +
+ +