Skip to content

Commit 59ef0f6

Browse files
committed
Apply requested changes, remove componion object of TemplateFile
1 parent 590f939 commit 59ef0f6

File tree

6 files changed

+56
-60
lines changed

6 files changed

+56
-60
lines changed

scala3doc/src/dotty/dokka/compat.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@ def JList[T](e: T*): JList[T] = e.asJava
2020
def JSet[T](e: T*): JSet[T] = e.toSet.asJava
2121
def JMap[K, V](e: (K, V)*): JMap[K, V] = e.toMap.asJava
2222
def JMap2[K, V](): JMap[K, V] = ??? // e.toMap.asJava
23+
def newHMap[K, V](m: JMap[K, V]): HMap[K, V] = new HMap[K, V](m)
2324

2425
type JList[T] = java.util.List[T]
2526
type JSet[T] = java.util.Set[T]
2627
type JMap[K, V] = java.util.Map[K, V]
28+
type HMap[K, V] = java.util.HashMap[K, V]
2729

2830
type SourceSetWrapper = DokkaConfiguration$DokkaSourceSet
2931
type DokkaSourceSet = DokkaConfiguration.DokkaSourceSet

scala3doc/src/dotty/dokka/site/SidebarParser.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,4 @@ object Sidebar:
3232
val mapper = ObjectMapper(YAMLFactory())
3333
val raw = mapper.readValue(content, RawTypeRef)
3434

35-
raw.get("sidebar").asScala.toList.map(toSidebar)
35+
raw.get("sidebar").asScala.toList.map(toSidebar)

scala3doc/src/dotty/dokka/site/StaticSiteContext.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ class StaticSiteContext(val root: File, sourceSets: Set[SourceSetWrapper]):
8282
def loadIndexPage(): TemplateFile =
8383
val indexFiles = from.listFiles { file =>file.getName == "index.md" || file.getName == "index.html" }
8484
indexFiles.size match
85-
case 0 => emptyTemplate(from)
85+
case 0 => emptyTemplate(from, from.getName)
8686
case 1 => loadTemplateFile(indexFiles.head).copy(file = from)
8787
case _ =>
8888
val msg = s"ERROR: Multiple index pages found under ${from.toPath}"
@@ -115,7 +115,7 @@ class StaticSiteContext(val root: File, sourceSets: Set[SourceSetWrapper]):
115115
case Sidebar.Category(title, nested) =>
116116
// Add support for index.html/index.md files!
117117
val fakeFile = new File(root, title)
118-
LoadedTemplate(emptyTemplate(fakeFile), nested.map(loadSidebarContent), fakeFile)
118+
LoadedTemplate(emptyTemplate(fakeFile, title), nested.map(loadSidebarContent), fakeFile)
119119

120120
private def loadAllFiles() =
121121
def dir(name: String)= List(new File(root, name)).filter(_.isDirectory)

scala3doc/src/dotty/dokka/site/common.scala

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,16 @@ val defaultMarkdownOptions: DataHolder =
4040
"https://github.global.ssl.fastly.net/images/icons/emoji/"
4141
)
4242

43-
def emptyTemplate(file: File): TemplateFile = TemplateFile(
43+
def emptyTemplate(file: File, title: String): TemplateFile = TemplateFile(
4444
file = file,
4545
isHtml = true,
4646
rawCode = "",
47-
settings = Map.empty
47+
settings = Map.empty,
48+
name = file.getName.stripSuffix(".html"),
49+
title = title,
50+
hasFrame = true,
51+
resources = List.empty,
52+
layout = None
4853
)
4954

5055
final val ConfigSeparator = "---"
@@ -66,19 +71,43 @@ def loadTemplateFile(file: File): TemplateFile = {
6671
val yamlCollector = new AbstractYamlFrontMatterVisitor()
6772
yamlCollector.visit(configParsed)
6873

69-
extension (v: java.util.List[String]) def getSettingValue: String | List[String] =
74+
def getSettingValue(k: String, v: JList[String]): String | List[String] =
7075
if v.size == 1 then v.get(0) else v.asScala.toList
7176

72-
val globalKeys = Set("extraJS", "extraCSS", "layout", "hasFrame")
73-
val (global, inner) = yamlCollector.getData.asScala.toMap.transform((_, v) => v.getSettingValue)
74-
.partition((k,_) => globalKeys.contains(k))
75-
val settings = global ++ Map("page" -> inner)
76-
77+
val globalKeys = Set("extraJS", "extraCSS", "layout", "hasFrame", "name")
78+
val allSettings = yamlCollector.getData.asScala.toMap.transform(getSettingValue)
79+
val (global, inner) = allSettings.partition((k,_) => globalKeys.contains(k))
80+
val settings = Map("page" -> inner)
81+
82+
def stringSetting(settings: Map[String, Object], name: String): Option[String] = settings.get(name).map {
83+
case List(elem: String) => elem
84+
case elem: String => elem
85+
case other => throw new RuntimeException(s"Expected a string setting for $name in $file but got $other")
86+
}.map(_.stripPrefix("\"").stripSuffix("\""))
87+
88+
def listSetting(settings: Map[String, Object], name: String): Option[List[String]] = settings.get(name).map {
89+
case elems: List[_] => elems.zipWithIndex.map {
90+
case (s: String, _) => s
91+
case (other, index) =>
92+
throw new RuntimeException(s"Expected a string at index $index for $name in $file but got $other")
93+
}
94+
case elem: String => List(elem)
95+
case other => throw new RuntimeException(s"Expected a list of string setting for $name in $file but got $other")
96+
}
97+
98+
val isHtml = file.getName.endsWith(".html")
99+
val name = stringSetting(allSettings, "name").getOrElse(file.getName.stripSuffix(if (isHtml) ".html" else ".md"))
100+
77101
TemplateFile(
78102
file = file,
79-
isHtml = file.getName.endsWith(".html"),
103+
isHtml = isHtml,
80104
rawCode = content.mkString(LineSeparator),
81105
settings = settings,
106+
name = name,
107+
title = stringSetting(allSettings, "title").getOrElse(name),
108+
hasFrame = !stringSetting(allSettings, "hasFrame").contains("false"),
109+
resources = (listSetting(allSettings, "extraCSS") ++ listSetting(allSettings, "extraJS")).flatten.toList,
110+
layout = stringSetting(allSettings, "layout")
82111
)
83112
}
84113

scala3doc/src/dotty/dokka/site/templates.scala

Lines changed: 10 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,12 @@ import com.vladsch.flexmark.parser.{Parser, ParserEmulationProfile}
1515
import com.vladsch.flexmark.util.options.{DataHolder, MutableDataSet}
1616
import com.vladsch.flexmark.html.HtmlRenderer
1717
import liqp.Template
18-
import java.util.{ Map => JMap, HashMap => HMap, ArrayList, Collection }
19-
2018
import scala.collection.JavaConverters._
19+
2120
import scala.io.Source
2221

2322
case class RenderingContext(
24-
properties: Map[String, Element],
23+
properties: Map[String, Object],
2524
layouts: Map[String, TemplateFile] = Map(),
2625
resolving: Set[String] = Set(),
2726
resources: List[String] = Nil
@@ -35,7 +34,6 @@ case class RenderingContext(
3534
)
3635

3736
case class ResolvedPage(code: String, resources: List[String] = Nil)
38-
type Element = String | List[String] | Object // Object represents Map[String, Element] since it is not possible to get circullar dependency
3937
/**
4038
* case class for the template files.
4139
* Template file is a file `.md` or `.html` handling settings.
@@ -48,7 +46,7 @@ case class TemplateFile(
4846
file: File,
4947
isHtml: Boolean,
5048
rawCode: String,
51-
settings: Map[String, Element],
49+
settings: Map[String, Object],
5250
name: String,
5351
title: String,
5452
hasFrame: Boolean,
@@ -66,13 +64,15 @@ case class TemplateFile(
6664
val layoutTemplate = layout.map(name =>
6765
ctx.layouts.getOrElse(name, throw new RuntimeException(s"No layouts named $name in ${ctx.layouts}")))
6866

69-
def toJava(m: Any): Any = m match
70-
case sm: Map[_, _] => sm.map(kv => (kv._1, toJava(kv._2))).asJava
71-
case sl: Iterable[_] => new ArrayList(sl.map( toJava ).asJava.asInstanceOf[Collection[_]])
72-
case _ => m
67+
def asJavaElement(k: String, v: Object): Object = v match
68+
case m: Map[_, _] => m.transform {
69+
case (k: String, v: Object) => asJavaElement(k, v)
70+
}.asJava
71+
case l: List[_] => l.asJava
72+
case other => other
7373

7474
// Library requires mutable maps..
75-
val mutableProperties = new HMap[String, Object](toJava(ctx.properties).asInstanceOf[JMap[String, Object]])
75+
val mutableProperties = HMap(ctx.properties.transform(asJavaElement).asJava)
7676
val rendered = Template.parse(this.rawCode).render(mutableProperties)
7777
// We want to render markdown only if next template is html
7878
val code = if (isHtml || layoutTemplate.exists(!_.isHtml)) rendered else
@@ -83,38 +83,3 @@ case class TemplateFile(
8383
case None => ResolvedPage(code, resources ++ ctx.resources)
8484
case Some(layoutTemplate) =>
8585
layoutTemplate.resolveInner(ctx.nest(code, file, resources))
86-
87-
object TemplateFile:
88-
extension (settings: Map[String, Element]):
89-
private def stringSetting(name: String): Option[String] = settings.getOrElse(name, null).match {
90-
case List(elem: String) => Some(elem)
91-
case elem: String => Some(elem)
92-
case _ => None
93-
}.map(_.stripPrefix("\"").stripSuffix("\""))
94-
95-
private def listSetting(name: String): Option[List[String]] = settings.getOrElse(name, null).match {
96-
case elem: List[_] => Some(elem.asInstanceOf[List[String]])
97-
case elem: String => Some(List(elem))
98-
case _ => None
99-
}
100-
101-
def apply(
102-
file: File,
103-
isHtml: Boolean,
104-
rawCode: String,
105-
settings: Map[String, Element],
106-
): TemplateFile = {
107-
val name = settings.stringSetting("name").getOrElse(file.getName.stripSuffix(if (isHtml) ".html" else ".md"))
108-
109-
TemplateFile(
110-
file = file,
111-
isHtml,
112-
rawCode = rawCode,
113-
settings = settings,
114-
name = name,
115-
title = settings.getOrElse("page", settings).asInstanceOf[Map[String, Object]].stringSetting("title").getOrElse(name),
116-
hasFrame = !settings.stringSetting("hasFrame").contains("false"),
117-
resources = (settings.listSetting("extraCSS") ++ settings.listSetting("extraJS")).flatten.toList,
118-
layout = settings.stringSetting("layout")
119-
)
120-
}

scala3doc/test/dotty/dokka/site/TemplateFileTests.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class TemplateFileTests:
2626
else
2727
val (code, ext) = remaining.head
2828
testTemplate(code, ext) { template =>
29-
val newCtx = ctx.copy(layouts = ctx.layouts + (template.name() -> template))
29+
val newCtx = ctx.copy(layouts = ctx.layouts + (template.name -> template))
3030
rec(newCtx, remaining.drop(1))
3131
}
3232

@@ -41,7 +41,7 @@ class TemplateFileTests:
4141
|code""".stripMargin
4242
) { t =>
4343
assertEquals(t.rawCode, "code")
44-
assertEquals(t.title(), "myTitle")
44+
assertEquals(t.title, "myTitle")
4545
}
4646

4747

@@ -243,4 +243,4 @@ class TemplateFileTests:
243243
testContent(
244244
html,
245245
Map(),
246-
List(base -> "html", content -> "html"))
246+
List(base -> "html", content -> "html"))

0 commit comments

Comments
 (0)