1 // Copyright 2008 the Contributors, as shown in the revision logs.
2 // Licensed under the Apache Public Source License 2.0 ("the License").
3 // You may not use this file except in compliance with the License.
5 import edu.berkeley.sbp.*;
6 import edu.berkeley.sbp.misc.*;
7 import edu.berkeley.sbp.util.*;
8 import edu.berkeley.sbp.meta.*;
9 import edu.berkeley.sbp.chr.*;
12 public class HaskellHelper {
13 public static boolean isNull(Object o) { return o==null; }
15 private static CharParser parser = null;
17 synchronized(HaskellHelper.class) {
20 // FIXME: bundle this into the jarfile
21 InputStream grammarFile = HaskellHelper.class.getClassLoader().getResourceAsStream("wix.g");
22 Tree<String> res = new CharParser(GrammarAST.getMetaGrammar())
23 .parse(grammarFile).expand1();
24 Union grammar = GrammarAST.buildFromAST(res, "s", new GrammarAST.ImportResolver() {
25 public InputStream getImportStream(String filename) {
26 return this.getClass().getClassLoader().getResourceAsStream(filename);
29 parser = new CharParser(grammar);
30 } catch (Exception e) {
31 throw new RuntimeException(e);
37 public static Tree help(String targetFile) throws Throwable {
40 Reader r = new InputStreamReader(new FileInputStream(targetFile));
41 Input input = new CharInput(new IndentingReader(r, CharAtom.left, CharAtom.right));
42 ret = parser.parse(input).expand1();
43 } catch (Throwable e) {
47 if (ret==null) throw new NullPointerException("CharParser returned null");
51 public static void main(String[] argv) throws Throwable {
52 if (argv.length != 2) {
53 System.out.println("usage: java -jar wix.jar [-v] <indir> <outdir>");
54 // FIXME: implement this
55 System.out.println(" | java -jar wix.jar [-v] <infile>.wix");
56 System.out.println("");
57 // FIXME: implement these
58 System.out.println(" -v print text as it is parsed (sbp.verbose=true)");
59 System.out.println(" -vv like -v, but also dump parse tree");
60 System.out.println(" -vvv like -vv, but also dump wix tree");
64 File indir = new File(argv[0]);
65 File outdir = new File(argv[1]);
66 if (!indir.isDirectory()) {
67 process(new File(indir.getParent()), indir.getName(), outdir);
69 process(indir, "", outdir);
73 private static void process(File indir, String suffix, File outdir) throws Throwable {
74 File f = new File(indir.getAbsolutePath()+File.separatorChar+suffix);
75 //System.out.println(f+" "+indir + " " + suffix + " " + outdir);
76 if (!f.exists()) return;
77 if (f.isDirectory()) {
78 for (String s : f.list())
79 process(indir, suffix + File.separatorChar + s, outdir);
82 if (f.getPath().endsWith(".wix")) {
83 String out = "== " + suffix + " ";
84 while(out.length() < 75) out+="=";
85 System.out.println(ANSI.yellow(out));
86 //System.out.println();
87 String outPath = outdir.getAbsolutePath()+File.separatorChar+suffix;
88 outPath = outPath.substring(0, outPath.length()-".wix".length())+".html";
89 if (new File(outPath).exists() && new File(outPath).lastModified() > f.lastModified()) return;
90 Class.forName("Main").
91 getMethod("main", new Class[] { String[].class }).
92 invoke(null, new Object[] { new String[] { f.getAbsolutePath() } });
93 new File(new File(outPath).getParent()).mkdirs();
94 PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(outPath+"+")));
98 File dest = new File(outPath);
101 Process p = Runtime.getRuntime().exec(new String[] {
104 dest.getAbsolutePath(),
105 new File(outPath+"+").getAbsolutePath()
107 BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
110 for(String s = br.readLine(); s != null; s = br.readLine()) {
111 if (s.startsWith("+")) System.out.println(ANSI.green(s));
112 else if (s.startsWith("-")) System.out.println(ANSI.red(s));
113 /*else System.out.println(ANSI.blue(s));*/
116 } catch (Exception e) {
120 new File(outPath+"+").renameTo(dest);
121 if (dest.lastModified() <= f.lastModified())
122 dest.setLastModified(f.lastModified()+1);
126 public static Object ret;
127 public static void putBack(String o) { ret = o; }