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 @@ + + + + + + + + + + + + {{document.title}} + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + {{document.content}} + +
+ + +
+ + +
+

Blog Search

+
+ + + + +
+ +
+ + +
+

Blog Categories

+ + +
+ +
+ +
+ + +
+ + + + +
+ + + + + + + + + + + diff --git a/src/sbt-test/laika_1.x/blog-post/src/blog/index.md b/src/sbt-test/laika_1.x/blog-post/src/blog/index.md new file mode 100644 index 0000000..49bbf83 --- /dev/null +++ b/src/sbt-test/laika_1.x/blog-post/src/blog/index.md @@ -0,0 +1,5 @@ +{% + title: "Blog Post - Start Bootstrap Template" +%} + +@:postsToc. \ No newline at end of file diff --git a/src/sbt-test/laika_1.x/blog-post/src/blog/topics/directory.conf b/src/sbt-test/laika_1.x/blog-post/src/blog/topics/directory.conf new file mode 100644 index 0000000..de88770 --- /dev/null +++ b/src/sbt-test/laika_1.x/blog-post/src/blog/topics/directory.conf @@ -0,0 +1,4 @@ +navigationOrder = [ + post-1.md + post-2.md +] \ No newline at end of file diff --git a/src/sbt-test/laika_1.x/blog-post/src/blog/topics/post-1.md b/src/sbt-test/laika_1.x/blog-post/src/blog/topics/post-1.md new file mode 100644 index 0000000..59c76a6 --- /dev/null +++ b/src/sbt-test/laika_1.x/blog-post/src/blog/topics/post-1.md @@ -0,0 +1,8 @@ +{% + title: "Blog Post Title" + by: "Start Bootstrap" +%} + +Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ducimus, vero, obcaecati, aut, error quam sapiente nemo saepe quibusdam sit excepturi nam quia corporis eligendi eos magni recusandae laborum minus inventore? + +Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut, tenetur natus doloremque laborum quos iste ipsum rerum obcaecati impedit odit illo dolorum ab tempora nihil dicta earum fugiat. Temporibus, voluptatibus. diff --git a/src/sbt-test/laika_1.x/blog-post/src/blog/topics/post-2.md b/src/sbt-test/laika_1.x/blog-post/src/blog/topics/post-2.md new file mode 100644 index 0000000..5eedcd6 --- /dev/null +++ b/src/sbt-test/laika_1.x/blog-post/src/blog/topics/post-2.md @@ -0,0 +1,10 @@ +{% + title: "Second Post Title" + by: "Start Bootstrap & Lipsum" +%} + +Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eos, doloribus, dolorem iusto blanditiis unde eius illum consequuntur neque dicta incidunt ullam ea hic porro optio ratione repellat perspiciatis. Enim, iure! + +Lorem ipsum dolor sit amet, consectetur adipisicing elit. Error, nostrum, aliquid, animi, ut quas placeat totam sunt tempora commodi nihil ullam alias modi dicta saepe minima ab quo voluptatem obcaecati? + +Lorem ipsum dolor sit amet, consectetur adipisicing elit. Harum, dolor quis. Sunt, ut, explicabo, aliquam tenetur ratione tempore quidem voluptates cupiditate voluptas illo saepe quaerat numquam recusandae? Qui, necessitatibus, est! diff --git a/src/sbt-test/laika_1.x/blog-post/test b/src/sbt-test/laika_1.x/blog-post/test new file mode 100644 index 0000000..9f9a269 --- /dev/null +++ b/src/sbt-test/laika_1.x/blog-post/test @@ -0,0 +1,2 @@ +> makeSite +> checkContent diff --git a/src/sbt-test/laika_1.x/minimal/build.sbt b/src/sbt-test/laika_1.x/minimal/build.sbt new file mode 100644 index 0000000..d80f793 --- /dev/null +++ b/src/sbt-test/laika_1.x/minimal/build.sbt @@ -0,0 +1,22 @@ +name := "test" + +//#enablePlugin +enablePlugins(LaikaSitePlugin) +//#enablePlugin + +siteSubdirName in LaikaSite := "minimal" + +TaskKey[Unit]("checkContent") := { + val dest = (target in makeSite).value / (siteSubdirName in LaikaSite).value + + val expectedFilesAndWords = Map( + dest / "index.html" -> Seq("test", "Minimal") + ) + + 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/minimal/project/build.properties b/src/sbt-test/laika_1.x/minimal/project/build.properties new file mode 100644 index 0000000..b7dd3cb --- /dev/null +++ b/src/sbt-test/laika_1.x/minimal/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.0.2 diff --git a/src/sbt-test/laika_1.x/minimal/project/plugins.sbt b/src/sbt-test/laika_1.x/minimal/project/plugins.sbt new file mode 100644 index 0000000..6246999 --- /dev/null +++ b/src/sbt-test/laika_1.x/minimal/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/minimal/src/laikaSite/index.md b/src/sbt-test/laika_1.x/minimal/src/laikaSite/index.md new file mode 100644 index 0000000..1c6b04b --- /dev/null +++ b/src/sbt-test/laika_1.x/minimal/src/laikaSite/index.md @@ -0,0 +1,3 @@ +# Test Minimal + +test diff --git a/src/sbt-test/laika_1.x/minimal/test b/src/sbt-test/laika_1.x/minimal/test new file mode 100644 index 0000000..9f9a269 --- /dev/null +++ b/src/sbt-test/laika_1.x/minimal/test @@ -0,0 +1,2 @@ +> makeSite +> checkContent