import java.util.*; import java.util.function.*; import java.nio.file.*; import java.io.*; import java.util.stream.*; import java.util.Arrays; public class Javadoc { public static void main(String[] args) throws IOException { String filename = args[0]; System.out.println(filename); List lines = Files.readAllLines(Paths.get(filename)); List> sections = groupBy((s1, s2) -> isComment(s1) && isComment(s2), lines); Iterator> it = sections.iterator(); List output = new LinkedList<>(); while (it.hasNext()) { List section; do { section = it.next(); if (!isComment(section.get(0))) output.add(mkCode(section)); } while (it.hasNext() && !isComment(section.get(0))); List prev; List curr = section; while (it.hasNext()) { prev = curr; curr = it.next(); if (isDocComment(prev.get(0)) && !isComment(curr.get(0))) { Html code = mkCode(curr); Html comment = mkComment(prev); output.add(code); output.add(comment); } } } String outFilename = filename.split("\\.")[0] + ".html"; System.out.println(outFilename + " is " + output); Files.write(Paths.get(outFilename), Arrays.asList(Html.html(HtmlTag.HTML, Html.str(HtmlTag.BODY, output.stream().map(Html::toString).collect(Collectors.joining("")))).toString())); } public static Html mkCode(List lines) { return Html.str(HtmlTag.PRE, String.join("\n", lines)); } public static Html mkComment(List lines) { return Html.str(HtmlTag.DIV, lines.stream().map((l) -> dropStar(l)).collect(Collectors.joining("\n"))); } public static List prefixes = Arrays.asList("*", "/**", "/*", "*/"); public static List docPrefixes = Arrays.asList("*", "/**", "*/"); public static String dropStar(String line){ String s = line.trim(); for (String prefix : prefixes) if (s.startsWith(prefix)) return s.substring(prefix.length()); return s; } public static List> groupBy(BiFunction p, List ss) { switch (ss.size()) { case 0: return new LinkedList<>(); case 1: List> l = new LinkedList<>(); l.add(ss); return l; default: List> groups = new LinkedList<>(); Iterator it = ss.iterator(); String prev; String curr = it.next(); List acc = new LinkedList<>(); acc.add(curr); while (it.hasNext()) { prev = curr; curr = it.next(); if (!p.apply(prev, curr)) { groups.add(acc); acc = new LinkedList<>(); } acc.add(curr); } groups.add(acc); return groups; } } public static boolean isComment(String line) { String s = line.trim(); return prefixes.stream().anyMatch((p) -> s.startsWith(p)); } public static boolean isDocComment(String line) { String s = line.trim(); return docPrefixes.stream().anyMatch((p) -> s.startsWith(p)); } }