import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.CopyOption; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.nio.file.StandardOpenOption; import java.util.AbstractMap; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.regex.Pattern; public class sigPlace { final static String ROOTDIR = "sitefiles"; final static String REFDIR = "ref"; final static String OUTDIR = "out"; final static String ARTICLESDIR = "articles"; final static String UPLOADSDIR = "uploads"; final static String COMMENTSDIR = "comments"; final static String DIRECTORYLISTING_FILENAME = "DIRECTORY_LISTING"; static int PORT = 8080; static double COLOR_ROTATION = 0; static boolean inCodeBlock = false; static String storedCodeBlock = ""; final static HashMap map = new HashMap<>(Map.ofEntries( new AbstractMap.SimpleEntry<>("$SITENAME", "SigPlace"), new AbstractMap.SimpleEntry<>("$SITE_BACKCOL", "#111"), new AbstractMap.SimpleEntry<>("$TITLE_CONTENT_START", "

"), new AbstractMap.SimpleEntry<>("$TITLE_CONTENT_END", "

"), new AbstractMap.SimpleEntry<>("$CONTENT_END", "
"), new AbstractMap.SimpleEntry<>("$DATE_CONTENT_START", "
") )); final static HashMap ops = new HashMap<>(Map.ofEntries( new AbstractMap.SimpleEntry<>( "%DEFAULT", Paths.get(REFDIR,"DEFAULT.html")), new AbstractMap.SimpleEntry<>( "%FOOTER", Paths.get(REFDIR,"FOOTER.html")) )); public static void main(String[] args) { if (args.length>0&&args.length%2==0) { int i=0; while (i items = Files.walk(Paths.get("out")).iterator(); ParseArticleFiles(items); items = Files.walk(Paths.get("out")).iterator(); ConvertArticleReferences(items); items = Files.walk(Paths.get("out","articles")).iterator(); GenerateArticleFiles(items); }catch (IOException e) { e.printStackTrace(); System.err.println("Copying files over failed!"); return; } System.out.println("Building directory listings..."); try { buildDirectoryListings(); } catch (IOException e) { e.printStackTrace(); System.err.println("Failed to build directory listings!"); return; } System.out.println("Site has been built into the "+OUTDIR+" directory."); ExportCodeFile(); System.out.println("\nStarting web server..."); new sigServer(); } private static void ParseArticleFiles(Iterator items) { while (items.hasNext()) { Path f = items.next(); System.out.println(" Found "+f.getFileName()); if (Files.isRegularFile(f)) { try { System.out.println(" Preparing "+f.getFileName()); List content = Files.readAllLines(f); if (isHTMLFile(f)) { content.addAll(0,Files.readAllLines(ops.get("%DEFAULT"))); content.addAll(Files.readAllLines(ops.get("%FOOTER"))); } System.out.println(" Parsing "+f.getFileName()); for (int i=0;i0&&isArticleFile(f)) { //Check for markdown pieces. if (s.charAt(0)=='-') { //Start of a title piece. s=s.replace("-",map.get("$TITLE_CONTENT_START")); s=s+map.get("$TITLE_CONTENT_END").replace("%ID%","id=\"content_"+f+"\""); //Use ⤈ if there's more text to be shown than can fit. } else if (s.contains("===")) { s=map.get("$CONTENT_END")+map.get("$DATE_CONTENT_START")+s.replace("===","")+map.get("$CONTENT_END")+"%CONDITIONAL_EXPAND%"+map.get("$CONTENT_END"); } else if (s.charAt(0)==':') { //Image with caption. //Format: //:,,, String[] splitter = s.split(Pattern.quote(",")); StringBuilder captionText = new StringBuilder(splitter[3]); for (int j=4;j
"+captionText.toString()+"
"; } else { //It's regular content, so add paragraphs. s="

"+s+"

"; } } else if (s.length()==0&&isArticleFile(f)) { s="
"; //Setup a line break here. } for (String key : map.keySet()) { s=s.replaceAll(Pattern.quote(key),map.get(key)); } if (s.length()>0&&isHTMLFile(f)) { if (!inCodeBlock) { if (s.contains("
")) {
                                    inCodeBlock=true;
                                    storedCodeBlock+=s.substring(s.indexOf("
"));
                                    s=s.substring(0,s.indexOf("
"));
                                }
                            } else {
                                if (s.contains("
")) { inCodeBlock=false; storedCodeBlock+=s.substring(0,s.indexOf("
")+"
".length()); int startPos=0; String endText=s.substring(s.indexOf("")+"".length(),s.length()); s=""; for (int j=0;j"+storedCodeBlock.charAt(j); startPos=j+1; continue; } else if (storedCodeBlock.charAt(j)=='\n') { System.out.println("newline"); //Previous section is done. s+="\r\n"; startPos=j+1; continue; } else if (storedCodeBlock.charAt(j)=='(') { //Previous section was a keyword. s+=SPAN("function")+storedCodeBlock.substring(startPos,j)+""+storedCodeBlock.charAt(j); startPos=j+1; continue; } else if (storedCodeBlock.charAt(j)==' '&&j>0&&storedCodeBlock.charAt(j-1)!=' ') { //Previous section was a keyword. s+=SPAN("keyword")+storedCodeBlock.substring(startPos,j)+""+storedCodeBlock.charAt(j); startPos=j+1; continue; } } s+=endText; //System.out.println("Stored code block: "+storedCodeBlock); } else { storedCodeBlock+=s; s=""; } } } content.set(i,s); } System.out.println(" Writing to "+f.toAbsolutePath()); Files.write(f, content, Charset.defaultCharset(),StandardOpenOption.CREATE,StandardOpenOption.TRUNCATE_EXISTING,StandardOpenOption.WRITE); System.out.println(" "+f.getFileName() + " conversion complete!"); } catch (IOException e) { e.printStackTrace(); } } } } /** * Writes a span tag with the included class. * **/ private static String SPAN(String className) { return ""; } private static void GenerateArticleFiles(Iterator items){ System.out.println(" Generating article files..."); while (items.hasNext()) { Path f = items.next(); try { if (Files.isRegularFile(f)&&isArticleFile(f)) { System.out.println(" Creating article for "+f.getFileName()); List content = Files.readAllLines(f); List preContent = Files.readAllLines(ops.get("%DEFAULT")); List postContent = Files.readAllLines(ops.get("%FOOTER")); StringBuilder sb = new StringBuilder(); for (String d : preContent) { for (String k : sigPlace.map.keySet()) { d=d.replaceAll(Pattern.quote(k),sigPlace.map.get(k)); } sb.append(d).append("\n"); } for (String d : content) { for (String k : sigPlace.map.keySet()) { d=d.replaceAll(Pattern.quote(k),sigPlace.map.get(k)); } d=d.replaceFirst("div class=\"content\"","div class=\"expandedContent\""); d=d.replaceFirst("%CONDITIONAL_EXPAND%",""); sb.append(d).append("\n"); } for (String d : postContent) { for (String k : sigPlace.map.keySet()) { d=d.replaceAll(Pattern.quote(k),sigPlace.map.get(k)); } sb.append(d).append("\n"); } Files.write(Paths.get(f.getParent().toString(),f.getFileName()+".html"),sb.toString().getBytes()); } } catch (IOException e) { e.printStackTrace(); } } } private static void ConvertArticleReferences(Iterator items) { while (items.hasNext()) { Path f = items.next(); System.out.println(" Looking for Article References..."+f.getFileName()); boolean articleJavascriptIncluded=false; if (Files.isRegularFile(f)&&isHTMLFile(f)) { System.out.println(" Searching "+f.getFileName()); try { List content = Files.readAllLines(f); for (int i=0;i0&&s.contains("$ARTICLE_PREVIEW")) { String article = ARTICLESDIR+"/"+s.replace("$ARTICLE_PREVIEW ","")+".article"; System.out.println(" Found article preview request in "+f.getFileName()+" for article "+article+"."); Path file = Paths.get(OUTDIR,article); List newData = Files.readAllLines(file); if (newData.size()>0) { content.set(i,newData.get(0)); for (int j=1;j



⤈ Click to expand.
"); content.set(i+newData.size()-1,lastline);//




⤈ Click to expand.
"); } else { content.set(i,""); } if (!articleJavascriptIncluded) { List articlejs = Files.readAllLines(Paths.get(REFDIR,"article.js")); for (int j=articlejs.size()-1;j>=0;j--) { content.add(i,articlejs.get(j)); } articleJavascriptIncluded=true; } } } Files.write(f,content); } catch (IOException e) { e.printStackTrace(); } } } } static void copyDirectory(String sourceDirectoryLocation, String destinationDirectoryLocation) throws IOException { Files.walk(Paths.get(sourceDirectoryLocation)) .forEach(source -> { Path destination = Paths.get(destinationDirectoryLocation, source.toString() .substring(sourceDirectoryLocation.length())); try { if (Files.isDirectory(destination)) { Files.createDirectories(destination); } else { Files.copy(source, destination, new CopyOption[]{StandardCopyOption.COPY_ATTRIBUTES,StandardCopyOption.REPLACE_EXISTING}); } } catch (IOException e) { e.printStackTrace(); } }); } static void buildDirectoryListings() throws IOException { String startingPath=Paths.get(sigPlace.OUTDIR).toAbsolutePath().toString(); HashMap> map = new HashMap<>(); Iterator it = Files.walk(Paths.get(sigPlace.OUTDIR)).iterator(); map.put("/",new ArrayList()); while (it.hasNext()) { Path f = it.next(); if (!f.getFileName().toString().equals(OUTDIR)) { String myKey = f.toAbsolutePath().toString().replace(startingPath,"").replace(f.getFileName().toString(),""); //System.out.println(myKey+","+f); map.putIfAbsent(myKey,new ArrayList()); map.get(myKey).add(f); } } System.out.println("Directory structure determined:"); System.out.println(" "+map); for (String key : map.keySet()) { System.out.println("Creating directory listing for "+key+"..."); StringBuilder sb = new StringBuilder(""); List data = Files.readAllLines(ops.get("%DEFAULT")); List data2 = Files.readAllLines(ops.get("%FOOTER")); for (String d : data) { for (String k : sigPlace.map.keySet()) { d=d.replaceAll(Pattern.quote(k),sigPlace.map.get(k)); } sb.append(d).append("\n"); } sb.append("

Directory Listing for "+key+"

"); sb.append(""); for (Path f : map.get(key)) { sb.append("
") .append("") .append((Files.isDirectory(f)?"📁":"🗎")) .append("") .append("") .append(f.getFileName()) .append("\t") .append(Files.getLastModifiedTime(f)) .append("\t") .append(Files.getOwner(f)) .append("\t") .append(Files.size(f)) .append("
\n"); } for (String d : data2) { for (String k : sigPlace.map.keySet()) { d=d.replaceAll(Pattern.quote(k),sigPlace.map.get(k)); } sb.append(d).append("\n"); } Path newf = Files.write(Paths.get(OUTDIR,key,DIRECTORYLISTING_FILENAME),sb.toString().getBytes()); System.out.println(" Added info for ("+map.size()+") files to "+newf.toAbsolutePath()); } } private static boolean isArticleFile(Path f) { return f.getFileName().toString().contains(".article"); } private static boolean isHTMLFile(Path f) { return f.getFileName().toString().contains(".html"); } private static void ExportCodeFile() { try { Path file = Paths.get("sigServer.java"); List data = Files.readAllLines(file); int i=0; while (!data.get(i++).contains("sigServer()")&&i