Sunday 3 February 2013


JAVA 2 HTML:
import java.io.*;

class c2h {

    static int maxKeyWords = 10000; //max number of keywords per language

//ini variables
    static String space = " ";
    static String outFile = "outFile.html";
    static String iniFile = "c2h.ini";
    static String ftypeExt = "filetype";
    static String languageName = "language";
    static String numbers = "%NUMBERS%";
    static String background = "%BACKGROUND%";
    static String text = "%TEXT%";
    static String end = "<end>";
    static String commentary = "//";
    static String t2start = "|",  t2end = "|"; //Keyword type 2, starts with/ends with;
    static String t3start = "[",  t3end = "]"; //Keyword type 3, starts with/ends with;
    static String t4start = "{",  t4end = "}"; //Keyword type 4, starts with/ends with;

//html-tags
    static String htmlStart = "<html>",  htmlEnd = "</html>";
    static String preformatertStart = "<pre>",  preformatertEnd = "</pre>";
    static String bodyStart = "<body>",  bodyEnd = "</body>";
    static String fontStart = "<font color=",  fontEnd = "</font>";
    static String codeFile = "",  ext = "",  Sprak = "",  left = "",  right = "";
    static String backCol = "#FFFFFF",  numbCol = "#CC0000",  textCol = "#000000"; //default colors

//here the keywords are stored
//[keyword nr.][keyword,type,color]
//type:1=regular keyword,2="line" starts with,3=string start and stops with
//4=start and stops with, over several lines possibly
    static String keyWord[][] = new String[maxKeyWords][3];//
    static String fext[] = new String[100];
    static String temp[] = new String[100];
    static int counter = 0,  flin = 0; //count everytime I read the ini file to print line number with error

//global usage variables
    static String s = "",  le = "",  ri = "",  mi = "";
    static int l = 0,  i = 0,  i2 = 0;

    public static void main(String[] args) throws Exception {
        System.out.println("\n-------------------------------------");
        System.out.println("Code2HTML v1.0 by Kenneth Sundnes");
        System.out.println("kenneths@stud.cs.uit.no IFI-UiT-2002");
        System.out.println("-------------------------------------\n");
        if (fileExist(iniFile) == false) {
            iniError();
        }
        if (args.length == 0) {
            noFileError();
        }
        if (fileExist(args[0]) == false) {
            fileError(args[0]);
        }
        ext = getExtension(args[0]);
        codeFile = args[0];
        try {
            readIniFile(); //read ini file
            findOutFile(); //figure output outFilename
            htmlOut(); //write the html!
        } catch (Exception exp) {
            System.out.println(exp);
            System.out.println("Something wrong happened :-(, the file " + outFile + " is probably wrongly converted.");
            System.exit(0);
        }
        if (fileExist(outFile) == false) {
            System.out.println("Something wrong happened :-(, the file " + outFile + " is NOT written!");
        } else {
            System.out.println("The file " + outFile + " is now written!");
        }
    }

//Reads the INI file
    static void readIniFile() throws Exception {
        String t = "", ftemp = "";
        BufferedReader fin = fileOpenRead(iniFile);
        for (;;) {
            t = readLineFromFile(fin).trim(); //read a line from ini file
            if (t == null) {
                break; //if eof - out of the loop
            }
            for (;;) {
                storeExt(getSubstring(ftypeExt, fin)); //finds a line with filtype in it
                if (stringInArray(fext, ext) != -1) { //if the input files extension matches this one:
                    String b = getSubstring(languageName, fin); //finds next line with "language"
                    if (b == null) {
                        errorInIni(); //if EOF - out!
                    }
                    if (b.indexOf("=") == -1) {
                        errorInIni(); //if the line does not have '=' - out!
                    }
                    Sprak = b.substring(b.indexOf("=") + 1); //stores language name
                    for (;;) {
                        b = nextLine(fin); //gets next line
                        if (b == null) {
                            errorInIni(); //if eof error
                        }
                        if (b.indexOf(end) != -1) {
                            break; //if <end> then finished
                        }
                        if (b.indexOf("<#") == -1) { //if its not a <color>
                            if (ftemp == "") {
                                errorInIni(); //if color is blank - out , error
                            }
                            temp = words2Array(b, 0); //stores this lines keywords in an array
                            for (int x = 0; x < temp.length; x++) { //for each keyword
                                temp[x] = replaceString(temp[x], "<", "&lt;", false); //'<' is readied for html
                                temp[x] = replaceString(temp[x], ">", "&gt;", false); //'>' is readied for html
                                if (temp[x].indexOf(background) != -1) {
                                    backCol = ftemp;
                                } else if (temp[x].indexOf(numbers) != -1) {
                                    numbCol = ftemp;
                                } else if (temp[x].indexOf(text) != -1) {
                                    textCol = ftemp;
                                } else {
                                    keyWord[counter][0] = temp[x]; //stores the keyword
                                    keyWord[counter][1] = int2String(keyType(temp[x]));
                                    keyWord[counter][2] = ftemp;
                                    counter += 1;
                                }
                            }
                        } else {
                            ftemp = b.substring(1, b.length() - 1);
                        }
                    }
                    if (ftemp != "") {
                        break;
                    }
                }
                if (ftemp != "") {
                    break;
                }
            }
            if (ftemp != "") {
                break;
            }
        }
    }


//writes the HTML file
    static void htmlOut() throws Exception {
        BufferedWriter fout = fileOpenWrite(outFile);
        BufferedReader fin = fileOpenRead(codeFile);
        writeLineToFile(fout, htmlStart, 1);
        writeLineToFile(fout, "<head><title>Code2Html v1.0 - " + codeFile + "</title></head>", 1);
        writeLineToFile(fout, "<body text=\"" + textCol + "\" bgcolor=\"" + backCol + "\">" + preformatertStart + bodyStart, 1);
        writeLineToFile(fout, "<strong><font size='6'>" + codeFile + "</font></strong><hr>", 1);
        writeLineToFile(fout, "", 1);

        for (;;) {
            s = readLineFromFile(fin); //reads a line from input file
            if (s == null) {
                break; //finished!
            }
            s = replaceString(s, "" + (char) (byte) 9, " ", true); //replaces TAB's with 4 spaces
            s = replaceString(s, "<", "&lt;", false); //HTML readied
            s = replaceString(s, ">", "&gt;", false); //HTML readied
            writeLineToFile(fout, colorNumbers(k1(k3(k2(k4(s, fin, fout))))), 1);
        }
//writes out the end tags
        writeLineToFile(fout, "", 1);
        writeLineToFile(fout, "<hr><font size='2'><i>&nbsp;&nbsp;Generated by Code2Html - <a href=mailto:kenneths@stud.cs.uit.no>Kenneth Sundnes</a> (C) 1999</i></font>", 1);
        writeLineToFile(fout, bodyEnd + preformatertEnd + htmlEnd, 1);
        fout.close();
    }

//returns a string with all type 1 keywords colored
    static String k1(String s) {
        String t = "";
        for (int x = 0; x < counter; x++) { //if type 1
            i2 = 0;
            if (keyWord[x][1].equals("1") == true) {
                for (;;) {
                    t = "";
                    left = keyWord[x][0];
                    l = left.length();
                    i = s.indexOf(left, i2);
                    if (i == -1) {
                        break;
                    }
                    if (i == 0) {
                        t = " " + s.substring(i, l + i);
                    } else {
                        t = s.substring(i - 1, l + i);
                    }
                    if (s.length() == i + l) {
                        t += " ";
                    } else {
                        t += s.charAt(i + l);
                    }
                    if (keyword(t) != false | l == 1) {
                        if (!isColored(s, i) && !isATag(s, i)) {
                            s = s.substring(0, i) + fontStart + keyWord[x][2] + ">" + s.substring(i, i + l) + fontEnd + s.substring(i + l);
                            i2 = i + 27 + left.length();
                        } else {
                            i2 = i + left.length();
                        }
                    } else {
                        i2 = i + left.length();
                    }
                }
            }
        }
        return s;
    }


//returns a string with all type 2 keywords colored
    static String k2(String s) {
        for (int x = 0; x < counter; x++) { //if type 2
            if (keyWord[x][1].equals("2") == true) {
                left = keyWord[x][0].substring(1, keyWord[x][0].length() - 1);
                i = s.indexOf(left);
                if (i != -1) {
                    if (commentaryInString(s, i) == false) {
                        if (!isColored(s, i) && !isATag(s, i)) {
                            s = s.substring(0, i) + fontStart + keyWord[x][2] + ">" + s.substring(i) + fontEnd;
                        }
                    }
                }
            }
        }
        return s;
    }

//returns a string with all type 4 keywords colored
    static String k4(String s, BufferedReader fin, BufferedWriter fout) throws Exception {
        for (int x = 0; x < counter; x++) { //if type = 4
            if (keyWord[x][1].equals("4") == true) {
                left = keyWord[x][0].substring(1, keyWord[x][0].indexOf(","));
                right = keyWord[x][0].substring(keyWord[x][0].indexOf(",") + 1, keyWord[x][0].length() - 1);
                i = s.indexOf(left);
                i2 = s.indexOf(right, i + left.length());
                l = left.length();
                if (i == -1) {
                    break;
                }
                if (commentaryInString(s, i) == true) {
                    break;
                }
                if (i2 != -1) {
                    s = s.substring(0, i) + fontStart + keyWord[x][2] + ">" + s.substring(i, i2 + right.length()) + fontEnd + s.substring(i2 + right.length());
                    break;
                }
                s = s.substring(0, i) + fontStart + keyWord[x][2] + ">" + s.substring(i);
                writeLineToFile(fout, s, 1);
                for (;;) {
                    s = readLineFromFile(fin);
                    s = replaceString(s, "<", "&lt;", false); //HTML readying
                    s = replaceString(s, ">", "&gt;", false); //HTML readying
                    s = replaceString(s, "" + (char) (byte) 9, " ", true); //replaces TAB's with 4 spaces
                    i = s.indexOf(right);
                    if (i != -1) {
                        if (commentaryInString(s, i) != true) {
                            s = s.substring(0, i + right.length()) + fontEnd + s.substring(i + right.length());
                            break;
                        }
                    }
                    writeLineToFile(fout, s, 1);
                }
            }
        }
        return s;
    }

//returns a string with all type 3 keywords colored
    static String k3(String s) {
        for (int x = 0; x < counter; x++) { //if type 3
            if (keyWord[x][1].equals("3") == true) {
                int y = 0;
                left = keyWord[x][0].substring(1, keyWord[x][0].indexOf(","));
                right = keyWord[x][0].substring(keyWord[x][0].indexOf(",") + 1, keyWord[x][0].length() - 1);
                l = left.length();
                i2 = 0;
                for (;;) {
                    i = s.indexOf(left, i2);
                    if (isColored(s, i) | isATag(s, i)) {
                        break;
                    }
                    i2 = s.indexOf(right, i + 1);
                    if (i == -1 | i2 == -1) {
                        break; //keyword doesnt exist break
                    }
                    le = s.substring(0, i + l); //left part
                    mi = fontStart + keyWord[x][2] + ">" + s.substring(i + l, i2) + fontEnd; //colored part
                    ri = s.substring(i2); //right part
                    i2 += 27 + left.length(); //next search position
                    s = le + mi + ri; //string colored
                }
            }
        }
        return s;
    }

//dont remember what this does :(
    static boolean keyword(String s) {
        if (s.length();
        )
        return false;
        byte b = (byte) s.charAt(0); //first char
        if (byte2Int(b) != -1) {
            return false; //A number return false
        }
        if (b < 91 & b > 64) {
            return false; //If UCase letter (ASCII value) return false
        }
        if (b < 123 & b > 96) {
            return false; //If LCase letter (ASCII value) return false
        }
        byte b2 = (byte) s.charAt(s.length() - 1); //same for last char
        if (byte2Int(b2) != -1) {
            return false;
        }
        if (b2 < 91 & b2 > 64) {
            return false;
        }
        if (b2 < 123 & b2 > 96) {
            return false;
        }
        return true; //passed all tests - true
    }

//Colors all numbers in a string, unless they are colored before
    static String colorNumbers(String s) {
        char a;
        int start, end, ok = 0, x, y, yes = 0;
        for (x = 0; x < s.length(); x++) {
            if (isANumber(s.charAt(x))) {
                yes = 0; //error check variable
                if (x != 0) {
                    if (isANumber(s.charAt(x - 1)) && !isColored(s, x - 1)) {
                        yes++; //if a number in front, and its not colored. no coloring.
                    }
                    if (isALetter(s.charAt(x - 1))) {
                        yes++; //if char before is a letter. no coloring.
                    }
                }
                if (isColored(s, x)) {
                    yes++; //if already colored. no coloring.
                }
                if (x != s.length() - 1 && isALetter(s.charAt(x + 1))) {
                    yes++;
                }
                if (yes == 0) { //if yes variable still is 0 we passed the test: color!
                    start = x;
                    for (y = x + 1; y < s.length(); y++) //find end of number
                    {
                        if (!isANumber(s.charAt(y))) {
                            break;
                        }
                    }
                    end = y - 1;
                    ok = 0;
                    if (start != 0) {
                        if (isALetter(s.charAt(start - 1))) {
                            ok++;
                        }
                    }
                    if (end + 1 != s.length()) {
                        if (isALetter(s.charAt(end + 1))) {
                            ok++;
                        }
                    }
                    if (ok == 0 && !isColored(s, start) && !isATag(s, start)) { //passed tests : color
                        s = s.substring(0, start) + fontStart + numbCol + ">" + s.substring(start, end + 1) + fontEnd + s.substring(end + 1);
                        x += 28 + (end - start);
                    }
                }
            }
        }
        return s;
    }


//check if pos in string is inside a tag, true or false
    static boolean isATag(String s, int pos) {
        if (pos < 0) {
            return false;
        }
        for (int x = pos; x < s.length(); x++) {
            if (s.charAt(x) == '<') {
                return false;
            }
            if (s.charAt(x) == '>') {
                return true;
            }
        }
        return false;
    }

//is this byte a letter?
    static boolean isALetter(char s) {
        byte b = (byte) s;
        if (b > 64 && b < 91) {
            return true;
        }
        if (b > 96 && b < 123) {
            return true;
        }
        if (b == 95) {
            return true; // _ is accepted numberPal.
        }
        return false;
    }


//replaces all instances of a string in a string with anohter string. mod bool is for TAB replace only.
    static String replaceString(String s, String fra, String til, boolean mod) {
        int y = 0, l = til.length();
        for (;;) {
            int x = s.indexOf(fra, y);
            if (x == -1) {
                return s;
            }
            if (mod) { //tab replace.
                String til2 = til;
                int b = (x + 1) % 4;
                if (b != 0) {
                    til2 = emptyString(4 - b);
                }
                s = s.substring(0, x) + til2 + s.substring(x + fra.length());
                y = x + til2.length();
            } else { //regular replace
                if (x == -1) {
                    return s;
                }
                s = s.substring(0, x) + til + s.substring(x + fra.length());
                y = x + l + 1;
            }
        }
    }

//return an empty string with y spaces
    static String emptyString(int y) {
        String a = "";
        for (int x = 0; x < y; x++) {
            a += ' ';
        }
        return a;
    }

//Chekcs if a keyword is already colored
    static boolean isColored(String s, int pos) {
        int a = countString(fontStart, s, 0, pos);
        int b = countString(fontEnd, s, 0, pos);
        if (a > b) {
            return true;
        }
        return false;
    }

//returns how many times a string a is in b from pos x to y
    static int countString(String a, String b, int x, int y) {
        int z = 0;
        while (true) {
            x = b.indexOf(a, x);
            if (x == -1 || x > y) {
                return z;
            }
            z++;
            x += a.length();
            if (x >= y) {
                break;
            }
        }
        return z;
    }

//Checks if a keyword type 3 is part of type 2 and should not be colored
    static boolean commentaryInString(String s, int pos) {
        int t = 0, l = 0, a = 0, b = 0;
        String k = "", le = "", ri = "";
        for (int x = 0; x < counter; x++) {
            if (keyWord[x][1].equals("3") == true) {
                k = keyWord[x][0];
                l = k.length();
                le = keyWord[x][0].substring(1, k.indexOf(","));
                ri = keyWord[x][0].substring(k.indexOf(",") + 1, l - 1);
                a = s.indexOf(le);
                b = s.indexOf(ri, a + le.length());
                if (a != -1 & b != -1) {
                    if (a < pos & b > pos) {
                        t = 1;
                    }
                }
            }
        }
        if (t == 0) {
            return false;
        } else {
            return true;
        }
    }

//gets extension of a filename in uppercase
    static String getExtension(String fil) {
        if (fil.indexOf(".") == 0) {
            return null;
        }
        return fil.substring(fil.indexOf(".") + 1).toUpperCase().trim();
    }

//finds output filename. If file exists. file2 will be written, and so on
    static void findOutFile() {
        String s = "", s2 = "";
        int a = codeFile.indexOf(".");
        s2 = codeFile.substring(0, a);
        s = s2 + ".html";
        outFile = s;
        if (fileExist(s) == true) {
            System.out.println("The file " + s + " already exists.");
            for (int x = 2; x < 100; x++) {
                s = s2 + int2String(x) + ".html";
                outFile = s;
                if (fileExist(s) == false) {
                    break;
                }
            }
        }
    }

//stores possible extensions for this language in this array
    static void storeExt(String s) {
        if (s.indexOf("=") == -1) {
            errorInIni();
        }
        s = s.substring(s.indexOf("=") + 1);
        fext = words2Array(s, 1);
    }

//returns which keytype this keyword is
    static int keyType(String s) {
        if (s.startsWith(t2start) == true & s.endsWith(t2end) == true) {
            return 2;
        }
        if (s.startsWith(t3start) == true & s.endsWith(t3end) == true) {
            return 3;
        }
        if (s.startsWith(t4start) == true & s.endsWith(t4end) == true) {
            return 4;
        }
        return 1;
    }

//Searches for a string in a line in a file and return line when found or null if not found
    static String getSubstring(String sok, BufferedReader fin) throws Exception {
        for (;;) {
            String s = readLineFromFile(fin).trim();
            if (s != null & s.length() != 0) {
                if (s.indexOf(sok) != -1) {
                    return s;
                }
            }
            if (s == null) {
                return null;
            }
        }
    }

//returns an array with all the words in a string in each index
//type=0=same case,1=ucase,2=lcase
    static String[] words2Array(String s, int stype) {
        s = s.trim();
        if (s == null | s.length() == 0) {
            return null;
        }
        String t[] = new String[200];
        if (stype == 1) {
            s = s.toUpperCase();
        }
        if (stype == 2) {
            s = s.toLowerCase();
        }
        for (int x = 0;; x++) {
            if (s.indexOf(" ") == -1) {
                t[x] = s;
                break;
            }
            t[x] = s.substring(0, s.indexOf(" "));
            s = s.substring(s.indexOf(" "));
            s = s.trim();
        }
        String t2[] = new String[arrayContentLength(t)];
        for (int x = 0; x < t2.length; x++) {
            t2[x] = t[x];
        }
        return t2;
    }

//Checks if a file exists
    static boolean fileExist(String fil) {
        File f = new File(fil);
        return f.canRead();
    }

//Returns a line from a file which is not empty or a commentary (ini file)
    static String nextLine(BufferedReader fin) throws Exception {
        String b = "";
        for (;;) {
            b = readLineFromFile(fin);
            if (b == null) {
                return null;
            }
            b = b.trim();
            if (b.startsWith(commentary) == false & b.length() != 0) {
                return b;
            }
        }
    }

//opens a file for reading
    static BufferedReader fileOpenRead(String Fname) throws IOException {
        BufferedReader fin = new BufferedReader(new FileReader(Fname));
        return fin;
    }

//opens a file for writing
    static BufferedWriter fileOpenWrite(String Fname) throws Exception {
        BufferedWriter fout = new BufferedWriter(new FileWriter(Fname));
        return fout;
    }

//reads a line from file
    static String readLineFromFile(BufferedReader fin) throws Exception {
        flin += 1;
        return fin.readLine();
    }

//writes a line to a file, if lin=1 lineshift is added
    static void writeLineToFile(BufferedWriter fout, String s, int lin) throws Exception {
        fout.write(space + s, 0, s.length() + space.length());
        if (lin == 1) {
            fout.write(13);
            fout.write(10);
        }
    }

//converts a ascii number byte to an int number
    static int byte2Int(byte b) {
        if (b > 57 | b < 48) {
            return -1;
        }
        return b - 48;
    }

//converts an int to a string
    static String int2String(int tall) {
        return String.valueOf(tall);
    }


//returns "real" length of a string array. not counting empty indexes
    static int arrayContentLength(String[] s) {
        int temp = 0;
        for (int x = 0; x < s.length; x++) {
            if (s[x] != null) {
                temp = x;
            }
        }
        return temp + 1;
    }

//searches for a string in an array, returns index if found, -1 if not found
    static int stringInArray(String[] a, String s) {
        for (int x = 0; x < a.length; x++) {
            if (a[x].indexOf(s) != -1) {
                return x;
            }
        }
        return -1;
    }


//is this char a number?
    static boolean isANumber(char s) {
        byte b = (byte) s;
        if (b > 57 | b < 48) {
            return false;
        }
        return true;
    }


//If no input file is given output this:
    static void noFileError() {
        System.out.println("This program converts text/sourcecode to syntax-highlighted HTML.");
        System.out.println("Please refer to c2h.ini for configuration/adding new languages.");
        System.out.println();
        System.out.println("You have to specify a file to convert...");
        System.out.println("I.e. java c2h program.java");
        System.out.println();
        System.out.println("NB! If the file name.html exists, name2.html will be created, and so on.");
        System.exit(0);
    }

//if ini file does not exist
    static void iniError() {
        System.out.println("The file " + iniFile + " does not exist. \nPlease contact author for new file.");
        System.exit(0);
    }

//input file does not exist
    static void fileError(String fil) {
        System.out.println("The file " + fil + " does not exist.");
        System.exit(0);
    }

//error in ini file
    static void errorInIni() {
        System.out.println("There is an error in the INI file.");
        System.out.println("Check line: " + flin);
    }
}

1 comment:

  1. It may be any programming language code which you can input, it will give formatted output as well.

    ReplyDelete