diff --git a/cli/src/main/groovy/com/jessebrault/ssg/AbstractBuildCommand.groovy b/cli/src/main/groovy/com/jessebrault/ssg/AbstractBuildCommand.groovy index d56c0cc..cd483a7 100644 --- a/cli/src/main/groovy/com/jessebrault/ssg/AbstractBuildCommand.groovy +++ b/cli/src/main/groovy/com/jessebrault/ssg/AbstractBuildCommand.groovy @@ -92,7 +92,7 @@ abstract class AbstractBuildCommand extends AbstractSubCommand { def context = new TaskExecutorContext( it, tasks, - null, + this.ssg.taskTypes, { Collection diagnostics -> executionDiagnostics.addAll(diagnostics) } diff --git a/lib/src/main/groovy/com/jessebrault/ssg/SimpleStaticSiteGenerator.groovy b/lib/src/main/groovy/com/jessebrault/ssg/SimpleStaticSiteGenerator.groovy index ca0583b..0219f67 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/SimpleStaticSiteGenerator.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/SimpleStaticSiteGenerator.groovy @@ -2,6 +2,7 @@ package com.jessebrault.ssg import com.jessebrault.ssg.task.SpecialPageToHtmlFileTaskFactory import com.jessebrault.ssg.task.TaskContainer +import com.jessebrault.ssg.task.TaskTypeContainer import com.jessebrault.ssg.task.TextToHtmlFileTaskFactory import groovy.transform.NullCheck import org.slf4j.Logger @@ -16,6 +17,14 @@ class SimpleStaticSiteGenerator implements StaticSiteGenerator { private static final Marker enter = MarkerFactory.getMarker('ENTER') private static final Marker exit = MarkerFactory.getMarker('EXIT') + private static final TextToHtmlFileTaskFactory textHtmlFactory = new TextToHtmlFileTaskFactory() + private static final SpecialPageToHtmlFileTaskFactory specialPageHtmlFactory = new SpecialPageToHtmlFileTaskFactory() + + @Override + TaskTypeContainer getTaskTypes() { + new TaskTypeContainer([textHtmlFactory.taskType, specialPageHtmlFactory.taskType]) + } + @Override Result generate(Build build) { logger.trace(enter, 'build: {}', build) @@ -24,13 +33,11 @@ class SimpleStaticSiteGenerator implements StaticSiteGenerator { def tasks = new TaskContainer() def diagnostics = [] - def textToHtmlFactory = new TextToHtmlFileTaskFactory() - def textsResult = textToHtmlFactory.getTasks(build) + def textsResult = textHtmlFactory.getTasks(build) tasks.addAll(textsResult.get()) diagnostics.addAll(textsResult.diagnostics) - def specialPageToHtmlFactory = new SpecialPageToHtmlFileTaskFactory() - def specialPagesResult = specialPageToHtmlFactory.getTasks(build) + def specialPagesResult = specialPageHtmlFactory.getTasks(build) tasks.addAll(specialPagesResult.get()) diagnostics.addAll(specialPagesResult.diagnostics) diff --git a/lib/src/main/groovy/com/jessebrault/ssg/StaticSiteGenerator.groovy b/lib/src/main/groovy/com/jessebrault/ssg/StaticSiteGenerator.groovy index b6e2844..fe72287 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/StaticSiteGenerator.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/StaticSiteGenerator.groovy @@ -1,7 +1,9 @@ package com.jessebrault.ssg import com.jessebrault.ssg.task.TaskContainer +import com.jessebrault.ssg.task.TaskTypeContainer interface StaticSiteGenerator { + TaskTypeContainer getTaskTypes() Result generate(Build build) } diff --git a/lib/src/main/groovy/com/jessebrault/ssg/renderer/RenderContext.groovy b/lib/src/main/groovy/com/jessebrault/ssg/renderer/RenderContext.groovy index fcc763a..5a4171a 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/renderer/RenderContext.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/renderer/RenderContext.groovy @@ -3,8 +3,8 @@ package com.jessebrault.ssg.renderer import com.jessebrault.ssg.Config import com.jessebrault.ssg.SiteSpec import com.jessebrault.ssg.part.Part -import com.jessebrault.ssg.task.Task import com.jessebrault.ssg.task.TaskContainer +import com.jessebrault.ssg.task.TaskTypeContainer import com.jessebrault.ssg.text.Text import groovy.transform.EqualsAndHashCode import groovy.transform.NullCheck @@ -22,5 +22,5 @@ final class RenderContext { final String sourcePath final String targetPath final TaskContainer tasks - final Set> taskTypes + final TaskTypeContainer taskTypes } diff --git a/lib/src/main/groovy/com/jessebrault/ssg/task/SpecialPageToHtmlFileTask.groovy b/lib/src/main/groovy/com/jessebrault/ssg/task/SpecialPageToHtmlFileTask.groovy index 4ae3749..22beae8 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/task/SpecialPageToHtmlFileTask.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/task/SpecialPageToHtmlFileTask.groovy @@ -24,7 +24,7 @@ final class SpecialPageToHtmlFileTask extends AbstractTask type = new TaskType<>( + static final TaskType TYPE = new TaskType<>( 'specialPageToHtmlFile', new SpecialPageToHtmlFileTaskExecutor() ) @@ -32,7 +32,7 @@ final class SpecialPageToHtmlFileTask extends AbstractTask getTaskType() { + SpecialPageToHtmlFileTask.TYPE + } + @Override Result> getTasks(Build build) { logger.trace(enter, 'build: {}', build) diff --git a/lib/src/main/groovy/com/jessebrault/ssg/task/TaskFactory.groovy b/lib/src/main/groovy/com/jessebrault/ssg/task/TaskFactory.groovy index b538653..60b78ff 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/task/TaskFactory.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/task/TaskFactory.groovy @@ -4,5 +4,6 @@ import com.jessebrault.ssg.Build import com.jessebrault.ssg.Result interface TaskFactory { + TaskType getTaskType() Result> getTasks(Build build) } \ No newline at end of file diff --git a/lib/src/main/groovy/com/jessebrault/ssg/task/TaskTypeContainer.groovy b/lib/src/main/groovy/com/jessebrault/ssg/task/TaskTypeContainer.groovy index cb1365d..b4092cc 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/task/TaskTypeContainer.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/task/TaskTypeContainer.groovy @@ -1,36 +1,31 @@ package com.jessebrault.ssg.task -import java.util.regex.Pattern - final class TaskTypeContainer { - private static final Pattern taskTypeNamePattern = ~/(.*)Task/ - @Delegate - private final Set> taskTypes = [] + private final Set> taskTypes = [] - TaskTypeContainer(Collection> taskTypes = null) { - if (taskTypes) { + TaskTypeContainer(Collection> taskTypes) { + if (taskTypes != null) { this.taskTypes.addAll(taskTypes) } } + TaskTypeContainer(TaskTypeContainer taskTypeContainer) { + if (taskTypeContainer != null) { + this.taskTypes.addAll(taskTypeContainer) + } + } + + TaskTypeContainer() {} + @Override - Class getProperty(String propertyName) { - def result = this.taskTypes.find { - def m = taskTypeNamePattern.matcher(it.simpleName) - if (m.matches()) { - def withoutTaskEnd = m.group(1) - def uncapitalized = withoutTaskEnd.uncapitalize() - return propertyName == uncapitalized - } else { - throw new IllegalStateException("invalid task type name: ${ it.simpleName }") - } + TaskType getProperty(String propertyName) { + def taskType = this.taskTypes.find { it.name == propertyName } + if (!taskType) { + throw new IllegalArgumentException("no such taskType: ${ propertyName }") } - if (!result) { - throw new IllegalStateException("no such taskType: ${ propertyName }") - } - result + taskType } } diff --git a/lib/src/main/groovy/com/jessebrault/ssg/task/TextToHtmlFileTask.groovy b/lib/src/main/groovy/com/jessebrault/ssg/task/TextToHtmlFileTask.groovy index 42883f0..dae969c 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/task/TextToHtmlFileTask.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/task/TextToHtmlFileTask.groovy @@ -24,7 +24,7 @@ final class TextToHtmlFileTask extends AbstractTask { } - private static final TaskType type = new TaskType<>( + static final TaskType TYPE = new TaskType<>( 'textToHtmlFile', new TextToHtmlFileTaskExecutor() ) @@ -32,7 +32,7 @@ final class TextToHtmlFileTask extends AbstractTask { final HtmlFileOutput output TextToHtmlFileTask(String name, Text input, HtmlFileOutput output) { - super(type, name) + super(TYPE, name) this.input = input this.output = output } diff --git a/lib/src/main/groovy/com/jessebrault/ssg/task/TextToHtmlFileTaskFactory.groovy b/lib/src/main/groovy/com/jessebrault/ssg/task/TextToHtmlFileTaskFactory.groovy index bfe3298..0f8d1c0 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/task/TextToHtmlFileTaskFactory.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/task/TextToHtmlFileTaskFactory.groovy @@ -17,6 +17,11 @@ final class TextToHtmlFileTaskFactory implements TaskFactory private static final Marker enter = MarkerFactory.getMarker('ENTER') private static final Marker exit = MarkerFactory.getMarker('EXIT') + @Override + TaskType getTaskType() { + TextToHtmlFileTask.TYPE + } + @Override Result> getTasks(Build build) { logger.trace(enter, 'build: {}', build) diff --git a/lib/src/testFixtures/groovy/com/jessebrault/ssg/testutil/RenderContextUtil.groovy b/lib/src/testFixtures/groovy/com/jessebrault/ssg/testutil/RenderContextUtil.groovy index 191895e..2477d6e 100644 --- a/lib/src/testFixtures/groovy/com/jessebrault/ssg/testutil/RenderContextUtil.groovy +++ b/lib/src/testFixtures/groovy/com/jessebrault/ssg/testutil/RenderContextUtil.groovy @@ -5,6 +5,7 @@ import com.jessebrault.ssg.SiteSpec import com.jessebrault.ssg.renderer.RenderContext import com.jessebrault.ssg.task.Task import com.jessebrault.ssg.task.TaskContainer +import com.jessebrault.ssg.task.TaskTypeContainer class RenderContextUtil { @@ -18,7 +19,7 @@ class RenderContextUtil { args?.sourcePath as String ?: '', args?.targetPath as String ?: '', args?.tasks as TaskContainer ?: new TaskContainer(), - args?.taskTypes as Set> ?: [] as Set> + args?.taskTypes as TaskTypeContainer ?: new TaskTypeContainer() ) }