diff -r 529418651908 -r 175e7d7ce5b3 build.sc --- 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