example/src/sqwl/cms/Content.scala
author Tomas Zeman <tzeman@volny.cz>
Tue, 11 Dec 2018 21:33:20 +0100
changeset 16 4556852613a9
parent 15 1e1b0a1a4d63
child 17 0ebcd5464503
permissions -rw-r--r--
Scalatex based article implementation


package sqwl.cms

import java.nio.file.{FileSystems, Path, Paths}

import akka.stream.scaladsl.FileIO
import enumeratum.EnumEntry.Hyphencase
import enumeratum._
import scala.io.Source
import scalatags.Text.all._

sealed abstract class Category(val name: String) extends EnumEntry with
  iCategory with Hyphencase {
  override def pathSegment: String = entryName
}

object Category extends Enum[Category] {
  val values = findValues
  case object Cat1 extends Category("Category 1")
  case object Cat2 extends Category("Category 2")
  case object Cat3 extends Category("Category 3")
  case object Cat4 extends Category("Category 4")
  case object Cat5 extends Category("Category 5")
  case object Cat6 extends Category("Category 6")
}

sealed abstract class Tag(val name: String) extends EnumEntry with iTag
  with Hyphencase {
  override def pathSegment: String = entryName
}

object Tag extends Enum[Tag] {
  val values = findValues
  case object Tag1 extends Tag("Tag 1")
  case object Tag2 extends Tag("Tag 2")
  case object Tag3 extends Tag("Tag 3")
  case object Tag4 extends Tag("Tag 4")
  case object Tag5 extends Tag("Tag 5")
  case object Tag6 extends Tag("Tag 6")
}

sealed abstract class Article(val title: String,
  val category: Option[iCategory],
  val tags: Seq[iTag] = Seq(),
  val tex: Option[SeqFrag[Frag]] = None
) extends EnumEntry with ScalatexOrFsArticle with Hyphencase {

  override protected def content: Either[Path, SeqFrag[Frag]] = tex match {
    case Some(v) => Right(v)
    case _ =>
      Left(Paths.get(s"example/content/${entryName}.html"))
  }

  override def assets: Path = Paths.get(s"example/content/${entryName}")
  override def pathSegment: String = entryName
}

object Article extends Enum[Article] {
  import Category._
  import  Tag._
  val values = findValues
  case object A1 extends Article("Article 1", Some(Cat1),
    Seq(Tag1, Tag2, Tag3))
  case object A2 extends Article("Article 2", Some(Cat1))
  case object A3 extends Article("Article 3", Some(Cat1),
    Seq(Tag4, Tag5))
  case object A4 extends Article("Article 4", Some(Cat2), Seq(Tag4))
  case object A5 extends Article("Article 5", Some(Cat2), Seq(Tag5))
  import scalatex._
  case object A6 extends Article("Article 6", Some(Cat1),
    Seq(Tag1), Some(twf("example/content/a6.scalatex")))
}

object Content extends iContent {

  def appTitle: String = "Content management system example"

  def appTitleShort: String = "CMS"

  def icon =
    ("icon.png", Paths.get("example/content/public/images/icon.png"))

  def publicAssets: Path = Paths.get("example/content/public")

  def styleSheet =
    ("site.css", Paths.get("example/content/public/css/site.css"))

  def articlesByTag(t: iTag): Seq[iArticle] =
    Article.values.filter(_.tags contains(t))

  def articlesByCategory(c: iCategory): Seq[iArticle] =
    Article.values.filter(_.category contains(c))

  def tags: Seq[iTag] = Tag.values

  def categories: Seq[iCategory] = Category.values

  def articleByPath(path: String): Option[iArticle] =
    Article.withNameOption(path)

  def categoryByPath(path: String): Option[iCategory] =
    Category.withNameOption(path)

  def tagByPath(path: String): Option[iTag] = Tag.withNameOption(path)
}