404
+ |Page Not Found
+ |+ | Sorry, the page you were looking for does not exist + |
+ | + |diff --git a/site/src/main/scala/org/typelevel/sbt/site/GenericSiteSettings.scala b/site/src/main/scala/org/typelevel/sbt/site/GenericSiteSettings.scala index ba09ab6e..b4771f0c 100644 --- a/site/src/main/scala/org/typelevel/sbt/site/GenericSiteSettings.scala +++ b/site/src/main/scala/org/typelevel/sbt/site/GenericSiteSettings.scala @@ -33,9 +33,11 @@ import org.typelevel.sbt.TypelevelGitHubPlugin.gitHubUserRepo import org.typelevel.sbt.TypelevelKernelPlugin.autoImport.tlIsScala3 import org.typelevel.sbt.TypelevelSitePlugin.autoImport.tlSiteApiUrl import sbt.Def._ +import sbt.Keys.baseDirectory import sbt.Keys.developers import sbt.Keys.scmInfo import sbt.Keys.version +import sbt._ import java.net.URL @@ -50,13 +52,26 @@ object GenericSiteSettings { } val themeExtensions: Initialize[ThemeProvider] = setting { + + val rootDir = (ThisBuild / baseDirectory).value + val docsDir = rootDir / "docs" + val userProvided404 = (docsDir / "404.md").exists() || (docsDir / "404.html").exists() + new ThemeProvider { def build[F[_]](implicit F: Async[F]): Resource[F, Theme[F]] = ThemeBuilder[F]("sbt-typelevel-site Helium Extensions") .addInputs( - tlSiteApiUrl.value.fold(InputTree[F]) { url => - InputTree[F].addString(htmlForwarder(url), Path.Root / "api" / "index.html") - } + tlSiteApiUrl + .value + .fold(InputTree[F]) { url => + InputTree[F].addString(htmlForwarder(url), Path.Root / "api" / "index.html") + } + .merge( + if (userProvided404) + InputTree[F] + else + InputTree[F].addString(default404Html, Path.Root / "404.html") + ) ) .addExtensions( GitHubFlavor, @@ -85,6 +100,31 @@ object GenericSiteSettings { ) } + private val default404Html: String = + """| + | + |
+ | + | + |+ | Sorry, the page you were looking for does not exist + |
+ | + |