From eba89539a29deba954035056437279088c3e047b Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Mon, 22 Oct 2012 16:52:48 -0400 Subject: [PATCH] Tweak permissions panel layout a bit --- src/com/gitblit/build/BuildSite.java | 215 ++++++++++++++++++++++++++++++++++++----------------- 1 files changed, 147 insertions(+), 68 deletions(-) diff --git a/src/com/gitblit/build/BuildSite.java b/src/com/gitblit/build/BuildSite.java index 97615f8..efff5a3 100644 --- a/src/com/gitblit/build/BuildSite.java +++ b/src/com/gitblit/build/BuildSite.java @@ -17,11 +17,9 @@ import java.io.BufferedReader; import java.io.File; -import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FilenameFilter; -import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.nio.charset.Charset; import java.text.MessageFormat; @@ -57,11 +55,13 @@ */ public class BuildSite { - private final static String CASE_SENSITIVE = "CASE-SENSITIVE"; + private static final String SPACE_DELIMITED = "SPACE-DELIMITED"; - private final static String RESTART_REQUIRED = "RESTART REQUIRED"; + private static final String CASE_SENSITIVE = "CASE-SENSITIVE"; - private final static String SINCE = "SINCE"; + private static final String RESTART_REQUIRED = "RESTART REQUIRED"; + + private static final String SINCE = "SINCE"; public static void main(String... args) { Params params = new Params(); @@ -91,22 +91,6 @@ 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); - if (!params.skips.contains(documentName)) { - 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 htmlHeader = FileUtils.readContent(new File(params.pageHeader), "\n"); @@ -118,54 +102,105 @@ } } String htmlFooter = FileUtils.readContent(new File(params.pageFooter), "\n"); - String links = sb.toString(); - String header = MessageFormat.format(htmlHeader, Constants.FULL_NAME, links); - if (!StringUtils.isEmpty(params.analyticsSnippet)) { - File snippet = new File(params.analyticsSnippet); - if (snippet.exists()) { - String htmlSnippet = FileUtils.readContent(snippet, "\n"); - header = header.replace("<!-- ANALYTICS -->", htmlSnippet); - } - } final String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); final String footer = MessageFormat.format(htmlFooter, "generated " + date); for (File file : markdownFiles) { + String documentName = getDocumentName(file); + if (params.skips.contains(documentName)) { + continue; + } try { - String documentName = getDocumentName(file); - if (!params.skips.contains(documentName)) { - 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]); + String links = createLinks(file, markdownFiles, aliasMap, params.skips); + String header = MessageFormat.format(htmlHeader, Constants.FULL_NAME, links); + if (!StringUtils.isEmpty(params.analyticsSnippet)) { + File snippet = new File(params.analyticsSnippet); + if (snippet.exists()) { + String htmlSnippet = FileUtils.readContent(snippet, "\n"); + header = header.replace("<!-- ANALYTICS -->", htmlSnippet); } - for (String alias : params.properties) { - String[] kv = alias.split("="); - String loadedContent = generatePropertiesContent(new File(kv[1])); - content = content.replace(kv[0], loadedContent); - } - for (String alias : params.loads) { - String[] kv = alias.split("="); - String loadedContent = FileUtils.readContent(new File(kv[1]), "\n"); - loadedContent = StringUtils.escapeForHtml(loadedContent, false); - loadedContent = StringUtils.breakLinesForHtml(loadedContent); - content = content.replace(kv[0], loadedContent); - } - OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream( - new File(destinationFolder, fileName)), Charset.forName("UTF-8")); - writer.write(header); - if (!StringUtils.isEmpty(htmlAdSnippet)) { - writer.write(htmlAdSnippet); - } - writer.write(content); - writer.write(footer); - reader.close(); - writer.close(); } + + String fileName = documentName + ".html"; + System.out.println(MessageFormat.format(" {0} => {1}", file.getName(), fileName)); + String rawContent = FileUtils.readContent(file, "\n"); + String markdownContent = rawContent; + + Map<String, List<String>> nomarkdownMap = new HashMap<String, List<String>>(); + + // extract sections marked as no-markdown + int nmd = 0; + for (String token : params.nomarkdown) { + StringBuilder strippedContent = new StringBuilder(); + + String nomarkdownKey = "%NOMARKDOWN" + nmd + "%"; + String[] kv = token.split(":", 2); + String beginToken = kv[0]; + String endToken = kv[1]; + + // strip nomarkdown chunks from markdown and cache them + List<String> chunks = new Vector<String>(); + int beginCode = 0; + int endCode = 0; + while ((beginCode = markdownContent.indexOf(beginToken, endCode)) > -1) { + if (endCode == 0) { + strippedContent.append(markdownContent.substring(0, beginCode)); + } else { + strippedContent.append(markdownContent.substring(endCode, beginCode)); + } + strippedContent.append(nomarkdownKey); + endCode = markdownContent.indexOf(endToken, beginCode); + chunks.add(markdownContent.substring(beginCode, endCode)); + nomarkdownMap.put(nomarkdownKey, chunks); + } + + // get remainder of text + if (endCode < markdownContent.length()) { + strippedContent.append(markdownContent.substring(endCode, + markdownContent.length())); + } + markdownContent = strippedContent.toString(); + nmd++; + } + + // transform markdown to html + String content = transformMarkdown(markdownContent.toString()); + + // reinsert nomarkdown chunks + for (Map.Entry<String, List<String>> nomarkdown : nomarkdownMap.entrySet()) { + for (String chunk : nomarkdown.getValue()) { + content = content.replaceFirst(nomarkdown.getKey(), chunk); + } + } + + for (String token : params.substitutions) { + String[] kv = token.split("=", 2); + content = content.replace(kv[0], kv[1]); + } + for (String token : params.regex) { + String[] kv = token.split("!!!", 2); + content = content.replaceAll(kv[0], kv[1]); + } + for (String alias : params.properties) { + String[] kv = alias.split("=", 2); + String loadedContent = generatePropertiesContent(new File(kv[1])); + content = content.replace(kv[0], loadedContent); + } + for (String alias : params.loads) { + String[] kv = alias.split("=", 2); + String loadedContent = FileUtils.readContent(new File(kv[1]), "\n"); + loadedContent = StringUtils.escapeForHtml(loadedContent, false); + loadedContent = StringUtils.breakLinesForHtml(loadedContent); + content = content.replace(kv[0], loadedContent); + } + OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(new File( + destinationFolder, fileName)), Charset.forName("UTF-8")); + writer.write(header); + if (!StringUtils.isEmpty(htmlAdSnippet)) { + writer.write(htmlAdSnippet); + } + writer.write(content); + writer.write(footer); + writer.close(); } catch (Throwable t) { System.err.println("Failed to transform " + file.getName()); t.printStackTrace(); @@ -182,6 +217,33 @@ return displayName.substring(underscore); } return displayName; + } + + private static String createLinks(File currentFile, File[] markdownFiles, + Map<String, String> aliasMap, List<String> skips) { + String linkPattern = "<li><a href=''{0}''>{1}</a></li>"; + String currentLinkPattern = "<li class=''active''><a href=''{0}''>{1}</a></li>"; + StringBuilder sb = new StringBuilder(); + for (File file : markdownFiles) { + String documentName = getDocumentName(file); + if (!skips.contains(documentName)) { + String displayName = documentName; + if (aliasMap.containsKey(documentName)) { + displayName = aliasMap.get(documentName); + } else { + displayName = displayName.replace('_', ' '); + } + String fileName = documentName + ".html"; + if (currentFile.getName().equals(file.getName())) { + sb.append(MessageFormat.format(currentLinkPattern, fileName, displayName)); + } else { + sb.append(MessageFormat.format(linkPattern, fileName, displayName)); + } + } + } + sb.setLength(sb.length() - 3); + sb.trimToSize(); + return sb.toString(); } private static String generatePropertiesContent(File propertiesFile) throws Exception { @@ -214,22 +276,27 @@ for (Setting setting : settings) { for (String comment : setting.comments) { if (comment.contains(SINCE) || comment.contains(RESTART_REQUIRED) - || comment.contains(CASE_SENSITIVE)) { - sb.append(MessageFormat.format("<span style=\"color:#004000;\"># <i>{0}</i></span>", transformMarkdown(comment))); + || comment.contains(CASE_SENSITIVE) || comment.contains(SPACE_DELIMITED)) { + sb.append(MessageFormat.format( + "<span style=\"color:#004000;\"># <i>{0}</i></span>", + transformMarkdown(comment))); } else { - sb.append(MessageFormat.format("<span style=\"color:#004000;\"># {0}</span>", transformMarkdown(comment))); + sb.append(MessageFormat.format("<span style=\"color:#004000;\"># {0}</span>", + transformMarkdown(comment))); } sb.append("<br/>\n"); } if (!StringUtils.isEmpty(setting.name)) { - sb.append(MessageFormat.format("<span style=\"color:#000080;\">{0}</span> = <span style=\"color:#800000;\">{1}</span>", setting.name, StringUtils.escapeForHtml(setting.value, false))); + sb.append(MessageFormat + .format("<span style=\"color:#000080;\">{0}</span> = <span style=\"color:#800000;\">{1}</span>", + setting.name, StringUtils.escapeForHtml(setting.value, false))); } sb.append("<br/>\n"); } return sb.toString(); } - + private static String transformMarkdown(String comment) throws ParseException { String md = MarkdownUtils.transformMarkdown(comment); if (md.startsWith("<p>")) { @@ -254,6 +321,9 @@ System.exit(0); } + /** + * Setting represents a setting with its comments from the properties file. + */ private static class Setting { final String name; final String value; @@ -266,6 +336,9 @@ } } + /** + * JCommander Parameters class for BuildSite. + */ @Parameters(separators = " ") private static class Params { @@ -302,5 +375,11 @@ @Parameter(names = { "--properties" }, description = "%TOKEN%=filename", required = false) public List<String> properties = new ArrayList<String>(); + @Parameter(names = { "--nomarkdown" }, description = "%STARTTOKEN%:%ENDTOKEN%", required = false) + public List<String> nomarkdown = new ArrayList<String>(); + + @Parameter(names = { "--regex" }, description = "searchPattern!!!replacePattern", required = false) + public List<String> regex = new ArrayList<String>(); + } } -- Gitblit v1.9.1