--- a/build.sc Thu Jan 17 14:51:59 2019 +0100
+++ b/build.sc Thu Jan 17 18:24:38 2019 +0100
@@ -66,6 +66,70 @@
super.sources() :+ PathRef(millSourcePath / 'shared / 'src / 'main / 'scala)
}
+ // https://github.com/FortAwesome/Font-Awesome/raw/5.6.3/metadata/icons.json
+ type IcoDef = (String, Set[String])
+ def parseIcons: Target[List[IcoDef]] = T{
+ ujson.read(os.read! pwd / "icons.json").obj.map(e => (e._1, e._2.obj("styles").arr.map(_.str).toSet)).toList
+ }
+
+ private def tpl(d: IcoDef): String = {
+ val sym = d._1 match {
+ //case "clone" => "clone_"
+ case x => x
+ }
+ d._2.map {
+ case "brands" => s""" val `fab-$sym`: T = fab("${d._1}")\n"""
+ case "solid" => s""" val `fas-$sym`: T = fas("${d._1}")\n"""
+ case "regular" => s""" val `far-$sym`: T = far("${d._1}")\n"""
+ }.mkString
+ }
+
+ override def generatedSources: Sources = T.sources{
+ val d = T.ctx().dest
+ val icons = parseIcons()
+ write(d / "generated.scala",
+ s"""
+ | package fontawesome.generic
+ | import scalatags.generic._
+ | class GenericFA[Builder, Output <: FragT, FragT](
+ | val bun: Bundle[Builder, Output, FragT]) {
+ |
+ | import bun.all._
+ |
+ | type T = FA[Builder, Output, FragT]
+ |
+ | val faStack: Modifier = cls := "fa-stack fa-lg"
+ |
+ | implicit val bundle: Bundle[Builder, Output, FragT] = bun
+ | implicit def fa2tag(x: T): TypedTag[Builder, Output, FragT] = x()
+ |
+ | private def fab(w: String): T = FA(FaStyle.Brands, w)
+ | private def far(w: String): T = FA(FaStyle.Regular, w)
+ | private def fas(w: String): T = FA(FaStyle.Solid, w)
+ |
+ | ${icons map(tpl) mkString}
+ |
+ | /*
+ | object fab {
+ | private def fa(w: String): T = FA(FaStyle.Brands, w)
+ | {icons.filter(_._2.contains("brands")).map(tpl).mkString}
+ | }
+ |
+ | object fas {
+ | private def fa(w: String): T = FA(FaStyle.Solid, w)
+ | {icons.filter(_._2.contains("solid")).map(tpl).mkString}
+ | }
+ |
+ | object far {
+ | private def fa(w: String): T = FA(FaStyle.Regular, w)
+ | {icons.filter(_._2.contains("regular")).map(tpl).mkString}
+ | }
+ | */
+ |
+ | }
+ """.stripMargin)
+ d
+ }
}
class JvmModule(val crossScalaVersion: String) extends Common
@@ -85,9 +149,18 @@
}
object example extends ScalaModule with ScalaJSModule {
- override def moduleDeps: Seq[PublishModule] = Seq(js(V.scala212))
override def scalaVersion: Target[String] = T{V.scala212}
override def scalaJSVersion: Target[String] = V.scalaJs
+
+
+ /* Ugly hack to prevent
+ * "Referring to non-existent method fontawesome.generic.FA... error"
+ */
+ //override def moduleDeps: Seq[PublishModule] = Seq(js(V.scala212))
+ override def ivyDeps: Target[Loose.Agg[Dep]] = Agg(D.scalatags)
+ override def sources: Sources = T.sources{super.sources() ++ js(V.scala212).sources()}
+ override def generatedSources = T{js(V.scala212).generatedSources()}
}
+
// vim: et ts=2 sw=2 syn=scala