home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 139 / dpcs0999.iso / Web / CFserver / data1.cab / Java / CFJava.cab / CFJavaRuntime.cab / netscape / application / HTMLParser.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-10-01  |  12.6 KB  |  396 lines

  1. package netscape.application;
  2.  
  3. import java.io.FilterInputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import netscape.util.Hashtable;
  7. import netscape.util.Vector;
  8.  
  9. public class HTMLParser extends FilterInputStream {
  10.    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", "-"};
  11.    private HTMLTokenGenerator tokenGenerator;
  12.    private HTMLParsingRules rules;
  13.    private Class defaultContainerClass;
  14.    private Class defaultMarkerClass;
  15.    private boolean throwsException;
  16.    private boolean appletInitialized;
  17.    private FoundationApplet applet;
  18.  
  19.    public HTMLParser(InputStream var1) {
  20.       this(var1, new HTMLParsingRules());
  21.    }
  22.  
  23.    public HTMLParser(InputStream var1, HTMLParsingRules var2) {
  24.       super(var1);
  25.       this.throwsException = false;
  26.       this.appletInitialized = false;
  27.       this.rules = var2;
  28.       this.tokenGenerator = new HTMLTokenGenerator(var1);
  29.    }
  30.  
  31.    public void setThrowsExceptionOnHTMLError(boolean var1) {
  32.       this.throwsException = var1;
  33.    }
  34.  
  35.    public boolean throwsExceptionOnHTMLError() {
  36.       return this.throwsException;
  37.    }
  38.  
  39.    public HTMLElement nextHTMLElement() throws IOException, HTMLParsingException, InstantiationException, IllegalAccessException {
  40.       while(this.tokenGenerator.hasMoreTokens()) {
  41.          HTMLElement var1 = this.parseNextHTMLElement(true, true, (String)null);
  42.          if (var1 != null) {
  43.             return var1;
  44.          }
  45.       }
  46.  
  47.       return null;
  48.    }
  49.  
  50.    public static Hashtable hashtableForAttributeString(String var0) throws HTMLParsingException {
  51.       Hashtable var1 = new Hashtable();
  52.       FastStringBuffer var6 = new FastStringBuffer();
  53.       if (var0 == null) {
  54.          return var1;
  55.       } else {
  56.          int var3 = var0.length();
  57.          int var2 = 0;
  58.  
  59.          while(var2 < var3) {
  60.             while(var2 < var3 && isSpace(var0.charAt(var2))) {
  61.                ++var2;
  62.             }
  63.  
  64.             if (var2 == var3) {
  65.                break;
  66.             }
  67.  
  68.             var6.truncateToLength(0);
  69.             int var7 = parseKeyOrValue(var0, var2, var6);
  70.             if (var7 == 0) {
  71.                throw new HTMLParsingException("Error while parsing attributes " + var0, 0);
  72.             }
  73.  
  74.             String var4 = filterKeyOrValue(var6);
  75.             var4 = var4.toUpperCase();
  76.             var2 += var7;
  77.             if (!var4.equals("")) {
  78.                while(var2 < var3 && isSpace(var0.charAt(var2))) {
  79.                   ++var2;
  80.                }
  81.  
  82.                if (var2 < var3 && var0.charAt(var2) == '=') {
  83.                   ++var2;
  84.                   var6.truncateToLength(0);
  85.                   var7 = parseKeyOrValue(var0, var2, var6);
  86.                   String var5 = filterKeyOrValue(var6);
  87.                   var2 += var7;
  88.                   var1.put(var4, var5);
  89.                } else {
  90.                   var1.put(var4, "");
  91.                }
  92.             }
  93.          }
  94.  
  95.          return var1;
  96.       }
  97.    }
  98.  
  99.    public void reportSyntaxError(String var1) throws HTMLParsingException {
  100.       if (this.throwsException) {
  101.          throw new HTMLParsingException(var1, this.tokenGenerator.lineForLastToken());
  102.       }
  103.    }
  104.  
  105.    public void setClassForMarker(Class var1, String var2) {
  106.       this.rules.setClassNameForMarker(var1.getName(), var2);
  107.    }
  108.  
  109.    private final char unicodeCharForBytes(String var1) {
  110.       String var4 = var1;
  111.       if (var1.length() > 0 && var1.charAt(0) == '#') {
  112.          return (char)Integer.parseInt(var1.substring(1, var1.length()));
  113.       } else {
  114.          int var2 = 0;
  115.  
  116.          for(int var3 = specialChars.length; var2 < var3; var2 += 2) {
  117.             if (specialChars[var2].equals(var4)) {
  118.                return specialChars[var2 + 1].charAt(0);
  119.             }
  120.          }
  121.  
  122.          return '\u0000';
  123.       }
  124.    }
  125.  
  126.    private final int convertSpecialCharacter(String var1, int var2, FastStringBuffer var3) {
  127.       int var4 = var1.length();
  128.       if (var2 + 1 < var4) {
  129.          int var6 = var2 + 1;
  130.          int var7 = var6;
  131.          char var8 = var1.charAt(var6);
  132.  
  133.          while(var7 < var4 && var8 != ';' && var8 != ' ' && var8 != '\n' && var8 != '\t') {
  134.             ++var7;
  135.             if (var7 < var4) {
  136.                var8 = var1.charAt(var7);
  137.             } else {
  138.                var8 = 0;
  139.             }
  140.          }
  141.  
  142.          if (var7 > var6) {
  143.             String var9 = var1.substring(var6, var6 + (var7 - var6));
  144.             char var5 = this.unicodeCharForBytes(var9);
  145.             if (var5 != 0 && var5 != '\b') {
  146.                var3.append(var5);
  147.             }
  148.  
  149.             if (var7 < var4 && var1.charAt(var7) == ';') {
  150.                return var9.length() + 2;
  151.             }
  152.  
  153.             return var9.length() + 1;
  154.          }
  155.       }
  156.  
  157.       return 0;
  158.    }
  159.  
  160.    private final String filterHTMLString(String var1, boolean var2, boolean var3) {
  161.       FastStringBuffer var4 = new FastStringBuffer();
  162.       boolean var9 = false;
  163.       boolean var10 = false;
  164.       int var5 = 0;
  165.  
  166.       for(int var6 = var1.length(); var5 < var6; ++var5) {
  167.          char var8 = var1.charAt(var5);
  168.          if (var2 && (var8 == ' ' || var8 == '\t' || var8 == '\n')) {
  169.             if ((var10 || (!var3 || var8 != '\t' && var8 != '\n') && (var3 || var8 != '\t' && var8 != '\n' && var8 != ' ')) && !var9) {
  170.                var9 = true;
  171.                var4.append(' ');
  172.             }
  173.          } else if (var8 == '&') {
  174.             int var7 = this.convertSpecialCharacter(var1, var5, var4);
  175.             if (var7 > 0) {
  176.                var5 += var7 - 1;
  177.             }
  178.  
  179.             var9 = false;
  180.             var10 = true;
  181.          } else if (var8 == '\n' || var8 == '\t' || var8 >= ' ' && var8 <= '~') {
  182.             var9 = false;
  183.             var10 = true;
  184.             var4.append(var8);
  185.          }
  186.       }
  187.  
  188.       if (var4.length() > 0) {
  189.          return var4.toString();
  190.       } else {
  191.          return null;
  192.       }
  193.    }
  194.  
  195.    private Class classForMarker(String var1) {
  196.       String var2 = this.rules.classNameForMarker(var1);
  197.       if (var2 != null) {
  198.          Class var3;
  199.          try {
  200.             if (!this.appletInitialized) {
  201.                this.applet = (FoundationApplet)AWTCompatibility.awtApplet();
  202.                this.appletInitialized = true;
  203.             }
  204.  
  205.             if (this.applet != null) {
  206.                var3 = this.applet.classForName(var2);
  207.             } else {
  208.                var3 = Class.forName(var2);
  209.             }
  210.          } catch (ClassNotFoundException var5) {
  211.             System.err.println("" + var5);
  212.             var3 = null;
  213.          }
  214.  
  215.          return var3;
  216.       } else {
  217.          return null;
  218.       }
  219.    }
  220.  
  221.    private final HTMLElement parseNextHTMLElement(boolean var1, boolean var2, String var3) throws IOException, HTMLParsingException, InstantiationException, IllegalAccessException {
  222.       Object var5 = null;
  223.       int var4 = this.tokenGenerator.nextToken();
  224.       switch (var4) {
  225.          case 1:
  226.             Class var25;
  227.             if ((var25 = this.classForMarker("IFCSTRING")) != null) {
  228.                String var28 = this.tokenGenerator.stringForLastToken();
  229.                var28 = this.filterHTMLString(var28, var1, var2);
  230.                if (var28 != null) {
  231.                   HTMLElement var22 = (HTMLElement)var25.newInstance();
  232.                   var22.setMarker("IFCSTRING");
  233.                   var22.setString(var28);
  234.                   return var22;
  235.                }
  236.             }
  237.             break;
  238.          case 2:
  239.             String var26 = this.tokenGenerator.stringForLastToken();
  240.             Hashtable var8 = this.rules.rulesForMarker(var26);
  241.             Class var24;
  242.             if ((var24 = this.classForMarker(var26)) != null) {
  243.                if (!this.rules.isContainer(var8)) {
  244.                   HTMLElement var21 = (HTMLElement)var24.newInstance();
  245.                   var21.setMarker(var26);
  246.                   var21.setAttributes(this.tokenGenerator.attributesForLastToken());
  247.                   return var21;
  248.                }
  249.  
  250.                Vector var10 = null;
  251.                Vector var11 = null;
  252.                boolean var15 = false;
  253.                boolean var16 = false;
  254.                HTMLElement var20 = (HTMLElement)var24.newInstance();
  255.                var20.setMarker(var26);
  256.                var20.setAttributes(this.tokenGenerator.attributesForLastToken());
  257.                Object[] var12 = new Object[2];
  258.                int var14 = 0;
  259.                if (var8 != null) {
  260.                   var10 = (Vector)var8.get("BeginTermination");
  261.                   var11 = (Vector)var8.get("EndTermination");
  262.                }
  263.  
  264.                while(this.tokenGenerator.hasMoreTokens()) {
  265.                   var4 = this.tokenGenerator.peekNextToken();
  266.                   if (var4 == 3) {
  267.                      String var17 = this.tokenGenerator.stringForLastToken();
  268.                      if (var26.equals(var17)) {
  269.                         this.tokenGenerator.nextToken();
  270.                         var15 = true;
  271.                         break;
  272.                      }
  273.  
  274.                      if (var11 != null && var11.indexOf(var17) != -1) {
  275.                         var15 = true;
  276.                         break;
  277.                      }
  278.  
  279.                      if (this.classForMarker(var17) != null) {
  280.                         this.reportSyntaxError("Unexcpected closing " + var17 + " while parsing contents for " + var26);
  281.                         var15 = true;
  282.                         break;
  283.                      }
  284.                   } else if (var4 == 2 && var10 != null && var10.indexOf(this.tokenGenerator.stringForLastToken()) != -1) {
  285.                      var15 = true;
  286.                      break;
  287.                   }
  288.  
  289.                   HTMLElement var27;
  290.                   if (this.rules.shouldFilterStringsForChildren(var8) && var1) {
  291.                      var27 = this.parseNextHTMLElement(true, var16, var26);
  292.                   } else {
  293.                      var27 = this.parseNextHTMLElement(false, var16, var26);
  294.                   }
  295.  
  296.                   var16 = true;
  297.                   if (var27 == null) {
  298.                      if (!this.tokenGenerator.hasMoreTokens()) {
  299.                         this.reportSyntaxError("Unterminated marker " + var26);
  300.                         break;
  301.                      }
  302.                   } else {
  303.                      var12[var14++] = var27;
  304.                      if (var14 == var12.length) {
  305.                         Object[] var30 = new Object[var12.length * 2];
  306.                         System.arraycopy(var12, 0, var30, 0, var14);
  307.                         var12 = var30;
  308.                      }
  309.                   }
  310.                }
  311.  
  312.                if (var14 > 0) {
  313.                   Object[] var13 = new Object[var14];
  314.                   System.arraycopy(var12, 0, var13, 0, var14);
  315.                   var20.setChildren(var13);
  316.                } else {
  317.                   var20.setChildren((Object[])null);
  318.                }
  319.  
  320.                if (!var15) {
  321.                   this.reportSyntaxError("No end found for marker " + var26);
  322.                }
  323.  
  324.                return var20;
  325.             }
  326.             break;
  327.          case 3:
  328.             String var7 = this.tokenGenerator.stringForLastToken();
  329.             Class var23 = this.classForMarker(var7);
  330.             if (var23 != null && !this.rules.shouldIgnoreEnd(this.rules.rulesForMarker(var7))) {
  331.                this.reportSyntaxError("Unexpected closing " + var7 + " while parsing contents for marker " + var3);
  332.             }
  333.             break;
  334.          case 4:
  335.             Class var6;
  336.             if ((var6 = this.classForMarker("IFCCOMMENT")) != null) {
  337.                String var9 = this.tokenGenerator.stringForLastToken();
  338.                HTMLElement var19 = (HTMLElement)var6.newInstance();
  339.                var19.setMarker("IFCCOMMENT");
  340.                var19.setString(var9);
  341.                return var19;
  342.             }
  343.             break;
  344.          default:
  345.             this.reportSyntaxError("Unexpected statement");
  346.       }
  347.  
  348.       return null;
  349.    }
  350.  
  351.    private static boolean isSpace(char var0) {
  352.       return var0 == ' ' || var0 == '\t' || var0 == '\n';
  353.    }
  354.  
  355.    private static int parseKeyOrValue(String var0, int var1, FastStringBuffer var2) {
  356.       int var3 = var1;
  357.       int var5 = var0.length();
  358.  
  359.       char var6;
  360.       for(var6 = 0; var3 < var5 && isSpace(var0.charAt(var3)); ++var3) {
  361.       }
  362.  
  363.       if (var3 == var5) {
  364.          return 0;
  365.       } else {
  366.          int var4 = var3;
  367.          if (var0.charAt(var3) == '\'' || var0.charAt(var3) == '"') {
  368.             var6 = var0.charAt(var3);
  369.          }
  370.  
  371.          do {
  372.             var2.append(var0.charAt(var4));
  373.             ++var4;
  374.          } while(var4 < var5 && (var6 == 0 && !isSpace(var0.charAt(var4)) && var0.charAt(var4) != '=' || var6 != 0 && var0.charAt(var4) != var6));
  375.  
  376.          if (var4 < var5 && var0.charAt(var4) == var6) {
  377.             var2.append(var0.charAt(var4));
  378.             ++var4;
  379.          }
  380.  
  381.          return var4 - var3;
  382.       }
  383.    }
  384.  
  385.    private static String filterKeyOrValue(FastStringBuffer var0) {
  386.       int var1 = var0.length();
  387.       if (var1 == 0) {
  388.          return "";
  389.       } else if (var0.charAt(0) != '\'' && var0.charAt(0) != '"') {
  390.          return var0.toString();
  391.       } else {
  392.          return var1 <= 2 ? "" : var0.toString().substring(1, var1 - 1);
  393.       }
  394.    }
  395. }
  396.