From a6f8e9f8425752aab79dfce9065b4d8d0585f511 Mon Sep 17 00:00:00 2001 From: Nikita Ermolenko Date: Wed, 15 May 2024 12:37:20 +0300 Subject: [PATCH] Update JupyterHtmlRenderer for image view support Developed a mechanism to enable or disable ImageViewer based on the current IDE version in the JupyterHtmlRenderer. --- .../dataframe/jupyter/JupyterHtmlRenderer.kt | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/jupyter/JupyterHtmlRenderer.kt b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/jupyter/JupyterHtmlRenderer.kt index c34862f21a..a5a4dc249b 100644 --- a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/jupyter/JupyterHtmlRenderer.kt +++ b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/jupyter/JupyterHtmlRenderer.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlinx.jupyter.api.renderHtmlAsIFrameIfNeeded /** Starting from this version, dataframe integration will respond with additional data for rendering in Kotlin Notebooks plugin. */ private const val MIN_KERNEL_VERSION_FOR_NEW_TABLES_UI = "0.11.0.311" private const val MIN_IDE_VERSION_SUPPORT_JSON_WITH_METADATA = 241 +private const val MIN_IDE_VERSION_SUPPORT_IMAGE_VIEWER = 242 internal class JupyterHtmlRenderer( val display: DisplayConfiguration, @@ -64,8 +65,8 @@ internal inline fun JupyterHtmlRenderer.render( if (notebook.kernelVersion >= KotlinKernelVersion.from(MIN_KERNEL_VERSION_FOR_NEW_TABLES_UI)!!) { val ideBuildNumber = KotlinNotebookPluginUtils.getKotlinNotebookIDEBuildNumber() - val jsonEncodedDf = - if (ideBuildNumber == null || ideBuildNumber.majorVersion < MIN_IDE_VERSION_SUPPORT_JSON_WITH_METADATA) { + val jsonEncodedDf = when { + !ideBuildNumber.supportsDynamicNestedTables() -> { json { obj( "nrow" to df.size.nrow, @@ -74,19 +75,32 @@ internal inline fun JupyterHtmlRenderer.render( "kotlin_dataframe" to encodeFrame(df.take(limit)), ) }.toJsonString() - } else { + } + + else -> { + val imageEncodingOptions = + if (ideBuildNumber.supportsImageViewer()) Base64ImageEncodingOptions() else null + df.toJsonWithMetadata( limit, reifiedDisplayConfiguration.rowsLimit, - imageEncodingOptions = Base64ImageEncodingOptions() + imageEncodingOptions = imageEncodingOptions ) } + } + notebook.renderAsIFrameAsNeeded(html, staticHtml, jsonEncodedDf) } else { notebook.renderHtmlAsIFrameIfNeeded(html) } } +private fun KotlinNotebookPluginUtils.IdeBuildNumber?.supportsDynamicNestedTables() = + this != null && majorVersion >= MIN_IDE_VERSION_SUPPORT_JSON_WITH_METADATA + +private fun KotlinNotebookPluginUtils.IdeBuildNumber?.supportsImageViewer() = + this != null && majorVersion >= MIN_IDE_VERSION_SUPPORT_IMAGE_VIEWER + internal fun Notebook.renderAsIFrameAsNeeded( data: HtmlData, staticData: HtmlData,