Freemarker templates

This commit is contained in:
Johan Maasing 2025-04-01 20:38:42 +02:00
parent 8057928548
commit d41212c7b2
5 changed files with 72 additions and 20 deletions

View file

@ -24,9 +24,9 @@
<version>4.7.6</version>
</dependency>
<dependency>
<groupId>gg.jte</groupId>
<artifactId>jte</artifactId>
<version>3.2.0</version>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.34</version>
</dependency>
</dependencies>
<build>

View file

@ -1,14 +1,13 @@
package nu.zoom.dsl.jte;
import gg.jte.CodeResolver;
import gg.jte.ContentType;
import gg.jte.TemplateEngine;
import gg.jte.TemplateOutput;
import gg.jte.output.FileOutput;
import gg.jte.resolve.DirectoryCodeResolver;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
import nu.zoom.dsl.ast.DocumentNode;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
@ -19,27 +18,37 @@ public class Generator {
private final Path templatesDir ;
private final DocumentNode data;
private final Path outputDir ;
private final TemplateEngine templateEngine;
private final Configuration cfg;
public Generator(Path templatesDir, DocumentNode data, Path outputDir) {
public Generator(Path templatesDir, DocumentNode data, Path outputDir) throws IOException {
this.templatesDir = Objects.requireNonNull(templatesDir);
this.data = Objects.requireNonNull(data);
this.outputDir = Objects.requireNonNull(outputDir);
this.templateEngine = TemplateEngine.create(
new DirectoryCodeResolver(templatesDir),
ContentType.Plain
);
this.cfg = new Configuration(Configuration.VERSION_2_3_34);
cfg.setDirectoryForTemplateLoading(templatesDir.toFile());
cfg.setDefaultEncoding("UTF-8");
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
cfg.setLogTemplateExceptions(false);
cfg.setWrapUncheckedExceptions(true);
cfg.setFallbackOnNullLoopVariable(false);
}
public List<Path> generate() throws IOException {
List<Path> templates = Files.list(templatesDir).filter(p -> p.toString().endsWith(".jte")).toList() ;
public List<Path> generate() throws IOException, TemplateException {
List<Path> templates = Files.list(templatesDir).filter(p -> p.toString().endsWith(".ftl")).toList() ;
ArrayList<Path> out = new ArrayList<>();
for (Path template : templates) {
// TODO file ending
Path outpath = outputDir.resolve(template.getFileName());
this.templateEngine.render(template.getFileName().toString(), this.data, new FileOutput(outpath));
out.add(outpath);
Path outpath = outputDir.resolve(outputFilenameFromTemplate(template.getFileName()));
Template ftl = this.cfg.getTemplate(template.getFileName().toString()) ;
try (var outw = Files.newBufferedWriter(outpath, StandardCharsets.UTF_8)) {
ftl.process(this.data, outw);
out.add(outpath);
}
}
return out ;
}
private String outputFilenameFromTemplate(Path template) {
return template.getFileName().toString().replace(".ftl", ".scala");
}
}