summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/it/alessandroiezzi/genwebsite/Genwebsite.java105
-rw-r--r--src/main/java/it/alessandroiezzi/genwebsite/Page.java76
-rw-r--r--src/main/java/it/alessandroiezzi/genwebsite/Website.java44
3 files changed, 225 insertions, 0 deletions
diff --git a/src/main/java/it/alessandroiezzi/genwebsite/Genwebsite.java b/src/main/java/it/alessandroiezzi/genwebsite/Genwebsite.java
new file mode 100644
index 0000000..5db5a3a
--- /dev/null
+++ b/src/main/java/it/alessandroiezzi/genwebsite/Genwebsite.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2021 Alessandro Iezzi dev@alessandroiezzi.it
+ *
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+package it.alessandroiezzi.genwebsite;
+
+import com.fasterxml.jackson.dataformat.xml.XmlMapper;
+
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+import freemarker.template.TemplateException;
+import freemarker.template.TemplateExceptionHandler;
+import org.apache.commons.cli.*;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.*;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class Genwebsite {
+ public static void main(String[] args) throws ParseException, IOException {
+ String filename = "./website.xml";
+
+ String longOpt = "file";
+ Options options = new Options();
+ Option _option = new Option("f", longOpt, true,
+ "If your website descriptor has a differnt name or resides in other directory.");
+ _option.setRequired(false);
+ options.addOption(_option);
+ CommandLine commandLine = new DefaultParser().parse(options, args);
+ if (commandLine.hasOption(longOpt)) {
+ filename = commandLine.getOptionValue(longOpt);
+ }
+
+ File websiteXml = Paths.get(filename).toFile();
+
+ XmlMapper xmlMapper = new XmlMapper();
+ Website website = xmlMapper.readValue(websiteXml, Website.class);
+ website.setRootDir(websiteXml.getAbsoluteFile().getParent());
+ File outDir = Paths.get(website.getRootDir()).resolve("build").toFile();
+ outDir.mkdirs();
+
+ //Freemarker configuration object
+ Configuration cfg = new Configuration(Configuration.VERSION_2_3_29);
+ cfg.setDirectoryForTemplateLoading(new File(website.getRootDir()));
+ cfg.setDefaultEncoding("UTF-8");
+ cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
+ cfg.setLogTemplateExceptions(false);
+ cfg.setWrapUncheckedExceptions(true);
+ cfg.setFallbackOnNullLoopVariable(false);
+
+ try {
+ for (Page page : website.getPages()) {
+ String pageTemplate = website.getTemplate();
+
+ if (StringUtils.isNotBlank(page.getTemplate())) {
+ pageTemplate = page.getTemplate();
+ }
+
+ //Load template from source folder
+ Template template = cfg.getTemplate(pageTemplate);
+
+ // Build the data-model
+ Map<String, Object> data = new HashMap<>();
+ data.put("title", page.getTitle());
+ data.put("content", page.parse());
+
+ // Console output
+ Writer out = new OutputStreamWriter(System.out);
+ template.process(data, out);
+ out.flush();
+
+ File pageFile = Paths.get(outDir.getAbsolutePath()).resolve(page.getOut()).toFile();
+ pageFile.getParentFile().mkdirs();
+
+ // File output
+ Writer file = new FileWriter(pageFile);
+ template.process(data, file);
+ file.flush();
+ file.close();
+ }
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (TemplateException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/src/main/java/it/alessandroiezzi/genwebsite/Page.java b/src/main/java/it/alessandroiezzi/genwebsite/Page.java
new file mode 100644
index 0000000..91506e0
--- /dev/null
+++ b/src/main/java/it/alessandroiezzi/genwebsite/Page.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2021 Alessandro Iezzi dev@alessandroiezzi.it
+ *
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+package it.alessandroiezzi.genwebsite;
+
+import com.vladsch.flexmark.html.HtmlRenderer;
+import com.vladsch.flexmark.parser.Parser;
+import com.vladsch.flexmark.util.ast.Node;
+import com.vladsch.flexmark.util.data.MutableDataSet;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+public class Page {
+ @Setter private String rootDir = "";
+ @Getter @Setter private String out = "";
+ @Getter @Setter private String content = "";
+ @Getter @Setter private String in = "";
+ @Getter @Setter private String template = "";
+ @Getter @Setter private String title = "";
+
+ public String parse() throws IOException {
+ if (content != null && !content.isEmpty()) {
+ return content;
+ } else if (in != null && !in.isEmpty() && !in.trim().isEmpty()) {
+ String[] splited = in.split("\\.");
+ String extension = splited[splited.length - 1];
+ switch (extension) {
+ case "md":
+ StringBuilder sb = new StringBuilder();
+ BufferedReader br = Files.newBufferedReader(Paths.get(rootDir).resolve(in));
+ String line;
+ while ((line = br.readLine()) != null) {
+ sb.append(line).append("\n");
+ }
+
+
+ MutableDataSet options = new MutableDataSet();
+
+ // uncomment to set optional extensions
+ //options.set(Parser.EXTENSIONS, Arrays.asList(TablesExtension.create(), StrikethroughExtension.create()));
+
+ // uncomment to convert soft-breaks to hard breaks
+ //options.set(HtmlRenderer.SOFT_BREAK, "<br />\n");
+
+ Parser parser = Parser.builder(options).build();
+ HtmlRenderer renderer = HtmlRenderer.builder(options).build();
+
+ // You can re-use parser and renderer instances
+ Node document = parser.parse(sb.toString());
+
+ return renderer.render(document);
+ }
+ }
+
+ return "";
+ }
+}
diff --git a/src/main/java/it/alessandroiezzi/genwebsite/Website.java b/src/main/java/it/alessandroiezzi/genwebsite/Website.java
new file mode 100644
index 0000000..b5394b7
--- /dev/null
+++ b/src/main/java/it/alessandroiezzi/genwebsite/Website.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2021 Alessandro Iezzi dev@alessandroiezzi.it
+ *
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+package it.alessandroiezzi.genwebsite;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.commons.lang3.StringUtils;
+
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Website {
+ @Getter private String rootDir;
+ @Setter private String pagesDir;
+ @Getter @Setter private String template;
+ @Getter @Setter private List<Page> pages = new ArrayList<>();
+
+ public void setRootDir(String rootDir) {
+ this.pages.forEach(p -> {
+ String rootPageDir = rootDir;
+ if (StringUtils.isNotBlank(pagesDir)) {
+ rootPageDir = Paths.get(rootDir).resolve(pagesDir).toFile().getAbsolutePath();
+ }
+ p.setRootDir(rootPageDir);
+ });
+ this.rootDir = rootDir;
+ }
+}