Web: Extract base template.

Change-Id: I20a4fbb04aa75a94f96617b0c4d1be00ab3e4aca
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 ebed4e2..714b785 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/wiki/WikiResource.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/wiki/WikiResource.java
@@ -4,6 +4,7 @@
 
 import io.quarkus.panache.common.Sort;
 import io.quarkus.qute.Template;
+import io.quarkus.qute.TemplateExtension;
 import io.quarkus.qute.TemplateInstance;
 import io.quarkus.qute.api.ResourcePath;
 import io.quarkus.security.Authenticated;
@@ -11,6 +12,7 @@
 import io.smallrye.jwt.auth.principal.JWTCallerPrincipal;
 import java.time.format.DateTimeFormatter;
 import java.time.format.FormatStyle;
+import java.time.temporal.TemporalAccessor;
 import java.util.Map;
 import java.util.Optional;
 import javax.inject.Inject;
@@ -55,17 +57,7 @@
       throw new NotFoundException();
     }
     var page = maybePage.get();
-    return wikiPage
-        .data("title", page.title)
-        .data(
-            "date",
-            Map.of(
-                "htmlFormat", htmlDateFormatter.format(page.date),
-                "humanFormat", humanDateFormatter.format(page.date)))
-        .data(
-            "author",
-            Map.of("name", String.format("%s %s", page.author.firstName, page.author.lastName)))
-        .data("content", page.content);
+    return wikiPage.data("page", page);
   }
 
   @POST
@@ -85,4 +77,14 @@
   public TemplateInstance getPageRevisions(@PathParam("pageName") String pageName) {
     throw new NotImplementedYetException();
   }
+
+  @TemplateExtension
+  static String humanDateTime(TemporalAccessor x) {
+    return humanDateFormatter.format(x);
+  }
+
+  @TemplateExtension
+  static String htmlDateTime(TemporalAccessor x) {
+    return htmlDateFormatter.format(x);
+  }
 }
diff --git a/src/main/resources/templates/base.html b/src/main/resources/templates/base.html
new file mode 100644
index 0000000..8fefe31
--- /dev/null
+++ b/src/main/resources/templates/base.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="UTF-8">
+
+  <title>{#insert title}{/}</title>
+
+  <link rel="stylesheet" type="text/css" href="/common.css" />
+  <script type="module" src="/components.js"></script>
+</head>
+
+<body>
+{#insert body}{/}
+</body>
+</html>
diff --git a/src/main/resources/templates/benki/wiki/wikiPage.html b/src/main/resources/templates/benki/wiki/wikiPage.html
index 865d3ba..7caf94d 100644
--- a/src/main/resources/templates/benki/wiki/wikiPage.html
+++ b/src/main/resources/templates/benki/wiki/wikiPage.html
@@ -1,28 +1,22 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <meta charset="UTF-8">
+{@eu.mulk.mulkcms2.benki.wiki.WikiPageRevision page}
 
-  <title>{title} &#8212; Benki Wiki</title>
+{#include base.html}
+{#title}{page.title} &#8212; Benki Wiki{/title}
+{#body}
+<article id="wiki-page">
+  <header>
+    <h1>{page.title}</h1>
+  </header>
 
-  <link rel="stylesheet" type="text/css" href="/common.css" />
-</head>
+  <main>
+    {#with page}{content.raw}{/}
+  </main>
 
-<body>
-  <article id="wiki-page">
-    <header>
-      <h1>{title}</h1>
-    </header>
+  <hr>
 
-    <main>
-      {content.raw}
-    </main>
-
-    <hr>
-
-    <footer>
-      <a href="/wiki/{title}/revisions">Page revisions</a>
-    </footer>
-  </article>
-</body>
-</html>
+  <footer>
+    <a href="/wiki/{page.title}/revisions">Page revisions</a>
+  </footer>
+</article>
+{/body}
+{/include}