import java.net.*; import java.io.*; import javax.swing.*; import java.util.regex.*; import java.util.*; // A JavaX extension for multi-line strings, modelled after Lua [[ ]] quotes. public class main { public static void main(String[] args) throws Exception { String s = loadMainJava(); StringBuffer out = new StringBuffer(); // [\s\S] is a clever trick to match all characters including newlines. Pattern regex = Pattern.compile("\\[\\[([\\s\\S]*?)\\]\\]"); Matcher matcher = regex.matcher(s); //print "Matching source code" while (matcher.find()) { //print "double brackets found" String string = matcher.group(1); string = string.replaceAll("^[\t ]*\r?\n", ""); // first newline is ignored in Lua too //System.out.println("String: " + string); String replacement = makeJavaStringLiteral(string); //stem.out.println("Replacement: " + replacement); matcher.appendReplacement(out, matcher.quoteReplacement(replacement)); // quoting is important... } matcher.appendTail(out); s = out.toString(); //System.out.println("Translated source:\n" + s); saveMainJava(s); } static String loadMainJava() throws IOException { return loadTextFile("input/main.java", ""); } static void saveMainJava(String s) throws IOException { saveTextFile("output/main.java", s); } public static String makeJavaStringLiteral(String text) { if (text == null) return null; return "\"" + text .replace("\\", "\\\\") .replace("\"", "\\\"") .replace("\n", "\\n") .replace("\r", "\\r") + "\""; } /** writes safely (to temp file, then rename) */ public static void saveTextFile(String fileName, String contents) throws IOException { File file = new File(fileName); File parentFile = file.getParentFile(); if (parentFile != null) parentFile.mkdirs(); String tempFileName = fileName + "_temp"; FileOutputStream fileOutputStream = new FileOutputStream(tempFileName); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "UTF-8"); PrintWriter printWriter = new PrintWriter(outputStreamWriter); printWriter.print(contents); printWriter.close(); if (file.exists() && !file.delete()) throw new IOException("Can't delete " + fileName); if (!new File(tempFileName).renameTo(file)) throw new IOException("Can't rename " + tempFileName + " to " + fileName); } public static String loadTextFile(String fileName, String defaultContents) throws IOException { if (!new File(fileName).exists()) return defaultContents; FileInputStream fileInputStream = new FileInputStream(fileName); InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8"); return loadTextFile(inputStreamReader); } public static String loadTextFile(Reader reader) throws IOException { StringBuilder builder = new StringBuilder(); try { BufferedReader bufferedReader = new BufferedReader(reader); String line; while ((line = bufferedReader.readLine()) != null) builder.append(line).append('\n'); } finally { reader.close(); } return builder.length() == 0 ? "" : builder.substring(0, builder.length()-1); } }