Newer
Older
kotlin-css-generator / src / commonMain / kotlin / nl / astraeus / css / properties / Measurement.kt
rnentjes on 9 Nov 2021 2 KB v. 1.0.4, add vh,vw measurements
package nl.astraeus.css.properties

enum class MeasurementUoM {
  NONE,
  PX,
  EM,
  REL,
  REM,
  PC,
  PRC,
  CM,
  FR,
  VH,
  VW
}

open class Measurement(
  value: String,
  val uom: MeasurementUoM = MeasurementUoM.NONE
) : CssProperty(value), CalcExpression {

  override fun toString(): String = super.value

  companion object {
    val auto = Measurement("auto")
    val initial = Measurement("initial")
    val inherit = Measurement("inherit")
    val normal = Measurement("normal")

    fun fromString(value: String): Measurement = when {
      value == "0" -> Measurement("0", MeasurementUoM.PX)
      value.endsWith("px") -> Measurement(value.slice(0..(value.length - 2)), MeasurementUoM.PX)
      value.endsWith("rel") -> Measurement(value.slice(0..(value.length - 3)), MeasurementUoM.REL)
      else -> {
        TODO("Unable to parse $value")
      }
    }
  }
}

val Int.px: Measurement
  get() = Measurement(
    "${this}${
      if (this == 0) {
        ""
      } else {
        "px"
      }
    }",
    MeasurementUoM.PX
  )
val Int.em: Measurement
  get() = Measurement(
    "${this}${
      if (this == 0) {
        ""
      } else {
        "em"
      }
    }",
    MeasurementUoM.EM
  )
val Int.rem: Measurement
  get() = Measurement(
    "${this}${
      if (this == 0) {
        ""
      } else {
        "rem"
      }
    }",
    MeasurementUoM.REM
  )
val Int.prc: Measurement
  get() = Measurement("${this}%", MeasurementUoM.PRC)
val Int.pc: Measurement
  get() = Measurement("${this}pc", MeasurementUoM.PC)
val Int.cm: Measurement
  get() = Measurement("${this}cm", MeasurementUoM.CM)
val Int.fr: Measurement
  get() = Measurement("${this}fr", MeasurementUoM.FR)
val Int.vw: Measurement
  get() = Measurement("${this}vw", MeasurementUoM.VW)
val Int.vh: Measurement
  get() = Measurement("${this}vh", MeasurementUoM.VH)

val Double.px: Measurement
  get() = Measurement("${this}px", MeasurementUoM.PX)
val Double.em: Measurement
  get() = Measurement("${this}em", MeasurementUoM.EM)
val Double.rem: Measurement
  get() = Measurement("${this}rem", MeasurementUoM.REM)
val Double.prc: Measurement
  get() = Measurement("${this}%", MeasurementUoM.PRC)
val Double.pc: Measurement
  get() = Measurement("${this}pc", MeasurementUoM.PC)
val Double.cm: Measurement
  get() = Measurement("${this}cm", MeasurementUoM.CM)
val Double.fr: Measurement
  get() = Measurement("${this}fr", MeasurementUoM.FR)
val Double.vw: Measurement
  get() = Measurement("${this}vw", MeasurementUoM.VW)
val Double.vh: Measurement
  get() = Measurement("${this}vh", MeasurementUoM.VH)

open class LineHeight(value: String) : CssProperty(value) {
  companion object {
    val normal = LineHeight("normal")
    val initial = LineHeight("initial")
    val inherit = LineHeight("inherit")
  }
}