blob: dc42cf55de5807f4370c58725f0e1d7c08d0353a [file] [log] [blame]
package com.gitblit;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.beust.jcommander.JCommander;
import com.beust.jcommander.Parameter;
import com.beust.jcommander.ParameterException;
import com.beust.jcommander.Parameters;
import com.gitblit.utils.MarkdownUtils;
public class BuildSite {
public static void main(String... args) {
Params params = new Params();
JCommander jc = new JCommander(params);
try {
jc.parse(args);
} catch (ParameterException t) {
usage(jc, t);
}
File sourceFolder = new File(params.sourceFolder);
File destinationFolder = new File(params.outputFolder);
File[] markdownFiles = sourceFolder.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".mkd");
}
});
Arrays.sort(markdownFiles);
Map<String, String> aliasMap = new HashMap<String, String>();
for (String alias : params.aliases) {
String[] values = alias.split("=");
aliasMap.put(values[0], values[1]);
}
System.out.println(MessageFormat.format("Generating site from {0} Markdown Docs in {1} ", markdownFiles.length, sourceFolder.getAbsolutePath()));
String linkPattern = "<a href=''{0}''>{1}</a>";
StringBuilder sb = new StringBuilder();
for (File file : markdownFiles) {
String documentName = getDocumentName(file);
String displayName = documentName;
if (aliasMap.containsKey(documentName)) {
displayName = aliasMap.get(documentName);
}
String fileName = documentName + ".html";
sb.append(MessageFormat.format(linkPattern, fileName, displayName));
sb.append(" | ");
}
sb.setLength(sb.length() - 3);
sb.trimToSize();
String html_header = readContent(new File(params.pageHeader));
String html_footer = readContent(new File(params.pageFooter));
final String links = sb.toString();
final String header = MessageFormat.format(html_header, Constants.FULL_NAME, links);
final String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
final String footer = MessageFormat.format(html_footer, "generated " + date);
for (File file : markdownFiles) {
try {
String documentName = getDocumentName(file);
String fileName = documentName + ".html";
System.out.println(MessageFormat.format(" {0} => {1}", file.getName(), fileName));
InputStreamReader reader = new InputStreamReader(new FileInputStream(file), Charset.forName("UTF-8"));
String content = MarkdownUtils.transformMarkdown(reader);
for (String token : params.substitutions) {
String [] kv = token.split("=");
content = content.replace(kv[0], kv[1]);
}
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(new File(destinationFolder, fileName)), Charset.forName("UTF-8"));
writer.write(header);
writer.write(content);
writer.write(footer);
reader.close();
writer.close();
} catch (Throwable t) {
System.err.println("Failed to transform " + file.getName());
t.printStackTrace();
}
}
}
private static String readContent(File file) {
StringBuilder sb = new StringBuilder();
try {
InputStreamReader is = new InputStreamReader(new FileInputStream(file), Charset.forName("UTF-8"));
BufferedReader reader = new BufferedReader(is);
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
reader.close();
} catch (Throwable t) {
System.err.println("Failed to read content of " + file.getAbsolutePath());
t.printStackTrace();
}
return sb.toString();
}
private static String getDocumentName(File file) {
String displayName = file.getName().substring(0, file.getName().lastIndexOf('.')).toLowerCase();
// trim leading ##_ which is to control display order
return displayName.substring(3);
}
private static void usage(JCommander jc, ParameterException t) {
System.out.println(Constants.getRunningVersion());
System.out.println();
if (t != null) {
System.out.println(t.getMessage());
System.out.println();
}
if (jc != null) {
jc.usage();
}
System.exit(0);
}
@Parameters(separators = " ")
private static class Params {
@Parameter(names = { "--sourceFolder" }, description = "Markdown Source Folder", required = true)
public String sourceFolder;
@Parameter(names = { "--outputFolder" }, description = "HTML Ouptut Folder", required = true)
public String outputFolder;
@Parameter(names = { "--pageHeader" }, description = "Page Header HTML Snippet", required = true)
public String pageHeader;
@Parameter(names = { "--pageFooter" }, description = "Page Footer HTML Snippet", required = true)
public String pageFooter;
@Parameter(names = { "--alias" }, description = "Filename=Linkname aliases", required = false)
public List<String> aliases = new ArrayList<String>();
@Parameter(names = { "--substitute" }, description = "@TOKEN@=value", required = false)
public List<String> substitutions = new ArrayList<String>();
}
}