From 0c0ed26408e10c124abaa913284cfcc224d13fb4 Mon Sep 17 00:00:00 2001 From: davidontop Date: Sat, 21 Sep 2024 09:38:02 +0200 Subject: [PATCH] feat: StringRenderer --- build.sbt | 16 ++++--- .../scala/top/davidon/sfs/dom/AsValue.scala | 7 --- .../top/davidon/sfs/dom/ScalaFullStack.scala | 44 ++++++------------- .../top/davidon/sfs/dom/codecs/package.scala | 11 +++++ .../sfs/renderers/StringRenderer.scala | 33 ++++++++++++++ 5 files changed, 68 insertions(+), 43 deletions(-) delete mode 100644 dom/src/main/scala/top/davidon/sfs/dom/AsValue.scala create mode 100644 sfs/src/main/scala/top/davidon/sfs/renderers/StringRenderer.scala diff --git a/build.sbt b/build.sbt index 956da4c..972e0b1 100644 --- a/build.sbt +++ b/build.sbt @@ -27,18 +27,13 @@ generate := DomGenerator.generate() (Compile / compile) := ((Compile / compile) dependsOn generate).value -lazy val root = crossProject(JSPlatform, JVMPlatform) +lazy val dom = crossProject(JSPlatform, JVMPlatform) .crossType(CrossType.Pure) .in(file("./dom")) .settings( name := "sfs-dom", version := "0.1.0-SNAPSHOT" ) -// .settings( -// libraryDependencies ++= Seq( -// "org.scala-js" % "scalajs-dom" % "2.8.0" % "sjs1_3" -// ) -// ) .jvmSettings( libraryDependencies ++= Seq( "org.scala-js" % "scalajs-dom_sjs1_3" % "2.8.0" @@ -49,3 +44,12 @@ lazy val root = crossProject(JSPlatform, JVMPlatform) "org.scala-js" % "scalajs-dom_sjs1_3" % "2.8.0" ) ) + +lazy val sfs = crossProject(JSPlatform, JVMPlatform) + .crossType(CrossType.Pure) + .in(file("./sfs")) + .settings( + name := "sfs", + version := "0.1.0-SNAPSHOT" + ) + .dependsOn(dom) diff --git a/dom/src/main/scala/top/davidon/sfs/dom/AsValue.scala b/dom/src/main/scala/top/davidon/sfs/dom/AsValue.scala deleted file mode 100644 index a1c2eda..0000000 --- a/dom/src/main/scala/top/davidon/sfs/dom/AsValue.scala +++ /dev/null @@ -1,7 +0,0 @@ -package top.davidon.sfs.dom - -trait AsValue[F, T] { - extension (from: F) { - def asStringValue(): Value[F, String] - } -} diff --git a/dom/src/main/scala/top/davidon/sfs/dom/ScalaFullStack.scala b/dom/src/main/scala/top/davidon/sfs/dom/ScalaFullStack.scala index 553d451..db71c2c 100644 --- a/dom/src/main/scala/top/davidon/sfs/dom/ScalaFullStack.scala +++ b/dom/src/main/scala/top/davidon/sfs/dom/ScalaFullStack.scala @@ -20,39 +20,23 @@ trait ScalaFullStack object svg extends SvgTags with SvgAttrs with ComplexSvgKeys - given AsValue[String, String] with { - extension (from: String) { - def asStringValue(): Value[String, String] = { - Value(from, StringAsIsCodec) - } - } + given strToVal: Conversion[String, Value[String, String]] with { + def apply(from: String): Value[String, String] = + Value(from, StringAsIsCodec) } - given AsValue[Int, String] with { - extension (from: Int) { - def asStringValue(): Value[Int, String] = { - Value(from, IntAsStringCodec) - } - } + given intToVal: Conversion[Int, Value[Int, String]] with { + def apply(from: Int): Value[Int, String] = Value(from, IntAsStringCodec) } - given AsValue[Double, String] with { - extension (from: Double) { - def asStringValue(): Value[Double, String] = { - Value(from, DoubleAsStringCodec) - } - } + given doubleToVal: Conversion[Double, Value[Double, String]] with { + def apply(from: Double): Value[Double, String] = + Value(from, DoubleAsStringCodec) } - given AsValue[Boolean, String] with { - extension (from: Boolean) { - def asStringValue(): Value[Boolean, String] = { - Value(from, BooleanAsTrueFalseStringCodec) - } - } + given longToVal: Conversion[Long, Value[Long, String]] with { + def apply(from: Long): Value[Long, String] = Value(from, LongAsStringCodec) } - given AsValue[Iterable[String], String] with { - extension (from: Iterable[String]) { - def asStringValue(): Value[Iterable[String], String] = { - Value(from, IterableAsSpaceSeparatedStringCodec) - } - } + given iterToVal: Conversion[Iterable[String], Value[Iterable[String], String]] + with { + def apply(from: Iterable[String]): Value[Iterable[String], String] = + Value(from, IterableAsSpaceSeparatedStringCodec) } } diff --git a/dom/src/main/scala/top/davidon/sfs/dom/codecs/package.scala b/dom/src/main/scala/top/davidon/sfs/dom/codecs/package.scala index 265b570..3b04e92 100644 --- a/dom/src/main/scala/top/davidon/sfs/dom/codecs/package.scala +++ b/dom/src/main/scala/top/davidon/sfs/dom/codecs/package.scala @@ -20,6 +20,17 @@ package object codecs { override def encode(scalaValue: Double): String = scalaValue.toString } + lazy val LongAsIsCodec: Codec[Long, Long] = AsIsCodec() + + lazy val LongAsStringCodec: Codec[Long, String] = + new Codec[Long, String] { + + override def decode(domValue: String): Long = + domValue.toLong // @TODO this can throw exception. How do we handle this? + + override def encode(scalaValue: Long): String = scalaValue.toString + } + lazy val BooleanAsTrueFalseStringCodec: Codec[Boolean, String] = new Codec[Boolean, String] { diff --git a/sfs/src/main/scala/top/davidon/sfs/renderers/StringRenderer.scala b/sfs/src/main/scala/top/davidon/sfs/renderers/StringRenderer.scala new file mode 100644 index 0000000..feb75ca --- /dev/null +++ b/sfs/src/main/scala/top/davidon/sfs/renderers/StringRenderer.scala @@ -0,0 +1,33 @@ +package top.davidon.sfs.renderers + +import org.scalajs.dom +import top.davidon.sfs.dom.SFS.given +import top.davidon.sfs.dom.{Element, Renderer, Value} + +class StringRenderer extends Renderer[String] { + override def render( + elements: Element[dom.Element]* + ): String = { + elements.map(renderElement(_)).mkString("") + } + + private def renderElement(e: Element[dom.Element]): String = { + val modsStr = + e.mods.map(m => s" ${m.key.name}=\"${m.value()}\"").mkString("") + val bodyStr = e.children + .map { + case e: Element[?] => + renderElement(e) + case c: Value[?, String] => + c() + case _ => + throw Exception( + "attempted to parse child that was neither an Element or Value, this should never happen if it did its a bug" + ) + } + .mkString(" ") + s"<${e.tag.name}$modsStr>$bodyStr${ + if e.tag.void then "" else s"" + }" + } +}