package net.rubygrapefruit.docs.launcher;
import joptsimple.OptionException;
import joptsimple.OptionParser;
import joptsimple.OptionSet;
import net.rubygrapefruit.docs.docbook.DocbookParser;
import net.rubygrapefruit.docs.html.HtmlParser;
import net.rubygrapefruit.docs.html.HtmlRenderer;
import net.rubygrapefruit.docs.markdown.MarkdownParser;
import net.rubygrapefruit.docs.model.Document;
import net.rubygrapefruit.docs.parser.Parser;
import net.rubygrapefruit.docs.pdf.PdfRenderer;
import net.rubygrapefruit.docs.renderer.Renderer;
import net.rubygrapefruit.docs.theme.DefaultTheme;
import net.rubygrapefruit.docs.theme.FixedWidthTheme;
import net.rubygrapefruit.docs.theme.MinimalTheme;
import net.rubygrapefruit.docs.theme.Theme;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class Main {
private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) throws IOException {
OptionParser optionParser = new OptionParser();
optionParser.accepts("html", "Generate HTML 4 output");
optionParser.accepts("pdf", "Generate PDF output");
optionParser.accepts("minimal", "Use the minimal theme");
optionParser.accepts("default", "Use the default theme");
optionParser.accepts("fixed-width", "Use the fixed width theme (HTML only)");
optionParser.accepts("out", "The directory to generate output to").withRequiredArg().required();
OptionSet result = null;
try {
result = optionParser.parse(args);
} catch (OptionException e) {
System.err.println(e.getMessage());
System.err.println();
System.err.println("USAGE: docmatic [options] --out <output-dir> <input-file>...");
System.err.println();
optionParser.printHelpOn(System.err);
System.exit(1);
}
List<File> inputs = new ArrayList<File>();
for (String s : result.nonOptionArguments()) {
inputs.add(new File(s));
}
boolean html = result.has("html");
boolean pdf = result.has("pdf");
if (!html && !pdf) {
LOGGER.warn("No output formats specified. Generating HTML.");
html = true;
}
boolean minimalOut = result.has("minimal");
boolean defaultOut = result.has("default");
boolean fixedWidthOut = result.has("fixed-width");
if (!minimalOut && !defaultOut && !fixedWidthOut) {
defaultOut = true;
}
File outputDir = new File(result.valueOf("out").toString());
Renderer htmlRenderer = new HtmlRenderer();
Renderer pdfRenderer = new PdfRenderer();
Theme minimalTheme = new MinimalTheme();
Theme defaultTheme = new DefaultTheme();
Theme fixedWidthTheme = new FixedWidthTheme();
for (File input : inputs) {
Parser parser;
if (input.getName().endsWith(".xml")) {
parser = new DocbookParser();
} else if (input.getName().endsWith(".html")) {
parser = new HtmlParser();
} else {
parser = new MarkdownParser();
}
Document document = parser.parse(input);
if (html) {
if (minimalOut) {
File htmlOutput = new File(outputDir, input.getName() + ".minimal.html");
htmlRenderer.render(document, minimalTheme, htmlOutput);
}
if (fixedWidthOut) {
File htmlOutput = new File(outputDir, input.getName() + ".fixed.html");
htmlRenderer.render(document, fixedWidthTheme, htmlOutput);
}
if (defaultOut) {
File htmlOutput = new File(outputDir, input.getName() + ".html");
htmlRenderer.render(document, defaultTheme, htmlOutput);
}
}
if (pdf) {
if (minimalOut) {
File pdfOutput = new File(outputDir, input.getName() + ".minimal.pdf");
pdfRenderer.render(document, minimalTheme, pdfOutput);
}
if (defaultOut) {
File pdfOutput = new File(outputDir, input.getName() + ".pdf");
pdfRenderer.render(document, defaultTheme, pdfOutput);
}
}
}
}
}