diff --git a/README.md b/README.md index 097399f..662f4e7 100644 --- a/README.md +++ b/README.md @@ -333,13 +333,13 @@ max_depth/ ``` ## Tree format -Choose between different tree formats. +Choose between different built-in tree formats, or create your own. The default is `UNICODE_BOX_DRAWING`, supported by all terminals, but you can also switch to use `CLASSIC_ASCII`. ```java // Example: FileTreeFormat.java var prettyPrinter = FileTreePrettyPrinter.builder() - .customizeOptions(options -> options.withTreeFormat(TreeFormat.CLASSIC_ASCII)) + .customizeOptions(options -> options.withTreeFormat(TreeFormats.CLASSIC_ASCII)) .build(); ``` @@ -352,9 +352,6 @@ tree_format/ `-- subFile_2 ``` -> [!TIP] -> *Idea for a future version: option to allow usage of custom format* - # Project Information * See [πŸ†•CHANGELOG.md](CHANGELOG.md) for a list of released versions and detailed changes. diff --git a/ROADMAP.md b/ROADMAP.md index 89834c4..2802d6c 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -4,12 +4,11 @@ - [x] **Features** - [x] Option: filtering - [x] Option: ordering - - [x] Option: emojis - - [x] Option: custom emojis mapping + - [x] Option: emojis (+ custom mapping) - [x] Option: compact directories display - [x] Option: line extension (=additional text after the file name) - [x] Option: children limit (static & dynamic) - - [x] Option: tree format Unicode box drawing / classic ASCII + - [x] Option: tree format (+ custom mapping) - [x] Option: max directory depth - [x] **Helpers** - [x] Path matchers @@ -29,10 +28,11 @@ - [x] SonarCloud integration - [x] **Workflows** - [x] Github actions - - [x] Publish on Maven Central! + - [x] Publish `0.0.x` alpha on Maven Central! ## To do -- [ ] Option: custom tree format +- [ ] Gather feedback +- [ ] Publish `0.x.0` beta on Maven Central! ## Backlog / To analyze / To implement if requested - [ ] Rework/fix Github wiki to be up to date diff --git a/assets/project-structure.png b/assets/project-structure.png index 19d0c8d..68b8e4b 100644 Binary files a/assets/project-structure.png and b/assets/project-structure.png differ diff --git a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ChildLimitDynamic.java b/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ChildLimitDynamic.java index b1d6f87..973764c 100644 --- a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ChildLimitDynamic.java +++ b/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ChildLimitDynamic.java @@ -1,8 +1,8 @@ package io.github.computerdaddyguy.jfiletreeprettyprinter.example; -import io.github.computerdaddyguy.jfiletreeprettyprinter.ChildLimits; import io.github.computerdaddyguy.jfiletreeprettyprinter.FileTreePrettyPrinter; -import io.github.computerdaddyguy.jfiletreeprettyprinter.PathMatchers; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.ChildLimits; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PathMatchers; public class ChildLimitDynamic { diff --git a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/FileTreeFormat.java b/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/FileTreeFormat.java index 8305f58..5e83379 100644 --- a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/FileTreeFormat.java +++ b/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/FileTreeFormat.java @@ -1,13 +1,13 @@ package io.github.computerdaddyguy.jfiletreeprettyprinter.example; import io.github.computerdaddyguy.jfiletreeprettyprinter.FileTreePrettyPrinter; -import io.github.computerdaddyguy.jfiletreeprettyprinter.PrettyPrintOptions.TreeFormat; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.TreeFormats; public class FileTreeFormat { public static void main(String[] args) { var prettyPrinter = FileTreePrettyPrinter.builder() - .customizeOptions(options -> options.withTreeFormat(TreeFormat.CLASSIC_ASCII)) + .customizeOptions(options -> options.withTreeFormat(TreeFormats.CLASSIC_ASCII)) .build(); var tree = prettyPrinter.prettyPrint("src/example/resources/tree_format"); System.out.println(tree); diff --git a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/Filtering.java b/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/Filtering.java index acd3138..be80241 100644 --- a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/Filtering.java +++ b/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/Filtering.java @@ -1,7 +1,7 @@ package io.github.computerdaddyguy.jfiletreeprettyprinter.example; import io.github.computerdaddyguy.jfiletreeprettyprinter.FileTreePrettyPrinter; -import io.github.computerdaddyguy.jfiletreeprettyprinter.PathMatchers; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PathMatchers; public class Filtering { diff --git a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/LineExtension.java b/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/LineExtension.java index fc79715..f8500c1 100644 --- a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/LineExtension.java +++ b/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/LineExtension.java @@ -1,8 +1,8 @@ package io.github.computerdaddyguy.jfiletreeprettyprinter.example; import io.github.computerdaddyguy.jfiletreeprettyprinter.FileTreePrettyPrinter; -import io.github.computerdaddyguy.jfiletreeprettyprinter.LineExtensions; -import io.github.computerdaddyguy.jfiletreeprettyprinter.PathMatchers; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.LineExtensions; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PathMatchers; import java.nio.file.Path; import java.util.function.Function; diff --git a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ProjectStructure.java b/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ProjectStructure.java index 66f0c0a..1221124 100644 --- a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ProjectStructure.java +++ b/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ProjectStructure.java @@ -1,10 +1,10 @@ package io.github.computerdaddyguy.jfiletreeprettyprinter.example; -import io.github.computerdaddyguy.jfiletreeprettyprinter.ChildLimits; import io.github.computerdaddyguy.jfiletreeprettyprinter.FileTreePrettyPrinter; -import io.github.computerdaddyguy.jfiletreeprettyprinter.LineExtensions; -import io.github.computerdaddyguy.jfiletreeprettyprinter.PathMatchers; -import io.github.computerdaddyguy.jfiletreeprettyprinter.PathSorts; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.ChildLimits; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.LineExtensions; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PathMatchers; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PathSorts; import java.nio.file.Path; import java.util.Comparator; import java.util.function.Function; @@ -56,9 +56,10 @@ public static void main(String[] args) { */ var childLimitFunction = ChildLimits.builder() // Hide all files under renderer and scanner packages + .add(PathMatchers.hasAbsolutePathMatchingGlob("**/io/github/computerdaddyguy/jfiletreeprettyprinter/options"), 0) .add(PathMatchers.hasAbsolutePathMatchingGlob("**/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer"), 0) .add(PathMatchers.hasAbsolutePathMatchingGlob("**/io/github/computerdaddyguy/jfiletreeprettyprinter/scanner"), 0) - .add(PathMatchers.hasAbsolutePathMatchingGlob("**/io/github/computerdaddyguy/jfiletreeprettyprinter"), 3) + .add(PathMatchers.hasAbsolutePathMatchingGlob("**/io/github/computerdaddyguy/jfiletreeprettyprinter"), 4) .build(); /* @@ -113,22 +114,25 @@ public static void main(String[] args) { β”‚ └─ πŸ–ΌοΈ project-structure.png // This image β”œβ”€ πŸ“‚ src/main/java/ β”‚ └─ πŸ“‚ io/github/computerdaddyguy/jfiletreeprettyprinter/ + β”‚ β”œβ”€ πŸ“‚ options/ + β”‚ β”‚ └─ ... β”‚ β”œβ”€ πŸ“‚ renderer/ β”‚ β”‚ └─ ... β”‚ β”œβ”€ πŸ“‚ scanner/ β”‚ β”‚ └─ ... β”‚ β”œβ”€ β˜• FileTreePrettyPrinter.java // Main entry point β”‚ └─ ... - β”œβ”€ πŸ—ΊοΈ CHANGELOG.md - β”œβ”€ πŸ“– CONTRIBUTING.md - β”œβ”€ πŸ“„ LICENSE - β”œβ”€ πŸ“– README.md // You're reading at this! + β”œβ”€ πŸ†• CHANGELOG.md + β”œβ”€ 🀝 CONTRIBUTING.md + β”œβ”€ βš–οΈ LICENSE + β”œβ”€ πŸ“˜ README.md // You're reading at this! β”œβ”€ πŸ—ΊοΈ ROADMAP.md β”œβ”€ πŸ›‘οΈ SECURITY.md - β”œβ”€ πŸ—οΈ pom.xml - β”œβ”€ πŸ“– release_process.md + β”œβ”€ πŸ› οΈ pom.xml + β”œβ”€ πŸ“ release_process.md └─ πŸ“œ runMutationTests.sh + */ } diff --git a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/Sorting.java b/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/Sorting.java index 5009595..8a3973e 100644 --- a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/Sorting.java +++ b/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/Sorting.java @@ -1,7 +1,7 @@ package io.github.computerdaddyguy.jfiletreeprettyprinter.example; import io.github.computerdaddyguy.jfiletreeprettyprinter.FileTreePrettyPrinter; -import io.github.computerdaddyguy.jfiletreeprettyprinter.PathSorts; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PathSorts; public class Sorting { diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinter.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinter.java index aa8af48..e5506f8 100644 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinter.java +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinter.java @@ -1,5 +1,6 @@ package io.github.computerdaddyguy.jfiletreeprettyprinter; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PrettyPrintOptions; import java.io.UncheckedIOException; import java.nio.file.Path; import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinterBuilder.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinterBuilder.java index 682250a..62d2011 100644 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinterBuilder.java +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinterBuilder.java @@ -1,5 +1,6 @@ package io.github.computerdaddyguy.jfiletreeprettyprinter; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PrettyPrintOptions; import io.github.computerdaddyguy.jfiletreeprettyprinter.renderer.TreeEntryRenderer; import io.github.computerdaddyguy.jfiletreeprettyprinter.scanner.PathToTreeScanner; import java.util.Objects; diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/ChildLimitBuilder.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/ChildLimitBuilder.java similarity index 98% rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/ChildLimitBuilder.java rename to src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/ChildLimitBuilder.java index 12090b6..e6eef92 100644 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/ChildLimitBuilder.java +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/ChildLimitBuilder.java @@ -1,4 +1,4 @@ -package io.github.computerdaddyguy.jfiletreeprettyprinter; +package io.github.computerdaddyguy.jfiletreeprettyprinter.options; import java.nio.file.Path; import java.nio.file.PathMatcher; diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/ChildLimits.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/ChildLimits.java similarity index 95% rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/ChildLimits.java rename to src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/ChildLimits.java index b640440..6493d2e 100644 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/ChildLimits.java +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/ChildLimits.java @@ -1,4 +1,4 @@ -package io.github.computerdaddyguy.jfiletreeprettyprinter; +package io.github.computerdaddyguy.jfiletreeprettyprinter.options; /** * Utility class providing constants and factory methods for creating diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/emoji/DefaultEmojiMapping.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/DefaultEmojiMapping.java similarity index 89% rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/emoji/DefaultEmojiMapping.java rename to src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/DefaultEmojiMapping.java index b233fcc..553bd92 100644 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/emoji/DefaultEmojiMapping.java +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/DefaultEmojiMapping.java @@ -1,6 +1,5 @@ -package io.github.computerdaddyguy.jfiletreeprettyprinter.renderer.emoji; +package io.github.computerdaddyguy.jfiletreeprettyprinter.options; -import io.github.computerdaddyguy.jfiletreeprettyprinter.PathMatchers; import java.nio.file.Path; import java.util.Objects; import java.util.Optional; diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/emoji/DefaultEmojiMappingBuilder.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/DefaultEmojiMappingBuilder.java similarity index 97% rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/emoji/DefaultEmojiMappingBuilder.java rename to src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/DefaultEmojiMappingBuilder.java index 8b515dd..29eedef 100644 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/emoji/DefaultEmojiMappingBuilder.java +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/DefaultEmojiMappingBuilder.java @@ -1,6 +1,6 @@ -package io.github.computerdaddyguy.jfiletreeprettyprinter.renderer.emoji; +package io.github.computerdaddyguy.jfiletreeprettyprinter.options; -import io.github.computerdaddyguy.jfiletreeprettyprinter.renderer.emoji.PathMatcherEmojiFunction.EmojiMatch; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PathMatcherEmojiFunction.EmojiMatch; import java.nio.file.PathMatcher; import java.util.ArrayList; import java.util.HashMap; diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/emoji/EmojiMapping.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/EmojiMapping.java similarity index 91% rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/emoji/EmojiMapping.java rename to src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/EmojiMapping.java index 3d6e982..12a33df 100644 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/emoji/EmojiMapping.java +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/EmojiMapping.java @@ -1,4 +1,4 @@ -package io.github.computerdaddyguy.jfiletreeprettyprinter.renderer.emoji; +package io.github.computerdaddyguy.jfiletreeprettyprinter.options; import java.nio.file.Path; import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/emoji/EmojiMappingBuilder.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/EmojiMappingBuilder.java similarity index 97% rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/emoji/EmojiMappingBuilder.java rename to src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/EmojiMappingBuilder.java index 57a79d2..036f31f 100644 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/emoji/EmojiMappingBuilder.java +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/EmojiMappingBuilder.java @@ -1,6 +1,5 @@ -package io.github.computerdaddyguy.jfiletreeprettyprinter.renderer.emoji; +package io.github.computerdaddyguy.jfiletreeprettyprinter.options; -import io.github.computerdaddyguy.jfiletreeprettyprinter.PathMatchers; import java.nio.file.PathMatcher; import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/LineExtensionBuilder.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/LineExtensionBuilder.java similarity index 98% rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/LineExtensionBuilder.java rename to src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/LineExtensionBuilder.java index b10cb13..f83d2ed 100644 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/LineExtensionBuilder.java +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/LineExtensionBuilder.java @@ -1,4 +1,4 @@ -package io.github.computerdaddyguy.jfiletreeprettyprinter; +package io.github.computerdaddyguy.jfiletreeprettyprinter.options; import java.nio.file.Path; import java.nio.file.PathMatcher; diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/LineExtensions.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/LineExtensions.java similarity index 95% rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/LineExtensions.java rename to src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/LineExtensions.java index efce6d4..4ec2c06 100644 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/LineExtensions.java +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/LineExtensions.java @@ -1,4 +1,4 @@ -package io.github.computerdaddyguy.jfiletreeprettyprinter; +package io.github.computerdaddyguy.jfiletreeprettyprinter.options; /** * Utility class providing constants and factory methods for creating diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/emoji/MappingUtils.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/MappingUtils.java similarity index 86% rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/emoji/MappingUtils.java rename to src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/MappingUtils.java index 0a63c2f..58279cf 100644 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/emoji/MappingUtils.java +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/MappingUtils.java @@ -1,4 +1,4 @@ -package io.github.computerdaddyguy.jfiletreeprettyprinter.renderer.emoji; +package io.github.computerdaddyguy.jfiletreeprettyprinter.options; import java.util.Map; import java.util.Map.Entry; diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/emoji/PathExtensionEmojiFunction.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathExtensionEmojiFunction.java similarity index 95% rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/emoji/PathExtensionEmojiFunction.java rename to src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathExtensionEmojiFunction.java index 399c731..aa8fb1d 100644 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/emoji/PathExtensionEmojiFunction.java +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathExtensionEmojiFunction.java @@ -1,4 +1,4 @@ -package io.github.computerdaddyguy.jfiletreeprettyprinter.renderer.emoji; +package io.github.computerdaddyguy.jfiletreeprettyprinter.options; import java.nio.file.Path; import java.util.ArrayList; diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/emoji/PathMatcherEmojiFunction.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathMatcherEmojiFunction.java similarity index 92% rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/emoji/PathMatcherEmojiFunction.java rename to src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathMatcherEmojiFunction.java index edb8d4e..b7c6f1a 100644 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/emoji/PathMatcherEmojiFunction.java +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathMatcherEmojiFunction.java @@ -1,4 +1,4 @@ -package io.github.computerdaddyguy.jfiletreeprettyprinter.renderer.emoji; +package io.github.computerdaddyguy.jfiletreeprettyprinter.options; import java.nio.file.Path; import java.nio.file.PathMatcher; diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PathMatchers.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathMatchers.java similarity index 99% rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PathMatchers.java rename to src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathMatchers.java index 34dbe7f..621d624 100644 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PathMatchers.java +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathMatchers.java @@ -1,4 +1,4 @@ -package io.github.computerdaddyguy.jfiletreeprettyprinter; +package io.github.computerdaddyguy.jfiletreeprettyprinter.options; import java.io.IOException; import java.io.UncheckedIOException; diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/emoji/PathNameEmojiFunction.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathNameEmojiFunction.java similarity index 89% rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/emoji/PathNameEmojiFunction.java rename to src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathNameEmojiFunction.java index b0d906c..20c8ab2 100644 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/emoji/PathNameEmojiFunction.java +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathNameEmojiFunction.java @@ -1,4 +1,4 @@ -package io.github.computerdaddyguy.jfiletreeprettyprinter.renderer.emoji; +package io.github.computerdaddyguy.jfiletreeprettyprinter.options; import java.nio.file.Path; import java.util.Map; diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PathSortBuilder.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathSortBuilder.java similarity index 98% rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PathSortBuilder.java rename to src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathSortBuilder.java index 0745e40..b15bb7e 100644 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PathSortBuilder.java +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathSortBuilder.java @@ -1,4 +1,4 @@ -package io.github.computerdaddyguy.jfiletreeprettyprinter; +package io.github.computerdaddyguy.jfiletreeprettyprinter.options; import java.nio.file.Path; import java.nio.file.PathMatcher; diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PathSorts.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathSorts.java similarity index 98% rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PathSorts.java rename to src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathSorts.java index 4d8fd6e..a6090f9 100644 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PathSorts.java +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathSorts.java @@ -1,4 +1,4 @@ -package io.github.computerdaddyguy.jfiletreeprettyprinter; +package io.github.computerdaddyguy.jfiletreeprettyprinter.options; import java.nio.file.Path; import java.util.Comparator; diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PrettyPrintOptions.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PrettyPrintOptions.java similarity index 93% rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PrettyPrintOptions.java rename to src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PrettyPrintOptions.java index a48608c..8a52df7 100644 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PrettyPrintOptions.java +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PrettyPrintOptions.java @@ -1,7 +1,6 @@ -package io.github.computerdaddyguy.jfiletreeprettyprinter; +package io.github.computerdaddyguy.jfiletreeprettyprinter.options; import io.github.computerdaddyguy.jfiletreeprettyprinter.renderer.RenderingOptions; -import io.github.computerdaddyguy.jfiletreeprettyprinter.renderer.emoji.EmojiMapping; import io.github.computerdaddyguy.jfiletreeprettyprinter.scanner.ScanningOptions; import java.nio.file.Path; import java.nio.file.PathMatcher; @@ -62,21 +61,7 @@ public PrettyPrintOptions withChildLimit(ToIntFunction childLimitFunction) // ---------- Tree format ---------- - public static enum TreeFormat { - - /** - * Uses characters: |--, `-- and β”‚ - */ - CLASSIC_ASCII, - - /** - * Uses characters: β”œβ”€, └─ and β”‚ - */ - UNICODE_BOX_DRAWING, - - } - - private TreeFormat treeFormat = TreeFormat.UNICODE_BOX_DRAWING; + private TreeFormat treeFormat = TreeFormats.UNICODE_BOX_DRAWING; @Override public TreeFormat getTreeFormat() { @@ -85,7 +70,7 @@ public TreeFormat getTreeFormat() { /** * Sets the depth rendering format. - * Default is {@link TreeFormat#UNICODE_BOX_DRAWING}. + * Default is {@link TreeFormats#UNICODE_BOX_DRAWING}. * * @param treeFormat The format to use, cannot be null. */ diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/emoji/SequentialEmojiFunction.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/SequentialEmojiFunction.java similarity index 90% rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/emoji/SequentialEmojiFunction.java rename to src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/SequentialEmojiFunction.java index f63cfdd..549c1e9 100644 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/emoji/SequentialEmojiFunction.java +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/SequentialEmojiFunction.java @@ -1,4 +1,4 @@ -package io.github.computerdaddyguy.jfiletreeprettyprinter.renderer.emoji; +package io.github.computerdaddyguy.jfiletreeprettyprinter.options; import java.nio.file.Path; import java.util.Objects; diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/TreeFormat.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/TreeFormat.java new file mode 100644 index 0000000..2906c10 --- /dev/null +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/TreeFormat.java @@ -0,0 +1,103 @@ +package io.github.computerdaddyguy.jfiletreeprettyprinter.options; + +import java.util.List; + +/** + * Represents the ASCII or Unicode symbol set used to render the visual + * structure of a directory tree. + * + *

A {@code TreeFormat} defines the characters or strings used for: + *

+ *

+ * + *

All four symbols must have the same display width + * (i.e., same string length) to ensure proper alignment of the printed tree. + * A mismatch will cause an {@link IllegalArgumentException} at construction time.

+ * + *

Example:

+ *
{@code
+ * var treeFormat = new TreeFormat("β”œβ”€", "└─", "β”‚ ", "  ");
+ * }
+ * + * @see TreeFormats + */ +public class TreeFormat { + + private final String nonLastChildSymbol; + private final String lastChildSymbol; + private final String continuationSymbol; + private final String emptySymbol; + + /** + * Constructs a new {@link TreeFormat} instance. + * + * @param nonLastChildSymbol the symbol used to connect non-last children (e.g. {@code "β”œβ”€"}) + * @param lastChildSymbol the symbol used to connect the last child (e.g. {@code "└─"}) + * @param continuationSymbol the symbol used for vertical continuation (e.g. {@code "β”‚ "}) + * @param emptySymbol the symbol used for empty indentation (e.g. {@code " "}) + * + * @throws NullPointerException if any argument is {@code null} + * @throws IllegalArgumentException if the provided symbols do not all have the same length + */ + public TreeFormat(String nonLastChildSymbol, String lastChildSymbol, String continuationSymbol, String emptySymbol) { + super(); + ensureAllSameLength(nonLastChildSymbol, lastChildSymbol, continuationSymbol, emptySymbol); + this.nonLastChildSymbol = nonLastChildSymbol; + this.lastChildSymbol = lastChildSymbol; + this.continuationSymbol = continuationSymbol; + this.emptySymbol = emptySymbol; + } + + private void ensureAllSameLength(String nonLastChildSymbol, String lastChildSymbol, String continuationSymbol, String emptySymbol) { + var sizeCountList = List.of(nonLastChildSymbol, lastChildSymbol, continuationSymbol, emptySymbol) + .stream() + .map(String::length) + .distinct() + .toList(); + if (sizeCountList.size() != 1) { + throw new IllegalArgumentException("All tree symbols must have the same length"); + } + } + + /** + * Returns the symbol used for non-last child connections. + * + * @return the non-last child symbol + */ + public String getNonLastChildSymbol() { + return nonLastChildSymbol; + } + + /** + * Returns the symbol used for last child connections. + * + * @return the last child symbol + */ + public String getLastChildSymbol() { + return lastChildSymbol; + } + + /** + * Returns the symbol used for continuing lines in deeper levels. + * + * @return the continuation symbol + */ + public String getContinuationSymbol() { + return continuationSymbol; + } + + /** + * Returns the symbol used for empty indentation (no connection line). + * + * @return the empty indentation symbol + */ + public String getEmptySymbol() { + return emptySymbol; + } + +} diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/TreeFormats.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/TreeFormats.java new file mode 100644 index 0000000..bf8f21f --- /dev/null +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/TreeFormats.java @@ -0,0 +1,36 @@ +package io.github.computerdaddyguy.jfiletreeprettyprinter.options; + +public final class TreeFormats { + + /** + * Uses characters: |--, `-- and β”‚ + */ + public static final TreeFormat CLASSIC_ASCII = new TreeFormat("|--", "`--", "β”‚ ", " "); + + /** + * Uses characters: β”œβ”€, └─ and β”‚ + */ + public static final TreeFormat UNICODE_BOX_DRAWING = new TreeFormat("β”œβ”€", "└─", "β”‚ ", " "); + + private TreeFormats() { + // Helper class + } + + /** + * Constructs a new {@link TreeFormat} instance. + * + * @param nonLastChildSymbol the symbol used to connect non-last children (e.g. {@code "β”œβ”€"}) + * @param lastChildSymbol the symbol used to connect the last child (e.g. {@code "└─"}) + * @param continuationSymbol the symbol used for vertical continuation (e.g. {@code "β”‚ "}) + * @param emptySymbol the symbol used for empty indentation (e.g. {@code " "}) + * + * @throws NullPointerException if any argument is {@code null} + * @throws IllegalArgumentException if the provided symbols do not all have the same length + * + * @see TreeFormat + */ + public static TreeFormat create(String nonLastChildSymbol, String lastChildSymbol, String continuationSymbol, String emptySymbol) { + return new TreeFormat(nonLastChildSymbol, lastChildSymbol, continuationSymbol, emptySymbol); + } + +} diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultLineRenderer.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultLineRenderer.java index 276b20f..f25d520 100644 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultLineRenderer.java +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultLineRenderer.java @@ -1,7 +1,5 @@ package io.github.computerdaddyguy.jfiletreeprettyprinter.renderer; -import io.github.computerdaddyguy.jfiletreeprettyprinter.renderer.depth.Depth; -import io.github.computerdaddyguy.jfiletreeprettyprinter.renderer.depth.DepthFormatter; import io.github.computerdaddyguy.jfiletreeprettyprinter.scanner.TreeEntry.DirectoryEntry; import io.github.computerdaddyguy.jfiletreeprettyprinter.scanner.TreeEntry.FileEntry; import io.github.computerdaddyguy.jfiletreeprettyprinter.scanner.TreeEntry.MaxDepthReachEntry; @@ -15,10 +13,10 @@ @NullMarked class DefaultLineRenderer implements LineRenderer { - private final DepthFormatter treeFormatter; + private final TreeFormatter treeFormatter; private final FileFormatter fileFormatter; - public DefaultLineRenderer(DepthFormatter treeFormatter, FileFormatter fileFormatter) { + public DefaultLineRenderer(TreeFormatter treeFormatter, FileFormatter fileFormatter) { this.treeFormatter = Objects.requireNonNull(treeFormatter, "treeFormatter formatter is null"); this.fileFormatter = Objects.requireNonNull(fileFormatter, "fileFormatter formatter is null"); } diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultTreeEntryRenderer.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultTreeEntryRenderer.java index 7e5694f..7f7fef5 100644 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultTreeEntryRenderer.java +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultTreeEntryRenderer.java @@ -1,7 +1,5 @@ package io.github.computerdaddyguy.jfiletreeprettyprinter.renderer; -import io.github.computerdaddyguy.jfiletreeprettyprinter.renderer.depth.Depth; -import io.github.computerdaddyguy.jfiletreeprettyprinter.renderer.depth.DepthSymbol; import io.github.computerdaddyguy.jfiletreeprettyprinter.scanner.TreeEntry; import io.github.computerdaddyguy.jfiletreeprettyprinter.scanner.TreeEntry.DirectoryEntry; import io.github.computerdaddyguy.jfiletreeprettyprinter.scanner.TreeEntry.FileEntry; @@ -75,7 +73,7 @@ private String renderDirectory(Depth depth, DirectoryEntry dirEntry, List while (childIt.hasNext()) { var childEntry = childIt.next(); - var childDepth = depth.append(childIt.hasNext() ? DepthSymbol.NON_LAST_FILE : DepthSymbol.LAST_FILE); + var childDepth = depth.append(childIt.hasNext() ? TreeSymbol.NON_LAST_FILE : TreeSymbol.LAST_FILE); childLines.append(renderTree(childEntry, childDepth)); if (childIt.hasNext()) { childLines.append('\n'); diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultTreeFormatter.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultTreeFormatter.java new file mode 100644 index 0000000..c708314 --- /dev/null +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultTreeFormatter.java @@ -0,0 +1,46 @@ +package io.github.computerdaddyguy.jfiletreeprettyprinter.renderer; + +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.TreeFormat; +import java.util.Objects; +import org.jspecify.annotations.NullMarked; + +@NullMarked +class DefaultTreeFormatter implements TreeFormatter { + + private final TreeFormat treeFormat; + private final String preIndent; + private final String postIndent; + + public DefaultTreeFormatter(TreeFormat treeFormat, int spaceBefore, int spaceAfter) { + this.treeFormat = Objects.requireNonNull(treeFormat, "treeFormat is null"); + this.preIndent = " ".repeat(spaceBefore); + this.postIndent = " ".repeat(spaceAfter); + } + + @Override + public String format(Depth depth) { + var buff = new StringBuilder(); + var it = depth.getSymbols().iterator(); + while (it.hasNext()) { + var symbol = it.next(); + if (symbol == TreeSymbol.LAST_FILE && it.hasNext()) { + symbol = TreeSymbol.EMPTY; + } else if (symbol == TreeSymbol.NON_LAST_FILE && it.hasNext()) { + symbol = TreeSymbol.CONTINUATION; + } + buff.append(preIndent).append(format(symbol)).append(postIndent); + } + + return buff.toString(); + } + + private String format(TreeSymbol symbol) { + return switch (symbol) { + case NON_LAST_FILE -> treeFormat.getNonLastChildSymbol(); + case LAST_FILE -> treeFormat.getLastChildSymbol(); + case CONTINUATION -> treeFormat.getContinuationSymbol(); + case EMPTY -> treeFormat.getEmptySymbol(); + }; + } + +} diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/depth/Depth.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/Depth.java similarity index 76% rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/depth/Depth.java rename to src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/Depth.java index acc004a..af03979 100644 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/depth/Depth.java +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/Depth.java @@ -1,4 +1,4 @@ -package io.github.computerdaddyguy.jfiletreeprettyprinter.renderer.depth; +package io.github.computerdaddyguy.jfiletreeprettyprinter.renderer; import java.util.ArrayList; import java.util.List; @@ -6,15 +6,15 @@ import org.jspecify.annotations.NullMarked; @NullMarked -public class Depth { +class Depth { - private final List symbols; + private final List symbols; public static Depth createNewEmpty() { return new Depth(List.of()); } - protected Depth(List symbols) { + protected Depth(List symbols) { this.symbols = Objects.requireNonNull(symbols, "symbols is null"); } @@ -30,8 +30,8 @@ public boolean isRoot() { return getSize() == 0; } - public Depth append(DepthSymbol symbol) { - var newList = new ArrayList(symbols); + public Depth append(TreeSymbol symbol) { + var newList = new ArrayList(symbols); newList.add(symbol); return new Depth(newList); } @@ -40,12 +40,12 @@ public Depth pop() { if (symbols.isEmpty()) { return this; } - var newList = new ArrayList(symbols); + var newList = new ArrayList(symbols); newList.removeLast(); return new Depth(newList); } - public List getSymbols() { + public List getSymbols() { return symbols; } diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/EmojiFileFormatter.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/EmojiFileFormatter.java index 58774f9..b3e0427 100644 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/EmojiFileFormatter.java +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/EmojiFileFormatter.java @@ -1,6 +1,6 @@ package io.github.computerdaddyguy.jfiletreeprettyprinter.renderer; -import io.github.computerdaddyguy.jfiletreeprettyprinter.renderer.emoji.EmojiMapping; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.EmojiMapping; import io.github.computerdaddyguy.jfiletreeprettyprinter.scanner.TreeEntry.DirectoryEntry; import io.github.computerdaddyguy.jfiletreeprettyprinter.scanner.TreeEntry.FileEntry; import io.github.computerdaddyguy.jfiletreeprettyprinter.scanner.TreeEntry.MaxDepthReachEntry; diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/FileFormatter.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/FileFormatter.java index 19c349d..46bf1d6 100644 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/FileFormatter.java +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/FileFormatter.java @@ -1,6 +1,6 @@ package io.github.computerdaddyguy.jfiletreeprettyprinter.renderer; -import io.github.computerdaddyguy.jfiletreeprettyprinter.renderer.emoji.EmojiMapping; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.EmojiMapping; import io.github.computerdaddyguy.jfiletreeprettyprinter.scanner.TreeEntry.DirectoryEntry; import io.github.computerdaddyguy.jfiletreeprettyprinter.scanner.TreeEntry.FileEntry; import io.github.computerdaddyguy.jfiletreeprettyprinter.scanner.TreeEntry.MaxDepthReachEntry; diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/LineRenderer.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/LineRenderer.java index 6f3b96e..b3102c0 100644 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/LineRenderer.java +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/LineRenderer.java @@ -1,7 +1,5 @@ package io.github.computerdaddyguy.jfiletreeprettyprinter.renderer; -import io.github.computerdaddyguy.jfiletreeprettyprinter.renderer.depth.Depth; -import io.github.computerdaddyguy.jfiletreeprettyprinter.renderer.depth.DepthFormatter; import io.github.computerdaddyguy.jfiletreeprettyprinter.scanner.TreeEntry.DirectoryEntry; import io.github.computerdaddyguy.jfiletreeprettyprinter.scanner.TreeEntry.FileEntry; import io.github.computerdaddyguy.jfiletreeprettyprinter.scanner.TreeEntry.MaxDepthReachEntry; @@ -27,7 +25,7 @@ interface LineRenderer { * @return */ static LineRenderer create(RenderingOptions options) { - var treeFormatter = DepthFormatter.getInstance(options.getTreeFormat()); + var treeFormatter = TreeFormatter.getInstance(options.getTreeFormat()); var fileFormatter = FileFormatter.createDefault(); fileFormatter = FileFormatter.wrapWithEmojis(fileFormatter, options.getEmojiMapping()); diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/RenderingOptions.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/RenderingOptions.java index b7fccfb..bbe1cab 100644 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/RenderingOptions.java +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/RenderingOptions.java @@ -1,7 +1,7 @@ package io.github.computerdaddyguy.jfiletreeprettyprinter.renderer; -import io.github.computerdaddyguy.jfiletreeprettyprinter.PrettyPrintOptions.TreeFormat; -import io.github.computerdaddyguy.jfiletreeprettyprinter.renderer.emoji.EmojiMapping; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.EmojiMapping; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.TreeFormat; import java.nio.file.Path; import java.util.function.Function; import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/TreeFormatter.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/TreeFormatter.java new file mode 100644 index 0000000..aad1ac7 --- /dev/null +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/TreeFormatter.java @@ -0,0 +1,15 @@ +package io.github.computerdaddyguy.jfiletreeprettyprinter.renderer; + +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.TreeFormat; +import org.jspecify.annotations.NullMarked; + +@NullMarked +interface TreeFormatter { + + String format(Depth depth); + + static TreeFormatter getInstance(TreeFormat treeFormat) { + return new DefaultTreeFormatter(treeFormat, 0, 1); + } + +} diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/depth/DepthSymbol.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/TreeSymbol.java similarity index 80% rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/depth/DepthSymbol.java rename to src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/TreeSymbol.java index 5b5fa33..3e4cc71 100644 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/depth/DepthSymbol.java +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/TreeSymbol.java @@ -1,9 +1,9 @@ -package io.github.computerdaddyguy.jfiletreeprettyprinter.renderer.depth; +package io.github.computerdaddyguy.jfiletreeprettyprinter.renderer; import org.jspecify.annotations.NullMarked; @NullMarked -public enum DepthSymbol { +enum TreeSymbol { /** * Symbol for a file that is not the last in its directory (=has a next file). @@ -18,15 +18,15 @@ public enum DepthSymbol { LAST_FILE, /** - * Symbol for representing a "skip", meaning a continue until next file. + * Symbol for representing a "continuation", meaning a continue until next file. * Something like "β”‚ ". */ - SKIP, + CONTINUATION, /** * Symbol of representing the absence of file. * Contains usually only spaces. */ - NONE; + EMPTY; } \ No newline at end of file diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/depth/DefaultDepthFormatter.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/depth/DefaultDepthFormatter.java deleted file mode 100644 index d241aeb..0000000 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/depth/DefaultDepthFormatter.java +++ /dev/null @@ -1,54 +0,0 @@ -package io.github.computerdaddyguy.jfiletreeprettyprinter.renderer.depth; - -import java.util.Objects; -import java.util.function.Function; -import org.jspecify.annotations.NullMarked; - -@NullMarked -class DefaultDepthFormatter implements DepthFormatter { - - static final DepthFormatter CLASSIC_ASCII = create("|--", "`--", "| ", " ", 0, 1); - static final DepthFormatter UNICODE_BOX_DRAWING = create("β”œβ”€", "└─", "β”‚ ", " ", 0, 1); - - private final Function printFunction; - private final String preIndent; - private final String postIndent; - - public DefaultDepthFormatter(Function printFunction, int spaceBefore, int spaceAfter) { - this.printFunction = Objects.requireNonNull(printFunction, "printFunction is null"); - this.preIndent = " ".repeat(spaceBefore); - this.postIndent = " ".repeat(spaceAfter); - } - - static DepthFormatter create(String nonLastFile, String lastFile, String skip, String none, int spaceBefore, int spaceAfter) { - return new DefaultDepthFormatter(symbol -> switch (symbol) { - case NON_LAST_FILE -> nonLastFile; - case LAST_FILE -> lastFile; - case SKIP -> skip; - case NONE -> none; - }, spaceBefore, spaceAfter); - - } - - @Override - public String format(Depth depth) { - var buff = new StringBuilder(); - var it = depth.getSymbols().iterator(); - while (it.hasNext()) { - var symbol = it.next(); - if (symbol == DepthSymbol.LAST_FILE && it.hasNext()) { - symbol = DepthSymbol.NONE; - } else if (symbol == DepthSymbol.NON_LAST_FILE && it.hasNext()) { - symbol = DepthSymbol.SKIP; - } - buff.append(format(symbol)); - } - - return buff.toString(); - } - - private String format(DepthSymbol symbol) { - return preIndent + printFunction.apply(symbol) + postIndent; - } - -} diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/depth/DepthFormatter.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/depth/DepthFormatter.java deleted file mode 100644 index 6f86365..0000000 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/depth/DepthFormatter.java +++ /dev/null @@ -1,18 +0,0 @@ -package io.github.computerdaddyguy.jfiletreeprettyprinter.renderer.depth; - -import io.github.computerdaddyguy.jfiletreeprettyprinter.PrettyPrintOptions.TreeFormat; -import org.jspecify.annotations.NullMarked; - -@NullMarked -public interface DepthFormatter { - - String format(Depth depth); - - static DepthFormatter getInstance(TreeFormat format) { - return switch (format) { - case CLASSIC_ASCII -> DefaultDepthFormatter.CLASSIC_ASCII; - case UNICODE_BOX_DRAWING -> DefaultDepthFormatter.UNICODE_BOX_DRAWING; - }; - } - -} diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/scanner/DefaultPathToTreeScanner.java b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/scanner/DefaultPathToTreeScanner.java index 6392019..856f357 100644 --- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/scanner/DefaultPathToTreeScanner.java +++ b/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/scanner/DefaultPathToTreeScanner.java @@ -1,6 +1,6 @@ package io.github.computerdaddyguy.jfiletreeprettyprinter.scanner; -import io.github.computerdaddyguy.jfiletreeprettyprinter.PathMatchers; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PathMatchers; import io.github.computerdaddyguy.jfiletreeprettyprinter.scanner.TreeEntry.DirectoryEntry; import io.github.computerdaddyguy.jfiletreeprettyprinter.scanner.TreeEntry.FileEntry; import io.github.computerdaddyguy.jfiletreeprettyprinter.scanner.TreeEntry.MaxDepthReachEntry; diff --git a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/ChildLimitDynamicTest.java b/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/ChildLimitDynamicTest.java index 27ced1c..24d824e 100644 --- a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/ChildLimitDynamicTest.java +++ b/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/ChildLimitDynamicTest.java @@ -2,6 +2,8 @@ import static org.assertj.core.api.Assertions.assertThat; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.ChildLimits; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PathMatchers; import io.github.computerdaddyguy.jfiletreeprettyprinter.util.FileStructureCreator; import io.github.computerdaddyguy.jfiletreeprettyprinter.util.FileStructures; import java.nio.file.Path; diff --git a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/EmojisTest.java b/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/EmojisTest.java index 1e54113..56d6082 100644 --- a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/EmojisTest.java +++ b/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/EmojisTest.java @@ -2,7 +2,9 @@ import static org.assertj.core.api.Assertions.assertThat; -import io.github.computerdaddyguy.jfiletreeprettyprinter.renderer.emoji.EmojiMapping; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.EmojiMapping; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PathMatchers; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PrettyPrintOptions; import io.github.computerdaddyguy.jfiletreeprettyprinter.util.FileStructureCreator; import io.github.computerdaddyguy.jfiletreeprettyprinter.util.FileStructures; import java.nio.file.Path; diff --git a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreeFormatTest.java b/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreeFormatTest.java deleted file mode 100644 index 03142b8..0000000 --- a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreeFormatTest.java +++ /dev/null @@ -1,42 +0,0 @@ -package io.github.computerdaddyguy.jfiletreeprettyprinter; - -import static org.assertj.core.api.Assertions.assertThat; - -import io.github.computerdaddyguy.jfiletreeprettyprinter.PrettyPrintOptions.TreeFormat; -import io.github.computerdaddyguy.jfiletreeprettyprinter.util.FileStructures; -import java.nio.file.Path; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; - -class FileTreeFormatTest { - - @TempDir - private Path root; - - private FileTreePrettyPrinter printer = FileTreePrettyPrinter.builder() - .customizeOptions( - options -> options.withTreeFormat(TreeFormat.CLASSIC_ASCII) - ) - .build(); - - @Test - void emptyDir() { - var path = FileStructures.emptyDirectory(root); - var result = printer.prettyPrint(path); - var expected = "targetPath/"; - assertThat(result).isEqualTo(expected); - } - - @Test - void dirWithFilesOnly() { - var path = FileStructures.simpleDirectoryWithFiles(root, 3); - var result = printer.prettyPrint(path); - var expected = """ - targetPath/ - |-- file1 - |-- file2 - `-- file3"""; - assertThat(result).isEqualTo(expected); - } - -} diff --git a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinterBuilderTest.java b/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinterBuilderTest.java index e95132e..f5485d0 100644 --- a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinterBuilderTest.java +++ b/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinterBuilderTest.java @@ -2,6 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PrettyPrintOptions; import io.github.computerdaddyguy.jfiletreeprettyprinter.util.FileStructures; import java.nio.file.Path; import org.junit.jupiter.api.Test; diff --git a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FilteringTest.java b/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FilteringTest.java index 5666c20..cbcf72e 100644 --- a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FilteringTest.java +++ b/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FilteringTest.java @@ -2,6 +2,8 @@ import static org.assertj.core.api.Assertions.assertThat; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PathMatchers; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PathSorts; import io.github.computerdaddyguy.jfiletreeprettyprinter.util.FileStructureCreator; import java.nio.file.Path; import org.junit.jupiter.api.Test; diff --git a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/LineExtensionTest.java b/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/LineExtensionTest.java index d145a3a..c8d1263 100644 --- a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/LineExtensionTest.java +++ b/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/LineExtensionTest.java @@ -2,6 +2,8 @@ import static org.assertj.core.api.Assertions.assertThat; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.LineExtensions; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PathMatchers; import io.github.computerdaddyguy.jfiletreeprettyprinter.util.FileStructureCreator; import io.github.computerdaddyguy.jfiletreeprettyprinter.util.FileStructures; import java.nio.file.Path; diff --git a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PathMatchersTest.java b/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PathMatchersTest.java index 62ac228..e638799 100644 --- a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PathMatchersTest.java +++ b/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PathMatchersTest.java @@ -3,6 +3,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PathMatchers; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; diff --git a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PathSortBuilderTest.java b/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PathSortBuilderTest.java index 1d91e63..70215ce 100644 --- a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PathSortBuilderTest.java +++ b/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PathSortBuilderTest.java @@ -2,6 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PathSorts; import java.nio.file.Path; import java.util.Comparator; import org.junit.jupiter.api.Nested; diff --git a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/SortingTest.java b/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/SortingTest.java index 90f8c31..2bb97d1 100644 --- a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/SortingTest.java +++ b/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/SortingTest.java @@ -2,6 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PathSorts; import io.github.computerdaddyguy.jfiletreeprettyprinter.util.FileStructureCreator; import java.nio.file.Path; import org.junit.jupiter.api.Test; diff --git a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/TreeFormatTest.java b/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/TreeFormatTest.java new file mode 100644 index 0000000..c76d1f1 --- /dev/null +++ b/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/TreeFormatTest.java @@ -0,0 +1,88 @@ +package io.github.computerdaddyguy.jfiletreeprettyprinter; + +import static org.assertj.core.api.Assertions.assertThat; + +import io.github.computerdaddyguy.jfiletreeprettyprinter.options.TreeFormats; +import io.github.computerdaddyguy.jfiletreeprettyprinter.util.FileStructureCreator; +import io.github.computerdaddyguy.jfiletreeprettyprinter.util.FileStructures; +import java.nio.file.Path; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +class TreeFormatTest { + + @TempDir + private Path root; + + @Test + void emptyDir() { + var path = FileStructures.emptyDirectory(root); + + var printer = FileTreePrettyPrinter.builder() + .customizeOptions( + options -> options.withTreeFormat(TreeFormats.CLASSIC_ASCII) + ) + .build(); + + var result = printer.prettyPrint(path); + var expected = "targetPath/"; + assertThat(result).isEqualTo(expected); + } + + @Test + void dirWithFilesOnly() { + var path = FileStructures.simpleDirectoryWithFiles(root, 3); + + var printer = FileTreePrettyPrinter.builder() + .customizeOptions( + options -> options.withTreeFormat(TreeFormats.CLASSIC_ASCII) + ) + .build(); + + var result = printer.prettyPrint(path); + var expected = """ + targetPath/ + |-- file1 + |-- file2 + `-- file3"""; + assertThat(result).isEqualTo(expected); + } + + @Test + void customFormat() { + + // @formatter:off + var path = FileStructureCreator + .forTargetPath(root) + .createAndEnterDirectory("dirA") + .createAndEnterDirectory("dirB") + .createAndEnterDirectory("dirC") + .createFiles("file", 3) + .up() + .up() + .up() + .createDirectory("dirX") + .getPath(); + // @formatter:on + + var printer = FileTreePrettyPrinter.builder() + .customizeOptions( + options -> options.withTreeFormat(TreeFormats.create("[", "^", "-", ".")) + ) + .build(); + + var result = printer.prettyPrint(path); + + var expected = """ + targetPath/ + [ dirA/ + - ^ dirB/ + - . ^ dirC/ + - . . [ file1 + - . . [ file2 + - . . ^ file3 + ^ dirX/"""; + assertThat(result).isEqualTo(expected); + } + +} diff --git a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/depth/DepthTest.java b/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DepthTest.java similarity index 58% rename from src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/depth/DepthTest.java rename to src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DepthTest.java index 21d5e71..ea81dde 100644 --- a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/depth/DepthTest.java +++ b/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DepthTest.java @@ -1,4 +1,4 @@ -package io.github.computerdaddyguy.jfiletreeprettyprinter.renderer.depth; +package io.github.computerdaddyguy.jfiletreeprettyprinter.renderer; import static org.assertj.core.api.Assertions.assertThat; @@ -15,7 +15,7 @@ void isEmpty_when_empty() { @Test void isEmpty_when_notEmpty() { var depth = Depth.createNewEmpty(); - depth = depth.append(DepthSymbol.LAST_FILE); + depth = depth.append(TreeSymbol.LAST_FILE); assertThat(depth.isEmpty()).isFalse(); } @@ -28,9 +28,9 @@ void getSize_when_empty() { @Test void getSize_when_notEmpty() { var depth = Depth.createNewEmpty(); - depth = depth.append(DepthSymbol.LAST_FILE); - depth = depth.append(DepthSymbol.LAST_FILE); - depth = depth.append(DepthSymbol.LAST_FILE); + depth = depth.append(TreeSymbol.LAST_FILE); + depth = depth.append(TreeSymbol.LAST_FILE); + depth = depth.append(TreeSymbol.LAST_FILE); assertThat(depth.getSize()).isEqualTo(3); } @@ -44,7 +44,7 @@ void pop_when_empty() { @Test void pop_when_single_item_then_empty() { var depth = Depth.createNewEmpty(); - depth = depth.append(DepthSymbol.LAST_FILE); + depth = depth.append(TreeSymbol.LAST_FILE); var result = depth.pop(); assertThat(result.getSymbols()).isEmpty(); } @@ -52,32 +52,32 @@ void pop_when_single_item_then_empty() { @Test void toString_nominal() { var depth = Depth.createNewEmpty(); - depth = depth.append(DepthSymbol.LAST_FILE); - depth = depth.append(DepthSymbol.NON_LAST_FILE); - depth = depth.append(DepthSymbol.NONE); - depth = depth.append(DepthSymbol.SKIP); + depth = depth.append(TreeSymbol.LAST_FILE); + depth = depth.append(TreeSymbol.NON_LAST_FILE); + depth = depth.append(TreeSymbol.EMPTY); + depth = depth.append(TreeSymbol.CONTINUATION); assertThat(depth).hasToString(depth.getSymbols().toString()); } @Test void equals_and_hashCode_nominal() { var depth1 = Depth.createNewEmpty(); - depth1 = depth1.append(DepthSymbol.LAST_FILE); - depth1 = depth1.append(DepthSymbol.NON_LAST_FILE); - depth1 = depth1.append(DepthSymbol.NONE); - depth1 = depth1.append(DepthSymbol.SKIP); + depth1 = depth1.append(TreeSymbol.LAST_FILE); + depth1 = depth1.append(TreeSymbol.NON_LAST_FILE); + depth1 = depth1.append(TreeSymbol.EMPTY); + depth1 = depth1.append(TreeSymbol.CONTINUATION); var depth1Copy = Depth.createNewEmpty(); - depth1Copy = depth1Copy.append(DepthSymbol.LAST_FILE); - depth1Copy = depth1Copy.append(DepthSymbol.NON_LAST_FILE); - depth1Copy = depth1Copy.append(DepthSymbol.NONE); - depth1Copy = depth1Copy.append(DepthSymbol.SKIP); + depth1Copy = depth1Copy.append(TreeSymbol.LAST_FILE); + depth1Copy = depth1Copy.append(TreeSymbol.NON_LAST_FILE); + depth1Copy = depth1Copy.append(TreeSymbol.EMPTY); + depth1Copy = depth1Copy.append(TreeSymbol.CONTINUATION); var depth2 = Depth.createNewEmpty(); - depth2 = depth2.append(DepthSymbol.LAST_FILE); - depth2 = depth2.append(DepthSymbol.NON_LAST_FILE); - depth2 = depth2.append(DepthSymbol.SKIP); - depth2 = depth2.append(DepthSymbol.NONE); + depth2 = depth2.append(TreeSymbol.LAST_FILE); + depth2 = depth2.append(TreeSymbol.NON_LAST_FILE); + depth2 = depth2.append(TreeSymbol.CONTINUATION); + depth2 = depth2.append(TreeSymbol.EMPTY); assertThat(depth1) .hasSameHashCodeAs(depth1)