Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 3f6efd9

Browse files
authoredNov 13, 2020
Merge pull request #10290 from BarkingBad/blogposts
Fix handling interpolated properties
2 parents d8fc06c + 59ef0f6 commit 3f6efd9

15 files changed

+119
-56
lines changed
 
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,6 @@
1+
---
2+
layout: doc-page
3+
title: "Import Implied"
4+
---
5+
16
The contents of this page have [moved](./given-imports.md).
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,6 @@
1+
---
2+
layout: doc-page
3+
title: "Inferable-By-Name Parameters"
4+
---
5+
16
The contents of this page have [moved](./by-name-context-parameters.md).
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,6 @@
1+
---
2+
layout: doc-page
3+
title: "Inferable Params"
4+
---
5+
16
The contents of this page have [moved](./using-clauses.md).
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,6 @@
1+
---
2+
layout: doc-page
3+
title: "Givens"
4+
---
5+
16
The contents of this page have [moved](./givens.md).
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,6 @@
1+
---
2+
layout: doc-page
3+
title: "Query Types Spec"
4+
---
5+
16
The contents of this page have [moved](./context-functions-spec.md).
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,6 @@
1+
---
2+
layout: doc-page
3+
title: "Query Types"
4+
---
5+
16
The contents of this page have [moved](./context-functions.md).

‎scala3doc/src/dotty/dokka/compat.scala

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

2627
type JList[T] = java.util.List[T]
2728
type JSet[T] = java.util.Set[T]
2829
type JMap[K, V] = java.util.Map[K, V]
30+
type HMap[K, V] = java.util.HashMap[K, V]
2931

3032
type SourceSetWrapper = DokkaConfiguration$DokkaSourceSet
3133
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/StaticPageNode.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ case class StaticPageNode(
2222
) extends ContentPage:
2323
override def getDocumentable: Documentable = null
2424

25-
def title(): String = template.title()
26-
def hasFrame(): Boolean = template.hasFrame()
25+
def title(): String = template.title
26+
def hasFrame(): Boolean = template.hasFrame
2727

2828
override def modified(
2929
name: String,
@@ -38,4 +38,4 @@ case class StaticPageNode(
3838

3939
def resources(): List[String] = getContent match
4040
case p: PartiallyRenderedContent => p.resolved.resources
41-
case _ => Nil
41+
case _ => Nil

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class StaticSiteContext(val root: File, sourceSets: Set[SourceSetWrapper]):
3232
lazy val layouts: Map[String, TemplateFile] =
3333
val layoutRoot = new File(root, "_layouts")
3434
val dirs: Array[File] = Option(layoutRoot.listFiles()).getOrElse(Array())
35-
dirs.map { it => loadTemplateFile(it) }.map { it => it.name() -> it }.toMap
35+
dirs.map { it => loadTemplateFile(it) }.map { it => it.name -> it }.toMap
3636

3737
lazy val sideBarConfig =
3838
val sidebarFile = root.toPath.resolve("sidebar.yml")
@@ -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}"
@@ -111,11 +111,11 @@ class StaticSiteContext(val root: File, sourceSets: Set[SourceSetWrapper]):
111111
val path = if isBlog then "blog" else url.stripSuffix(".html") + ".md"
112112
val file = root.toPath.resolve(path) // Add support for .html files!
113113
val LoadedTemplate(template, children, tFile) = loadTemplate(file.toFile, isBlog).get // Add proper logging if file does not exisits
114-
LoadedTemplate(template.copy(settings = template.settings + ("title" -> List(title))), children, tFile)
114+
LoadedTemplate(template.copy(settings = template.settings + ("title" -> title)), children, tFile)
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)
@@ -141,9 +141,9 @@ class StaticSiteContext(val root: File, sourceSets: Set[SourceSetWrapper]):
141141
)
142142
StaticPageNode(
143143
myTemplate.templateFile,
144-
myTemplate.templateFile.title(),
144+
myTemplate.templateFile.title,
145145
content,
146146
JSet(dri),
147147
JList(),
148148
(myTemplate.children.map(templateToPage)).asJava
149-
)
149+
)

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

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

43-
def emptyTemplate(file: File): TemplateFile = TemplateFile(file, isHtml = true, "", Map())
43+
def emptyTemplate(file: File, title: String): TemplateFile = TemplateFile(
44+
file = file,
45+
isHtml = true,
46+
rawCode = "",
47+
settings = Map.empty,
48+
name = file.getName.stripSuffix(".html"),
49+
title = title,
50+
hasFrame = true,
51+
resources = List.empty,
52+
layout = None
53+
)
4454

4555
final val ConfigSeparator = "---"
4656
final val LineSeparator = "\n"
@@ -61,11 +71,43 @@ def loadTemplateFile(file: File): TemplateFile = {
6171
val yamlCollector = new AbstractYamlFrontMatterVisitor()
6272
yamlCollector.visit(configParsed)
6373

74+
def getSettingValue(k: String, v: JList[String]): String | List[String] =
75+
if v.size == 1 then v.get(0) else v.asScala.toList
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+
64101
TemplateFile(
65102
file = file,
66-
file.getName.endsWith(".html"),
103+
isHtml = isHtml,
67104
rawCode = content.mkString(LineSeparator),
68-
settings = yamlCollector.getData.asScala.toMap.transform((_, v) => v.asScala.toList)
105+
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")
69111
)
70112
}
71113

‎scala3doc/src/dotty/dokka/site/processors.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class SiteResourceManager(ctx: Option[StaticSiteContext]) extends BaseStaticSite
4444
val modified = input.transformContentPagesTree {
4545
case it: StaticPageNode =>
4646
it.copy(getEmbeddedResources =
47-
if it.template.hasFrame() then it.getEmbeddedResources ++ it.resources().asJava
47+
if it.template.hasFrame then it.getEmbeddedResources ++ it.resources().asJava
4848
else it.resources().asJava
4949
)
5050
case it => it

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

Lines changed: 27 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,16 @@ 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-
1918
import scala.collection.JavaConverters._
19+
2020
import scala.io.Source
2121

2222
case class RenderingContext(
23-
properties: Map[String, Object],
24-
layouts: Map[String, TemplateFile] = Map(),
25-
resolving: Set[String] = Set(),
26-
resources: List[String] = Nil
27-
):
23+
properties: Map[String, Object],
24+
layouts: Map[String, TemplateFile] = Map(),
25+
resolving: Set[String] = Set(),
26+
resources: List[String] = Nil
27+
):
2828

2929
def nest(code: String, file: File, resources: List[String]) =
3030
copy(
@@ -33,8 +33,7 @@ case class RenderingContext(
3333
resources = this.resources ++ resources
3434
)
3535

36-
case class ResolvedPage(val code: String, val resources: List[String] = Nil)
37-
36+
case class ResolvedPage(code: String, resources: List[String] = Nil)
3837
/**
3938
* case class for the template files.
4039
* Template file is a file `.md` or `.html` handling settings.
@@ -44,52 +43,42 @@ case class ResolvedPage(val code: String, val resources: List[String] = Nil)
4443
* @param settings The config defined in the begging of the file, between the pair of `---` (e.g. layout: basic).
4544
*/
4645
case class TemplateFile(
47-
val file: File,
48-
val isHtml: Boolean,
49-
val rawCode: String,
50-
val settings: Map[String, List[String]]
51-
):
52-
53-
private def stringSetting(name: String): Option[String] =
54-
settings.get(name) map {
55-
case List(single) => single.stripPrefix("\"").stripSuffix("\"")
56-
case nonSingle =>
57-
throw new RuntimeException(s"Setting $name is a not a singlel-ement list but $nonSingle")
58-
}
59-
60-
61-
private def listSetting(name: String): List[String] = settings.getOrElse(name, Nil)
62-
63-
def name(): String = stringSetting("name").getOrElse(file.getName.stripSuffix(if (isHtml) ".html" else ".md"))
64-
65-
def title(): String = stringSetting("title").getOrElse(name())
66-
67-
def layout(): Option[String] = stringSetting("layout")
68-
69-
def hasFrame(): Boolean = !stringSetting("hasFrame").contains("false")
70-
46+
file: File,
47+
isHtml: Boolean,
48+
rawCode: String,
49+
settings: Map[String, Object],
50+
name: String,
51+
title: String,
52+
hasFrame: Boolean,
53+
resources: List[String],
54+
layout: Option[String],
55+
):
7156
def isIndexPage() = file.isFile && (file.getName == "index.md" || file.getName == "index.html")
7257

73-
def resolveToHtml(ctx: StaticSiteContext): ResolvedPage =
74-
val props = Map("page" -> JMap("title" -> title()))
75-
resolveInner(RenderingContext(props, ctx.layouts))
58+
def resolveToHtml(ctx: StaticSiteContext): ResolvedPage = resolveInner(RenderingContext(settings, ctx.layouts))
7659

7760
private[site] def resolveInner(ctx: RenderingContext): ResolvedPage =
7861
if (ctx.resolving.contains(file.getAbsolutePath))
7962
throw new RuntimeException(s"Cycle in templates involving $file: ${ctx.resolving}")
8063

81-
val layoutTemplate = layout().map(name =>
64+
val layoutTemplate = layout.map(name =>
8265
ctx.layouts.getOrElse(name, throw new RuntimeException(s"No layouts named $name in ${ctx.layouts}")))
8366

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
73+
8474
// Library requires mutable maps..
85-
val mutableProperties = new java.util.HashMap[String, Object](ctx.properties.asJava)
75+
val mutableProperties = HMap(ctx.properties.transform(asJavaElement).asJava)
8676
val rendered = Template.parse(this.rawCode).render(mutableProperties)
8777
// We want to render markdown only if next template is html
8878
val code = if (isHtml || layoutTemplate.exists(!_.isHtml)) rendered else
8979
val parser: Parser = Parser.builder().build()
9080
HtmlRenderer.builder(defaultMarkdownOptions).build().render(parser.parse(rendered))
9181

92-
val resources = listSetting("extraCSS") ++ listSetting("extraJS")
9382
layoutTemplate match
9483
case None => ResolvedPage(code, resources ++ ctx.resources)
9584
case Some(layoutTemplate) =>

‎scala3doc/src/dotty/renderers/ScalaHtmlRenderer.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ class ScalaHtmlRenderer(ctx: DokkaContext) extends HtmlRenderer(ctx) {
265265
override def buildHtml(page: PageNode, resources: JList[String], kotlinxContent: FlowContentConsumer): String =
266266
val (pageTitle, noFrame) = page match
267267
case static: StaticPageNode =>
268-
(static.template.title(), !static.hasFrame())
268+
(static.template.title, !static.hasFrame())
269269
case _ =>
270270
(page.getName, false)
271271

‎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)
Please sign in to comment.