Skip to content

Commit 04235cf

Browse files
committed
Markdown preprocessor for static site
1 parent 66a5159 commit 04235cf

File tree

8 files changed

+55
-23
lines changed

8 files changed

+55
-23
lines changed

project/Build.scala

+1
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,7 @@ object Build {
329329
".*java.*::javadoc::https://docs.oracle.com/javase/8/docs/api/",
330330
"-skip-by-regex:.+\\.internal($|\\..+)",
331331
"-skip-by-regex:.+\\.impl($|\\..+)",
332+
"-format", "md",
332333
"-project-logo", "docs/logo.svg",
333334
"-social-links:" +
334335
"github::https://github.com/lampepfl/dotty," +

scaladoc/src/dotty/tools/scaladoc/Scaladoc.scala

+4-2
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ object Scaladoc:
5858
snippetCompilerDebug: Boolean = false,
5959
noLinkWarnings: Boolean = false,
6060
versionsDictionaryUrl: Option[String] = None,
61-
generateInkuire : Boolean = false
61+
generateInkuire : Boolean = false,
62+
projectFormat: String = "html",
6263
)
6364

6465
def run(args: Array[String], rootContext: CompilerContext): Reporter =
@@ -223,7 +224,8 @@ object Scaladoc:
223224
noLinkWarnings.get,
224225
snippetCompilerDebug.get,
225226
versionsDictionaryUrl.nonDefault,
226-
generateInkuire.get
227+
generateInkuire.get,
228+
projectFormat.get
227229
)
228230
(Some(docArgs), newContext)
229231
}

scaladoc/src/dotty/tools/scaladoc/ScaladocSettings.scala

+4
Original file line numberDiff line numberDiff line change
@@ -120,5 +120,9 @@ class ScaladocSettings extends SettingGroup with AllScalaSettings:
120120
val generateInkuire: Setting[Boolean] =
121121
BooleanSetting("-Ygenerate-inkuire", "Generates InkuireDB and enables Hoogle-like searches", false)
122122

123+
val projectFormat: Setting[String] =
124+
StringSetting("-format", "format of the static site output", "Format of the static site output", "html")
125+
126+
123127
def scaladocSpecificSettings: Set[Setting[_]] =
124128
Set(sourceLinks, syntax, revision, externalDocumentationMappings, socialLinks, skipById, skipByRegex, deprecatedSkipPackages, docRootContent, snippetCompiler, snippetCompilerDebug, generateInkuire)

scaladoc/src/dotty/tools/scaladoc/renderers/HtmlRenderer.scala

+9-1
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,15 @@ class HtmlRenderer(rootPackage: Member, val members: Map[DRI, Member])(using ctx
101101

102102
def renderPage(page: Page, parents: Vector[Link]): Seq[String] =
103103
val newParents = parents :+ page.link
104-
val content = renderContent(page)
104+
val content = ctx.args.projectFormat match
105+
case "html" => html(
106+
mkHead(page),
107+
body(
108+
if !page.hasFrame then renderContent(page)
109+
else mkFrame(page.link, newParents, renderContent(page))
110+
)
111+
)
112+
case "md" => renderContent(page)
105113
write(page.link.dri, content) +: page.children.flatMap(renderPage(_, newParents))
106114

107115
private def specificResources(page: Page): Set[String] =

scaladoc/src/dotty/tools/scaladoc/renderers/SiteRenderer.scala

+21-8
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,24 @@ trait SiteRenderer(using DocContext) extends Locations:
5656
else
5757
processLocalLink(str)
5858

59-
val document = Jsoup.parse(content.resolved.code)
60-
document.select("a").forEach(element =>
61-
element.attr("href", processLocalLinkWithGuard(element.attr("href")))
62-
)
63-
document.select("img").forEach { element =>
64-
element.attr("src", processLocalLink(element.attr("src")))
65-
} // foreach does not work here. Why?
66-
raw(document.outerHtml())
59+
summon[DocContext].args.projectFormat match
60+
case "html" =>
61+
val document = Jsoup.parse(content.resolved.code)
62+
document.select("a").forEach(element =>
63+
element.attr("href", processLocalLinkWithGuard(element.attr("href")))
64+
)
65+
document.select("img").forEach { element =>
66+
element.attr("src", processLocalLink(element.attr("src")))
67+
} // foreach does not work here. Why?
68+
raw(document.outerHtml())
69+
case "md" =>
70+
val links = """(?<!\\!)\[(.*)\\]\\((.*)\\)""".r
71+
val imgs = """!\\[(.*)\\]\\((.*)\\)""".r
72+
73+
raw(links.replaceAllIn(
74+
imgs.replaceAllIn(
75+
content.resolved.code,
76+
m => s"[${m.group(1)}](${processLocalLink(m.group(2))})"
77+
),
78+
m => s"[${m.group(1)}](${processLocalLinkWithGuard(m.group(2))})"
79+
))

scaladoc/src/dotty/tools/scaladoc/site/StaticSiteContext.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class StaticSiteContext(
3434
lazy val layouts: Map[String, TemplateFile] =
3535
val layoutRoot = new File(root, "_layouts")
3636
val dirs: Array[File] = Option(layoutRoot.listFiles()).getOrElse(Array())
37-
dirs.map { it => loadTemplateFile(it) }.map { it => it.name -> it }.toMap
37+
dirs.map { it => loadTemplateFile(it)(using this) }.map { it => it.name -> it }.toMap
3838

3939
lazy val sideBarConfig =
4040
val sidebarFile = root.toPath.resolve("sidebar.yml")
@@ -90,7 +90,7 @@ class StaticSiteContext(
9090
val msg = s"ERROR: Multiple index pages for $from found in ${indexes.map(_.file)}"
9191
throw new java.lang.RuntimeException(msg)
9292

93-
val templateFile = if (from.isDirectory) loadIndexPage() else loadTemplateFile(from)
93+
val templateFile = if (from.isDirectory) loadIndexPage() else loadTemplateFile(from)(using this)
9494

9595
def dateFrom(p: LoadedTemplate, default: String = "1900-01-01"): String =
9696
val pageSettings = p.templateFile.settings.get("page").collect{ case m: Map[String @unchecked, _] => m }

scaladoc/src/dotty/tools/scaladoc/site/common.scala

+7-4
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import scala.collection.JavaConverters._
2121
val docsRootDRI: DRI = DRI(location = "docs/index", symbolUUID = staticFileSymbolUUID)
2222
val apiPageDRI: DRI = DRI(location = "api/index")
2323

24-
val defaultMarkdownOptions: DataHolder =
24+
def defaultMarkdownOptions(using ctx: StaticSiteContext): DataHolder =
2525
new MutableDataSet()
2626
.setFrom(ParserEmulationProfile.COMMONMARK.getOptions)
2727
.set(AnchorLinkExtension.ANCHORLINKS_WRAP_TEXT, false)
@@ -37,7 +37,10 @@ val defaultMarkdownOptions: DataHolder =
3737
YamlFrontMatterExtension.create(),
3838
StrikethroughExtension.create(),
3939
WikiLinkExtension.create(),
40-
tasty.comments.markdown.SnippetFormattingExtension,
40+
(ctx.args.projectFormat match
41+
case "html" => tasty.comments.markdown.SnippetRenderingExtension
42+
case "md" => tasty.comments.markdown.SnippetFormattingExtension
43+
),
4144
))
4245

4346
def emptyTemplate(file: File, title: String): TemplateFile = TemplateFile(
@@ -56,9 +59,9 @@ def emptyTemplate(file: File, title: String): TemplateFile = TemplateFile(
5659
final val ConfigSeparator = "---"
5760
final val LineSeparator = "\n"
5861

59-
val yamlParser: Parser = Parser.builder(defaultMarkdownOptions).build()
62+
def yamlParser(using ctx: StaticSiteContext): Parser = Parser.builder(defaultMarkdownOptions).build()
6063

61-
def loadTemplateFile(file: File): TemplateFile = {
64+
def loadTemplateFile(file: File)(using ctx: StaticSiteContext): TemplateFile = {
6265
val lines = Files.readAllLines(file.toPath).asScala.toList
6366

6467
val (config, content) = if (lines.head == ConfigSeparator) {

scaladoc/src/dotty/tools/scaladoc/site/templates.scala

+7-6
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,12 @@ case class TemplateFile(
109109
val parsedMd = parser.parse(rendered)
110110
val processed = FlexmarkSnippetProcessor.processSnippets(parsedMd, ssctx.snippetCompilerArgs.debug, snippetCheckingFunc)(using ssctx.outerCtx)
111111

112-
Formatter.builder(defaultMarkdownOptions).build().render(processed)
112+
ssctx.args.projectFormat match
113+
case "html" => HtmlRenderer.builder(defaultMarkdownOptions).build().render(processed)
114+
case "md" => Formatter.builder(defaultMarkdownOptions).build().render(processed)
113115

114-
// HtmlRenderer.builder(defaultMarkdownOptions).build().render(processed)
115116

116-
layoutTemplate match
117-
case None => ResolvedPage(code, resources ++ ctx.resources)
118-
case Some(layoutTemplate) =>
119-
layoutTemplate.resolveInner(ctx.nest(code, file, resources))
117+
if layoutTemplate.isEmpty || ssctx.args.projectFormat == "md" then
118+
ResolvedPage(code, resources ++ ctx.resources)
119+
else
120+
layoutTemplate.get.resolveInner(ctx.nest(code, file, resources))

0 commit comments

Comments
 (0)