diff --git a/guides.yaml b/guides.yaml new file mode 100644 index 00000000..ce89f6d1 --- /dev/null +++ b/guides.yaml @@ -0,0 +1,24 @@ +guides: + - id: migration + title: Migration + - id: getting-started + title: Getting started + - id: server + title: Server + - id: operator + title: Operator + - id: securing-apps + title: Securing applications + - id: high-availability + title: High availability + +sources: + - id: keycloak + dir: target/keycloak-guides-$$VERSION$$ + github: https://github.com/keycloak/keycloak/tree/main/docs/guides/ + - id: keycloak-client + dir: target/keycloak-client-guides-$$VERSION$$ + github: https://github.com/keycloak/keycloak-client/tree/main/docs/guides/ + - id: keycloak-web + dir: guides + github: https://github.com/keycloak/keycloak-web/tree/main/guides/ diff --git a/pages/guides.ftl b/pages/guides.ftl index 3058e8b8..fddf4ff1 100644 --- a/pages/guides.ftl +++ b/pages/guides.ftl @@ -9,7 +9,7 @@ @@ -25,9 +25,9 @@
<#list guides.categories as c>
-

${c.label}

+

${c.title}

<#list guides.getGuides(c) as g> - <#if g.tileVisible> + <#if g.tileVisible && !g.snapshot>
diff --git a/pages/nightly/guides.ftl b/pages/nightly/guides.ftl new file mode 100644 index 00000000..e749a86f --- /dev/null +++ b/pages/nightly/guides.ftl @@ -0,0 +1,61 @@ +<#import "/templates/template.ftl" as tmpl> + +<@tmpl.page current="guides" title="Guides"> + + + + + +
+
+ <#list guides.categories as c> +
+

${c.title}

+ <#list guides.getGuides(c) as g> + <#if g.tileVisible && g.snapshot> +
+
+
+
+ ${g.title} + <#if g.community> community + <#if g.external> external +
+ <#if g.summary??> + ${g.summary} + +
+ <#if g.tags??> + <#list g.tags as tag> + ${tag} + + +
+ target="_blank" class="stretched-link link-dark"> +
+
+
+ + +
+ +
+
+
+ + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 06e9ea79..ac4baf8a 100644 --- a/pom.xml +++ b/pom.xml @@ -16,13 +16,12 @@ 1.300 2.3.31 2.5.2 - 2.13.2 - 2.13.4.2 + 2.17.2 2.11.0 1.26.0 25.0.6 - 26.0.0-SNAPSHOT + 26.0.0 1.12.1 v16.13.1 @@ -34,6 +33,18 @@ 3.1.2 + + + sonatype-snapshots + Sonatype Snapshots + https://s01.oss.sonatype.org/content/repositories/snapshots/ + + true + daily + + + + org.kohsuke @@ -58,7 +69,12 @@ com.fasterxml.jackson.core jackson-databind - ${version.jackson-databind} + ${version.jackson-core} + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + ${version.jackson-core} commons-io @@ -219,10 +235,28 @@ true ${project.build.directory} + + org.keycloak + keycloak-guides + 999.0.0-SNAPSHOT + asciidoc + zip + true + ${project.build.directory} + + + + + + + + + + org.keycloak keycloak-client-guides - ${version.keycloak.client} + 999.0.0-SNAPSHOT asciidoc zip true diff --git a/src/main/java/org/keycloak/webbuilder/Context.java b/src/main/java/org/keycloak/webbuilder/Context.java index ca4755f8..d898a5bf 100644 --- a/src/main/java/org/keycloak/webbuilder/Context.java +++ b/src/main/java/org/keycloak/webbuilder/Context.java @@ -3,6 +3,7 @@ import org.keycloak.webbuilder.utils.AsciiDoctor; import org.keycloak.webbuilder.utils.FreeMarker; import org.keycloak.webbuilder.utils.JsonParser; +import org.keycloak.webbuilder.utils.YamlParser; import java.io.File; @@ -28,6 +29,7 @@ public class Context { private Extensions extensions; private Blogs blogs; private Guides guides; + private GuidesMetadata guidesMetadata; private News news; private FreeMarker freeMarker; @@ -63,7 +65,8 @@ public void init() throws Exception { versions = new Versions(versionsDir, jsonParser); extensions = new Extensions(extensionsDir, jsonParser); blogs = new Blogs(blogDir, versions, config, freeMarker, asciiDoctor); - guides = new Guides(tmpDir, guidesDir, asciiDoctor); + guidesMetadata = new YamlParser().read(new File(getWebSrcDir(),"/guides.yaml"), GuidesMetadata.class); + guides = new Guides(guidesMetadata, tmpDir, getWebSrcDir(), asciiDoctor); news = new News(newsDir, blogs, jsonParser, config); freeMarker.init(this); @@ -158,6 +161,10 @@ public File getBlogDir() { return blogDir; } + public GuidesMetadata getGuidesMetadata() { + return guidesMetadata; + } + public File getGuidesDir() { return guidesDir; } diff --git a/src/main/java/org/keycloak/webbuilder/Guides.java b/src/main/java/org/keycloak/webbuilder/Guides.java index 6bbf84bd..557fea88 100644 --- a/src/main/java/org/keycloak/webbuilder/Guides.java +++ b/src/main/java/org/keycloak/webbuilder/Guides.java @@ -17,32 +17,26 @@ public class Guides { - private List categories = new LinkedList<>(); + private List categories = new LinkedList<>(); private List guides = new LinkedList<>(); - public Guides(File tmpDir, File guidesDir, AsciiDoctor asciiDoctor) throws IOException { - for (File d : guidesDir.listFiles((file) -> file.isDirectory())) { - GuideCategory category = getCategory(d); - if (category == null) { - continue; - } + public Guides(GuidesMetadata guidesMetadata, File tmpDir, File webSrcDir, AsciiDoctor asciiDoctor) throws IOException { - loadGuides(asciiDoctor, d, category); - } + for (GuidesMetadata.GuideSource guideSource : guidesMetadata.getSources()) { + final File d = new File(webSrcDir, guideSource.getDir()); + File[] sourceDirs; + if (d.getName().contains("$$VERSION$$")) { + sourceDirs = d.getParentFile().listFiles(f -> f.getName().matches(d.getName().replace("$$VERSION$$", ".*"))); + } else { + sourceDirs = new File[] { d }; + } - Arrays.stream(tmpDir.getParentFile().listFiles((f, s) -> s.startsWith("keycloak-guides") || s.startsWith("keycloak-client-guides"))) - .forEach(f -> { - try { - loadGuides(asciiDoctor, new File(f, "generated-guides/server"), GuideCategory.SERVER); - loadGuides(asciiDoctor, new File(f, "generated-guides/operator"), GuideCategory.OPERATOR); - loadGuides(asciiDoctor, new File(f, "generated-guides/migration"), GuideCategory.MIGRATION); - loadGuides(asciiDoctor, new File(f, "generated-guides/getting-started"), GuideCategory.GETTING_STARTED); - loadGuides(asciiDoctor, new File(f, "generated-guides/securing-apps"), GuideCategory.SECURING_APPS); - loadGuides(asciiDoctor, new File(f, "generated-guides/high-availability"), GuideCategory.HIGH_AVAILABILITY); - } catch (IOException e) { - e.printStackTrace(); + for (GuidesMetadata.GuideMetadata guideMetadata : guidesMetadata.getGuides()) { + for (File sourceDir : sourceDirs) { + loadGuides(asciiDoctor, sourceDir, guideSource, guideMetadata); + } } - }); + } Collections.sort(guides, (o1, o2) -> { if (o1.getPriority() == o2.getPriority()) { @@ -52,19 +46,31 @@ public Guides(File tmpDir, File guidesDir, AsciiDoctor asciiDoctor) throws IOExc } }); - for (GuideCategory c : GuideCategory.values()) { - if (getGuides(c).size() > 0) { - categories.add(c); + for (GuidesMetadata.GuideMetadata guideMetadata : guidesMetadata.getGuides()) { + if (getGuides(guideMetadata).size() > 0) { + categories.add(guideMetadata); } } } public Guide getGuide(String category, String name) { - Optional o = guides.stream().filter(g -> g.getCategory().getId().equals(category) && g.getName().equals(name)).findFirst(); + Optional o = guides.stream().filter(g -> g.getMetadata().getId().equals(category) && g.getName().equals(name)).findFirst(); return o.isPresent() ? o.get() : null; } - private void loadGuides(AsciiDoctor asciiDoctor, File d, GuideCategory category) throws IOException { + private void loadGuides(AsciiDoctor asciiDoctor, File d, GuidesMetadata.GuideSource guideSource, GuidesMetadata.GuideMetadata guideMetadata) throws IOException { + if (!d.isDirectory()) { + return; + } + + boolean snapshot = d.getName().endsWith("-SNAPSHOT"); + + File generatedGuides = new File(d, "generated-guides"); + if (generatedGuides.isDirectory()) { + d = generatedGuides; + } + + d = new File(d, guideMetadata.getId()); if (!d.isDirectory()) { return; } @@ -82,8 +88,8 @@ private void loadGuides(AsciiDoctor asciiDoctor, File d, GuideCategory category) Object isTileVisibileAttribute = attributes.get("guide-tile-visible"); boolean isTileVisibile = isTileVisibileAttribute == null || "true".equals(isTileVisibileAttribute); try { - Guide g = new Guide(category, f, (String) attributes.get("guide-title"), (String) attributes.get("guide-summary"), (String) attributes.get("guide-tags"), (String) attributes.get("author"), community, - (String) attributes.get("external-link"), isTileVisibile); + Guide g = new Guide(guideSource, guideMetadata, f, (String) attributes.get("guide-title"), (String) attributes.get("guide-summary"), (String) attributes.get("guide-tags"), (String) attributes.get("author"), community, + (String) attributes.get("external-link"), isTileVisibile, snapshot); if (guidePriorities != null) { Integer priority = guidePriorities.get(g.getName()); @@ -118,35 +124,27 @@ private Map loadPinnedGuides(File pinnedGuides) throws IOExcept } } - private GuideCategory getCategory(File d) { - String name = d.getName().toUpperCase().replaceAll("-", "_"); - for (GuideCategory c : GuideCategory.values()) { - if (c.name().equals(name)) { - return c; - } - } - return null; - } - - public List getGuides(GuideCategory c) { - return guides.stream().filter(g -> g.category.equals(c)).collect(Collectors.toList()); + public List getGuides(GuidesMetadata.GuideMetadata c) { + return guides.stream().filter(g -> g.getMetadata().equals(c)).collect(Collectors.toList()); } public List getGuides() { return guides; } - public List getCategories() { + public List getCategories() { return categories; } public class Guide { - private GuideCategory category; + private GuidesMetadata.GuideSource guideSource; + private GuidesMetadata.GuideMetadata metadata; private String name; private String author; private boolean community; private File source; + private final boolean snapshot; private String template; private String title; private String summary; @@ -156,19 +154,21 @@ public class Guide { private String externalLink; private boolean tileVisible; - public Guide(GuideCategory category, File source, String title, String summary, String tags, String author, boolean community, String externalLink, boolean tileVisible) { - this.category = category; + public Guide(GuidesMetadata.GuideSource guideSource, GuidesMetadata.GuideMetadata metadata, File source, String title, String summary, String tags, String author, boolean community, String externalLink, boolean tileVisible, boolean snapshot) { + this.guideSource = guideSource; + this.metadata = metadata; this.name = source.getName().replace(".adoc", ""); this.author = author; this.community = community; this.source = source; + this.snapshot = snapshot; this.template = "guide-" + name + ".html"; this.title = title; this.summary = summary; if (tags != null) { this.tags = Arrays.stream(tags.split(",")).map(s -> s.toLowerCase().trim()).sorted().collect(Collectors.toList()); } - this.path = category.getId() + "/" + name; + this.path = metadata.getId() + "/" + name; this.externalLink = externalLink; this.tileVisible = tileVisible; } @@ -185,8 +185,12 @@ public boolean isCommunity() { return community; } - public GuideCategory getCategory() { - return category; + public GuidesMetadata.GuideSource getGuideSource() { + return guideSource; + } + + public GuidesMetadata.GuideMetadata getMetadata() { + return metadata; } public File getSource() { @@ -228,32 +232,9 @@ public boolean isExternal() { public boolean isTileVisible() { return tileVisible; } - } - - public enum GuideCategory { - - MIGRATION("migration", "Migration"), - GETTING_STARTED("getting-started", "Getting started"), - SERVER("server", "Server"), - OPERATOR("operator", "Operator"), - SECURING_APPS("securing-apps", "Securing applications"), - HIGH_AVAILABILITY("high-availability", "High availability"); - - private final String label; - - private final String id; - - GuideCategory(String id, String label) { - this.id = id; - this.label = label; - } - - public String getId() { - return id; - } - public String getLabel() { - return label; + public boolean isSnapshot() { + return snapshot; } } diff --git a/src/main/java/org/keycloak/webbuilder/GuidesMetadata.java b/src/main/java/org/keycloak/webbuilder/GuidesMetadata.java new file mode 100644 index 00000000..ecafef4b --- /dev/null +++ b/src/main/java/org/keycloak/webbuilder/GuidesMetadata.java @@ -0,0 +1,80 @@ +package org.keycloak.webbuilder; + +import java.util.List; + +public class GuidesMetadata { + + public List guides; + + public List sources; + + public List getGuides() { + return guides; + } + + public void setGuides(List guides) { + this.guides = guides; + } + + public List getSources() { + return sources; + } + + public void setSources(List sources) { + this.sources = sources; + } + + public static class GuideMetadata { + + private String id; + private String title; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + } + + public static class GuideSource { + + private String id; + private String dir; + private String github; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getDir() { + return dir; + } + + public void setDir(String dir) { + this.dir = dir; + } + + public String getGithub() { + return github; + } + + public void setGithub(String github) { + this.github = github; + } + } + +} diff --git a/src/main/java/org/keycloak/webbuilder/Links.java b/src/main/java/org/keycloak/webbuilder/Links.java index 1037be2c..1f72eb1c 100644 --- a/src/main/java/org/keycloak/webbuilder/Links.java +++ b/src/main/java/org/keycloak/webbuilder/Links.java @@ -21,7 +21,11 @@ public String getDocs() { } public String getGuides() { - return getLink("guides"); + return getGuides(false); + } + + public String getGuides(boolean snapshot) { + return snapshot ? getLink("nightly/guides") : getLink("guides"); } public String getDownloads() { @@ -52,27 +56,12 @@ public String get(Guides.Guide guide) { if (guide.isExternal()) { return guide.getExternalLink(); } else { - return getLink(guide.getPath()); + return getLink((guide.isSnapshot() ? "nightly/" : "") + guide.getPath()); } } public String getGuideEdit(Guides.Guide guide) { - switch (guide.getCategory()) { - case SERVER: - return "https://github.com/keycloak/keycloak/tree/main/docs/guides/server/" + guide.getName() + ".adoc"; - case SECURING_APPS: - return "https://github.com/keycloak/keycloak-web/tree/main/guides/securing-apps/" + guide.getName() + ".adoc"; - case MIGRATION: - return "https://github.com/keycloak/keycloak/tree/main/docs/guides/migration/" + guide.getName() + ".adoc"; - case OPERATOR: - return "https://github.com/keycloak/keycloak/tree/main/docs/guides/operator/" + guide.getName() + ".adoc"; - case GETTING_STARTED: - return "https://github.com/keycloak/keycloak/tree/main/docs/guides/getting-started/" + guide.getName() + ".adoc"; - case HIGH_AVAILABILITY: - return "https://github.com/keycloak/keycloak/tree/main/docs/guides/high-availability/" + guide.getName() + ".adoc"; - default: - return null; - } + return guide.getGuideSource().getGithub() + guide.getMetadata().getId() + "/" + guide.getName() + ".adoc"; } public String get(Blogs.Blog blog) { diff --git a/src/main/java/org/keycloak/webbuilder/builders/GuideBuilder.java b/src/main/java/org/keycloak/webbuilder/builders/GuideBuilder.java index b417f752..7a125a39 100644 --- a/src/main/java/org/keycloak/webbuilder/builders/GuideBuilder.java +++ b/src/main/java/org/keycloak/webbuilder/builders/GuideBuilder.java @@ -23,15 +23,27 @@ private void buildGuide(Map attributes, Guides.Guide guide) thro return; } attributes.put("guide", guide); + if (guide.isSnapshot()) { + attributes.put("imagesdir", context.getLinks().getRoot() + "/resources/images/guides/nightly"); + } else { + attributes.put("imagesdir", context.getLinks().getRoot() + "/resources/images/guides"); + } + + setGuideLinkAttributes(attributes, guide.isSnapshot()); File dir = new File(context.getTargetDir(), "guides"); dir.mkdirs(); context.getTmpDir().mkdirs(); - context.asciiDoctor().writeFile(attributes, guide.getSource(), context.getTmpDir(), guide.getTemplate()); + context.asciiDoctor().writeFile(attributes, guide.getSource(), context.getTmpDir(), "guide.html"); - File target = new File(context.getTargetDir(), guide.getCategory().getId()); + File target; + if (guide.isSnapshot()) { + target = new File(context.getTargetDir(), "nightly/" + guide.getMetadata().getId()); + } else { + target = new File(context.getTargetDir(), guide.getMetadata().getId()); + } target.mkdirs(); context.freeMarker().writeFile(attributes, "templates/guide-entry.ftl", target, guide.getName() + ".html"); @@ -39,20 +51,19 @@ private void buildGuide(Map attributes, Guides.Guide guide) thro } private void setCommonAttributes(Map attributes) { - attributes.put("imagesdir", context.getLinks().getRoot() + "/resources/images/guides"); attributes.put("leveloffset", "0"); attributes.put("fragment", "yes"); attributes.put("notitle", "yes"); attributes.put("icons", "font"); - - setGuideLinkAttributes(attributes); } - private void setGuideLinkAttributes(Map attributes) { + private void setGuideLinkAttributes(Map attributes, boolean snapshot) { for (Guides.Guide guide : context.guides().getGuides()) { - String linkKeyPrefix = "links_" + guide.getCategory().getId() + "_" + guide.getName(); - attributes.put(linkKeyPrefix + "_name", guide.getTitle()); - attributes.put(linkKeyPrefix + "_url", context.getLinks().get(guide)); + if (guide.isSnapshot() == snapshot){ + String linkKeyPrefix = "links_" + guide.getMetadata().getId() + "_" + guide.getName(); + attributes.put(linkKeyPrefix + "_name", guide.getTitle()); + attributes.put(linkKeyPrefix + "_url", context.getLinks().get(guide)); + } } } diff --git a/src/main/java/org/keycloak/webbuilder/builders/ResourcesBuilder.java b/src/main/java/org/keycloak/webbuilder/builders/ResourcesBuilder.java index 0fb840e0..4a1b045e 100644 --- a/src/main/java/org/keycloak/webbuilder/builders/ResourcesBuilder.java +++ b/src/main/java/org/keycloak/webbuilder/builders/ResourcesBuilder.java @@ -1,6 +1,7 @@ package org.keycloak.webbuilder.builders; import org.apache.commons.io.FileUtils; +import org.keycloak.webbuilder.GuidesMetadata; import java.io.File; import java.io.IOException; @@ -14,6 +15,7 @@ public class ResourcesBuilder extends AbstractBuilder { protected void build() throws Exception { File targetResourcesDir = new File(context.getTargetDir(), "resources"); File guidesImageDir = new File(new File(targetResourcesDir, "images"), "guides"); + File guidesNightlyImageDir = new File(new File(targetResourcesDir, "images"), "guides/nightly"); FileUtils.copyDirectory(context.getResourcesDir(), targetResourcesDir); @@ -21,19 +23,30 @@ protected void build() throws Exception { FileUtils.copyDirectory(new File(context.getBlogDir(), "images"), new File(new File(targetResourcesDir, "images"), "blog")); FileUtils.copyDirectory(new File(context.getGuidesDir(), "images"), guidesImageDir); - List genGuidesImagesDirs = Arrays.stream(context.getTmpDir().getParentFile() - .listFiles((f, s) -> s.startsWith("keycloak-guides") || s.startsWith("keycloak-client-guides"))) - .flatMap(d -> Arrays.stream(new File(d, "generated-guides").listFiles(n -> n.getName().equals("images")))) - .collect(Collectors.toList()); - - for (File genGuidesImagesDir : genGuidesImagesDirs) { - for (File f : genGuidesImagesDir.listFiles()) { - if (f.isFile()) { - FileUtils.copyFileToDirectory(f, guidesImageDir); - } else { - FileUtils.copyDirectoryToDirectory(f, guidesImageDir); - } - } + + for (GuidesMetadata.GuideSource guideSource : context.getGuidesMetadata().getSources()) { + final File d = new File(context.getWebSrcDir(), guideSource.getDir()); + File[] sourceDirs; + if (d.getName().contains("$$VERSION$$")) { + sourceDirs = d.getParentFile().listFiles(f -> f.getName().matches(d.getName().replace("$$VERSION$$", ".*"))); + } else { + sourceDirs = new File[] { d }; + } + + for (File sourceDir : sourceDirs) { + File imageDir = new File(sourceDir, "generated-guides/images"); + if (imageDir.isDirectory()) { + boolean snapshot = sourceDir.getName().endsWith("-SNAPSHOT"); + File targetDir = snapshot ? guidesNightlyImageDir : guidesImageDir; + for (File f : imageDir.listFiles()) { + if (f.isFile()) { + FileUtils.copyFileToDirectory(f, targetDir); + } else { + FileUtils.copyDirectoryToDirectory(f, targetDir); + } + } + } + } } printStep("copied", "blog images"); diff --git a/src/main/java/org/keycloak/webbuilder/utils/AsciiDoctor.java b/src/main/java/org/keycloak/webbuilder/utils/AsciiDoctor.java index 8291f65d..61095412 100644 --- a/src/main/java/org/keycloak/webbuilder/utils/AsciiDoctor.java +++ b/src/main/java/org/keycloak/webbuilder/utils/AsciiDoctor.java @@ -37,7 +37,9 @@ public void writeFile(Map attr, URL url, File targetDir, String } public void writeFile(Map attr, File file, File targetDir, String output) throws Exception { - writeFile(file.getParentFile(), attr, new FileReader(file), new FileWriter(new File(targetDir, output))); + try (FileReader fr = new FileReader(file); FileWriter fw = new FileWriter(new File(targetDir, output))) { + writeFile(file.getParentFile(), attr, fr, fw); + } } private void writeFile(File baseDir, Map attr, Reader reader, Writer writer) throws Exception { diff --git a/src/main/java/org/keycloak/webbuilder/utils/FreeMarker.java b/src/main/java/org/keycloak/webbuilder/utils/FreeMarker.java index 3d27c68a..87ef69d1 100644 --- a/src/main/java/org/keycloak/webbuilder/utils/FreeMarker.java +++ b/src/main/java/org/keycloak/webbuilder/utils/FreeMarker.java @@ -1,5 +1,6 @@ package org.keycloak.webbuilder.utils; +import freemarker.cache.NullCacheStorage; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateExceptionHandler; @@ -27,6 +28,7 @@ public FreeMarker(File webSrcDir) throws IOException { cfg.setDefaultEncoding("UTF-8"); cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); cfg.setLogTemplateExceptions(false); + cfg.setCacheStorage(new NullCacheStorage()); } public Map parseAttributes(File file) throws IOException { diff --git a/src/main/java/org/keycloak/webbuilder/utils/YamlParser.java b/src/main/java/org/keycloak/webbuilder/utils/YamlParser.java new file mode 100644 index 00000000..5021d60a --- /dev/null +++ b/src/main/java/org/keycloak/webbuilder/utils/YamlParser.java @@ -0,0 +1,20 @@ +package org.keycloak.webbuilder.utils; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; + +import java.io.File; + +public class YamlParser { + + private final ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); + + public T read(File f, Class t) { + try { + return mapper.readValue(f, t); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + +} diff --git a/templates/guide-entry.ftl b/templates/guide-entry.ftl index babcbc65..06c94944 100644 --- a/templates/guide-entry.ftl +++ b/templates/guide-entry.ftl @@ -7,8 +7,8 @@
@@ -48,7 +48,7 @@
- <#include "../target/tmp/${guide.template}" parse=false> + <#include "../target/tmp/guide.html" parse=false>