diff --git a/build.sbt b/build.sbt index cbbd30c..5e36df0 100644 --- a/build.sbt +++ b/build.sbt @@ -42,7 +42,15 @@ libraryDependencies ++= { (scalaBinaryVersion in pluginCrossBuild).value ) ) - } else Nil + } else { + Seq( + Defaults.sbtPluginExtra( + "org.planet42" % "laika-sbt" % "0.7.5", + (sbtBinaryVersion in pluginCrossBuild).value, + (scalaBinaryVersion in pluginCrossBuild).value + ) + ) + } } enablePlugins(ParadoxSitePlugin, ParadoxMaterialThemePlugin) diff --git a/notes/1.3.2.markdown b/notes/1.3.2.markdown index f3c111d..2fc22a3 100644 --- a/notes/1.3.2.markdown +++ b/notes/1.3.2.markdown @@ -6,9 +6,12 @@ See the [1.3.2 milestone] for the full list of related tickets and PRs. 1. Bump sbt to 0.13.17 and 1.0.4. [#123] ([@jonas]) 2. Bump Paradox to version [0.3.2][paradox-0.3.2]. ([@jonas]) +3. Port Laika site plugin to sbt 1.x. [#121] ([@rhpvorderman]) [1.3.2 milestone]: https://github.com/sbt/sbt-site/milestone/6 +[#121]: https://github.com/sbt/sbt-site/pull/121 [#123]: https://github.com/sbt/sbt-site/pull/123 [paradox-0.3.2]: https://github.com/lightbend/paradox/releases/tag/v0.3.2 [@jonas]: https://github.com/jonas +[@rhpvorderman]: http://github.com/rhpvorderman diff --git a/src/main/paradox/generators/laika.md b/src/main/paradox/generators/laika.md index 8626d96..dddab80 100644 --- a/src/main/paradox/generators/laika.md +++ b/src/main/paradox/generators/laika.md @@ -1,14 +1,9 @@ # Laika The sbt-site plugin has support for building [Laika] projects. - -@@@ note -Currently the Laika generator is only supported for sbt 0.13. -@@@ - To enable Laika site generation, simply enable the associated plugin in your `build.sbt` file: -@@ snip[enablePlugin](../../../sbt-test/laika/minimal/build.sbt) { #enablePlugin } +@@ snip[enablePlugin](../../../sbt-test/laika_0.13/minimal/build.sbt) { #enablePlugin } This plugin assumes you have a Laika project under the `src/laika` directory. To change this, set the `sourceDirectory` key in the `LaikaSite` scope: @@ -24,14 +19,10 @@ From other hand you can customize other aspects of Laika's behavior through basi [Laika sbt plugin](https://planet42.github.io/Laika/using-laika/sbt.html) keys and hooks. For example in order to add custom block directives you can include such code to your build.sbt: -```sbt -import LaikaKeys._ - -blockDirectives in Laika += CustomDirectives.postsToc -``` - -Full sample how use Laika sbt plugin together with sbt-site you can find here: +sbt 0.13 +: @@ snip[laikaSbtPluginCustomization](../../../sbt-test/laika_0.13/blog-post/build.sbt) { #laikaSbtPluginCustomization } -@@ snip[laikaSbtPluginCustomization](../../../sbt-test/laika/blog-post/build.sbt) { #laikaSbtPluginCustomization } +sbt 1.x +: @@ snip[laikaSbtPluginCustomization](../../../sbt-test/laika_1.x/blog-post/build.sbt) { #laikaSbtPluginCustomization } [Laika]: https://github.com/planet42/Laika diff --git a/src/main/paradox/index.md b/src/main/paradox/index.md index 79bcb32..22f2c57 100644 --- a/src/main/paradox/index.md +++ b/src/main/paradox/index.md @@ -6,8 +6,7 @@ Before upgrading please consult the @github:[release notes](/notes/). Instructio @@@ note -* Version 1.3.0 is cross published to both sbt 0.13 and sbt 1.x, however, the - [Laika](generators/laika.md) generator is currently only available for sbt 0.13. +* Version 1.3.0 is cross published to both sbt 0.13 and sbt 1.x. * As of sbt-site version 1.x.x, sbt version 0.13.10+ or 1.0.0-RC2+ is required. * For earlier 0.13.x releases, use [version 0.8.2][0.8.2]. * For sbt 0.12, use [version 0.7.2][0.7.2]. diff --git a/src/main/scala-sbt-1.0/com/typesafe/sbt/site/laika/LaikaSitePlugin.scala b/src/main/scala-sbt-1.0/com/typesafe/sbt/site/laika/LaikaSitePlugin.scala new file mode 100644 index 0000000..45ceb83 --- /dev/null +++ b/src/main/scala-sbt-1.0/com/typesafe/sbt/site/laika/LaikaSitePlugin.scala @@ -0,0 +1,50 @@ +package com.typesafe.sbt.site.laika + +import java.io.File + +import sbt._ +import Keys._ +import com.typesafe.sbt.site.SitePlugin +import com.typesafe.sbt.site.util.SiteHelpers +import com.typesafe.sbt.site.SitePlugin.autoImport.siteSubdirName +import com.typesafe.sbt.site.SitePlugin.autoImport.makeSite +import laika.sbt.LaikaPlugin.autoImport.{ Laika, laikaHTML, laikaSite } +import laika.sbt.LaikaPlugin +import Path.relativeTo + +object LaikaSitePlugin extends AutoPlugin { + override def requires = SitePlugin && LaikaPlugin + override def trigger = noTrigger + + object autoImport { + val LaikaSite = config("laikaSite") + } + import autoImport._ + + override def projectSettings = laikaSettings(LaikaSite) + + /** Creates settings necessary for running Laika in the given configuration. */ + def laikaSettings(config: Configuration): Seq[Setting[_]] = + inConfig(config)( + Def.settings( + LaikaPlugin.projectSettings, + target in laikaSite := target.value, + includeFilter := AllPassFilter, + excludeFilter := HiddenFileFilter, + mappings := { + generate(laikaSite.value, includeFilter.value, excludeFilter.value) + }, + siteSubdirName := "", + sourceDirectories in Laika := Seq(sourceDirectory.value) + ) + ) ++ + SiteHelpers.directorySettings(config) ++ + SiteHelpers.watchSettings(config) ++ + SiteHelpers.addMappingsToSiteDir(mappings in config, siteSubdirName in config) + + private def generate(target: File, inc: FileFilter, exc: FileFilter): Seq[(File, String)] = { + // Figure out what was generated. + val files = (target ** inc) --- (target ** exc) --- target + files pair relativeTo(target) + } +} diff --git a/src/sbt-test/laika/blog-post/README.md b/src/sbt-test/laika_0.13/blog-post/README.md similarity index 100% rename from src/sbt-test/laika/blog-post/README.md rename to src/sbt-test/laika_0.13/blog-post/README.md diff --git a/src/sbt-test/laika/blog-post/build.sbt b/src/sbt-test/laika_0.13/blog-post/build.sbt similarity index 100% rename from src/sbt-test/laika/blog-post/build.sbt rename to src/sbt-test/laika_0.13/blog-post/build.sbt diff --git a/src/sbt-test/laika/blog-post/project/CustomDirectives.scala b/src/sbt-test/laika_0.13/blog-post/project/CustomDirectives.scala similarity index 100% rename from src/sbt-test/laika/blog-post/project/CustomDirectives.scala rename to src/sbt-test/laika_0.13/blog-post/project/CustomDirectives.scala diff --git a/src/sbt-test/laika/blog-post/project/build.properties b/src/sbt-test/laika_0.13/blog-post/project/build.properties similarity index 100% rename from src/sbt-test/laika/blog-post/project/build.properties rename to src/sbt-test/laika_0.13/blog-post/project/build.properties diff --git a/src/sbt-test/laika/blog-post/project/plugins.sbt b/src/sbt-test/laika_0.13/blog-post/project/plugins.sbt similarity index 100% rename from src/sbt-test/laika/blog-post/project/plugins.sbt rename to src/sbt-test/laika_0.13/blog-post/project/plugins.sbt diff --git a/src/sbt-test/laika/blog-post/src/blog/default.template.html b/src/sbt-test/laika_0.13/blog-post/src/blog/default.template.html similarity index 100% rename from src/sbt-test/laika/blog-post/src/blog/default.template.html rename to src/sbt-test/laika_0.13/blog-post/src/blog/default.template.html diff --git a/src/sbt-test/laika/blog-post/src/blog/index.md b/src/sbt-test/laika_0.13/blog-post/src/blog/index.md similarity index 100% rename from src/sbt-test/laika/blog-post/src/blog/index.md rename to src/sbt-test/laika_0.13/blog-post/src/blog/index.md diff --git a/src/sbt-test/laika/blog-post/src/blog/topics/directory.conf b/src/sbt-test/laika_0.13/blog-post/src/blog/topics/directory.conf similarity index 100% rename from src/sbt-test/laika/blog-post/src/blog/topics/directory.conf rename to src/sbt-test/laika_0.13/blog-post/src/blog/topics/directory.conf diff --git a/src/sbt-test/laika/blog-post/src/blog/topics/post-1.md b/src/sbt-test/laika_0.13/blog-post/src/blog/topics/post-1.md similarity index 100% rename from src/sbt-test/laika/blog-post/src/blog/topics/post-1.md rename to src/sbt-test/laika_0.13/blog-post/src/blog/topics/post-1.md diff --git a/src/sbt-test/laika/blog-post/src/blog/topics/post-2.md b/src/sbt-test/laika_0.13/blog-post/src/blog/topics/post-2.md similarity index 100% rename from src/sbt-test/laika/blog-post/src/blog/topics/post-2.md rename to src/sbt-test/laika_0.13/blog-post/src/blog/topics/post-2.md diff --git a/src/sbt-test/laika/blog-post/test b/src/sbt-test/laika_0.13/blog-post/test similarity index 100% rename from src/sbt-test/laika/blog-post/test rename to src/sbt-test/laika_0.13/blog-post/test diff --git a/src/sbt-test/laika/minimal/build.sbt b/src/sbt-test/laika_0.13/minimal/build.sbt similarity index 100% rename from src/sbt-test/laika/minimal/build.sbt rename to src/sbt-test/laika_0.13/minimal/build.sbt diff --git a/src/sbt-test/laika/minimal/project/build.properties b/src/sbt-test/laika_0.13/minimal/project/build.properties similarity index 100% rename from src/sbt-test/laika/minimal/project/build.properties rename to src/sbt-test/laika_0.13/minimal/project/build.properties diff --git a/src/sbt-test/laika/minimal/project/plugins.sbt b/src/sbt-test/laika_0.13/minimal/project/plugins.sbt similarity index 100% rename from src/sbt-test/laika/minimal/project/plugins.sbt rename to src/sbt-test/laika_0.13/minimal/project/plugins.sbt diff --git a/src/sbt-test/laika/minimal/src/laikaSite/index.md b/src/sbt-test/laika_0.13/minimal/src/laikaSite/index.md similarity index 100% rename from src/sbt-test/laika/minimal/src/laikaSite/index.md rename to src/sbt-test/laika_0.13/minimal/src/laikaSite/index.md diff --git a/src/sbt-test/laika/minimal/test b/src/sbt-test/laika_0.13/minimal/test similarity index 100% rename from src/sbt-test/laika/minimal/test rename to src/sbt-test/laika_0.13/minimal/test diff --git a/src/sbt-test/laika_1.x/blog-post/README.md b/src/sbt-test/laika_1.x/blog-post/README.md new file mode 100644 index 0000000..08cfd48 --- /dev/null +++ b/src/sbt-test/laika_1.x/blog-post/README.md @@ -0,0 +1 @@ +Based on [Blog Post](http://startbootstrap.com/template-overviews/blog-post/) and adopted for Laika just as sample diff --git a/src/sbt-test/laika_1.x/blog-post/build.sbt b/src/sbt-test/laika_1.x/blog-post/build.sbt new file mode 100644 index 0000000..a32262e --- /dev/null +++ b/src/sbt-test/laika_1.x/blog-post/build.sbt @@ -0,0 +1,31 @@ +name := "test" + +//#enablePlugin +enablePlugins(LaikaSitePlugin) +//#enablePlugin + +sourceDirectory in LaikaSite := sourceDirectory.value / "blog" + +siteSubdirName in LaikaSite := "blog" + +//#laikaSbtPluginCustomization +laikaBlockDirectives in LaikaSite += CustomDirectives.postsToc +laikaSiteRenderers in LaikaSite += CustomDirectives.postsRenderer +//#laikaSbtPluginCustomization + +TaskKey[Unit]("checkContent") := { + val dest = (target in makeSite).value / (siteSubdirName in LaikaSite).value + + val expectedFilesAndWords = Map( + dest / "index.html" -> Seq("Start Bootstrap Template", "Blog Post Title", "Second Post Title"), + dest / "topics" / "post-1.html" -> Seq("Blog Post Title", "recusandae laborum minus inventore?"), + dest / "topics" / "post-2.html" -> Seq("Second Post Title", "perspiciatis. Enim, iure!") + ) + + for ((file, words) <- expectedFilesAndWords) { + assert(file.exists, s"${file.getAbsolutePath} did not exist") + val content = IO.readLines(file) + for (word <- words) + assert(content.exists(_.contains(word)), s"Did not find $word content in:\n${content.mkString("\n")}") + } +} diff --git a/src/sbt-test/laika_1.x/blog-post/project/CustomDirectives.scala b/src/sbt-test/laika_1.x/blog-post/project/CustomDirectives.scala new file mode 100644 index 0000000..08cf839 --- /dev/null +++ b/src/sbt-test/laika_1.x/blog-post/project/CustomDirectives.scala @@ -0,0 +1,55 @@ +import laika.directive.Directives.Blocks +import laika.directive.StandardDirectives +import laika.render.HTMLWriter +import laika.rewrite.{DocumentCursor, TreeCursor} +import laika.tree.Documents.{Document, DocumentTree} +import laika.tree.Elements +import laika.tree.Elements._ +import com.typesafe.config.Config + +// Just sample, probably not the best way to do custom toc for Laika +object CustomDirectives extends StandardDirectives { + + case class PostsTocElement(title: Seq[Span], by: String, path: PathInfo, options: Elements.Options) + extends Elements.Element with Elements.Block + + val postsToc: Blocks.Directive = Blocks.create("postsToc") { + import Blocks.Combinators._ + + def titleOrName (content: Document) = + if (content.title.nonEmpty) content.title + else Seq(Text(content.name)) + + def by(config: Config) = + if (config.hasPath("by")) + config.getString("by") + else "" + + cursor.map { cursor => + val posts = cursor.root.children.collect { + case pd: TreeCursor => + pd.children.collect { + case d: DocumentCursor => + val path = d.target.path + val refPath = cursor.parent.target.path + PostsTocElement(titleOrName(d.target), + by(d.config), + PathInfo.fromPath(path, refPath.parent), + Styles("toc")) + } + }.flatten + + BlockSequence(posts) + } + } + + val postsRenderer: HTMLWriter => RenderFunction = { out => { + case PostsTocElement(title, by, path, options) => + out << Paragraph(List( + CrossLink(title, "", path), + LineBreak(), + SpanSequence(Seq(Text("by "), Text(by))) + ), options) + } + } +} diff --git a/src/sbt-test/laika_1.x/blog-post/project/build.properties b/src/sbt-test/laika_1.x/blog-post/project/build.properties new file mode 100644 index 0000000..b7dd3cb --- /dev/null +++ b/src/sbt-test/laika_1.x/blog-post/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.0.2 diff --git a/src/sbt-test/laika_1.x/blog-post/project/plugins.sbt b/src/sbt-test/laika_1.x/blog-post/project/plugins.sbt new file mode 100644 index 0000000..6246999 --- /dev/null +++ b/src/sbt-test/laika_1.x/blog-post/project/plugins.sbt @@ -0,0 +1 @@ +addSbtPlugin("com.typesafe.sbt" % "sbt-site" % sys.props("project.version")) \ No newline at end of file diff --git a/src/sbt-test/laika_1.x/blog-post/src/blog/default.template.html b/src/sbt-test/laika_1.x/blog-post/src/blog/default.template.html new file mode 100644 index 0000000..fe895dd --- /dev/null +++ b/src/sbt-test/laika_1.x/blog-post/src/blog/default.template.html @@ -0,0 +1,159 @@ + + + +
+ + + + + + + +