refactor: Consolidate Qute extensions in a separate package.

Change-Id: I03526ef4f5d99db202cbbf1045e52464e2d83a9a
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/posts/PostResource.java b/src/main/java/eu/mulk/mulkcms2/benki/posts/PostResource.java
index 07a9f2f..d6fe538 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/posts/PostResource.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/posts/PostResource.java
@@ -78,17 +78,6 @@
 
 public abstract class PostResource {
 
-  private static final DateTimeFormatter htmlDateTimeFormatter =
-      DateTimeFormatter.ISO_OFFSET_DATE_TIME;
-
-  private static final DateTimeFormatter humanDateTimeFormatter =
-      DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG, FormatStyle.SHORT);
-
-  private static final DateTimeFormatter htmlDateFormatter = DateTimeFormatter.ISO_LOCAL_DATE;
-
-  private static final DateTimeFormatter humanDateFormatter =
-      DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG);
-
   private static final String hashcashDigestAlgorithm = "SHA-256";
 
   private static final int pageKeyBytes = 32;
@@ -496,42 +485,6 @@
     return wireFeedOutput.outputString(feed);
   }
 
-  @TemplateExtension
-  @CheckForNull
-  static String humanDateTime(@CheckForNull TemporalAccessor x) {
-    if (x == null) {
-      return null;
-    }
-    return humanDateTimeFormatter.format(x);
-  }
-
-  @TemplateExtension
-  @CheckForNull
-  static String htmlDateTime(@CheckForNull TemporalAccessor x) {
-    if (x == null) {
-      return null;
-    }
-    return htmlDateTimeFormatter.format(x);
-  }
-
-  @TemplateExtension
-  @CheckForNull
-  static String humanDate(@CheckForNull TemporalAccessor x) {
-    if (x == null) {
-      return null;
-    }
-    return humanDateFormatter.format(x);
-  }
-
-  @TemplateExtension
-  @CheckForNull
-  static String htmlDate(@CheckForNull TemporalAccessor x) {
-    if (x == null) {
-      return null;
-    }
-    return htmlDateFormatter.format(x);
-  }
-
   private boolean showBookmarkForm() {
     switch (postFilter) {
       case ALL:
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/wiki/WikiResource.java b/src/main/java/eu/mulk/mulkcms2/benki/wiki/WikiResource.java
index edf9c72..4100dc2 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/wiki/WikiResource.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/wiki/WikiResource.java
@@ -37,11 +37,6 @@
 @Path("/wiki")
 public class WikiResource {
 
-  private static final DateTimeFormatter htmlDateFormatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
-
-  private static final DateTimeFormatter humanDateFormatter =
-      DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG, FormatStyle.SHORT);
-
   private static final JsonProvider jsonProvider = JsonProvider.provider();
 
   @CheckedTemplate(basePath = "benki/wiki")
@@ -158,22 +153,4 @@
 
     return Templates.wikiPageRevisionList(page, pageName);
   }
-
-  @TemplateExtension
-  @CheckForNull
-  static String humanDateTime(@CheckForNull TemporalAccessor x) {
-    if (x == null) {
-      return null;
-    }
-    return humanDateFormatter.format(x);
-  }
-
-  @TemplateExtension
-  @CheckForNull
-  static String htmlDateTime(@CheckForNull TemporalAccessor x) {
-    if (x == null) {
-      return null;
-    }
-    return htmlDateFormatter.format(x);
-  }
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/common/template/TemporalExtensions.java b/src/main/java/eu/mulk/mulkcms2/common/template/TemporalExtensions.java
new file mode 100644
index 0000000..35d6d32
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/common/template/TemporalExtensions.java
@@ -0,0 +1,58 @@
+package eu.mulk.mulkcms2.common.template;
+
+import io.quarkus.qute.TemplateExtension;
+import java.time.format.DateTimeFormatter;
+import java.time.format.FormatStyle;
+import java.time.temporal.TemporalAccessor;
+import javax.annotation.CheckForNull;
+
+public class TemporalExtensions {
+
+  private static final DateTimeFormatter htmlDateTimeFormatter =
+      DateTimeFormatter.ISO_OFFSET_DATE_TIME;
+
+  private static final DateTimeFormatter humanDateTimeFormatter =
+      DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG, FormatStyle.SHORT);
+
+  private static final DateTimeFormatter htmlDateFormatter = DateTimeFormatter.ISO_LOCAL_DATE;
+
+  private static final DateTimeFormatter humanDateFormatter =
+      DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG);
+
+  @TemplateExtension
+  @CheckForNull
+  static String humanDateTime(@CheckForNull TemporalAccessor x) {
+    if (x == null) {
+      return null;
+    }
+    return humanDateTimeFormatter.format(x);
+  }
+
+  @TemplateExtension
+  @CheckForNull
+  static String htmlDateTime(@CheckForNull TemporalAccessor x) {
+    if (x == null) {
+      return null;
+    }
+    return htmlDateTimeFormatter.format(x);
+  }
+
+  @TemplateExtension
+  @CheckForNull
+  static String humanDate(@CheckForNull TemporalAccessor x) {
+    if (x == null) {
+      return null;
+    }
+    return humanDateFormatter.format(x);
+  }
+
+  @TemplateExtension
+  @CheckForNull
+  static String htmlDate(@CheckForNull TemporalAccessor x) {
+    if (x == null) {
+      return null;
+    }
+    return htmlDateFormatter.format(x);
+  }
+
+}