diff options
Diffstat (limited to 'src/main/java')
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; + } +} |