example/src/sqwl/cms/Content.scala
author Tomas Zeman <tzeman@volny.cz>
Thu, 06 Dec 2018 16:18:26 +0100
changeset 13 216da61215db
parent 12 e7512f9dc903
child 15 1e1b0a1a4d63
permissions -rw-r--r--
Implemented tags
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     1
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     2
package sqwl.cms
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     3
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     4
import java.nio.file.{FileSystems, Path, Paths}
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     5
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     6
import akka.stream.scaladsl.FileIO
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     7
import enumeratum.EnumEntry.Hyphencase
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     8
import enumeratum._
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     9
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    10
import scala.io.Source
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    11
10
4b5313097a4d Added example content articles, categories
Tomas Zeman <tzeman@volny.cz>
parents: 9
diff changeset
    12
sealed abstract class Category(val name: String) extends EnumEntry with
4b5313097a4d Added example content articles, categories
Tomas Zeman <tzeman@volny.cz>
parents: 9
diff changeset
    13
  iCategory with Hyphencase {
4
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    14
  override def pathSegment: String = entryName
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    15
}
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    16
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    17
object Category extends Enum[Category] {
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    18
  val values = findValues
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    19
  case object Cat1 extends Category("Category 1")
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    20
  case object Cat2 extends Category("Category 2")
10
4b5313097a4d Added example content articles, categories
Tomas Zeman <tzeman@volny.cz>
parents: 9
diff changeset
    21
  case object Cat3 extends Category("Category 3")
4b5313097a4d Added example content articles, categories
Tomas Zeman <tzeman@volny.cz>
parents: 9
diff changeset
    22
  case object Cat4 extends Category("Category 4")
4b5313097a4d Added example content articles, categories
Tomas Zeman <tzeman@volny.cz>
parents: 9
diff changeset
    23
  case object Cat5 extends Category("Category 5")
4b5313097a4d Added example content articles, categories
Tomas Zeman <tzeman@volny.cz>
parents: 9
diff changeset
    24
  case object Cat6 extends Category("Category 6")
4
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    25
}
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    26
13
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    27
sealed abstract class Tag(val name: String) extends EnumEntry with iTag
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    28
  with Hyphencase {
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    29
  override def pathSegment: String = entryName
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    30
}
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    31
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    32
object Tag extends Enum[Tag] {
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    33
  val values = findValues
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    34
  case object Tag1 extends Tag("Tag 1")
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    35
  case object Tag2 extends Tag("Tag 2")
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    36
  case object Tag3 extends Tag("Tag 3")
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    37
  case object Tag4 extends Tag("Tag 4")
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    38
  case object Tag5 extends Tag("Tag 5")
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    39
  case object Tag6 extends Tag("Tag 6")
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    40
}
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    41
4
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    42
sealed abstract class Article(val title: String,
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    43
  val category: Option[iCategory],
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    44
  val tags: Seq[iTag],
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    45
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    46
) extends EnumEntry with iArticle with Hyphencase {
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    47
  override def htmlContent: String = {
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    48
    val src = Source.fromFile(s"example/content/${entryName}.html", "UTF-8")
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    49
    try {
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    50
      src.getLines.mkString
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    51
    } catch {
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    52
      case _: Throwable => ""
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    53
    } finally {
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    54
      src.close()
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    55
    }
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    56
  }
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    57
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    58
  override def assets: Path = Paths.get(s"example/content/${entryName}")
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    59
  override def pathSegment: String = entryName
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    60
}
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    61
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    62
object Article extends Enum[Article] {
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    63
  import Category._
13
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    64
  import  Tag._
4
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    65
  val values = findValues
13
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    66
  case object A1 extends Article("Article 1", Some(Cat1),
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    67
    Seq(Tag1, Tag2, Tag3))
10
4b5313097a4d Added example content articles, categories
Tomas Zeman <tzeman@volny.cz>
parents: 9
diff changeset
    68
  case object A2 extends Article("Article 2", Some(Cat1), Seq())
13
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    69
  case object A3 extends Article("Article 3", Some(Cat1),
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    70
    Seq(Tag4, Tag5))
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    71
  case object A4 extends Article("Article 4", Some(Cat2), Seq(Tag4))
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    72
  case object A5 extends Article("Article 5", Some(Cat2), Seq(Tag5))
4
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    73
}
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    74
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    75
object Content extends iContent {
13
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    76
9
7d5ed4c927ce Content cleanup
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    77
  def appTitle: String = "Content management system example"
13
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    78
9
7d5ed4c927ce Content cleanup
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    79
  def appTitleShort: String = "CMS"
13
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    80
10
4b5313097a4d Added example content articles, categories
Tomas Zeman <tzeman@volny.cz>
parents: 9
diff changeset
    81
  def icon =
4b5313097a4d Added example content articles, categories
Tomas Zeman <tzeman@volny.cz>
parents: 9
diff changeset
    82
    ("icon.png", Paths.get("example/content/public/images/icon.png"))
13
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    83
7
50a354e5bda4 Content parametrizing
Tomas Zeman <tzeman@volny.cz>
parents: 4
diff changeset
    84
  def publicAssets: Path = Paths.get("example/content/public")
13
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    85
10
4b5313097a4d Added example content articles, categories
Tomas Zeman <tzeman@volny.cz>
parents: 9
diff changeset
    86
  def styleSheet =
4b5313097a4d Added example content articles, categories
Tomas Zeman <tzeman@volny.cz>
parents: 9
diff changeset
    87
    ("site.css", Paths.get("example/content/public/css/site.css"))
13
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    88
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    89
  def articlesByTag(t: iTag): Seq[iArticle] =
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    90
    Article.values.filter(_.tags contains(t))
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    91
12
e7512f9dc903 Layout: categories, articles, primary view
Tomas Zeman <tzeman@volny.cz>
parents: 10
diff changeset
    92
  def articlesByCategory(c: iCategory): Seq[iArticle] =
e7512f9dc903 Layout: categories, articles, primary view
Tomas Zeman <tzeman@volny.cz>
parents: 10
diff changeset
    93
    Article.values.filter(_.category contains(c))
13
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    94
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    95
  def tags: Seq[iTag] = Tag.values
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    96
4
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    97
  def categories: Seq[iCategory] = Category.values
13
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
    98
10
4b5313097a4d Added example content articles, categories
Tomas Zeman <tzeman@volny.cz>
parents: 9
diff changeset
    99
  def articleByPath(path: String): Option[iArticle] =
4b5313097a4d Added example content articles, categories
Tomas Zeman <tzeman@volny.cz>
parents: 9
diff changeset
   100
    Article.withNameOption(path)
13
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
   101
10
4b5313097a4d Added example content articles, categories
Tomas Zeman <tzeman@volny.cz>
parents: 9
diff changeset
   102
  def categoryByPath(path: String): Option[iCategory] =
4b5313097a4d Added example content articles, categories
Tomas Zeman <tzeman@volny.cz>
parents: 9
diff changeset
   103
    Category.withNameOption(path)
13
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
   104
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 12
diff changeset
   105
  def tagByPath(path: String): Option[iTag] = Tag.withNameOption(path)
4
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   106
}