diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index a61f2e9d..69a37ed7 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -39,6 +39,9 @@ ktor-serialization-kotlinx-xml = "2.3.11"
kotlinx-serialization = "1.6.3"
squareup-okhttp = "5.0.0-alpha.11"
kotlinx-io = "0.3.3"
+webjar-material-design-icons = "4.0.0"
+webjar-materialize = "1.0.0"
+webjars-locator-lite = "0.0.4"
[libraries]
roborazzi = { module = "io.github.takahirom.roborazzi:roborazzi", version.ref = "roborazzi-for-replacing-by-include-build" }
@@ -88,3 +91,6 @@ squareup-okhttp-coroutines = { module = "com.squareup.okhttp3:okhttp-coroutines"
robolectric = { module = "org.robolectric:robolectric", version.ref = "robolectric" }
robolectric-android-all = { module = "org.robolectric:android-all", version.ref = "robolectric-android-all" }
kotlinx-io-core = { module = "org.jetbrains.kotlinx:kotlinx-io-core", version.ref = "kotlinx-io" }
+webjars-material-design-icons = { module = "org.webjars:material-design-icons", version.ref = "webjar-material-design-icons" }
+webjars-materialize = { module = "org.webjars:materializecss", version.ref = "webjar-materialize" }
+webjars-locator-lite = { module = "org.webjars:webjars-locator-lite", version.ref = "webjars-locator-lite" }
diff --git a/include-build/roborazzi-core/src/commonMain/kotlin/com/github/takahirom/roborazzi/CaptureResults.kt b/include-build/roborazzi-core/src/commonMain/kotlin/com/github/takahirom/roborazzi/CaptureResults.kt
index b56e7067..ff94ee7a 100644
--- a/include-build/roborazzi-core/src/commonMain/kotlin/com/github/takahirom/roborazzi/CaptureResults.kt
+++ b/include-build/roborazzi-core/src/commonMain/kotlin/com/github/takahirom/roborazzi/CaptureResults.kt
@@ -93,7 +93,7 @@ data class CaptureResults(
tabs.forEachIndexed { tabIndex, tab ->
//
Test 1
val activeClass = if (tabIndex == 0) """class="active" """ else ""
- append("""${tab.title}""")
+ append("""${tab.title}""")
}
append("\n")
tabs.forEach { tab ->
diff --git a/include-build/roborazzi-core/src/commonMain/kotlin/com/github/takahirom/roborazzi/RoborazziReportConst.kt b/include-build/roborazzi-core/src/commonMain/kotlin/com/github/takahirom/roborazzi/RoborazziReportConst.kt
index 3a608379..460b12a1 100644
--- a/include-build/roborazzi-core/src/commonMain/kotlin/com/github/takahirom/roborazzi/RoborazziReportConst.kt
+++ b/include-build/roborazzi-core/src/commonMain/kotlin/com/github/takahirom/roborazzi/RoborazziReportConst.kt
@@ -43,114 +43,4 @@ object RoborazziReportConst {
}
}
}
-
- const val reportHtml = """
-
-
-
-
-
-
- Roborazzi report
-
-
-
-
-
-
-
-
-
-
-REPORT_TEMPLATE_BODY
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- """
}
\ No newline at end of file
diff --git a/include-build/roborazzi-gradle-plugin/build.gradle b/include-build/roborazzi-gradle-plugin/build.gradle
index cb360dfe..3d768fac 100644
--- a/include-build/roborazzi-gradle-plugin/build.gradle
+++ b/include-build/roborazzi-gradle-plugin/build.gradle
@@ -19,6 +19,9 @@ dependencies {
exclude group: 'junit', module: 'junit'
}
implementation libs.kotlinx.serialization.json
+ implementation libs.webjars.locator.lite
+ implementation libs.webjars.materialize
+ implementation libs.webjars.material.design.icons
integrationTestDepImplementation libs.android.tools.build.gradle
integrationTestDepImplementation libs.kotlin.gradle.plugin
integrationTestDepImplementation libs.compose.gradle.plugin
diff --git a/include-build/roborazzi-gradle-plugin/src/main/java/io/github/takahirom/roborazzi/RoborazziPlugin.kt b/include-build/roborazzi-gradle-plugin/src/main/java/io/github/takahirom/roborazzi/RoborazziPlugin.kt
index 85963e48..663aab28 100644
--- a/include-build/roborazzi-gradle-plugin/src/main/java/io/github/takahirom/roborazzi/RoborazziPlugin.kt
+++ b/include-build/roborazzi-gradle-plugin/src/main/java/io/github/takahirom/roborazzi/RoborazziPlugin.kt
@@ -32,6 +32,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTargetWithTests
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
import org.jetbrains.kotlin.gradle.targets.native.KotlinNativeBinaryTestRun
import org.jetbrains.kotlin.gradle.targets.native.tasks.KotlinNativeTest
+import java.io.FileNotFoundException
import java.util.Locale
import javax.inject.Inject
import kotlin.reflect.KClass
@@ -50,6 +51,7 @@ open class RoborazziExtension @Inject constructor(objects: ObjectFactory) {
@Suppress("unused")
// From Paparazzi: https://github.com/cashapp/paparazzi/blob/a76702744a7f380480f323ffda124e845f2733aa/paparazzi/paparazzi-gradle-plugin/src/main/java/app/cash/paparazzi/gradle/PaparazziPlugin.kt
abstract class RoborazziPlugin : Plugin {
+
val AbstractTestTask.systemProperties: MutableMap
get() = when (this) {
is Test -> systemProperties
@@ -255,9 +257,12 @@ abstract class RoborazziPlugin : Plugin {
resultsSummaryFile.parentFile.mkdirs()
resultsSummaryFile.writeText(jsonResult)
val reportFile = reportFileProperty.get().asFile
+
reportFile.parentFile.mkdirs()
+ WebAssets.create().writeToRoborazziReportsDir(reportFile.parentFile)
+ val reportHtml = readIndexHtmlFile() ?: throw FileNotFoundException("index.html not found in resources/META-INF folder")
reportFile.writeText(
- RoborazziReportConst.reportHtml.replace(
+ reportHtml.replace(
oldValue = "REPORT_TEMPLATE_BODY",
newValue = roborazziResults.toHtml(reportFile.parentFile.absolutePath)
)
@@ -464,6 +469,10 @@ abstract class RoborazziPlugin : Plugin {
}
}
+ private fun readIndexHtmlFile(): String? {
+ return this::class.java.classLoader.getResource("META-INF/index.html")?.readText()
+ }
+
private fun String.capitalizeUS() =
replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.US) else it.toString() }
diff --git a/include-build/roborazzi-gradle-plugin/src/main/java/io/github/takahirom/roborazzi/WebAssets.kt b/include-build/roborazzi-gradle-plugin/src/main/java/io/github/takahirom/roborazzi/WebAssets.kt
new file mode 100644
index 00000000..f5cc19f0
--- /dev/null
+++ b/include-build/roborazzi-gradle-plugin/src/main/java/io/github/takahirom/roborazzi/WebAssets.kt
@@ -0,0 +1,78 @@
+package io.github.takahirom.roborazzi
+
+import org.webjars.WebJarVersionLocator
+import java.io.File
+
+class WebAssets private constructor(private val webJarVersionLocator: WebJarVersionLocator) {
+ private val materializeCss = "materializecss"
+ private val materialIcons = "material-design-icons"
+ private val webJarResource = "resources"
+
+ fun writeToRoborazziReportsDir(reportDir: File) {
+ writeLocalAssetsToRoborazziReportsDir(reportDir)
+ writeWebJarAssetsToRoborazziReportsDir(reportDir)
+ }
+
+ private fun writeLocalAssetsToRoborazziReportsDir(reportDir: File) {
+ writeAssets(
+ assetName = "report-style.css",
+ exactPath = "assets/report-style.css",
+ reportDir = reportDir
+ )
+ }
+
+ private fun writeWebJarAssetsToRoborazziReportsDir(reportDir: File) {
+ mapOf(
+ materializeCss to listOf(
+ "css/materialize.min.css",
+ "js/materialize.min.js",
+ ),
+ materialIcons to listOf(
+ "material-icons.css",
+ "MaterialIcons-Regular.ttf",
+ )
+ ).forEach { (key, value) ->
+ value.forEach { exactPath ->
+ webJarVersionLocator.locate(key, exactPath)?.let {
+ writeAssets(
+ assetName = exactPath.substringAfterLast("/"),
+ exactPath = "$webJarResource/$it",
+ reportDir = reportDir
+ )
+ }
+ }
+ }
+ }
+
+ private fun outputFile(directory: File, filename: String): File {
+ return File(directory, filename).apply {
+ parentFile.apply { if (!exists()) mkdirs() }
+ }
+ }
+
+ private fun WebJarVersionLocator.locate(webJarName: String, exactPath: String) = run {
+ path(webJarName, exactPath)?.let { "webjars/$it" }
+ }
+
+ private fun writeAssets(
+ assetName: String,
+ exactPath: String,
+ reportDir: File
+ ) {
+ val assetsDirectory = File(reportDir, "assets")
+ val asset = this::class.java
+ .classLoader
+ .getResource("META-INF/$exactPath")?.readBytes()
+ if (asset != null) {
+ val assetFile = outputFile(assetsDirectory, assetName)
+ assetFile.writeBytes(asset)
+ }
+ }
+
+ companion object {
+
+ fun create(
+ webJarVersionLocator: WebJarVersionLocator = WebJarVersionLocator()
+ ): WebAssets = WebAssets(webJarVersionLocator)
+ }
+}
\ No newline at end of file
diff --git a/include-build/roborazzi-gradle-plugin/src/main/resources/META-INF/assets/report-style.css b/include-build/roborazzi-gradle-plugin/src/main/resources/META-INF/assets/report-style.css
new file mode 100644
index 00000000..9b90fae3
--- /dev/null
+++ b/include-build/roborazzi-gradle-plugin/src/main/resources/META-INF/assets/report-style.css
@@ -0,0 +1,33 @@
+.container {
+ width: 90%;
+ }
+
+ h3 {
+ color: orange;
+ }
+
+ a, .menu {
+ color: white;
+ }
+
+ th a, td a {
+ display: block;
+ color: black;
+ }
+
+ .material-icons {
+ color: #29b6f6;
+ }
+
+ .us {
+ color: #ffcc80;
+ }
+
+ #imageBottomSheet {
+ max-height: 100%;
+ top: 15%;
+ }
+
+ #modalImage {
+ max-width: 100%;
+ }
\ No newline at end of file
diff --git a/include-build/roborazzi-gradle-plugin/src/main/resources/META-INF/index.html b/include-build/roborazzi-gradle-plugin/src/main/resources/META-INF/index.html
new file mode 100644
index 00000000..366b8439
--- /dev/null
+++ b/include-build/roborazzi-gradle-plugin/src/main/resources/META-INF/index.html
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+ Roborazzi report
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file