1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
package lombok.website;
import static spark.Spark.*;
import java.awt.Desktop;
import java.io.IOException;
import java.net.URI;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import spark.Request;
import spark.Response;
import spark.Route;
public class RunSite {
private static final int DEFAULT_PORT = 4569;
private final Path base;
public RunSite(Path base) {
this.base = base;
}
public static void main(String[] args) throws Exception {
boolean open = args.length > 1 && args[1].equals("open");
new RunSite(Paths.get(args[0])).go(open);
}
private void go(boolean open) throws Exception {
port(DEFAULT_PORT);
get("/", serve("index.html"));
get("/setup/overview", serve("setup/index.html"));
get("/setup", serve("setup/index.html"));
get("/features", serve("features/index.html"));
get("/features/all", serve("features/index.html"));
get("/features/experimental/all", serve("features/experimental/index.html"));
get("/features/experimental", serve("features/experimental/index.html"));
serveDir("/", base);
System.out.println("Serving page from " + base + " -- hit enter to stop");
if (open) Opener.open("http://localhost:" + DEFAULT_PORT + "/");
System.in.read();
System.exit(0);
}
private void serveDir(String sub, Path dir) throws IOException {
DirectoryStream<Path> ds = Files.newDirectoryStream(dir);
try {
for (Path c : ds) {
String n = c.getFileName().toString();
if (n.equals(".") || n.equals("..")) continue;
if (Files.isDirectory(c)) {
serveDir(sub + n + "/", c);
continue;
}
String rel = base.relativize(c).toString();
get(sub + n, serve(rel));
if (n.endsWith(".html")) get(sub + n.substring(0, n.length() - 5), serve(rel));
}
} finally {
ds.close();
}
}
private static class Opener {
public static void open(String url) throws Exception {
Desktop.getDesktop().browse(new URI(url));
}
}
private Route serve(final String path) {
final Path tgt = base.resolve(path);
return new Route() {
@Override public Object handle(Request req, Response res) throws Exception {
res.type(mapMime(path));
return Files.readAllBytes(tgt);
}
};
}
private String mapMime(String path) {
if (path.endsWith(".css")) return "text/css; charset=UTF-8";
if (path.endsWith(".js")) return "text/javascript; charset=UTF-8";
if (path.endsWith(".png")) return "image/png";
if (path.endsWith(".gif")) return "image/gif";
if (path.endsWith(".jpg")) return "image/jpeg";
if (path.endsWith(".mp4")) return "video/mp4";
if (path.endsWith(".m4v")) return "video/mp4";
if (path.endsWith(".ogv")) return "video/ogg";
if (path.endsWith(".webm")) return "video/webm";
if (path.endsWith(".ico")) return "image/x-icon";
if (path.endsWith(".pdf")) return "application/pdf";
if (path.endsWith(".json")) return "application/json";
if (path.endsWith(".xml")) return "text/xml";
if (path.endsWith(".woff")) return "font/woff";
if (path.endsWith(".woff2")) return "font/woff2";
if (path.endsWith(".html")) return "text/html; charset=UTF-8";
return "text/plain; charset=UTF-8";
}
}
|