blob: 10c9481167b8ff53cc00a2a267bb3906d948ccbc [file] [log] [blame]
package t5build
import org.gradle.api.*
import org.gradle.api.tasks.*
/**
* Used by the tapestry-core module, to split t5-core-dom into two flavors: one for prototype, one for jQuery.
*/
class PreprocessCoffeeScript extends DefaultTask {
{
description = "Splits CoffeeScript source files into multiple flavors."
group = "build"
}
@Internal
def flavors = ["prototype", "jquery"]
def srcDir = "src/main/preprocessed-coffeescript"
def outputDir = "${project.buildDir}/postprocessed-coffeescript"
@InputDirectory
File getSrcDir() { project.file(srcDir) }
@OutputDirectory
File getOutputDir() { project.file(outputDir) }
@TaskAction
void doSplit() {
logger.info "Splitting CoffeeScript sources from $srcDir into $outputDir ($flavors)"
def outputDirFile = getOutputDir()
// Recursively delete output directory if it exists
outputDirFile.deleteDir()
def tree = project.fileTree srcDir, {
include '**/*.coffee'
}
tree.visit { visit ->
if (visit.directory) return
def inputFile = visit.file
def inputPath = visit.path
flavors.each { flavor ->
def dotx = inputPath.lastIndexOf "."
def outputPath = inputPath.substring(0, dotx) + "-${flavor}.coffee"
def outputFile = new File(outputDirFile, outputPath)
logger.info "Generating ${outputPath} from ${inputPath}"
outputFile.parentFile.mkdirs()
split inputFile, outputFile, flavor
}
}
}
// Very sloppy; doesn't actually differentiate between #if and #elseif (nesting is not actually
// supported). Some more C Macro support would be nice, too.
@Internal
def ifPattern = ~/^#(else)?if\s+(\w+)$/
void split(File inputFile, File outputFile, String flavor) {
def ignoring = false
outputFile.withPrintWriter { pw ->
inputFile.eachLine { line ->
def matcher = ifPattern.matcher line
if (matcher.matches()) {
// ignore the block unless it matches the flavor
ignoring = matcher[0][2] != flavor
// And don't copy the "#if" line at all.
return;
}
// Note that we don't check for nested #if, and those aren't supported.
if (line == "#endif") {
ignoring = false;
return;
}
if (ignoring) {
return;
}
// Copy the line to the output:
pw.println line
}
}
}
}