home *** CD-ROM | disk | FTP | other *** search
- package netscape.application;
-
- import java.io.FilterInputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import netscape.util.Hashtable;
- import netscape.util.Vector;
-
- public class HTMLParser extends FilterInputStream {
- private static final String[] specialChars = new String[]{"lt", "<", "gt", ">", "amp", "&", "quot", "\"", "nbsp", " ", "iexcl", "¡", "cent", "¢", "pound", "£", "curren", "¤", "yen", "¥", "brvbar", "¦", "sect", "§", "uml", "¨", "copy", "©", "ordf", "ª", "laquo", "«", "not", "¬", "shy", "\u00ad", "reg", "®", "macr", "¯", "deg", "°", "plusmn", "±", "sup2", "²", "sup3", "³", "acute", "´", "micro", "µ", "para", "¶", "middot", "·", "cedil", "¸", "sup1", "¹", "ordm", "º", "raquo", "»", "frac14", "¼", "frac12", "½", "frac34", "¾", "iquest", "¿", "Agrave", "À", "Aacute", "Á", "Acirc", "Â", "Atilde", "Ã", "Auml", "Ä", "Aring", "Å", "AElig", "Æ", "Ccedil", "Ç", "Egrave", "È", "Eacute", "É", "Ecirc", "Ê", "Euml", "Ë", "Igrave", "Ì", "Iacute", "Í", "Icirc", "Î", "Iuml", "Ï", "ETH", "Ð", "Ntilde", "Ñ", "Ograve", "Ò", "Oacute", "Ó", "Ocirc", "Ô", "Otilde", "Õ", "Ouml", "Ö", "times", "×", "Oslash", "Ø", "Ugrave", "Ù", "Uacute", "Ú", "Ucirc", "Û", "Uuml", "Ü", "Yacute", "Ý", "THORN", "Þ", "szlig", "ß", "agrave", "à", "aacute", "á", "acirc", "â", "atilde", "ã", "auml", "ä", "aring", "å", "aelig", "æ", "ccedil", "ç", "egrave", "è", "eacute", "é", "ecirc", "ê", "euml", "ë", "igrave", "ì", "iacute", "í", "icirc", "î", "iuml", "ï", "eth", "ð", "ntilde", "ñ", "ograve", "ò", "oacute", "ó", "ocirc", "ô", "otilde", "õ", "ouml", "ö", "divide", "÷", "oslash", "ø", "ugrave", "ù", "uacute", "ú", "ucirc", "û", "uuml", "ü", "yacute", "ý", "thorn", "þ", "yuml", "ÿ", "ensp", " ", "emsp", " ", "endash", "-", "emdash", "-"};
- private HTMLTokenGenerator tokenGenerator;
- private HTMLParsingRules rules;
- private Class defaultContainerClass;
- private Class defaultMarkerClass;
- private boolean throwsException;
- private boolean appletInitialized;
- private FoundationApplet applet;
-
- public HTMLParser(InputStream var1) {
- this(var1, new HTMLParsingRules());
- }
-
- public HTMLParser(InputStream var1, HTMLParsingRules var2) {
- super(var1);
- this.throwsException = false;
- this.appletInitialized = false;
- this.rules = var2;
- this.tokenGenerator = new HTMLTokenGenerator(var1);
- }
-
- public void setThrowsExceptionOnHTMLError(boolean var1) {
- this.throwsException = var1;
- }
-
- public boolean throwsExceptionOnHTMLError() {
- return this.throwsException;
- }
-
- public HTMLElement nextHTMLElement() throws IOException, HTMLParsingException, InstantiationException, IllegalAccessException {
- while(this.tokenGenerator.hasMoreTokens()) {
- HTMLElement var1 = this.parseNextHTMLElement(true, true, (String)null);
- if (var1 != null) {
- return var1;
- }
- }
-
- return null;
- }
-
- public static Hashtable hashtableForAttributeString(String var0) throws HTMLParsingException {
- Hashtable var1 = new Hashtable();
- FastStringBuffer var6 = new FastStringBuffer();
- if (var0 == null) {
- return var1;
- } else {
- int var3 = var0.length();
- int var2 = 0;
-
- while(var2 < var3) {
- while(var2 < var3 && isSpace(var0.charAt(var2))) {
- ++var2;
- }
-
- if (var2 == var3) {
- break;
- }
-
- var6.truncateToLength(0);
- int var7 = parseKeyOrValue(var0, var2, var6);
- if (var7 == 0) {
- throw new HTMLParsingException("Error while parsing attributes " + var0, 0);
- }
-
- String var4 = filterKeyOrValue(var6);
- var4 = var4.toUpperCase();
- var2 += var7;
- if (!var4.equals("")) {
- while(var2 < var3 && isSpace(var0.charAt(var2))) {
- ++var2;
- }
-
- if (var2 < var3 && var0.charAt(var2) == '=') {
- ++var2;
- var6.truncateToLength(0);
- var7 = parseKeyOrValue(var0, var2, var6);
- String var5 = filterKeyOrValue(var6);
- var2 += var7;
- var1.put(var4, var5);
- } else {
- var1.put(var4, "");
- }
- }
- }
-
- return var1;
- }
- }
-
- public void reportSyntaxError(String var1) throws HTMLParsingException {
- if (this.throwsException) {
- throw new HTMLParsingException(var1, this.tokenGenerator.lineForLastToken());
- }
- }
-
- public void setClassForMarker(Class var1, String var2) {
- this.rules.setClassNameForMarker(var1.getName(), var2);
- }
-
- private final char unicodeCharForBytes(String var1) {
- String var4 = var1;
- if (var1.length() > 0 && var1.charAt(0) == '#') {
- return (char)Integer.parseInt(var1.substring(1, var1.length()));
- } else {
- int var2 = 0;
-
- for(int var3 = specialChars.length; var2 < var3; var2 += 2) {
- if (specialChars[var2].equals(var4)) {
- return specialChars[var2 + 1].charAt(0);
- }
- }
-
- return '\u0000';
- }
- }
-
- private final int convertSpecialCharacter(String var1, int var2, FastStringBuffer var3) {
- int var4 = var1.length();
- if (var2 + 1 < var4) {
- int var6 = var2 + 1;
- int var7 = var6;
- char var8 = var1.charAt(var6);
-
- while(var7 < var4 && var8 != ';' && var8 != ' ' && var8 != '\n' && var8 != '\t') {
- ++var7;
- if (var7 < var4) {
- var8 = var1.charAt(var7);
- } else {
- var8 = 0;
- }
- }
-
- if (var7 > var6) {
- String var9 = var1.substring(var6, var6 + (var7 - var6));
- char var5 = this.unicodeCharForBytes(var9);
- if (var5 != 0 && var5 != '\b') {
- var3.append(var5);
- }
-
- if (var7 < var4 && var1.charAt(var7) == ';') {
- return var9.length() + 2;
- }
-
- return var9.length() + 1;
- }
- }
-
- return 0;
- }
-
- private final String filterHTMLString(String var1, boolean var2, boolean var3) {
- FastStringBuffer var4 = new FastStringBuffer();
- boolean var9 = false;
- boolean var10 = false;
- int var5 = 0;
-
- for(int var6 = var1.length(); var5 < var6; ++var5) {
- char var8 = var1.charAt(var5);
- if (var2 && (var8 == ' ' || var8 == '\t' || var8 == '\n')) {
- if ((var10 || (!var3 || var8 != '\t' && var8 != '\n') && (var3 || var8 != '\t' && var8 != '\n' && var8 != ' ')) && !var9) {
- var9 = true;
- var4.append(' ');
- }
- } else if (var8 == '&') {
- int var7 = this.convertSpecialCharacter(var1, var5, var4);
- if (var7 > 0) {
- var5 += var7 - 1;
- }
-
- var9 = false;
- var10 = true;
- } else if (var8 == '\n' || var8 == '\t' || var8 >= ' ' && var8 <= '~') {
- var9 = false;
- var10 = true;
- var4.append(var8);
- }
- }
-
- if (var4.length() > 0) {
- return var4.toString();
- } else {
- return null;
- }
- }
-
- private Class classForMarker(String var1) {
- String var2 = this.rules.classNameForMarker(var1);
- if (var2 != null) {
- Class var3;
- try {
- if (!this.appletInitialized) {
- this.applet = (FoundationApplet)AWTCompatibility.awtApplet();
- this.appletInitialized = true;
- }
-
- if (this.applet != null) {
- var3 = this.applet.classForName(var2);
- } else {
- var3 = Class.forName(var2);
- }
- } catch (ClassNotFoundException var5) {
- System.err.println("" + var5);
- var3 = null;
- }
-
- return var3;
- } else {
- return null;
- }
- }
-
- private final HTMLElement parseNextHTMLElement(boolean var1, boolean var2, String var3) throws IOException, HTMLParsingException, InstantiationException, IllegalAccessException {
- Object var5 = null;
- int var4 = this.tokenGenerator.nextToken();
- switch (var4) {
- case 1:
- Class var25;
- if ((var25 = this.classForMarker("IFCSTRING")) != null) {
- String var28 = this.tokenGenerator.stringForLastToken();
- var28 = this.filterHTMLString(var28, var1, var2);
- if (var28 != null) {
- HTMLElement var22 = (HTMLElement)var25.newInstance();
- var22.setMarker("IFCSTRING");
- var22.setString(var28);
- return var22;
- }
- }
- break;
- case 2:
- String var26 = this.tokenGenerator.stringForLastToken();
- Hashtable var8 = this.rules.rulesForMarker(var26);
- Class var24;
- if ((var24 = this.classForMarker(var26)) != null) {
- if (!this.rules.isContainer(var8)) {
- HTMLElement var21 = (HTMLElement)var24.newInstance();
- var21.setMarker(var26);
- var21.setAttributes(this.tokenGenerator.attributesForLastToken());
- return var21;
- }
-
- Vector var10 = null;
- Vector var11 = null;
- boolean var15 = false;
- boolean var16 = false;
- HTMLElement var20 = (HTMLElement)var24.newInstance();
- var20.setMarker(var26);
- var20.setAttributes(this.tokenGenerator.attributesForLastToken());
- Object[] var12 = new Object[2];
- int var14 = 0;
- if (var8 != null) {
- var10 = (Vector)var8.get("BeginTermination");
- var11 = (Vector)var8.get("EndTermination");
- }
-
- while(this.tokenGenerator.hasMoreTokens()) {
- var4 = this.tokenGenerator.peekNextToken();
- if (var4 == 3) {
- String var17 = this.tokenGenerator.stringForLastToken();
- if (var26.equals(var17)) {
- this.tokenGenerator.nextToken();
- var15 = true;
- break;
- }
-
- if (var11 != null && var11.indexOf(var17) != -1) {
- var15 = true;
- break;
- }
-
- if (this.classForMarker(var17) != null) {
- this.reportSyntaxError("Unexcpected closing " + var17 + " while parsing contents for " + var26);
- var15 = true;
- break;
- }
- } else if (var4 == 2 && var10 != null && var10.indexOf(this.tokenGenerator.stringForLastToken()) != -1) {
- var15 = true;
- break;
- }
-
- HTMLElement var27;
- if (this.rules.shouldFilterStringsForChildren(var8) && var1) {
- var27 = this.parseNextHTMLElement(true, var16, var26);
- } else {
- var27 = this.parseNextHTMLElement(false, var16, var26);
- }
-
- var16 = true;
- if (var27 == null) {
- if (!this.tokenGenerator.hasMoreTokens()) {
- this.reportSyntaxError("Unterminated marker " + var26);
- break;
- }
- } else {
- var12[var14++] = var27;
- if (var14 == var12.length) {
- Object[] var30 = new Object[var12.length * 2];
- System.arraycopy(var12, 0, var30, 0, var14);
- var12 = var30;
- }
- }
- }
-
- if (var14 > 0) {
- Object[] var13 = new Object[var14];
- System.arraycopy(var12, 0, var13, 0, var14);
- var20.setChildren(var13);
- } else {
- var20.setChildren((Object[])null);
- }
-
- if (!var15) {
- this.reportSyntaxError("No end found for marker " + var26);
- }
-
- return var20;
- }
- break;
- case 3:
- String var7 = this.tokenGenerator.stringForLastToken();
- Class var23 = this.classForMarker(var7);
- if (var23 != null && !this.rules.shouldIgnoreEnd(this.rules.rulesForMarker(var7))) {
- this.reportSyntaxError("Unexpected closing " + var7 + " while parsing contents for marker " + var3);
- }
- break;
- case 4:
- Class var6;
- if ((var6 = this.classForMarker("IFCCOMMENT")) != null) {
- String var9 = this.tokenGenerator.stringForLastToken();
- HTMLElement var19 = (HTMLElement)var6.newInstance();
- var19.setMarker("IFCCOMMENT");
- var19.setString(var9);
- return var19;
- }
- break;
- default:
- this.reportSyntaxError("Unexpected statement");
- }
-
- return null;
- }
-
- private static boolean isSpace(char var0) {
- return var0 == ' ' || var0 == '\t' || var0 == '\n';
- }
-
- private static int parseKeyOrValue(String var0, int var1, FastStringBuffer var2) {
- int var3 = var1;
- int var5 = var0.length();
-
- char var6;
- for(var6 = 0; var3 < var5 && isSpace(var0.charAt(var3)); ++var3) {
- }
-
- if (var3 == var5) {
- return 0;
- } else {
- int var4 = var3;
- if (var0.charAt(var3) == '\'' || var0.charAt(var3) == '"') {
- var6 = var0.charAt(var3);
- }
-
- do {
- var2.append(var0.charAt(var4));
- ++var4;
- } while(var4 < var5 && (var6 == 0 && !isSpace(var0.charAt(var4)) && var0.charAt(var4) != '=' || var6 != 0 && var0.charAt(var4) != var6));
-
- if (var4 < var5 && var0.charAt(var4) == var6) {
- var2.append(var0.charAt(var4));
- ++var4;
- }
-
- return var4 - var3;
- }
- }
-
- private static String filterKeyOrValue(FastStringBuffer var0) {
- int var1 = var0.length();
- if (var1 == 0) {
- return "";
- } else if (var0.charAt(0) != '\'' && var0.charAt(0) != '"') {
- return var0.toString();
- } else {
- return var1 <= 2 ? "" : var0.toString().substring(1, var1 - 1);
- }
- }
- }
-