aboutsummaryrefslogtreecommitdiff
path: root/doc-tool/src/dotty/tools/dottydoc/staticsite/DefaultParams.scala
blob: cc1f8862f1f18162f24bb257e83cdeaf3da3ac9d (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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package dotty.tools
package dottydoc
package staticsite

import model.{ Entity, Package, NonEntity }

import java.util.{ HashMap, List => JList, Map => JMap }
import scala.collection.JavaConverters._

case class DefaultParams(
  docs: JList[_],
  originalDocs: Map[String, Package],
  page: PageInfo,
  site: SiteInfo,
  sidebar: Sidebar,
  entity: Entity = NonEntity
) {
  import model.java._

  def toMap: Map[String, AnyRef] = Map(
    "docs" -> docs,

    "originalDocs" -> originalDocs,

    "page" -> Map(
      "url" -> page.url,
      "date" -> page.date,
      "path" -> page.path
    ),

    "site" -> Map(
      "baseurl" -> site.baseurl,
      "posts" -> site.posts.map(_.toMap),
      "project" -> site.projectTitle
    ).asJava,

    "sidebar" -> sidebar.titles.asJava,

    "entity" -> entity.asJava()
  )

  def withPosts(posts: Array[BlogPost]): DefaultParams =
    copy(site = SiteInfo(site.baseurl, site.projectTitle, posts))

  def withUrl(url: String): DefaultParams =
    copy(page = PageInfo(url))

  def withEntity(e: model.Entity) = copy(entity = e)

  def withDate(d: String) = copy(page = PageInfo(page.url, d))
}

case class PageInfo(url: String, date: String = "") {
  val path: Array[String] = url.split('/').reverse.drop(1)
}

case class SiteInfo(baseurl: String, projectTitle: String, posts: Array[BlogPost])

case class Sidebar(titles: List[Title])

object Sidebar {
  def apply(map: HashMap[String, AnyRef]): Option[Sidebar] = Option(map.get("sidebar")).map {
    case list: JList[JMap[String, AnyRef]] @unchecked if !list.isEmpty =>
      new Sidebar(list.asScala.map(Title.apply).flatMap(x => x).toList)
    case _ => Sidebar.empty
  }

  def empty: Sidebar = Sidebar(Nil)
}

case class Title(title: String, url: Option[String], subsection: List[Title])

object Title {
  def apply(map: JMap[String, AnyRef]): Option[Title] = {
    val title = Option(map.get("title")).collect {
      case s: String => s
    }
    val url = Option(map.get("url")).collect {
      case s: String => s
    }
    val subsection = Option(map.get("subsection")).collect {
      case xs: JList[JMap[String, AnyRef]] @unchecked =>
        xs.asScala.map(Title.apply).toList.flatMap(x => x)
    }.getOrElse(Nil)

    title.map {
      case title: String  => Title(title, url, subsection)
    }
  }
}