Main task
src/main/groovy/.../PandocExec.groovy
package org.m2ci.msp.pandocreveal
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.*
class PandocExec extends DefaultTask {
@InputFile
File markdownFile
@OutputFile
File htmlFile
@TaskAction
void compile() {
project.exec {
commandLine 'pandoc', '--standalone', '--smart', '--to', 'revealjs', markdownFile, '--output', htmlFile
}
}
}
Plugin code
src/main/groovy/.../PandocRevealPlugin.groovy
package org.m2ci.msp.pandocreveal
import org.gradle.api.*
import org.gradle.api.plugins.BasePlugin
import org.gradle.api.tasks.Copy
class PandocRevealPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.pluginManager.apply BasePlugin
project.repositories {
ivy {
url 'https://github.com/hakimel'
layout 'pattern', {
artifact '[module]/archive/[revision].[ext]'
}
}
}
project.configurations {
revealJS
}
project.ext.revealJsVersion = '3.5.0'
project.dependencies {
revealJS group: 'se.hakimel.lab', name: 'reveal.js', version: project.revealJsVersion, ext: 'zip'
}
project.task('revealJS', type: Copy) {
from project.configurations.revealJS.collect {
project.zipTree(it)
}
into "$project.buildDir/reveal.js"
eachFile {
it.path = it.path - "reveal.js-$project.revealJsVersion/"
}
includeEmptyDirs = false
}
project.task('compileMarkdown', type: PandocExec) {
dependsOn project.tasks.findByName('revealJS')
project.tasks.findByName('assemble').dependsOn it
}
}
}
Functional testing
src/test/groovy/.../PandocRevealPluginTest.groovy
package org.m2ci.msp.pandocreveal
import org.gradle.testkit.runner.GradleRunner
import org.testng.annotations.*
@Test
class PandocRevealPluginTest {
GradleRunner provideGradle() {
def projectDir = File.createTempDir()
['build.gradle', 'slides.md', 'expected.html'].each { resourceName ->
new File(projectDir, resourceName).withWriter {
it << this.class.getResourceAsStream(resourceName)
}
}
GradleRunner.create().withPluginClasspath().withProjectDir(projectDir)
}
@Test
void testPlugin() {
def gradle = provideGradle()
def result = gradle.build()
assert result
}
@Test
void testCompileMarkdown() {
def gradle = provideGradle()
def result = gradle.withArguments('compileMarkdown').build()
assert result
def actualFile = new File(gradle.projectDir, 'actual.html')
assert actualFile.exists()
def expectedFile = new File(gradle.projectDir, 'expected.html')
assert expectedFile.text == actualFile.text
}
}