package eu.m724.blog; import eu.m724.blog.data.Post; import eu.m724.blog.data.Site; import eu.m724.blog.data.Template; import in.wilsonl.minifyhtml.Configuration; import in.wilsonl.minifyhtml.MinifyHtml; import org.apache.commons.io.file.PathUtils; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.lib.RepositoryBuilder; import java.io.IOException; import java.nio.file.FileAlreadyExistsException; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.Comparator; import java.util.stream.Collectors; public class Main { // TODO put this somewhere else private static final Configuration configuration = new Configuration.Builder() .setMinifyCss(true) .setMinifyJs(true) .build(); public static void main(String[] args) throws IOException { System.out.println("Hello world!"); var workingDirectory = Path.of("m724"); var templateDirectory = workingDirectory.resolve("template"); var outputDirectory = workingDirectory.resolve("generated_out"); var force = true; // var repository = new RepositoryBuilder() .setGitDir(workingDirectory.resolve(".git").toFile()) .build(); var git = new Git(repository); // if (outputDirectory.toFile().exists()) { if (force) { PathUtils.deleteDirectory(outputDirectory); } else { throw new FileAlreadyExistsException(outputDirectory.toString(), null, "Output directory already exists"); } } var site = Site.fromConfig(git); var template = new Template(templateDirectory); Files.createDirectory(outputDirectory); copyIfExists(workingDirectory.resolve("assets"), outputDirectory.resolve("assets")); copyIfExists(templateDirectory.resolve("static"), outputDirectory.resolve("static")); Files.createDirectory(outputDirectory.resolve("post")); var postDirectory = workingDirectory.resolve("posts"); var posts = new ArrayList(); try (var stream = Files.walk(postDirectory)) { for (var path : stream.collect(Collectors.toSet())) { if (!Files.isRegularFile(path)) continue; if (!path.toString().endsWith(".html")) { System.out.println("Post " + path.getFileName() + ": unsupported file type"); continue; } path = postDirectory.relativize(path); var post = Post.fromFile(git, path); var render = template.renderPost(site, post); var outFile = outputDirectory.resolve("post").resolve(path); try { Files.createDirectory(outFile.getParent()); } catch (FileAlreadyExistsException ignored) { } Files.writeString(outFile, render); posts.add(post); } } posts.sort(Comparator.comparing(Post::createdAt).reversed()); Files.writeString(outputDirectory.resolve("index.html"), template.renderIndex(site, posts)); new Server(outputDirectory).start(); } private static boolean copyTree(Path srcDir, Path destDir) throws IOException { if (!Files.isDirectory(srcDir)) { return false; } try (var walk = Files.walk(srcDir)) { for (var src : walk.collect(Collectors.toSet())) { var rel = srcDir.relativize(src); var dest = destDir.resolve(rel); if (Files.isRegularFile(src)) { var parent = dest.getParent(); if (!Files.isDirectory(parent)) { Files.createDirectories(parent); } var type = Files.probeContentType(src); String content = null; if (type.equals("text/html")) { content = MinifyHtml.minify(Files.readString(src), configuration); } else if (type.equals("text/css")) { content = MinifyHtml.minify(Files.readString(src), configuration); } else if (type.equals("text/javascript")) { content = MinifyHtml.minify(Files.readString(src), configuration); } if (content != null) { Files.writeString(dest, content); } else { Files.copy(src, dest); } } } } return true; } private static void copyIfExists(Path srcDir, Path destDir) throws IOException { System.out.print(srcDir); if (copyTree(srcDir, destDir)) { System.out.println(" copied"); } else { System.out.println(" doesn't exist, not copying"); } } }