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;
}
}