package html; import eprog.*; /**Htmlparser. * Dieser Parser kann einen Teil von Html * richtig erkennen. Die Formatierung wird * einfach in einem String geschrieben.*/ public class Parser { // Private Variablen private String formatstring; private int state; private int prevstate; private int tablebegin; private int spalten; private int zeilen; // state kann folgende Zustände annehmen private final int NONE = 0; private final int HTML = 1; private final int H2 = 2; private final int H3 = 3; private final int H4 = 4; private final int H5 = 5; private final int HEAD = 10; private final int TITLE = 11; private final int BODY = 20; private final int TABLE = 100; private final int TBODY = 101; private final int TR = 110; private final int TD = 120; private final int ATEND = 100000; // Der Konstruktor public Parser () { state = NONE; formatstring = ""; } /* end gibt zurück, ob der Parser * den Endtoken gefunden hat.*/ public boolean end () { return state == ATEND; } /* Diese Funktion wird bei Token verwendet * die öffnend sind. * z.b. * sate wird neu gesetzt und der Formatstring * wird erweitert*/ public void begintoken (String Token) throws Exception { prevstate = state; if (state == NONE && Token.equals("HTML")) state = HTML; else if (state == HTML && Token.equals ("HEAD")) state = HEAD; else if (state == HTML && Token.equals ("BODY")) state = BODY; else if ((state == BODY || state == TD) && Token.length()==2 && Token.charAt(0)=='h') { if (Token.charAt(1) == '2') { formatstring += "Text_sehr_gross"; state = H2; } else if (Token.charAt(1) == '3') { formatstring += "Text_gross"; state = H3; } else if (Token.charAt(1) == '4') { formatstring += "Text_mittel"; state = H4; } else if (Token.charAt(1) == '5') { formatstring += "Text_normal"; state = H5; } else throw new Exception ("Nicht definierte Überschrift!"); } else if (state == BODY && Token.equals ("BR")) formatstring += "\n"; else if (state == HEAD && Token.equals ("TITLE")) { formatstring += "Titel"; state = TITLE; } else if (state == BODY && Token.equals("TABLE")) { if (formatstring.length()>0 && ! formatstring.endsWith("\n")) formatstring += " "; formatstring += "Tabelle "; tablebegin = formatstring.length(); spalten = 0; zeilen = 0; state = TABLE; } else if(state == TABLE && Token.equals("TBODY")) state = TBODY; else if(state == TBODY && Token.equals("TR")) { spalten++; state = TR; } else if(state == TR && Token.equals("TD")) { zeilen++; state = TD; } else throw new Exception ("Kann hier nicht aufgemacht werden: " + Token); } /* Hier wird bestimmt, was mit den Endtoken * passieren soll. State wird wieder zurück * gesetzt und der Formatstring wird angepasst*/ private void endtoken(String Token) throws Exception { if (state == HTML && Token.equals("HTML")) { if (formatstring.length()>0 && ! formatstring.endsWith("\n")) formatstring += " "; formatstring += "Ende"; state = ATEND; } else if (state == HEAD && Token.equals("HEAD")) state = HTML; else if (state == BODY && Token.equals("BODY")) state = HTML; else if (Token.length() == 2 && Token.charAt(0) == 'h') { formatstring += ";"; if ( state == H2 && Token.charAt(1) == '2' || state == H3 && Token.charAt(1) == '3' || state == H4 && Token.charAt(1) == '4' || state == H5 && Token.charAt(1) == '5') state = prevstate; else throw new Exception ("Falsche Überschrift " + "geschlossen h" + Token.charAt(1)); } else if (state == TITLE && Token.equals ("TITLE")) { formatstring += ";"; state = HEAD; } else if (state == TD && Token.equals("TD")) state = TR; else if (state == TR && Token.equals("TR")) state = TBODY; else if (state == TBODY && Token.equals("TBODY")) state = TABLE; else if(state == TABLE && Token.equals("TABLE")) { String s1 = formatstring.substring(0, tablebegin); s1+=spalten; s1+=" "; s1+=zeilen; s1+=" "; s1+=formatstring.substring(tablebegin); ; formatstring = s1; state = BODY; } else throw new Exception ("Falsch zugemacht!"); } /* Diese Funktion parst die Token aus dem String * heraus. Da der String nur ein Token oder * ein Wort beinhaltet ist die Funktion trivial.*/ public void parse (String str) throws Exception { if (str.charAt(0) == '<') // Token found! { String Token; // stores the Token if (str.charAt(str.length()-1) != '>') // invalid Token throw new Exception ("> nicht gefunden!"); if (str.charAt(1) == '/') endtoken(str.substring(2,str.length()-1)); else begintoken(str.substring(1,str.length()-1)); } else { if ( state == TITLE || state >= H2 && state <= H5) formatstring += " " + str; } } /* Gibt den formatierten String zurück. Der Inhalt ist nur * korrekt, wenn weder eine Exception geworfen wurde und * end() true zurückgibt.*/ public String formated () { return formatstring; } }
Fr Jul 30 13:54:24 CEST 2021
patent_button.gif valid-html401.png elektra.jpg fsfe-logo.png valid-css.png vim.gif anybrowser.gif