You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

BuildSite.java 6.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. /*
  2. * Copyright 2011 gitblit.com.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.gitblit;
  17. import java.io.BufferedReader;
  18. import java.io.File;
  19. import java.io.FileInputStream;
  20. import java.io.FileOutputStream;
  21. import java.io.FilenameFilter;
  22. import java.io.InputStreamReader;
  23. import java.io.OutputStreamWriter;
  24. import java.nio.charset.Charset;
  25. import java.text.MessageFormat;
  26. import java.text.SimpleDateFormat;
  27. import java.util.ArrayList;
  28. import java.util.Arrays;
  29. import java.util.Date;
  30. import java.util.HashMap;
  31. import java.util.List;
  32. import java.util.Map;
  33. import com.beust.jcommander.JCommander;
  34. import com.beust.jcommander.Parameter;
  35. import com.beust.jcommander.ParameterException;
  36. import com.beust.jcommander.Parameters;
  37. import com.gitblit.utils.MarkdownUtils;
  38. public class BuildSite {
  39. public static void main(String... args) {
  40. Params params = new Params();
  41. JCommander jc = new JCommander(params);
  42. try {
  43. jc.parse(args);
  44. } catch (ParameterException t) {
  45. usage(jc, t);
  46. }
  47. File sourceFolder = new File(params.sourceFolder);
  48. File destinationFolder = new File(params.outputFolder);
  49. File[] markdownFiles = sourceFolder.listFiles(new FilenameFilter() {
  50. @Override
  51. public boolean accept(File dir, String name) {
  52. return name.toLowerCase().endsWith(".mkd");
  53. }
  54. });
  55. Arrays.sort(markdownFiles);
  56. Map<String, String> aliasMap = new HashMap<String, String>();
  57. for (String alias : params.aliases) {
  58. String[] values = alias.split("=");
  59. aliasMap.put(values[0], values[1]);
  60. }
  61. System.out.println(MessageFormat.format("Generating site from {0} Markdown Docs in {1} ", markdownFiles.length, sourceFolder.getAbsolutePath()));
  62. String linkPattern = "<a href=''{0}''>{1}</a>";
  63. StringBuilder sb = new StringBuilder();
  64. for (File file : markdownFiles) {
  65. String documentName = getDocumentName(file);
  66. String displayName = documentName;
  67. if (aliasMap.containsKey(documentName)) {
  68. displayName = aliasMap.get(documentName);
  69. }
  70. String fileName = documentName + ".html";
  71. sb.append(MessageFormat.format(linkPattern, fileName, displayName));
  72. sb.append(" | ");
  73. }
  74. sb.setLength(sb.length() - 3);
  75. sb.trimToSize();
  76. String html_header = readContent(new File(params.pageHeader));
  77. String html_footer = readContent(new File(params.pageFooter));
  78. final String links = sb.toString();
  79. final String header = MessageFormat.format(html_header, Constants.FULL_NAME, links);
  80. final String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
  81. final String footer = MessageFormat.format(html_footer, "generated " + date);
  82. for (File file : markdownFiles) {
  83. try {
  84. String documentName = getDocumentName(file);
  85. String fileName = documentName + ".html";
  86. System.out.println(MessageFormat.format(" {0} => {1}", file.getName(), fileName));
  87. InputStreamReader reader = new InputStreamReader(new FileInputStream(file), Charset.forName("UTF-8"));
  88. String content = MarkdownUtils.transformMarkdown(reader);
  89. for (String token : params.substitutions) {
  90. String [] kv = token.split("=");
  91. content = content.replace(kv[0], kv[1]);
  92. }
  93. OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(new File(destinationFolder, fileName)), Charset.forName("UTF-8"));
  94. writer.write(header);
  95. writer.write(content);
  96. writer.write(footer);
  97. reader.close();
  98. writer.close();
  99. } catch (Throwable t) {
  100. System.err.println("Failed to transform " + file.getName());
  101. t.printStackTrace();
  102. }
  103. }
  104. }
  105. private static String readContent(File file) {
  106. StringBuilder sb = new StringBuilder();
  107. try {
  108. InputStreamReader is = new InputStreamReader(new FileInputStream(file), Charset.forName("UTF-8"));
  109. BufferedReader reader = new BufferedReader(is);
  110. String line = null;
  111. while ((line = reader.readLine()) != null) {
  112. sb.append(line);
  113. }
  114. reader.close();
  115. } catch (Throwable t) {
  116. System.err.println("Failed to read content of " + file.getAbsolutePath());
  117. t.printStackTrace();
  118. }
  119. return sb.toString();
  120. }
  121. private static String getDocumentName(File file) {
  122. String displayName = file.getName().substring(0, file.getName().lastIndexOf('.')).toLowerCase();
  123. // trim leading ##_ which is to control display order
  124. return displayName.substring(3);
  125. }
  126. private static void usage(JCommander jc, ParameterException t) {
  127. System.out.println(Constants.getRunningVersion());
  128. System.out.println();
  129. if (t != null) {
  130. System.out.println(t.getMessage());
  131. System.out.println();
  132. }
  133. if (jc != null) {
  134. jc.usage();
  135. }
  136. System.exit(0);
  137. }
  138. @Parameters(separators = " ")
  139. private static class Params {
  140. @Parameter(names = { "--sourceFolder" }, description = "Markdown Source Folder", required = true)
  141. public String sourceFolder;
  142. @Parameter(names = { "--outputFolder" }, description = "HTML Ouptut Folder", required = true)
  143. public String outputFolder;
  144. @Parameter(names = { "--pageHeader" }, description = "Page Header HTML Snippet", required = true)
  145. public String pageHeader;
  146. @Parameter(names = { "--pageFooter" }, description = "Page Footer HTML Snippet", required = true)
  147. public String pageFooter;
  148. @Parameter(names = { "--alias" }, description = "Filename=Linkname aliases", required = false)
  149. public List<String> aliases = new ArrayList<String>();
  150. @Parameter(names = { "--substitute" }, description = "@TOKEN@=value", required = false)
  151. public List<String> substitutions = new ArrayList<String>();
  152. }
  153. }