{
+ private static final HighConcurrencyTemplateCache HIGH_CONCURRENCY_TEMPLATE_CACHE =
+ new HighConcurrencyTemplateCache();
+
+ /**
+ * Use this to obtain an instance of Handlebars instead of creating one separately.
+ *
+ * Specify a TemplateLoader if the default ClassPathTemplateLoader is not required.
+ *
+ *
Using this ensures the instance returned has a consistent setup with all helpers registered.
+ *
+ * @param loader The TemplateLoader to use. If null, handlebars defaults to
+ * ClassPathTemplateLoader.
+ * @return A HandleBars instance with appropriate settings and registered helpers
+ */
+ static Handlebars getHandlebarsInstance(@Nullable TemplateLoader loader) {
+ Handlebars handlebars =
+ new Handlebars()
+ .with(HIGH_CONCURRENCY_TEMPLATE_CACHE)
+ .preEvaluatePartialBlocks(false)
+ .parentScopeResolution(false)
+ .setCharset(StandardCharsets.UTF_8);
+ if (loader != null) {
+ handlebars.with(loader);
+ }
+ return HandlebarsHelpers.registerHelpers(handlebars);
+ }
+
public static boolean isAssetFileHandlebars(String filename) {
if (filename == null) {
return false;
@@ -63,7 +79,7 @@ public static boolean isAssetFileHandlebars(String filename) {
private final Template template;
/** Logging class instance. */
- private static final Logger log = LogManager.getLogger(Token.class);
+ private static final Logger log = LogManager.getLogger(HandlebarsUtil.class);
/** Handlebars partial template source that uses Add-On files */
private static record LibraryTemplateSource(@Nonnull Library library, @Nonnull String filename)
@@ -92,7 +108,7 @@ public String content(@Nonnull final Charset charset) throws IOException {
/** Handlebars partial template loader that uses Add-On Library URIs */
private static class LibraryTemplateLoader extends AbstractTemplateLoader {
/** Path to template being resolved, relative paths are resolved relative to its parent. */
- @Nonnull final Path current;
+ @Nonnull final URI current;
@Nonnull final Library library;
@@ -100,7 +116,7 @@ private LibraryTemplateLoader(@Nonnull String current, @Nonnull Library library)
if (!current.startsWith("/")) {
current = "/" + current;
}
- this.current = new File(current).toPath();
+ this.current = URI.create(current);
this.library = library;
setPrefix(TemplateLoader.DEFAULT_PREFIX);
setSuffix(TemplateLoader.DEFAULT_SUFFIX);
@@ -110,7 +126,7 @@ private LibraryTemplateLoader(@Nonnull String current, @Nonnull Library library)
@Override
@Nonnull
public String resolve(@Nonnull final String path) {
- var location = current.resolveSibling(path).normalize().toString();
+ var location = current.resolve(path).normalize().toString();
if (location.startsWith("/")) {
location = location.substring(1);
}
@@ -124,29 +140,6 @@ public LibraryTemplateSource sourceAt(@Nonnull final String location) {
}
}
- private static enum MapToolHelpers implements Helper