diff --git a/lib/src/main/groovy/com/jessebrault/ssg/part/PartFilePartsProvider.groovy b/lib/src/main/groovy/com/jessebrault/ssg/part/PartFilePartsProvider.groovy index 72e7cc8..b49f117 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/part/PartFilePartsProvider.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/part/PartFilePartsProvider.groovy @@ -1,13 +1,14 @@ package com.jessebrault.ssg.part import com.jessebrault.ssg.provider.WithWatchableDir -import com.jessebrault.ssg.util.FileNameHandler import groovy.io.FileType import groovy.transform.EqualsAndHashCode import groovy.transform.NullCheck import org.slf4j.Logger import org.slf4j.LoggerFactory +import static com.jessebrault.ssg.util.ExtensionsUtil.getExtension + @NullCheck @EqualsAndHashCode(includeFields = true) class PartFilePartsProvider implements PartsProvider, WithWatchableDir { @@ -24,8 +25,9 @@ class PartFilePartsProvider implements PartsProvider, WithWatchableDir { } private PartType getPartType(File file) { + def path = file.path this.partTypes.find { - it.ids.contains(new FileNameHandler(file).getExtension()) + it.ids.contains(getExtension(path)) } } diff --git a/lib/src/main/groovy/com/jessebrault/ssg/specialpage/SpecialPageFileSpecialPagesProvider.groovy b/lib/src/main/groovy/com/jessebrault/ssg/specialpage/SpecialPageFileSpecialPagesProvider.groovy index a2ef1e3..37d6a9d 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/specialpage/SpecialPageFileSpecialPagesProvider.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/specialpage/SpecialPageFileSpecialPagesProvider.groovy @@ -1,14 +1,15 @@ package com.jessebrault.ssg.specialpage import com.jessebrault.ssg.provider.WithWatchableDir -import com.jessebrault.ssg.util.FileNameHandler -import com.jessebrault.ssg.util.RelativePathHandler import groovy.io.FileType import groovy.transform.EqualsAndHashCode import groovy.transform.NullCheck import org.slf4j.Logger import org.slf4j.LoggerFactory +import static com.jessebrault.ssg.util.ExtensionsUtil.getExtension +import static com.jessebrault.ssg.util.ExtensionsUtil.stripExtension + @NullCheck @EqualsAndHashCode(includeFields = true) class SpecialPageFileSpecialPagesProvider implements SpecialPagesProvider, WithWatchableDir { @@ -25,8 +26,9 @@ class SpecialPageFileSpecialPagesProvider implements SpecialPagesProvider, WithW } private SpecialPageType getSpecialPageType(File file) { + def path = file.path this.specialPageTypes.find { - it.ids.contains(new FileNameHandler(file).getExtension()) + it.ids.contains(getExtension(path)) } } @@ -41,7 +43,7 @@ class SpecialPageFileSpecialPagesProvider implements SpecialPagesProvider, WithW def type = this.getSpecialPageType(it) if (type != null) { def relativePath = this.specialPagesDir.relativePath(it) - def path = new RelativePathHandler(relativePath).getWithoutExtension() + def path = stripExtension(relativePath) logger.info('found specialPage {} with type {}', path, type) specialPages << new SpecialPage(it.text, path, type) } else { diff --git a/lib/src/main/groovy/com/jessebrault/ssg/template/TemplateFileTemplatesProvider.groovy b/lib/src/main/groovy/com/jessebrault/ssg/template/TemplateFileTemplatesProvider.groovy index a656c1e..09bcc18 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/template/TemplateFileTemplatesProvider.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/template/TemplateFileTemplatesProvider.groovy @@ -1,13 +1,14 @@ package com.jessebrault.ssg.template import com.jessebrault.ssg.provider.WithWatchableDir -import com.jessebrault.ssg.util.FileNameHandler import groovy.io.FileType import groovy.transform.EqualsAndHashCode import groovy.transform.NullCheck import org.slf4j.Logger import org.slf4j.LoggerFactory +import static com.jessebrault.ssg.util.ExtensionsUtil.getExtension + @NullCheck @EqualsAndHashCode(includeFields = true) class TemplateFileTemplatesProvider implements TemplatesProvider, WithWatchableDir { @@ -24,8 +25,9 @@ class TemplateFileTemplatesProvider implements TemplatesProvider, WithWatchableD } private TemplateType getType(File file) { + def path = file.path this.templateTypes.find { - it.ids.contains(new FileNameHandler(file).getExtension()) + it.ids.contains(getExtension(path)) } } diff --git a/lib/src/main/groovy/com/jessebrault/ssg/text/TextFileTextsProvider.groovy b/lib/src/main/groovy/com/jessebrault/ssg/text/TextFileTextsProvider.groovy index 1eacbf9..3e6510f 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/text/TextFileTextsProvider.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/text/TextFileTextsProvider.groovy @@ -1,14 +1,15 @@ package com.jessebrault.ssg.text import com.jessebrault.ssg.provider.WithWatchableDir -import com.jessebrault.ssg.util.FileNameHandler -import com.jessebrault.ssg.util.RelativePathHandler import groovy.io.FileType import groovy.transform.EqualsAndHashCode import groovy.transform.NullCheck import org.slf4j.Logger import org.slf4j.LoggerFactory +import static com.jessebrault.ssg.util.ExtensionsUtil.getExtension +import static com.jessebrault.ssg.util.ExtensionsUtil.stripExtension + @NullCheck @EqualsAndHashCode(includeFields = true) class TextFileTextsProvider implements TextsProvider, WithWatchableDir { @@ -25,8 +26,9 @@ class TextFileTextsProvider implements TextsProvider, WithWatchableDir { } private TextType getTextType(File file) { + def path = file.path this.textTypes.find { - it.ids.contains(new FileNameHandler(file).getExtension()) + it.ids.contains(getExtension(path)) } } @@ -41,7 +43,7 @@ class TextFileTextsProvider implements TextsProvider, WithWatchableDir { def type = this.getTextType(it) if (type != null) { def relativePath = this.textsDir.relativePath(it) - def path = new RelativePathHandler(relativePath).getWithoutExtension() + def path = stripExtension(relativePath) logger.debug('found textFile {} with type {}', path, type) textFiles << new Text(it.text, path, type) } else { diff --git a/lib/src/main/groovy/com/jessebrault/ssg/util/ExtensionsUtil.groovy b/lib/src/main/groovy/com/jessebrault/ssg/util/ExtensionsUtil.groovy new file mode 100644 index 0000000..b072c4c --- /dev/null +++ b/lib/src/main/groovy/com/jessebrault/ssg/util/ExtensionsUtil.groovy @@ -0,0 +1,24 @@ +package com.jessebrault.ssg.util + +import java.util.regex.Pattern + +class ExtensionsUtil { + + private static final Pattern stripExtensionPattern = ~/(.+)\..+$/ + private static final Pattern getExtensionPattern = ~/.+(\..+)$/ + + static String stripExtension(String path) { + def m = stripExtensionPattern.matcher(path) + m.matches() ? m.group(1) : path + } + + static String getExtension(String path) { + def m = getExtensionPattern.matcher(path) + if (m.matches()) { + m.group(1) + } else { + throw new IllegalArgumentException("cannot get extension for path: ${ path }") + } + } + +} diff --git a/lib/src/main/groovy/com/jessebrault/ssg/util/FileNameHandler.groovy b/lib/src/main/groovy/com/jessebrault/ssg/util/FileNameHandler.groovy deleted file mode 100644 index 086cf35..0000000 --- a/lib/src/main/groovy/com/jessebrault/ssg/util/FileNameHandler.groovy +++ /dev/null @@ -1,32 +0,0 @@ -package com.jessebrault.ssg.util - -import groovy.transform.EqualsAndHashCode -import groovy.transform.NullCheck -import groovy.transform.TupleConstructor - -@TupleConstructor(includeFields = true, defaults = false) -@NullCheck -@EqualsAndHashCode(includeFields = true) -class FileNameHandler { - - private final File file - - String getExtension() { - def lastIndexOfDot = this.file.name.lastIndexOf('.') - if (lastIndexOfDot == -1) { - '' - } else { - this.file.name.substring(lastIndexOfDot) - } - } - - String getWithoutExtension() { - this.file.name.substring(0, this.file.name.lastIndexOf('.')) - } - - @Override - String toString() { - "FileNameHandler(file: ${ this.file })" - } - -} diff --git a/lib/src/main/groovy/com/jessebrault/ssg/util/RelativePathHandler.groovy b/lib/src/main/groovy/com/jessebrault/ssg/util/RelativePathHandler.groovy deleted file mode 100644 index 2258bb0..0000000 --- a/lib/src/main/groovy/com/jessebrault/ssg/util/RelativePathHandler.groovy +++ /dev/null @@ -1,23 +0,0 @@ -package com.jessebrault.ssg.util - -import groovy.transform.EqualsAndHashCode -import groovy.transform.NullCheck -import groovy.transform.TupleConstructor - -@TupleConstructor(includeFields = true, defaults = false) -@NullCheck -@EqualsAndHashCode(includeFields = true) -class RelativePathHandler { - - private final String relativePath - - String getWithoutExtension() { - this.relativePath.subSequence(0, this.relativePath.lastIndexOf('.')) - } - - @Override - String toString() { - "RelativePathHandler(relativePath: ${ this.relativePath })" - } - -} diff --git a/lib/src/test/groovy/com/jessebrault/ssg/util/ExtensionsUtilTests.groovy b/lib/src/test/groovy/com/jessebrault/ssg/util/ExtensionsUtilTests.groovy new file mode 100644 index 0000000..438c3c8 --- /dev/null +++ b/lib/src/test/groovy/com/jessebrault/ssg/util/ExtensionsUtilTests.groovy @@ -0,0 +1,49 @@ +package com.jessebrault.ssg.util + +import org.junit.jupiter.api.Test + +import static com.jessebrault.ssg.util.ExtensionsUtil.stripExtension +import static com.jessebrault.ssg.util.ExtensionsUtil.getExtension +import static org.junit.jupiter.api.Assertions.assertEquals + +class ExtensionsUtilTests { + + static class StripExtensionTests { + + @Test + void simple() { + assertEquals('test', stripExtension('test.txt')) + } + + @Test + void withSlashes() { + assertEquals('test/test', stripExtension('test/test.txt')) + } + + @Test + void withMultipleExtensions() { + assertEquals('test.txt', stripExtension('test.txt.html')) + } + + } + + static class GetExtensionTests { + + @Test + void simple() { + assertEquals('.txt', getExtension('test.txt')) + } + + @Test + void withSlashes() { + assertEquals('.txt', getExtension('test/test.txt')) + } + + @Test + void withMultipleExtensions() { + assertEquals('.txt', getExtension('test.test.txt')) + } + + } + +} diff --git a/lib/src/test/groovy/com/jessebrault/ssg/util/FileNameHandlerTests.groovy b/lib/src/test/groovy/com/jessebrault/ssg/util/FileNameHandlerTests.groovy deleted file mode 100644 index d15f57b..0000000 --- a/lib/src/test/groovy/com/jessebrault/ssg/util/FileNameHandlerTests.groovy +++ /dev/null @@ -1,16 +0,0 @@ -package com.jessebrault.ssg.util - -import org.junit.jupiter.api.Test - -import static org.junit.jupiter.api.Assertions.assertEquals - -class FileNameHandlerTests { - - @Test - void getsCorrectExtension() { - def file = new File('hello.txt') - def extension = new FileNameHandler(file).getExtension() - assertEquals('.txt', extension) - } - -} diff --git a/lib/src/test/groovy/com/jessebrault/ssg/util/RelativePathHandlerTests.groovy b/lib/src/test/groovy/com/jessebrault/ssg/util/RelativePathHandlerTests.groovy deleted file mode 100644 index a82f87e..0000000 --- a/lib/src/test/groovy/com/jessebrault/ssg/util/RelativePathHandlerTests.groovy +++ /dev/null @@ -1,15 +0,0 @@ -package com.jessebrault.ssg.util - -import org.junit.jupiter.api.Test - -import static org.junit.jupiter.api.Assertions.assertEquals - -class RelativePathHandlerTests { - - @Test - void stripsExtension() { - def stripped = new RelativePathHandler('hello.txt').getWithoutExtension() - assertEquals('hello', stripped) - } - -}