Thursday, September 25, 2014

Membuat Syntax Highlighter di Web dengan Java (versi 1.0)

Dalam tulisan ini saya hanya berbagi sedikit pengetahuan dasar mengenai bagaimana menghighlight syntax pada website dengan java. Saya lagi mencari cara bagaimana agar String dan inline comment yang sebaris dengan kode program bisa ter-highlight juga. Tapi itu agak lumayan rumit. Mungkin saya perlu membongkar source code milik orang lain. Untuk memahaminya Anda hanya perlu mencari tahu tentang konsep regular expression di java. Ditambah pengetahuan dasar mengenai html misalnya perbedaan antara div dan span.

Walaupun masih sangat jauh dari harapan, tapi yang penting kita pahami dulu ide dasarnya Smile.


package com.fjr.java.syntax;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class JavaSyntaxHighlighter {

static File input = new File("D:/testing html/Test.java") ;

static File output = new File("D:/testing html/Out.java");

static String regex1 = "";

static String[] keyword = {

"abstract", "continue" , "for", "new", "switch",
"assert", "default" , "goto" , "package", "synchronized",
"boolean", "do" , "if" , "private", "this",
"break" , "double" , "implements" , "protected", "throw",
"byte", "else" , "import" , "public" , "throws",
"case" , "enum" , "instanceof", "return", "transient",
"catch", "extends", "int", "short" , "try" ,
"char", "final", "interface", "static", "void",
"class" , "finally", "long" ,"strictfp" , "volatile",
"const", "float", "native" ,"super" , "while"
};

public static void main(String[] args) throws Exception{

if(! output.exists()){
output.createNewFile();
}

BufferedReader br = new BufferedReader(new FileReader(input));
BufferedWriter bw = new BufferedWriter(new FileWriter(output));
highlight(br, bw);
bw.close();
br.close();

System.out.println("FINISH");
}

static void highlight(BufferedReader br , BufferedWriter bw ) throws IOException{
String inputResult;
A: while((inputResult = br.readLine()) != null){
String hasil = inputResult;
String inlineComment = "";
// inline comment
if(hasil.matches("(\\w|[0-9]|\\s)*//(\\w|[0-9]|\\s)*")){
String temp[] = hasil.split("//");
if(temp.length > 1){
inlineComment = "" + s + "");
}

bw.write( hasil + inlineComment + "\n");
}
}
}


Hasilnya


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class JavaSyntaxHighlighter {

static File input = new File("D:/testing html/Test.java") ;

static File output = new File("D:/testing html/Out.java");

static String regex1 = "";

static String[] keyword = {

"abstract", "continue" , "for", "new", "switch",
"assert", "default" , "goto" , "package", "synchronized",
"boolean", "do" , "if" , "private", "this",
"break" , "double" , "implements" , "protected", "throw",
"byte", "else" , "import" , "public" , "throws",
"case" , "enum" , "instanceof", "return", "transient",
"catch", "extends", "int", "short" , "try" ,
"char", "final", "interface", "static", "void",
"class" , "finally", "long" ,"strictfp" , "volatile",
"const", "float", "native" ,"super" , "while"
};

public static void main(String[] args) throws Exception{

if(! output.exists()){
output.createNewFile();
}

BufferedReader br = new BufferedReader(new FileReader(input));
BufferedWriter bw = new BufferedWriter(new FileWriter(output));
highlight(br, bw);
bw.close();
br.close();

System.out.println("FINISH");
}

static void highlight(BufferedReader br , BufferedWriter bw ) throws IOException{
String inputResult;
A: while((inputResult = br.readLine()) != null){
String hasil = inputResult;
String inlineComment = "";
// inline comment
if(hasil.matches("(\\w|[0-9]|\\s)*//(\\w|[0-9]|\\s)*")){
String temp[] = hasil.split("//");
if(temp.length > 1){
inlineComment = "else if(temp.length == 1){
hasil = "continue A;
}
}

hasil.replaceAll("\\t", " ");

for(String s : keyword){
String regex1 = "(" + "\\b" + s + "\\b|" +"\\s*" + s + "\\s+" + ")";
String regex2 = "(" + "\\b" + s + "\\b)";
hasil = hasil.replaceAll( regex2 ,
"" + s + "");
}

bw.write( hasil + inlineComment + "\n");
}
}
}

No comments: