Skip to content

Commit

Permalink
Add .cm and .px Double->Size extensions, move SizeUnit to Size.Unit
Browse files Browse the repository at this point in the history
  • Loading branch information
iamgio committed Jul 15, 2024
1 parent b53a179 commit e527282
Show file tree
Hide file tree
Showing 5 changed files with 96 additions and 82 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,36 +6,24 @@ package eu.iamgio.quarkdown.document.page
* @param height height of the page
*/
enum class PageSizeFormat(val width: Size, val height: Size) {
A0(841.mm, 1189.mm),
A1(594.mm, 841.mm),
A2(420.mm, 594.mm),
A3(297.mm, 420.mm),
A4(210.mm, 297.mm),
A5(148.mm, 210.mm),
A6(105.mm, 148.mm),
A7(74.mm, 105.mm),
A8(52.mm, 74.mm),
A9(37.mm, 52.mm),
A10(26.mm, 37.mm),
B0(1000.mm, 1414.mm),
B1(707.mm, 1000.mm),
B2(500.mm, 707.mm),
B3(353.mm, 500.mm),
B4(250.mm, 353.mm),
B5(176.mm, 250.mm),
A0(841.0.mm, 1189.0.mm),
A1(594.0.mm, 841.0.mm),
A2(420.0.mm, 594.0.mm),
A3(297.0.mm, 420.0.mm),
A4(210.0.mm, 297.0.mm),
A5(148.0.mm, 210.0.mm),
A6(105.0.mm, 148.0.mm),
A7(74.0.mm, 105.0.mm),
A8(52.0.mm, 74.0.mm),
A9(37.0.mm, 52.0.mm),
A10(26.0.mm, 37.0.mm),
B0(1000.0.mm, 1414.0.mm),
B1(707.0.mm, 1000.0.mm),
B2(500.0.mm, 707.0.mm),
B3(353.0.mm, 500.0.mm),
B4(250.0.mm, 353.0.mm),
B5(176.0.mm, 250.0.mm),
LETTER(8.5.inch, 11.0.inch),
LEGAL(8.5.inch, 14.0.inch),
LEDGER(11.0.inch, 17.0.inch),
}

/**
* Represents a size expressed in millimeters.
*/
private val Int.mm: Size
get() = Size(this.toDouble(), SizeUnit.MM)

/**
* Represents a size expressed in inches.
*/
private val Double.inch: Size
get() = Size(this, SizeUnit.IN)
72 changes: 48 additions & 24 deletions core/src/main/kotlin/eu/iamgio/quarkdown/document/page/Size.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,38 +6,62 @@ import eu.iamgio.quarkdown.rendering.representable.RenderRepresentableVisitor
/**
* A numeric size with a unit, which represents a generic size (e.g. margin, length, font size).
*/
data class Size(val value: Double, val unit: SizeUnit) : RenderRepresentable {
data class Size(val value: Double, val unit: Unit) : RenderRepresentable {
override fun toString() = "$value${unit.name.lowercase()}"

override fun <T> accept(visitor: RenderRepresentableVisitor<T>) = visitor.visit(this)
}

/**
* Unit of a [Size].
*/
enum class SizeUnit {
/**
* Pixels.
* Unit of a [Size].
*/
PX,
enum class Unit {
/**
* Pixels.
*/
PX,

/**
* Points.
*/
PT,
/**
* Points.
*/
PT,

/**
* Centimeters.
*/
CM,
/**
* Centimeters.
*/
CM,

/**
* Millimeters.
*/
MM,
/**
* Millimeters.
*/
MM,

/**
* Inches.
*/
IN,
/**
* Inches.
*/
IN,
}
}

/**
* Represents a size expressed in pixels.
*/
val Double.px: Size
get() = Size(this, Size.Unit.PX)

/**
* Represents a size expressed in centimeters.
*/
val Double.cm: Size
get() = Size(this, Size.Unit.CM)

/**
* Represents a size expressed in millimeters.
*/
val Double.mm: Size
get() = Size(this, Size.Unit.MM)

/**
* Represents a size expressed in inches.
*/
val Double.inch: Size
get() = Size(this, Size.Unit.IN)
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import eu.iamgio.quarkdown.ast.PlainTextNode
import eu.iamgio.quarkdown.context.Context
import eu.iamgio.quarkdown.context.MutableContext
import eu.iamgio.quarkdown.document.page.Size
import eu.iamgio.quarkdown.document.page.SizeUnit
import eu.iamgio.quarkdown.document.page.Sizes
import eu.iamgio.quarkdown.function.error.internal.InvalidExpressionEvalException
import eu.iamgio.quarkdown.function.expression.ComposedExpression
Expand Down Expand Up @@ -108,7 +107,7 @@ object ValueFactory {

// The unit, which is optional and defaults to pixels.
val rawUnit = groups.next()
val unit = SizeUnit.values().find { it.name.equals(rawUnit, ignoreCase = true) } ?: SizeUnit.PX
val unit = Size.Unit.values().find { it.name.equals(rawUnit, ignoreCase = true) } ?: Size.Unit.PX

return ObjectValue(Size(value, unit))
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ import eu.iamgio.quarkdown.ast.quarkdown.Clipped
import eu.iamgio.quarkdown.context.BaseContext
import eu.iamgio.quarkdown.context.Context
import eu.iamgio.quarkdown.context.MutableContext
import eu.iamgio.quarkdown.document.page.Size
import eu.iamgio.quarkdown.document.page.SizeUnit
import eu.iamgio.quarkdown.document.page.cm
import eu.iamgio.quarkdown.document.page.inch
import eu.iamgio.quarkdown.flavor.quarkdown.QuarkdownFlavor
import eu.iamgio.quarkdown.misc.Color
import eu.iamgio.quarkdown.pipeline.PipelineOptions
Expand Down Expand Up @@ -613,7 +613,7 @@ class HtmlNodeRendererTest {
out.next(),
Box(
title = null,
padding = Size(4.0, SizeUnit.CM),
padding = 4.0.cm,
backgroundColor = null,
foregroundColor = null,
listOf(paragraph),
Expand All @@ -624,7 +624,7 @@ class HtmlNodeRendererTest {
out.next(),
Box(
title = listOf(Text("Title")),
padding = Size(3.0, SizeUnit.IN),
padding = 3.0.inch,
backgroundColor = Color(255, 0, 120),
foregroundColor = Color(0, 10, 25),
listOf(paragraph),
Expand Down
49 changes: 26 additions & 23 deletions core/src/test/kotlin/eu/iamgio/quarkdown/ValueFactoryTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ package eu.iamgio.quarkdown

import eu.iamgio.quarkdown.context.MutableContext
import eu.iamgio.quarkdown.document.page.Size
import eu.iamgio.quarkdown.document.page.SizeUnit
import eu.iamgio.quarkdown.document.page.Sizes
import eu.iamgio.quarkdown.document.page.cm
import eu.iamgio.quarkdown.document.page.mm
import eu.iamgio.quarkdown.document.page.px
import eu.iamgio.quarkdown.flavor.quarkdown.QuarkdownFlavor
import eu.iamgio.quarkdown.function.error.InvalidLambdaArgumentCountException
import eu.iamgio.quarkdown.function.value.BooleanValue
Expand Down Expand Up @@ -56,12 +58,13 @@ class ValueFactoryTest {

@Test
fun size() {
assertEquals(Size(10.0, SizeUnit.PX), ValueFactory.size("10px").unwrappedValue)
assertEquals(Size(8.0, SizeUnit.PT), ValueFactory.size("8pt").unwrappedValue)
assertEquals(Size(16.2, SizeUnit.CM), ValueFactory.size("16.2cm").unwrappedValue)
assertEquals(Size(1.4, SizeUnit.MM), ValueFactory.size("1.4mm").unwrappedValue)
assertEquals(Size(8.2, SizeUnit.IN), ValueFactory.size("8.2in").unwrappedValue)
assertEquals(Size(32.95, SizeUnit.PX), ValueFactory.size("32.95").unwrappedValue)
assertEquals(Size(10.0, Size.Unit.PX), ValueFactory.size("10px").unwrappedValue)
assertEquals(Size(8.0, Size.Unit.PT), ValueFactory.size("8pt").unwrappedValue)
assertEquals(Size(16.2, Size.Unit.CM), ValueFactory.size("16.2cm").unwrappedValue)
assertEquals(Size(1.4, Size.Unit.MM), ValueFactory.size("1.4mm").unwrappedValue)
assertEquals(Size(8.2, Size.Unit.IN), ValueFactory.size("8.2in").unwrappedValue)
assertEquals(Size(32.95, Size.Unit.PX), ValueFactory.size("32.95").unwrappedValue)
assertEquals(32.95.px, ValueFactory.size("32.95").unwrappedValue)
assertFails { ValueFactory.size("px") }
assertFails { ValueFactory.size("abc") }
assertFails { ValueFactory.size("10.10.2cm") }
Expand All @@ -72,34 +75,34 @@ class ValueFactoryTest {
fun sizes() {
assertEquals(
Sizes(
Size(10.0, SizeUnit.PX),
Size(10.0, SizeUnit.PX),
Size(10.0, SizeUnit.PX),
Size(10.0, SizeUnit.PX),
Size(10.0, Size.Unit.PX),
Size(10.0, Size.Unit.PX),
Size(10.0, Size.Unit.PX),
Size(10.0, Size.Unit.PX),
),
ValueFactory.sizes("10px").unwrappedValue,
)
assertEquals(
Sizes(all = Size(10.0, SizeUnit.PX)),
Sizes(all = Size(10.0, Size.Unit.PX)),
ValueFactory.sizes("10px").unwrappedValue,
)
assertEquals(
Sizes(all = Size(13.2, SizeUnit.CM)),
Sizes(all = Size(13.2, Size.Unit.CM)),
ValueFactory.sizes("13.2cm").unwrappedValue,
)
assertEquals(
Sizes(
Size(9.2, SizeUnit.CM),
Size(3.8, SizeUnit.MM),
Size(9.2, SizeUnit.CM),
Size(3.8, SizeUnit.MM),
9.2.cm,
3.8.mm,
9.2.cm,
3.8.mm,
),
ValueFactory.sizes("9.2cm 3.8mm").unwrappedValue,
)
assertEquals(
Sizes(
vertical = Size(9.2, SizeUnit.CM),
horizontal = Size(3.8, SizeUnit.MM),
vertical = Size(9.2, Size.Unit.CM),
horizontal = Size(3.8, Size.Unit.MM),
),
ValueFactory.sizes("9.2cm 3.8mm").unwrappedValue,
)
Expand All @@ -120,11 +123,11 @@ class ValueFactoryTest {
@Test
fun enum() {
@Suppress("UNCHECKED_CAST")
val values = SizeUnit.values() as Array<Enum<*>>
val values = Size.Unit.values() as Array<Enum<*>>

assertEquals(SizeUnit.PX, ValueFactory.enum("px", values)!!.unwrappedValue)
assertEquals(SizeUnit.CM, ValueFactory.enum("CM", values)!!.unwrappedValue)
assertEquals(SizeUnit.MM, ValueFactory.enum("mM", values)!!.unwrappedValue)
assertEquals(Size.Unit.PX, ValueFactory.enum("px", values)!!.unwrappedValue)
assertEquals(Size.Unit.CM, ValueFactory.enum("CM", values)!!.unwrappedValue)
assertEquals(Size.Unit.MM, ValueFactory.enum("mM", values)!!.unwrappedValue)
assertNull(ValueFactory.enum("abc", values))
}

Expand Down

0 comments on commit e527282

Please sign in to comment.