Skip to content

Commit 839ff5e

Browse files
committed
better top-aligning for static html cols
1 parent a815983 commit 839ff5e

File tree

4 files changed

+40
-4
lines changed
  • core
    • generated-sources/src
      • main/kotlin/org/jetbrains/kotlinx/dataframe/io
      • test/kotlin/org/jetbrains/kotlinx/dataframe/rendering
    • src
      • main/kotlin/org/jetbrains/kotlinx/dataframe/io
      • test/kotlin/org/jetbrains/kotlinx/dataframe/rendering

4 files changed

+40
-4
lines changed

core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/html.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@ import org.jetbrains.kotlinx.dataframe.api.isEmpty
1515
import org.jetbrains.kotlinx.dataframe.api.isNumber
1616
import org.jetbrains.kotlinx.dataframe.api.isSubtypeOf
1717
import org.jetbrains.kotlinx.dataframe.api.rows
18+
import org.jetbrains.kotlinx.dataframe.api.sumOf
1819
import org.jetbrains.kotlinx.dataframe.api.take
1920
import org.jetbrains.kotlinx.dataframe.columns.BaseColumn
2021
import org.jetbrains.kotlinx.dataframe.columns.ColumnGroup
2122
import org.jetbrains.kotlinx.dataframe.columns.ColumnWithPath
23+
import org.jetbrains.kotlinx.dataframe.columns.FrameColumn
2224
import org.jetbrains.kotlinx.dataframe.columns.depth
2325
import org.jetbrains.kotlinx.dataframe.impl.DataFrameSize
2426
import org.jetbrains.kotlinx.dataframe.impl.columns.addPath
@@ -238,7 +240,7 @@ public fun AnyFrame.toStaticHtml(
238240

239241
// Adds a single cell to the html. DataRows from column groups already need to be split up into separate cells.
240242
fun StringBuilder.emitCell(cellValue: Any?, borders: Set<Border>): Unit =
241-
emitTag("td", borders.toClass()) {
243+
emitTag("td", "${borders.toClass()} style=\"vertical-align:top\"") {
242244
when (cellValue) {
243245
// uses the <details> and <summary> to create a collapsible cell for dataframes
244246
is AnyFrame ->
@@ -347,6 +349,15 @@ internal fun BaseColumn<*>.maxWidth(): Int =
347349
if (this is ColumnGroup<*>) columns().sumOf { it.maxWidth() }.coerceAtLeast(1)
348350
else 1
349351

352+
internal fun BaseColumn<*>.maxNumberOfRows(): Int =
353+
if (this is ColumnGroup<*>) {
354+
columns().maxOfOrNull { it.maxNumberOfRows() } ?: 0
355+
} else if (this is FrameColumn<*>) {
356+
values().sumOf { it.asColumnGroup("").maxNumberOfRows() }
357+
} else {
358+
this.size()
359+
}
360+
350361
/**
351362
* Given a [DataFrame], this function returns a depth-first "matrix" containing all columns
352363
* laid out in such a way that they can be used to render the header of a table. The

core/generated-sources/src/test/kotlin/org/jetbrains/kotlinx/dataframe/rendering/RenderingTests.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ class RenderingTests : TestBase() {
184184
val df = DataFrame.read("https://raw.githubusercontent.com/Kotlin/dataframe/master/data/jetbrains.json")
185185

186186
// df.toHTML().openInBrowser()
187-
df.toStaticHtml(openNestedDfs = true).copy(script = "").openInBrowser()
187+
df.toStaticHtml(openNestedDfs = true, includeCss = false).copy(script = "").openInBrowser()
188188
// df.get(frameColumn("repos")).get(0).toStaticHtml(openNestedDfs = false).copy(script = "").openInBrowser()
189189
}
190190
}

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/html.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@ import org.jetbrains.kotlinx.dataframe.api.isEmpty
1515
import org.jetbrains.kotlinx.dataframe.api.isNumber
1616
import org.jetbrains.kotlinx.dataframe.api.isSubtypeOf
1717
import org.jetbrains.kotlinx.dataframe.api.rows
18+
import org.jetbrains.kotlinx.dataframe.api.sumOf
1819
import org.jetbrains.kotlinx.dataframe.api.take
1920
import org.jetbrains.kotlinx.dataframe.columns.BaseColumn
2021
import org.jetbrains.kotlinx.dataframe.columns.ColumnGroup
2122
import org.jetbrains.kotlinx.dataframe.columns.ColumnWithPath
23+
import org.jetbrains.kotlinx.dataframe.columns.FrameColumn
2224
import org.jetbrains.kotlinx.dataframe.columns.depth
2325
import org.jetbrains.kotlinx.dataframe.impl.DataFrameSize
2426
import org.jetbrains.kotlinx.dataframe.impl.columns.addPath
@@ -238,7 +240,7 @@ public fun AnyFrame.toStaticHtml(
238240

239241
// Adds a single cell to the html. DataRows from column groups already need to be split up into separate cells.
240242
fun StringBuilder.emitCell(cellValue: Any?, borders: Set<Border>): Unit =
241-
emitTag("td", borders.toClass()) {
243+
emitTag("td", "${borders.toClass()} style=\"vertical-align:top\"") {
242244
when (cellValue) {
243245
// uses the <details> and <summary> to create a collapsible cell for dataframes
244246
is AnyFrame ->

core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/rendering/RenderingTests.kt

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@ package org.jetbrains.kotlinx.dataframe.rendering
33
import io.kotest.matchers.shouldBe
44
import io.kotest.matchers.string.shouldContain
55
import io.kotest.matchers.string.shouldNotContain
6+
import org.jetbrains.kotlinx.dataframe.DataFrame
67
import org.jetbrains.kotlinx.dataframe.api.add
8+
import org.jetbrains.kotlinx.dataframe.api.asColumnGroup
79
import org.jetbrains.kotlinx.dataframe.api.columnOf
810
import org.jetbrains.kotlinx.dataframe.api.dataFrameOf
911
import org.jetbrains.kotlinx.dataframe.api.emptyDataFrame
12+
import org.jetbrains.kotlinx.dataframe.api.frameColumn
1013
import org.jetbrains.kotlinx.dataframe.api.group
1114
import org.jetbrains.kotlinx.dataframe.api.into
1215
import org.jetbrains.kotlinx.dataframe.api.move
@@ -16,13 +19,20 @@ import org.jetbrains.kotlinx.dataframe.io.DisplayConfiguration
1619
import org.jetbrains.kotlinx.dataframe.io.escapeHTML
1720
import org.jetbrains.kotlinx.dataframe.io.formatter
1821
import org.jetbrains.kotlinx.dataframe.io.maxDepth
22+
import org.jetbrains.kotlinx.dataframe.io.maxWidth
1923
import org.jetbrains.kotlinx.dataframe.io.print
24+
import org.jetbrains.kotlinx.dataframe.io.read
2025
import org.jetbrains.kotlinx.dataframe.io.renderToString
2126
import org.jetbrains.kotlinx.dataframe.io.renderToStringTable
2227
import org.jetbrains.kotlinx.dataframe.io.toHTML
28+
import org.jetbrains.kotlinx.dataframe.io.toStaticHtml
2329
import org.jetbrains.kotlinx.dataframe.jupyter.DefaultCellRenderer
2430
import org.jetbrains.kotlinx.dataframe.jupyter.RenderedContent
2531
import org.jetbrains.kotlinx.dataframe.samples.api.TestBase
32+
import org.jetbrains.kotlinx.dataframe.samples.api.firstName
33+
import org.jetbrains.kotlinx.dataframe.samples.api.lastName
34+
import org.jetbrains.kotlinx.dataframe.samples.api.name
35+
import org.jetbrains.kotlinx.dataframe.samples.api.secondName
2636
import org.jsoup.Jsoup
2737
import org.junit.Test
2838
import java.net.URL
@@ -162,6 +172,19 @@ class RenderingTests : TestBase() {
162172

163173
@Test
164174
fun `max width`() {
165-
// TODO
175+
dfGroup.asColumnGroup("").maxWidth() shouldBe 8
176+
dfGroup.name.maxWidth() shouldBe 4
177+
dfGroup.name.firstName.maxWidth() shouldBe 3
178+
dfGroup.name.lastName.maxWidth() shouldBe 1
179+
dfGroup.name.firstName.secondName.maxWidth() shouldBe 1
180+
}
181+
182+
@Test
183+
fun `test static rendering TODO temp`() {
184+
val df = DataFrame.read("https://raw.githubusercontent.com/Kotlin/dataframe/master/data/jetbrains.json")
185+
186+
// df.toHTML().openInBrowser()
187+
df.toStaticHtml(openNestedDfs = true, includeCss = false).copy(script = "").openInBrowser()
188+
// df.get(frameColumn("repos")).get(0).toStaticHtml(openNestedDfs = false).copy(script = "").openInBrowser()
166189
}
167190
}

0 commit comments

Comments
 (0)