aboutsummaryrefslogtreecommitdiff
path: root/doc-tool/src/dotty/tools/dottydoc/staticsite/BlogPost.scala
blob: f68157e40743a672d0e6a581bb09e5617df3cf31 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package dotty.tools
package dottydoc
package staticsite

import java.io.{ File => JFile }
import java.util.{ List => JList, Map => JMap }

import dotc.config.Printers.dottydoc

import MapOperations._

/**
 *  A `BlogPost` represents the parsed posts from `./blog/_posts/`
 *  each post must be named according to the format
 *  `YYYY-MM-DD-title.{md,html}`
 */
class BlogPost(
  val title: String,
  val url: String,
  val date: String,
  val content: String,
  firstParagraph: String,
  val excerpt_separator: Option[String],
  val categories: JList[String]
) {
  import scala.collection.JavaConverters._
  lazy val excerpt: String = excerpt_separator match {
    case Some(str) => content.split(str).head
    case _ => firstParagraph
  }

  lazy val toMap: JMap[String, AnyRef] = Map(
    "title" -> title,
    "date" -> date,
    "url" -> url,
    "excerpt" -> excerpt,
    "excerpt_separator" -> excerpt_separator.getOrElse(""),
    "content" -> content,
    "categories" -> categories
  ).asJava
}

object BlogPost {
  val extract = """(\d\d\d\d)-(\d\d)-(\d\d)-(.*)\.(md|html)""".r
  def apply(file: JFile, page: Page): BlogPost = {
    def report(key: String, fallback: String = "") = {
      /*dottydoc.*/println(s"couldn't find page.$key in ${file.getName}")
      fallback
    }

    // Relying on the person using this class to pass a valid `file`
    val extract(year, month, day, name, _) = file.getName
    val title = page.yaml.getString("title").getOrElse(report("title", name))
    val url = page.yaml.getString("url").getOrElse(report("url"))
    val date = page.yaml.getString("date").getOrElse(s"$year-$month-$day 00:00:00")
    val excerptSep = page.yaml.getString("excerpt_separator")
    val categories = page.yaml.list("categories")

    new BlogPost(title, url, date, page.html, page.firstParagraph, excerptSep, categories)
  }
}