summaryrefslogtreecommitdiff
path: root/libjava/classpath/gnu/javax/swing/text/html
diff options
context:
space:
mode:
authorupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
committerupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
commit554fd8c5195424bdbcabf5de30fdc183aba391bd (patch)
tree976dc5ab7fddf506dadce60ae936f43f58787092 /libjava/classpath/gnu/javax/swing/text/html
downloadcbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.bz2
cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.xz
obtained gcc-4.6.4.tar.bz2 from upstream website;upstream
verified gcc-4.6.4.tar.bz2.sig; imported gcc-4.6.4 source tree from verified upstream tarball. downloading a git-generated archive based on the 'upstream' tag should provide you with a source tree that is binary identical to the one extracted from the above tarball. if you have obtained the source via the command 'git clone', however, do note that line-endings of files in your working directory might differ from line-endings of the respective files in the upstream repository.
Diffstat (limited to 'libjava/classpath/gnu/javax/swing/text/html')
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/CharacterAttributeTranslator.java192
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/CombinedAttributes.java213
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/ImageViewIconFactory.java282
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/css/BorderStyle.java64
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/css/BorderWidth.java78
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/css/CSSColor.java170
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/css/CSSLexicalException.java60
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/css/CSSParser.java503
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/css/CSSParserCallback.java81
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/css/CSSParserException.java62
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/css/CSSScanner.java718
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/css/FontSize.java273
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/css/FontStyle.java80
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/css/FontWeight.java84
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/css/Length.java283
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/css/Selector.java245
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/package.html50
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/GnuParserDelegator.java179
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/HTML_401F.java3801
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/SmallHtmlAttributeSet.java261
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/gnuDTD.java421
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/htmlAttributeSet.java183
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/htmlValidator.java622
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/models/PCDATAonly_model.java62
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/models/TableRowContentModel.java77
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/models/list.java384
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/models/noTagModel.java75
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/models/node.java339
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/models/package.html53
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/models/transformer.java201
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/package.html51
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/support/Parser.java1532
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/support/gnuStringIntMapper.java112
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/support/low/Buffer.java238
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/support/low/Constants.java433
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/support/low/Location.java83
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/support/low/ParseException.java51
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/support/low/Queue.java142
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/support/low/ReaderTokenizer.java373
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/support/low/Token.java169
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/support/low/node.java78
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/support/low/package.html47
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/support/low/pattern.java105
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/support/package.html47
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/support/parameterDefaulter.java106
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/support/textPreProcessor.java189
46 files changed, 13852 insertions, 0 deletions
diff --git a/libjava/classpath/gnu/javax/swing/text/html/CharacterAttributeTranslator.java b/libjava/classpath/gnu/javax/swing/text/html/CharacterAttributeTranslator.java
new file mode 100644
index 000000000..d4e58eb5d
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/CharacterAttributeTranslator.java
@@ -0,0 +1,192 @@
+/* CharacterAttributeTranslator.java --
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.javax.swing.text.html;
+
+import java.awt.Color;
+import java.util.HashMap;
+import java.util.StringTokenizer;
+
+import javax.swing.text.MutableAttributeSet;
+import javax.swing.text.StyleConstants;
+import javax.swing.text.html.HTML.Attribute;
+import javax.swing.text.html.HTML.Tag;
+
+/**
+ * This is a small utility class to translate HTML character attributes to
+ * Swing StyleConstants
+ */
+public class CharacterAttributeTranslator
+{
+ /**
+ * Maps color name to its hex encoding.
+ */
+ private static final HashMap colorMap = new HashMap();
+ static
+ {
+ colorMap.put("aqua" , "#00FFFF");
+ colorMap.put("blue" , "#0000FF");
+ colorMap.put("black", "#000000");
+ colorMap.put("fuchsia" , "#FF00FF");
+ colorMap.put("gray" , "#808080");
+ colorMap.put("green" , "#008000");
+ colorMap.put("lime" , "#00FF00");
+ colorMap.put("maroon" , "#800000");
+ colorMap.put("navy" , "#000080");
+ colorMap.put("olive" , "#808000");
+ colorMap.put("purple" , "#800080");
+ colorMap.put("red" , "#FF0000");
+ colorMap.put("silver" , "#C0C0C0");
+ colorMap.put("teal" , "#008080");
+ colorMap.put("white" , "#FFFFFF");
+ colorMap.put("yellow" , "#FFFF00");
+ }
+
+ /**
+ * Convert the color string represenation into java.awt.Color. The valid
+ * values are like "aqua" , "#00FFFF" or "rgb(1,6,44)".
+ *
+ * @param colorName the color to convert.
+ * @return the matching java.awt.color
+ */
+ public static Color getColor(String colorName)
+ {
+ colorName = colorName.toLowerCase();
+ try
+ {
+ if (colorName.startsWith("rgb"))
+ {
+ // rgb(red, green, blue) notation.
+ StringTokenizer st = new StringTokenizer(colorName, " ,()");
+ String representation = st.nextToken();
+
+ // Return null if the representation is not supported.
+ if (! representation.equals("rgb"))
+ return null;
+ int red = Integer.parseInt(st.nextToken());
+ int green = Integer.parseInt(st.nextToken());
+ int blue = Integer.parseInt(st.nextToken());
+
+ return new Color(red, green, blue);
+ }
+ else
+ {
+ String s2 = (String) colorMap.get(colorName);
+ if (s2 == null)
+ s2 = colorName;
+ return Color.decode(s2);
+ }
+ }
+ catch (Exception nex)
+ {
+ // Can be either number format exception or illegal argument
+ // exception.
+ return null;
+ }
+ }
+
+ /**
+ * Translate the HTML character attribute to the Swing style constant.
+ *
+ * @param charAttr the character attributes of the html tag
+ * @param t the html tag itself
+ * @param a the attribute set where the translated attributes will be stored
+ *
+ * @return true if some attributes were translated, false otherwise.
+ */
+ public static boolean translateTag(MutableAttributeSet charAttr,
+ Tag t, MutableAttributeSet a)
+ {
+ if(t == Tag.FONT)
+ {
+ Object color = a.getAttribute(Attribute.COLOR);
+ if(color != null)
+ {
+ Color c = getColor(color.toString());
+ if( c == null )
+ return false;
+ charAttr.addAttribute(StyleConstants.Foreground, c);
+ return true;
+ }
+
+ if(a.getAttribute(Attribute.SIZE) != null)
+ {
+ // FIXME
+ // charAttr.addAttribute(StyleConstants.FontSize,
+ // new java.lang.Integer(72));
+ return true;
+ }
+ }
+
+ if( t == Tag.B )
+ {
+ charAttr.addAttribute(StyleConstants.Bold, Boolean.TRUE);
+ return true;
+ }
+
+ if( t == Tag.I )
+ {
+ charAttr.addAttribute(StyleConstants.Italic, Boolean.TRUE);
+ return true;
+ }
+
+ if( t == Tag.U )
+ {
+ charAttr.addAttribute(StyleConstants.Underline, Boolean.TRUE);
+ return true;
+ }
+
+ if( t == Tag.STRIKE )
+ {
+ charAttr.addAttribute(StyleConstants.StrikeThrough, Boolean.TRUE);
+ return true;
+ }
+
+ if( t == Tag.SUP )
+ {
+ charAttr.addAttribute(StyleConstants.Superscript, Boolean.TRUE);
+ return true;
+ }
+
+ if( t == Tag.SUB )
+ {
+ charAttr.addAttribute(StyleConstants.Subscript, Boolean.TRUE);
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/CombinedAttributes.java b/libjava/classpath/gnu/javax/swing/text/html/CombinedAttributes.java
new file mode 100644
index 000000000..c3fe66816
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/CombinedAttributes.java
@@ -0,0 +1,213 @@
+/* CombinedAttributes.java -- A two combined sets of attributes
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html;
+
+import java.io.Serializable;
+import java.util.Enumeration;
+
+import javax.swing.text.AttributeSet;
+import javax.swing.text.SimpleAttributeSet;
+
+/**
+ * Contains the two combined attribute sets what are searched subsequently.
+ * This is used to combine style sheet attributes with the HTML view attributes.
+ * The parent cannot be used as the view may have its own attribute hierarchy.
+ *
+ * @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
+ */
+public class CombinedAttributes implements AttributeSet, Serializable
+{
+ /**
+ * Returns the elements from both enumerations.
+ */
+ class CombinedEnumeration implements Enumeration
+ {
+ /**
+ * Create a combined enumeration that enumerates over two enumerations.
+ *
+ * @param first the first enumeration to enumerate
+ * @param second the second enumeration to enumerate
+ */
+ CombinedEnumeration(Enumeration first, Enumeration second)
+ {
+ a = first;
+ b = second;
+ }
+
+ /**
+ * The first enumeration (elements returned first)
+ */
+ final Enumeration a;
+
+ /**
+ * The second enumeration (elements returned later)
+ */
+ final Enumeration b;
+
+ /** @inheritDoc */
+ public boolean hasMoreElements()
+ {
+ return a.hasMoreElements() || b.hasMoreElements();
+ }
+
+ /** @inheritDoc */
+ public Object nextElement()
+ {
+ return a.hasMoreElements() ? a.nextElement():b.nextElement();
+ }
+ }
+
+
+ /**
+ * The first attribute set.
+ */
+ final AttributeSet a;
+
+ /**
+ * The second attribute set.
+ */
+ final AttributeSet b;
+
+ /**
+ * Create the CombinedAttributes what search in the two sets. If any of the
+ * two passed sets is null, another set is returned. Otherwise, the combined
+ * attribute set is returned.
+ *
+ * @param primary the first set (searched first)
+ * @param secondary the second set (searched later).
+ */
+ public static AttributeSet combine(AttributeSet primary,
+ AttributeSet secondary)
+ {
+ if (primary == null)
+ return secondary;
+ else if (secondary == null)
+ return primary;
+ else
+ return new CombinedAttributes(primary, secondary);
+ }
+
+ /**
+ * Create the CombinedAttributes what search in the two sets.
+ *
+ * @param primary the first set (searched first)
+ * @param secondary the second set (searched later).
+ */
+ private CombinedAttributes(AttributeSet primary, AttributeSet secondary)
+ {
+ a = primary;
+ b = secondary;
+ }
+
+ /** @inheritDoc */
+ public boolean containsAttribute(Object name, Object value)
+ {
+ return a.containsAttribute(name, value) || b.containsAttribute(name, value);
+ }
+
+ /** @inheritDoc */
+ public boolean containsAttributes(AttributeSet attributes)
+ {
+ Enumeration names = attributes.getAttributeNames();
+ Object name;
+ while (names.hasMoreElements())
+ {
+ name = names.nextElement();
+ if (!containsAttribute(name, attributes.getAttribute(name)))
+ return false;
+ }
+ return true;
+ }
+
+ /** @inheritDoc */
+ public AttributeSet copyAttributes()
+ {
+ SimpleAttributeSet copy = new SimpleAttributeSet();
+ copy.addAttributes(a);
+ copy.addAttributes(b);
+ return copy;
+ }
+
+ /** @inheritDoc */
+ public Object getAttribute(Object key)
+ {
+ Object value = a.getAttribute(key);
+ if (value == null)
+ value = b.getAttribute(key);
+
+ return value;
+ }
+
+ /** @inheritDoc */
+ public int getAttributeCount()
+ {
+ return a.getAttributeCount()+b.getAttributeCount();
+ }
+
+ /** @inheritDoc */
+ public Enumeration getAttributeNames()
+ {
+ return new CombinedEnumeration(a.getAttributeNames(), b.getAttributeNames());
+ }
+
+ /**
+ * There is no one.
+ *
+ * @return null, always.
+ */
+ public AttributeSet getResolveParent()
+ {
+ return null;
+ }
+
+ /** @inheritDoc */
+ public boolean isDefined(Object attrName)
+ {
+ return a.isDefined(attrName) || b.isDefined(attrName);
+ }
+
+ /** @inheritDoc */
+ public boolean isEqual(AttributeSet attr)
+ {
+ if (attr.getAttributeCount() == getAttributeCount())
+ return containsAttributes(attr);
+ else
+ return false;
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/ImageViewIconFactory.java b/libjava/classpath/gnu/javax/swing/text/html/ImageViewIconFactory.java
new file mode 100644
index 000000000..ef3a1c6d1
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/ImageViewIconFactory.java
@@ -0,0 +1,282 @@
+package gnu.javax.swing.text.html;
+
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Graphics;
+import java.io.Serializable;
+
+import javax.swing.Icon;
+import javax.swing.plaf.metal.MetalLookAndFeel;
+
+/**
+ * Creates icons for ImageView. The icons reflect the basic ideas of the Sun's
+ * icons as they would be described in the text (sheet of paper with image and
+ * broken sheet of paper with image). They are not pixel to pixel identical and
+ * contain elements from the metal icon factory.
+ *
+ * @author Audrius Meskauskas (audriusa@bioinformatics.org)
+ */
+public class ImageViewIconFactory
+{
+ private static Icon noImageIcon;
+
+ private static Icon loadingImageIcon;
+
+ /**
+ * This icon reflects the general concept (broken sheet of paper with
+ * image), but is currently not pixel to pixel identical with the Sun's
+ * implementation.
+ */
+ public static class NoImageIcon implements Icon, Serializable
+ {
+ /**
+ * Creates a new icon.
+ */
+ public NoImageIcon()
+ {
+ // Nothing to do here.
+ }
+
+ /**
+ * Returns the width of the icon, in pixels.
+ *
+ * @return The width of the icon.
+ */
+ public int getIconWidth()
+ {
+ return 38;
+ }
+
+ /**
+ * Returns the height of the icon, in pixels.
+ *
+ * @return The height of the icon.
+ */
+ public int getIconHeight()
+ {
+ return 38;
+ }
+
+ /**
+ * Paints the icon using colors from the {@link MetalLookAndFeel}.
+ *
+ * @param c
+ * the component (ignored).
+ * @param g
+ * the graphics device.
+ * @param x
+ * the x-coordinate for the top-left of the icon.
+ * @param y
+ * the y-coordinate for the top-left of the icon.
+ */
+ public void paintIcon(Component c, Graphics g, int x, int y)
+ {
+ // frame
+ Color savedColor = g.getColor();
+
+ g.setColor(MetalLookAndFeel.getBlack());
+
+ g.drawLine(x, y, x + 19, y);
+
+ g.drawLine(x, y + 1, x, y + 5);
+ g.drawLine(x, y + 13, x, y + 25);
+
+ g.drawLine(x, y + 25, x + 22, y + 25);
+
+ g.drawLine(x + 22, y + 25, x + 22, y + 21);
+ g.drawLine(x + 22, y + 13, x + 22, y + 6);
+
+ g.drawLine(x + 22, y + 6, x + 19, y);
+
+ g.drawLine(x + 17, y + 2, x + 21, y + 6);
+
+ g.drawLine(x + 18, y + 1, x + 19, y + 1);
+
+ g.setColor(MetalLookAndFeel.getControlShadow());
+
+ g.drawLine(x + 1, y + 1, x + 17, y + 1);
+
+ g.drawLine(x + 1, y + 1, x + 1, y + 5);
+ g.drawLine(x + 1, y + 13, x + 1, y + 24);
+
+ g.drawLine(x + 1, y + 24, x + 21, y + 24);
+
+ g.drawLine(x + 21, y + 24, x + 21, y + 21);
+ g.drawLine(x + 21, y + 13, x + 21, y + 7);
+
+ g.drawLine(x + 18, y + 2, x + 20, y + 4);
+
+ // Breaking line
+
+ // Shadow
+ g.drawLine(x + 1, y + 6, x + 20, y + 13);
+ g.drawLine(x + 1, y + 13, x + 20, y + 20);
+
+ // Edge
+ g.setColor(MetalLookAndFeel.getBlack());
+ g.drawLine(x, y + 6, x + 21, y + 14);
+ g.drawLine(x, y + 12, x + 21, y + 20);
+
+ // Picture
+
+ y += 1;
+ x += 3;
+
+ g.setColor(MetalLookAndFeel.getBlack());
+
+ // roof
+ g.drawLine(x + 4, y + 5, x + 8, y + 1);
+ g.drawLine(x + 8, y + 1, x + 15, y + 8);
+
+ // chimney
+ g.drawLine(x + 11, y + 2, x + 11, y + 4);
+ g.drawLine(x + 12, y + 2, x + 12, y + 5);
+
+ g.setColor(MetalLookAndFeel.getControlDarkShadow());
+
+ // roof paint
+ int xx = x + 8;
+ for (int i = 0; i < 4; i++)
+ g.drawLine(xx - i, y + 2 + i, xx + i, y + 2 + i);
+ g.fillRect(x + 4, y + 6, 9, 2);
+
+ // base of house
+ g.drawLine(x + 3, y + 14, x + 3, y + 18);
+ g.drawLine(x + 3, y + 18, x + 13, y + 18);
+
+ g.setColor(savedColor);
+ }
+ }
+
+ /**
+ * This icon reflects the general concept (sheet of paper with image), but is
+ * currently not pixel to pixel identical with the Sun's implementation.
+ */
+ public static class LoadingImageIcon implements Icon, Serializable
+ {
+
+ /**
+ * Creates a new icon.
+ */
+ public LoadingImageIcon()
+ {
+ // Nothing to do here.
+ }
+
+ /**
+ * Returns the width of the icon, in pixels.
+ *
+ * @return The width of the icon.
+ */
+ public int getIconWidth()
+ {
+ return 38;
+ }
+
+ /**
+ * Returns the height of the icon, in pixels.
+ *
+ * @return The height of the icon.
+ */
+ public int getIconHeight()
+ {
+ return 38;
+ }
+
+ /**
+ * Paints the icon using colors from the {@link MetalLookAndFeel}.
+ *
+ * @param c
+ * the component (ignored).
+ * @param g
+ * the graphics device.
+ * @param x
+ * the x-coordinate for the top-left of the icon.
+ * @param y
+ * the y-coordinate for the top-left of the icon.
+ */
+ public void paintIcon(Component c, Graphics g, int x, int y)
+ {
+ // frame
+ Color savedColor = g.getColor();
+
+ g.setColor(Color.black);
+ g.drawLine(x, y, x + 19, y);
+ g.drawLine(x, y + 1, x, y + 25);
+ g.drawLine(x, y + 25, x + 22, y + 25);
+ g.drawLine(x + 22, y + 25, x + 22, y + 6);
+ g.drawLine(x + 22, y + 6, x + 19, y);
+
+ g.drawLine(x + 17, y + 2, x + 21, y + 6);
+ g.drawLine(x + 18, y + 1, x + 19, y + 1);
+
+ g.setColor(new Color(204, 204, 255));
+
+ g.drawLine(x + 1, y + 1, x + 17, y + 1);
+ g.drawLine(x + 1, y + 1, x + 1, y + 24);
+ g.drawLine(x + 1, y + 24, x + 21, y + 24);
+ g.drawLine(x + 21, y + 24, x + 21, y + 7);
+ g.drawLine(x + 18, y + 2, x + 20, y + 4);
+
+ // Picture (house)
+
+ y += 3;
+ x += 3;
+
+ g.setColor(MetalLookAndFeel.getBlack());
+
+ // roof
+ g.drawLine(x + 1, y + 8, x + 8, y + 1);
+ g.drawLine(x + 8, y + 1, x + 15, y + 8);
+
+ // base of house
+ g.drawLine(x + 3, y + 6, x + 3, y + 15);
+ g.drawLine(x + 3, y + 15, x + 13, y + 15);
+ g.drawLine(x + 13, y + 6, x + 13, y + 15);
+
+ // door frame
+ g.drawLine(x + 6, y + 9, x + 6, y + 15);
+ g.drawLine(x + 6, y + 9, x + 10, y + 9);
+ g.drawLine(x + 10, y + 9, x + 10, y + 15);
+
+ // chimney
+ g.drawLine(x + 11, y + 2, x + 11, y + 4);
+ g.drawLine(x + 12, y + 2, x + 12, y + 5);
+
+ g.setColor(MetalLookAndFeel.getControlDarkShadow());
+
+ // roof paint
+ int xx = x + 8;
+ for (int i = 0; i < 4; i++)
+ g.drawLine(xx - i, y + 2 + i, xx + i, y + 2 + i);
+ g.fillRect(x + 4, y + 6, 9, 2);
+
+ // door knob
+ g.drawLine(x + 9, y + 12, x + 9, y + 12);
+
+ // house paint
+ g.setColor(MetalLookAndFeel.getPrimaryControl());
+ g.drawLine(x + 4, y + 8, x + 12, y + 8);
+ g.fillRect(x + 4, y + 9, 2, 6);
+ g.fillRect(x + 11, y + 9, 2, 6);
+
+ g.setColor(savedColor);
+ }
+ }
+
+ public static Icon getNoImageIcon()
+ {
+ if (noImageIcon == null)
+ noImageIcon = new NoImageIcon();
+ return noImageIcon;
+ }
+
+ public static Icon getLoadingImageIcon()
+ {
+ if (loadingImageIcon == null)
+ loadingImageIcon = new LoadingImageIcon();
+ return loadingImageIcon;
+ }
+
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/css/BorderStyle.java b/libjava/classpath/gnu/javax/swing/text/html/css/BorderStyle.java
new file mode 100644
index 000000000..3ccd38491
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/css/BorderStyle.java
@@ -0,0 +1,64 @@
+/* BorderStyle.java -- Utility for dealing with border styles
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.css;
+
+/**
+ * Utility class for handling border styles.
+ */
+public class BorderStyle
+{
+
+ /**
+ * Determines if a given value makes up a valid border style value.
+ *
+ * @param value the value to check
+ *
+ * @return <code>true</code> when this is a valid border style,
+ * <code>false</code> otherwise
+ */
+ public static boolean isValidStyle(String value)
+ {
+ return value.equals("none") || value.equals("hidden")
+ || value.equals("dotted") || value.equals("dashed")
+ || value.equals("solid") || value.equals("double")
+ || value.equals("groove") || value.equals("ridge")
+ || value.equals("inset") || value.equals("outset");
+
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/css/BorderWidth.java b/libjava/classpath/gnu/javax/swing/text/html/css/BorderWidth.java
new file mode 100644
index 000000000..ae64c2110
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/css/BorderWidth.java
@@ -0,0 +1,78 @@
+/* BorderWidth.java -- A CSS metric for border widths
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.css;
+
+/**
+ * A special CSS metric for border widths. It basically understands everything
+ * as Length, and in addition to that provides a mapping for the border-width's
+ * thin, medium and think values.
+ */
+public class BorderWidth
+ extends Length
+{
+
+ /**
+ * Creates a new BorderWidth instance.
+ *
+ * @param val the CSS value to be interpreted
+ */
+ public BorderWidth(String val)
+ {
+ super(val);
+ if (val.equals("thin"))
+ floatValue = 1.F;
+ else if (val.equals("medium"))
+ floatValue = 2.F;
+ else if (val.equals("thick"))
+ floatValue = 3.F;
+ }
+
+ /**
+ * Checks if the specified value makes up a valid border-width value.
+ *
+ * @param value the value to check
+ *
+ * @return <code>true</code> if the value is a valid border-width
+ */
+ public static boolean isValid(String value)
+ {
+ return value.equals("thin") || value.equals("medium")
+ || value.equals("thick") || Length.isValid(value);
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/css/CSSColor.java b/libjava/classpath/gnu/javax/swing/text/html/css/CSSColor.java
new file mode 100644
index 000000000..ea4b94ae0
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/css/CSSColor.java
@@ -0,0 +1,170 @@
+/* CSSColor.java -- Converts CSS color values
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.css;
+
+import java.awt.Color;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * Converts CSS color values into AWT Color values.
+ *
+ * @author Roman Kennke (kennke@aicas.com)
+ */
+public class CSSColor
+{
+
+ private static final HashMap COLOR_MAP;
+ static
+ {
+ COLOR_MAP = new HashMap();
+ COLOR_MAP.put("maroon", "#800000");
+ COLOR_MAP.put("red", "#ff0000");
+ COLOR_MAP.put("orange", "#ffa500");
+ COLOR_MAP.put("yellow", "#ffff00");
+ COLOR_MAP.put("olive", "#808000");
+ COLOR_MAP.put("purple", "#800080");
+ COLOR_MAP.put("fuchsia", "#ff00ff");
+ COLOR_MAP.put("white", "#ffffff");
+ COLOR_MAP.put("lime", "#00ff00");
+ COLOR_MAP.put("green", "#008000");
+ COLOR_MAP.put("navy", "#000080");
+ COLOR_MAP.put("blue", "#0000ff");
+ COLOR_MAP.put("aqua", "#00ffff");
+ COLOR_MAP.put("teal", "#008080");
+ COLOR_MAP.put("black", "#000000");
+ COLOR_MAP.put("silver", "#c0c0c0");
+ COLOR_MAP.put("gray", "#808080");
+ }
+
+ /**
+ * The CSS value.
+ */
+ private String value;
+
+ /**
+ * The converted color.
+ */
+ private Color color;
+
+ /**
+ * Creates a new instance.
+ *
+ * @param val the CSS value
+ */
+ public CSSColor(String val)
+ {
+ value = val;
+ color = convertValue(value);
+ }
+
+ /**
+ * Converts a CSS color value to an AWT color.
+ *
+ * @param value the CSS color value
+ *
+ * @return the converted color value
+ */
+ public static Color convertValue(String value)
+ {
+ Color color;
+ String val1 = value.toLowerCase();
+ if (val1.charAt(0) != '#')
+ val1 = (String) COLOR_MAP.get(val1);
+ if (val1 != null)
+ {
+ String hexVal = val1.substring(1).trim();
+ try
+ {
+ int rgb = Integer.parseInt(hexVal, 16);
+ color = new Color(rgb);
+ }
+ catch (NumberFormatException ex)
+ {
+ color = Color.BLACK;
+ }
+ }
+ else
+ color = null;
+ return color;
+ }
+
+ /**
+ * Returns the converted color.
+ *
+ * @return the converted color
+ */
+ public Color getValue()
+ {
+ return color;
+ }
+
+ public String toString()
+ {
+ return value;
+ }
+
+ /**
+ * Returns <code>true</code> if the specified value is a valid color value,
+ * <code>false</code> otherwise.
+ *
+ * @param val the value to check
+ *
+ * @return <code>true</code> if the specified value is a valid color value,
+ * <code>false</code> otherwise
+ */
+ public static boolean isValidColor(String val)
+ {
+ boolean ret = false;
+ if (val.charAt(0) == '#')
+ ret = true;
+ else
+ {
+ Set colors = COLOR_MAP.keySet();
+ for (Iterator i = colors.iterator(); i.hasNext() && ret == false;)
+ {
+ String color = (String) i.next();
+ if (color.equalsIgnoreCase(val))
+ ret = true;
+ }
+ }
+ return ret;
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/css/CSSLexicalException.java b/libjava/classpath/gnu/javax/swing/text/html/css/CSSLexicalException.java
new file mode 100644
index 000000000..13968e4d2
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/css/CSSLexicalException.java
@@ -0,0 +1,60 @@
+/* CSSLexicalException.java -- Indicates a failure in the lexical analyser
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.css;
+
+import java.io.IOException;
+
+/**
+ * Indicates a failure in the lexical analyser of the CSS parser.
+ */
+public class CSSLexicalException
+ extends IOException
+{
+
+ public CSSLexicalException()
+ {
+ super();
+ }
+
+ public CSSLexicalException(String message)
+ {
+ super(message);
+ }
+
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/css/CSSParser.java b/libjava/classpath/gnu/javax/swing/text/html/css/CSSParser.java
new file mode 100644
index 000000000..4be315e37
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/css/CSSParser.java
@@ -0,0 +1,503 @@
+/* CSSParser.java -- A parser for CSS stylesheets
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.css;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.StringTokenizer;
+
+/**
+ * A parser for CSS stylesheets.
+ *
+ * This parser is based on the simple CSS grammar describe in
+ *
+ * http://www.w3.org/TR/CSS21/syndata.html .
+ *
+ * @author Roman Kennke (kennke@aicas.com)
+ */
+// TODO: Maybe use more restrictive grammar:
+// http://www.w3.org/TR/CSS21/grammar.html#q1
+public class CSSParser
+{
+
+ /**
+ * The scanner used to read the input streams into more usable tokens.
+ */
+ private CSSScanner scanner;
+
+ /**
+ * The parser callback.
+ */
+ private CSSParserCallback callback;
+
+ /**
+ * One lookahead token.
+ */
+ private int lookahead;
+
+ /**
+ * The parse error.
+ */
+ private String error;
+
+ /**
+ * Creates a new CSSParser that parses the specified input.
+ *
+ * @param in the source to parse
+ */
+ public CSSParser(Reader in, CSSParserCallback cb)
+ {
+ scanner = new CSSScanner(in);
+ callback = cb;
+ lookahead = -1;
+ }
+
+ /**
+ * Parses the input source specified in the constructor.
+ *
+ * @throws IOException if an IO or parse error occurs
+ */
+ public void parse()
+ throws IOException
+ {
+ boolean success = parseStylesheet();
+ if (! success)
+ {
+ throw new CSSParserException(error);
+ }
+ }
+
+ /**
+ * Parses a stylesheet.
+ *
+ * @return <code>true</code> if the stylesheet could be parsed successfully,
+ * <code>false</code> otherwise
+ *
+ * @throws IOException if an IO or parse error occurs
+ */
+ private boolean parseStylesheet()
+ throws IOException
+ {
+ int token = peekToken();
+ while (token != CSSScanner.EOF && (token == CSSScanner.CDC
+ || token == CSSScanner.CDO || token == CSSScanner.S
+ || parseStatement()))
+ {
+ if (token == CSSScanner.CDC || token == CSSScanner.CDO
+ || token == CSSScanner.S)
+ readToken();
+ token = peekToken();
+ }
+ // Last token must be EOF for valid stylesheets, I'd think.
+ return token == CSSScanner.EOF;
+ }
+
+ /**
+ * Parses a CSS statement.
+ * @return <code>true</code> if the stylesheet could be parsed successfully,
+ * <code>false</code> otherwise
+ *
+ * @throws IOException if an IO or parse error occurs
+ */
+ private boolean parseStatement()
+ throws IOException
+ {
+ return parseRuleset() || parseAtRule();
+ }
+
+ /**
+ * Parses a CSS rule set.
+ *
+ * @return <code>true</code> if the ruleset could be parsed successfully,
+ * <code>false</code> otherwise
+ *
+ * @throws IOException if an IO or parse error occurs
+ */
+ private boolean parseRuleset()
+ throws IOException
+ {
+ StringBuilder selector = new StringBuilder();
+ parseSelector(selector);
+ StringTokenizer selSplitter =
+ new StringTokenizer(selector.toString(), ",");
+ Selector[] sels = new Selector[selSplitter.countTokens()];
+ for (int i = 0; selSplitter.hasMoreTokens(); i++)
+ {
+ String sel = selSplitter.nextToken().trim();
+ sels[i] = new Selector(sel);
+ }
+ callback.startStatement(sels);
+ // Read any number of whitespace.
+ int token;
+ do
+ {
+ token = readToken();
+ } while (token == CSSScanner.S);
+ boolean ret = true;
+
+ if (token == CSSScanner.CURLY_LEFT)
+ {
+ // Read any number of whitespace.
+ do
+ {
+ token = readToken();
+ } while (token == CSSScanner.S);
+ lookahead = token;
+
+ // Maybe read declaration.
+ boolean decl = parseDeclaration();
+ token = peekToken();
+ while (token == CSSScanner.SEMICOLON)
+ {
+ readToken(); // Read the semicolon.
+ // Read any number of whitespace.
+ do
+ {
+ token = readToken();
+ } while (token == CSSScanner.S);
+ lookahead = token;
+
+ // Maybe read declaration.
+ parseDeclaration();
+ token = peekToken();
+ }
+ if (token != CSSScanner.CURLY_RIGHT)
+ {
+ error = "Expected right curly brace";
+ ret = false;
+ }
+ else
+ {
+ readToken();
+ // Read any number of whitespace.
+ do
+ {
+ token = readToken();
+ } while (token == CSSScanner.S);
+ lookahead = token;
+ callback.endStatement();
+ }
+ }
+ else
+ {
+ ret = false;
+ error = "Expected left curly brace";
+ }
+ return ret;
+ }
+
+ /**
+ * Parses a CSS declaration.
+ *
+ * @return <code>true</code> if the ruleset could be parsed successfully,
+ * <code>false</code> otherwise
+ *
+ * @throws IOException if an IO or parse error occurs
+ */
+ private boolean parseDeclaration()
+ throws IOException
+ {
+ // Maybe fetch one DELIM.
+ int token = readToken();
+ if (token == CSSScanner.DELIM)
+ token = readToken();
+
+ boolean ret = true;
+
+ // Parse property
+ String property = null;
+ if (token == CSSScanner.IDENT)
+ {
+ property = new String(scanner.parseBuffer, 0, scanner.tokenEnd);
+ // Read any number of whitespace.
+ do
+ {
+ token = readToken();
+ } while (token == CSSScanner.S);
+
+ // Read ':'.
+ if (token == CSSScanner.DELIM && scanner.parseBuffer[0] == ':')
+ {
+ // Read any number of whitespace.
+ do
+ {
+ token = readToken();
+ } while (token == CSSScanner.S);
+ lookahead = token;
+
+ StringBuilder value = new StringBuilder();
+ if (parseValue(value))
+ {
+ callback.declaration(property, value.toString().trim());
+ }
+ else
+ {
+ ret = false;
+ error = "Error while reading the property value";
+ }
+ }
+ else
+ {
+ ret = false;
+ error = "Expected colon to separate property and value";
+ }
+
+ }
+ else
+ {
+ lookahead = token;
+ ret = false;
+ error = "Expected IDENT token for property";
+ }
+ return ret;
+ }
+
+ /**
+ * Parses a property value.
+ *
+ * @param s the string builder to read the value into
+ *
+ * @return <code>true</code> if the ruleset could be parsed successfully,
+ * <code>false</code> otherwise
+ *
+ * @throws IOException if an IO or parse error occurs
+ */
+ private boolean parseValue(StringBuilder s)
+ throws IOException
+ {
+ // FIXME: Handle block and ATKEYWORD.
+ boolean success = parseAny(s);
+ while (parseAny(s))
+ ;
+
+ return success;
+ }
+
+ /**
+ * Parses a selector.
+ *
+ * @param sel the string buffer to put the selector into
+ *
+ * @return <code>true</code> if the ruleset could be parsed successfully,
+ * <code>false</code> otherwise
+ *
+ * @throws IOException if an IO or parse error occurs
+ */
+ private boolean parseSelector(StringBuilder sel)
+ throws IOException
+ {
+ // At least one any needs to be parsed.
+ boolean ret = parseAny(sel);
+ if (ret)
+ {
+ while (parseAny(sel))
+ ;
+ }
+ return ret;
+ }
+
+ /**
+ * Parses the any rule. If s is not null, then the contents of the
+ * tokens is appended verbatim.
+ *
+ * @param s the string builder to append to
+ *
+ * @return <code>true</code> if the ruleset could be parsed successfully,
+ * <code>false</code> otherwise
+ *
+ * @throws IOException if an IO or parse error occurs
+ */
+ private boolean parseAny(StringBuilder s)
+ throws IOException
+ {
+ int token = peekToken();
+ boolean ret = false;
+ if (token == CSSScanner.IDENT || token == CSSScanner.NUMBER
+ || token == CSSScanner.PERCENTAGE || token == CSSScanner.DIMENSION
+ || token == CSSScanner.STRING || token == CSSScanner.DELIM
+ || token == CSSScanner.URI || token == CSSScanner.HASH
+ || token == CSSScanner.UNICODE_RANGE || token == CSSScanner.INCLUDES
+ || token == CSSScanner.DASHMATCH)
+ {
+ if (s != null)
+ s.append(scanner.parseBuffer, 0, scanner.tokenEnd);
+ readToken();
+ ret = true;
+ }
+ else if (token == CSSScanner.FUNCTION)
+ System.err.println("Implement parseAny for FUNCTION");
+ else if (token == CSSScanner.PAREN_LEFT)
+ System.err.println("Implement parseAny for (");
+ else if (token == CSSScanner.BRACE_LEFT)
+ System.err.println("Implement parseAny for [");
+
+ // Parse any following whitespace too.
+ token = peekToken();
+ while (token == CSSScanner.S)
+ {
+ if (s != null)
+ s.append(scanner.parseBuffer, 0, scanner.tokenEnd);
+ readToken();
+ token = peekToken();
+ }
+ return ret;
+ }
+
+ /**
+ * Parses a CSS at-rule.
+ *
+ * @return <code>true</code> if the at-rule could be parsed successfully,
+ * <code>false</code> otherwise
+ *
+ * @throws IOException if an IO or parse error occurs
+ */
+ private boolean parseAtRule()
+ throws IOException
+ {
+ // FIXME: Implement.
+ return false;
+ }
+
+ /**
+ * Reads the next token, and skips the comments.
+ *
+ * @return the next non-comment token
+ */
+ private int readToken()
+ throws IOException
+ {
+ int token;
+ if (lookahead == -1)
+ {
+ do
+ {
+ token = scanner.nextToken();
+ } while (token == CSSScanner.COMMENT);
+ }
+ else
+ {
+ token = lookahead;
+ lookahead = -1;
+ }
+ return token;
+ }
+
+ /**
+ * Returns the next token to be read, without really reading it. The next
+ * call to readToken() will return the same token again.
+ *
+ * @return the next token to be read, without really reading it
+ */
+ private int peekToken()
+ throws IOException
+ {
+ int token;
+ if (lookahead == -1)
+ {
+ do
+ {
+ token = scanner.nextToken();
+ } while (token == CSSScanner.COMMENT);
+ lookahead = token;
+ }
+ else
+ token = lookahead;
+ return token;
+ }
+
+ /**
+ * For testing, we read in the default.css in javax/swing/text/html
+ *
+ * @param args
+ */
+ public static void main(String[] args)
+ {
+ try
+ {
+ InputStream in;
+ if (args.length > 0)
+ {
+ File file = new File(args[0]);
+ in = new FileInputStream(file);
+ }
+ else
+ {
+ String name = "/javax/swing/text/html/default.css";
+ in = CSSScanner.class.getResourceAsStream(name);
+ }
+ BufferedInputStream bin = new BufferedInputStream(in);
+ InputStreamReader r = new InputStreamReader(bin);
+ CSSParserCallback cb = new CSSParserCallback()
+ {
+ public void startStatement(Selector[] selector)
+ {
+ System.out.print("startStatement: ");
+ for (int i = 0; i < selector.length; i++)
+ {
+ System.out.print(selector[i]);
+ if (i < selector.length - 1)
+ System.out.print(',');
+ else
+ System.out.println();
+ }
+ }
+ public void endStatement()
+ {
+ System.out.println("endStatement");
+ }
+ public void declaration(String property, String value)
+ {
+ System.out.println("declaration: " + property + ", " + value);
+ }
+ };
+ CSSParser p = new CSSParser(r, cb);
+ p.parse();
+ }
+ catch (IOException ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/css/CSSParserCallback.java b/libjava/classpath/gnu/javax/swing/text/html/css/CSSParserCallback.java
new file mode 100644
index 000000000..f49ffa232
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/css/CSSParserCallback.java
@@ -0,0 +1,81 @@
+/* CSSParserCallback.java -- Callback for parsing CSS
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.css;
+
+/**
+ * Defines the callback that is used by the CSSParser to notify the
+ * backend of the parsing process.
+ *
+ * @author Roman Kennke (kennke@aicas.com)
+ */
+public interface CSSParserCallback
+{
+
+ /**
+ * Signals the beginning of a statement.
+ *
+ * A CSS statement is build up like follows:
+ * <pre>
+ * <selector> {
+ * ... declarations...
+ * }
+ * </pre>
+ *
+ * After startStatement(), the callback will receive zero to n callbacks
+ * to declaration, followed by an endStatement() call.
+ *
+ * @param selector the selector of the statement.
+ */
+ void startStatement(Selector[] selector);
+
+ /**
+ * Signals the end of a statement.
+ */
+ void endStatement();
+
+ /**
+ * Signals the parsing of one declaration, which defines a mapping
+ * from a property to a value.
+ *
+ * @param property the property
+ * @param value the value
+ */
+ void declaration(String property, String value);
+
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/css/CSSParserException.java b/libjava/classpath/gnu/javax/swing/text/html/css/CSSParserException.java
new file mode 100644
index 000000000..2328d5398
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/css/CSSParserException.java
@@ -0,0 +1,62 @@
+/* CSSParserException.java -- The CSS parser exception
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.css;
+
+import java.io.IOException;
+
+/**
+ * This exception is raised when the CSS parser hits a syntax error.
+ *
+ * @author Roman Kennke (kennke@aicas.com)
+ */
+public class CSSParserException
+ extends IOException
+{
+
+ /**
+ * Creates a new CSSParserException.
+ *
+ * @param message the exception message
+ */
+ public CSSParserException(String message)
+ {
+ super(message);
+ }
+
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/css/CSSScanner.java b/libjava/classpath/gnu/javax/swing/text/html/css/CSSScanner.java
new file mode 100644
index 000000000..37d544641
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/css/CSSScanner.java
@@ -0,0 +1,718 @@
+/* CSSScanner.java -- A parser for CSS stylesheets
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.css;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+
+/**
+ * A tokenizer for CSS stylesheets. This is based on the scanner definition
+ * from:
+ *
+ * http://www.w3.org/TR/CSS21/syndata.html#tokenization
+ *
+ * @author Roman Kennke (kennke@aicas.com)
+ */
+// TODO: Maybe implement more restrictive scanner:
+// http://www.w3.org/TR/CSS21/grammar.html#q2
+class CSSScanner
+{
+
+ // The tokens. This list is taken from:
+ // http://www.w3.org/TR/CSS21/syndata.html#tokenization
+ static final int IDENT = 1;
+ static final int ATKEYWORD = 2;
+ static final int STRING = 3;
+ static final int INVALID = 4;
+ static final int HASH = 5;
+ static final int NUMBER = 6;
+ static final int PERCENTAGE = 7;
+ static final int DIMENSION = 8;
+ static final int URI = 9;
+ static final int UNICODE_RANGE = 10;
+ static final int CDO = 11;
+ static final int CDC = 12;
+ static final int SEMICOLON = 13;
+ static final int CURLY_LEFT = 14;
+ static final int CURLY_RIGHT = 15;
+ static final int PAREN_LEFT = 16;
+ static final int PAREN_RIGHT = 17;
+ static final int BRACE_LEFT = 16;
+ static final int BRACE_RIGHT = 17;
+ static final int S = 18;
+ static final int COMMENT = 19;
+ static final int FUNCTION = 20;
+ static final int INCLUDES = 21;
+ static final int DASHMATCH = 22;
+ static final int DELIM = 23;
+
+ // Additional tokens defined for convenience.
+ static final int EOF = -1;
+
+ /**
+ * The input source.
+ */
+ private Reader in;
+
+ /**
+ * The parse buffer.
+ */
+ char[] parseBuffer;
+
+ /**
+ * The end index in the parseBuffer of the current token.
+ */
+ int tokenEnd;
+
+ /**
+ * The lookahead 'buffer'.
+ */
+ private int[] lookahead;
+
+ CSSScanner(Reader r)
+ {
+ lookahead = new int[2];
+ lookahead[0] = -1;
+ lookahead[1] = -1;
+ parseBuffer = new char[2048];
+ in = r;
+ }
+
+ /**
+ * Fetches the next token. The actual character data is in the parseBuffer
+ * afterwards with the tokenStart at index 0 and the tokenEnd field
+ * pointing to the end of the token.
+ *
+ * @return the next token
+ */
+ int nextToken()
+ throws IOException
+ {
+ tokenEnd = 0;
+ int token = -1;
+ int next = read();
+ if (next != -1)
+ {
+ switch (next)
+ {
+ case ';':
+ parseBuffer[0] = (char) next;
+ tokenEnd = 1;
+ token = SEMICOLON;
+ break;
+ case '{':
+ parseBuffer[0] = (char) next;
+ tokenEnd = 1;
+ token = CURLY_LEFT;
+ break;
+ case '}':
+ parseBuffer[0] = (char) next;
+ tokenEnd = 1;
+ token = CURLY_RIGHT;
+ break;
+ case '(':
+ parseBuffer[0] = (char) next;
+ tokenEnd = 1;
+ token = PAREN_LEFT;
+ break;
+ case ')':
+ parseBuffer[0] = (char) next;
+ tokenEnd = 1;
+ token = PAREN_RIGHT;
+ break;
+ case '[':
+ parseBuffer[0] = (char) next;
+ tokenEnd = 1;
+ token = BRACE_LEFT;
+ break;
+ case ']':
+ parseBuffer[0] = (char) next;
+ tokenEnd = 1;
+ token = BRACE_RIGHT;
+ break;
+ case '@':
+ parseBuffer[0] = (char) next;
+ tokenEnd = 1;
+ readIdent();
+ token = ATKEYWORD;
+ break;
+ case '#':
+ parseBuffer[0] = (char) next;
+ tokenEnd = 1;
+ readName();
+ token = HASH;
+ break;
+ case '\'':
+ case '"':
+ lookahead[0] = next;
+ readString();
+ token = STRING;
+ break;
+ case ' ':
+ case '\t':
+ case '\r':
+ case '\n':
+ case '\f':
+ lookahead[0] = next;
+ readWhitespace();
+ token = S;
+ break;
+ // FIXME: Detecting an URI involves several characters lookahead.
+// case 'u':
+// lookahead[0] = ch;
+// readURI();
+// token = URI;
+// break;
+ case '<':
+ parseBuffer[0] = (char) next;
+ parseBuffer[1] = (char) read();
+ parseBuffer[2] = (char) read();
+ parseBuffer[3] = (char) read();
+ if (parseBuffer[1] == '!' && parseBuffer[2] == '-'
+ && parseBuffer[3] == '-')
+ {
+ token = CDO;
+ tokenEnd = 4;
+ }
+ else
+ throw new CSSLexicalException("expected CDO token");
+ break;
+ case '/':
+ lookahead[0] = next;
+ readComment();
+ token = COMMENT;
+ break;
+ case '~':
+ parseBuffer[0] = (char) next;
+ parseBuffer[1] = (char) read();
+ if (parseBuffer[1] == '=')
+ token = INCLUDES;
+ else
+ throw new CSSLexicalException("expected INCLUDES token");
+ break;
+ case '|':
+ parseBuffer[0] = (char) next;
+ parseBuffer[1] = (char) read();
+ if (parseBuffer[1] == '=')
+ token = DASHMATCH;
+ else
+ throw new CSSLexicalException("expected DASHMATCH token");
+ break;
+ case '-':
+ int ch2 = read();
+ if (ch2 == '-')
+ {
+ int ch3 = read();
+ if (ch3 == '>')
+ {
+ parseBuffer[0] = (char) next;
+ parseBuffer[1] = (char) ch2;
+ parseBuffer[2] = (char) ch3;
+ tokenEnd = 3;
+ token = CDC;
+ }
+ else
+ throw new CSSLexicalException("expected CDC token");
+ }
+ else
+ {
+ lookahead[0] = next;
+ lookahead[1] = ch2;
+ readIdent();
+ int ch3 = read();
+ if (ch3 == -1 || ch3 != '(')
+ {
+ lookahead[0] = ch3;
+ token = IDENT;
+ }
+ else
+ {
+ parseBuffer[tokenEnd] = (char) ch3;
+ tokenEnd++;
+ token = FUNCTION;
+ }
+ }
+ break;
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ lookahead[0] = next;
+ readNum();
+ int ch3 = read();
+ if (ch3 == '%')
+ {
+ parseBuffer[tokenEnd] = (char) ch3;
+ tokenEnd++;
+ token = PERCENTAGE;
+ }
+ else if (ch3 == -1 || (! (ch3 == '_'
+ || (ch3 >= 'a' && ch3 <= 'z')
+ || (ch3 >= 'A' && ch3 <= 'Z')
+ || ch3 == '\\' || ch3 > 177)))
+ {
+ lookahead[0] = ch3;
+ token = NUMBER;
+ }
+ else
+ {
+ lookahead[0] = ch3;
+ readIdent();
+ token = DIMENSION;
+ }
+ break;
+ default:
+ // Handle IDENT that don't begin with '-'.
+ if (next == '_' || (next >= 'a' && next <= 'z')
+ || (next >= 'A' && next <= 'Z') || next == '\\' || next > 177)
+ {
+ lookahead[0] = next;
+ readIdent();
+ int ch4 = read();
+ if (ch4 == -1 || ch4 != '(')
+ {
+ lookahead[0] = ch4;
+ token = IDENT;
+ }
+ else
+ {
+ parseBuffer[tokenEnd] = (char) ch4;
+ tokenEnd++;
+ token = FUNCTION;
+ }
+ }
+ else
+ {
+ parseBuffer[0] = (char) next;
+ tokenEnd = 1;
+ token = DELIM;
+ }
+ break;
+ }
+ }
+ return token;
+ }
+
+ String currentTokenString()
+ {
+ return new String(parseBuffer, 0, tokenEnd);
+ }
+
+ /**
+ * Reads one character from the input stream or from the lookahead
+ * buffer, if it contains one character.
+ *
+ * @return the next character
+ *
+ * @throws IOException if problems occur on the input source
+ */
+ private int read()
+ throws IOException
+ {
+ int ret;
+ if (lookahead[0] != -1)
+ {
+ ret = lookahead[0];
+ lookahead[0] = -1;
+ }
+ else if (lookahead[1] != -1)
+ {
+ ret = lookahead[1];
+ lookahead[1] = -1;
+ }
+ else
+ {
+ ret = in.read();
+ }
+ return ret;
+ }
+
+ /**
+ * Reads and identifier.
+ *
+ * @throws IOException if something goes wrong in the input source or if
+ * the lexical analyser fails to read an identifier
+ */
+ private void readIdent()
+ throws IOException
+ {
+ int ch1 = read();
+ // Read possibly leading '-'.
+ if (ch1 == '-')
+ {
+ parseBuffer[tokenEnd] = (char) ch1;
+ tokenEnd++;
+ ch1 = read();
+ }
+ // What follows must be '_' or a-z or A-Z or nonascii (>177) or an
+ // escape.
+ if (ch1 == '_' || (ch1 >= 'a' && ch1 <= 'z')
+ || (ch1 >= 'A' && ch1 <= 'Z') || ch1 > 177)
+ {
+ parseBuffer[tokenEnd] = (char) ch1;
+ tokenEnd++;
+ }
+ else if (ch1 == '\\')
+ {
+ // Try to read an escape.
+ lookahead[0] = ch1;
+ readEscape();
+ }
+ else
+ throw new CSSLexicalException("First character of identifier incorrect");
+
+ // Read any number of [_a-zA-Z0-9-] chars.
+ int ch = read();
+ while (ch != -1 && (ch == '_' || ch == '-' || (ch >= 'a' && ch <= 'z')
+ || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9')))
+ {
+ parseBuffer[tokenEnd] = (char) ch;
+ tokenEnd++;
+ ch = read();
+ }
+
+ // Push back last read character since it doesn't belong to the IDENT.
+ lookahead[0] = ch;
+ }
+
+ /**
+ * Reads an escape.
+ *
+ * @throws IOException if something goes wrong in the input source or if
+ * the lexical analyser fails to read an escape
+ */
+ private void readEscape()
+ throws IOException
+ {
+ int ch = read();
+ if (ch != -1 && ch == '\\')
+ {
+ parseBuffer[tokenEnd] = (char) ch;
+ tokenEnd++;
+ ch = read();
+ if ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f'))
+ {
+ // Read unicode escape.
+ // Zero to five 0-9a-f chars can follow.
+ int hexcount = 0;
+ ch = read();
+ while (((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f'))
+ && hexcount < 5)
+ {
+ parseBuffer[tokenEnd] = (char) ch;
+ tokenEnd++;
+ hexcount++;
+ ch = read();
+ }
+ // Now we can have a \r\n or any whitespace character following.
+ if (ch == '\r')
+ {
+ parseBuffer[tokenEnd] = (char) ch;
+ tokenEnd++;
+ ch = read();
+ if (ch == '\n')
+ {
+ parseBuffer[tokenEnd] = (char) ch;
+ tokenEnd++;
+ }
+ else
+ {
+ lookahead[0] = ch;
+ }
+ }
+ else if (ch == ' ' || ch == '\n' || ch == '\f' || ch == '\t')
+ {
+ parseBuffer[tokenEnd] = (char) ch;
+ tokenEnd++;
+ }
+ else
+ {
+ lookahead[0] = ch;
+ }
+ }
+ else if (ch != '\n' && ch != '\r' && ch != '\f')
+ {
+ parseBuffer[tokenEnd] = (char) ch;
+ tokenEnd++;
+ }
+ else
+ throw new CSSLexicalException("Can't read escape");
+ }
+ else
+ throw new CSSLexicalException("Escape must start with '\\'");
+
+ }
+
+ private void readName()
+ throws IOException
+ {
+ // Read first name character.
+ int ch = read();
+ if (ch != -1 && (ch == '_' || ch == '-' || (ch >= 'a' && ch <= 'z')
+ || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9')))
+ {
+ parseBuffer[tokenEnd] = (char) ch;
+ tokenEnd++;
+ }
+ else
+ throw new CSSLexicalException("Invalid name");
+
+ // Read any number (at least one) of [_a-zA-Z0-9-] chars.
+ ch = read();
+ while (ch != -1 && (ch == '_' || ch == '-' || (ch >= 'a' && ch <= 'z')
+ || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9')))
+ {
+ parseBuffer[tokenEnd] = (char) ch;
+ tokenEnd++;
+ ch = read();
+ }
+
+ // Push back last read character since it doesn't belong to the IDENT.
+ lookahead[0] = ch;
+ }
+
+ /**
+ * Reads in a string.
+ *
+ * @throws IOException
+ */
+ private void readString()
+ throws IOException
+ {
+ int ch1 = read();
+ if (ch1 != -1 && (ch1 == '\'' || ch1 == '\"'))
+ {
+ parseBuffer[tokenEnd] = (char) ch1;
+ tokenEnd++;
+
+ // Read any number of chars until we hit another chc1 char.
+ // Reject newlines, except if prefixed with \.
+ int ch = read();
+ while (ch != -1 && ch != ch1)
+ {
+ // Every non-newline and non-\ char should be ok.
+ if (ch != '\n' && ch != '\r' && ch != '\f' && ch != '\\')
+ {
+ parseBuffer[tokenEnd] = (char) ch;
+ tokenEnd++;
+ }
+ // Ok when followed by newline or as part of escape.
+ else if (ch == '\\')
+ {
+ int ch2 = read();
+ if (ch2 == '\n' || ch2 == '\r')
+ {
+ parseBuffer[tokenEnd] = (char) ch;
+ parseBuffer[tokenEnd + 1] = (char) ch2;
+ tokenEnd += 2;
+ }
+ else
+ {
+ // Try to parse an escape.
+ lookahead[0] = ch;
+ lookahead[1] = ch2;
+ readEscape();
+ }
+ }
+ else
+ throw new CSSLexicalException("Invalid string");
+
+ ch = read();
+ }
+ if (ch != -1)
+ {
+ // Push the final char on the buffer.
+ parseBuffer[tokenEnd] = (char) ch;
+ tokenEnd++;
+ }
+ else
+ throw new CSSLexicalException("Unterminated string");
+ }
+ else
+ throw new CSSLexicalException("Invalid string");
+ }
+
+ /**
+ * Reads a chunk of whitespace.
+ *
+ * @throws IOException
+ */
+ private void readWhitespace()
+ throws IOException
+ {
+ int ch = read();
+ while (ch != -1 && (ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n'
+ || ch == '\f'))
+ {
+ parseBuffer[tokenEnd] = (char) ch;
+ tokenEnd++;
+ ch = read();
+ }
+ // Push back last character read.
+ lookahead[0] = ch;
+
+ }
+
+ private void readURI()
+ throws IOException
+ {
+ // FIXME: Implement.
+ }
+
+ /**
+ * Reads a comment block.
+ *
+ * @throws IOException
+ */
+ private void readComment()
+ throws IOException
+ {
+ // First we need a / and a *
+ int ch = read();
+ if (ch != -1 && ch == '/')
+ {
+ parseBuffer[tokenEnd] = (char) ch;
+ tokenEnd++;
+ ch = read();
+ if (ch != -1 && ch == '*')
+ {
+ parseBuffer[tokenEnd] = (char) ch;
+ tokenEnd++;
+ ch = read();
+ parseBuffer[tokenEnd] = (char) ch;
+ tokenEnd++;
+ boolean finished = false;
+ int lastChar = ch;
+ ch = read();
+ while (! finished && ch != -1)
+ {
+ if (lastChar == '*' && ch == '/')
+ finished = true;
+ parseBuffer[tokenEnd] = (char) ch;
+ tokenEnd++;
+ lastChar = ch;
+ ch = read();
+ }
+ }
+ }
+ if (ch == -1)
+ throw new CSSLexicalException("Unterminated comment");
+
+ // Push back last character read.
+ lookahead[0] = ch;
+ }
+
+ /**
+ * Reads a number.
+ *
+ * @throws IOException
+ */
+ private void readNum()
+ throws IOException
+ {
+ boolean hadDot = false;
+ // First char must be number or .
+ int ch = read();
+ if (ch != -1 && ((ch >= '0' && ch <= '9') || ch == '.'))
+ {
+ if (ch == '.')
+ hadDot = true;
+ parseBuffer[tokenEnd] = (char) ch;
+ tokenEnd++;
+ // Now read in any number of digits afterwards, and maybe one dot,
+ // if we hadn't one already.
+ ch = read();
+ while (ch != -1 && ((ch >= '0' && ch <= '9')
+ || (ch == '.' && ! hadDot)))
+ {
+ if (ch == '.')
+ hadDot = true;
+ parseBuffer[tokenEnd] = (char) ch;
+ tokenEnd++;
+ ch = read();
+ }
+ }
+ else
+ throw new CSSLexicalException("Invalid number");
+
+ // Check if we haven't accidentally finished with a dot.
+ if (parseBuffer[tokenEnd - 1] == '.')
+ throw new CSSLexicalException("Invalid number");
+
+ // Push back last character read.
+ lookahead[0] = ch;
+ }
+
+ /**
+ * For testing, we read in the default.css in javax/swing/text/html
+ *
+ * @param args
+ */
+ public static void main(String[] args)
+ {
+ try
+ {
+ String name = "/javax/swing/text/html/default.css";
+ InputStream in = CSSScanner.class.getResourceAsStream(name);
+ BufferedInputStream bin = new BufferedInputStream(in);
+ InputStreamReader r = new InputStreamReader(bin);
+ CSSScanner s = new CSSScanner(r);
+ int token;
+ do
+ {
+ token = s.nextToken();
+ System.out.println("token: " + token + ": "
+ + s.currentTokenString());
+ } while (token != -1);
+ }
+ catch (IOException ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/css/FontSize.java b/libjava/classpath/gnu/javax/swing/text/html/css/FontSize.java
new file mode 100644
index 000000000..203eadc40
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/css/FontSize.java
@@ -0,0 +1,273 @@
+/* FontSize.java -- Converts CSS font size values into real values
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.css;
+
+/**
+ * Converts CSS font-size values into real (point) values.
+ *
+ * @author Roman Kennke (kennke@aicas.com)
+ */
+public class FontSize
+{
+
+ /**
+ * The CSS value.
+ */
+ private String value;
+
+ /**
+ * The actual font size.
+ */
+ private int size;
+
+ /**
+ * The index of one of the standard sizes that this font size maps to.
+ * This is -1 if this fontsize doesn't map to one of the standard sizes.
+ *
+ * @see #SCALE
+ */
+ private int sizeIndex;
+
+ /**
+ * True when this font size is relative.
+ */
+ private boolean isRelative;
+
+ /**
+ * The default size for 'medium' absolute size. The other absolute sizes
+ * are calculated from this.
+ */
+ public static final int DEFAULT_FONT_SIZE = 12;
+
+ /**
+ * The scaling factors relative to the medium size. Medium is at index 2.
+ */
+ private static final double[] SCALE = {0.8, 0.9, 1.0, 1.2, 1.4, 1.6, 1.8 };
+
+ /**
+ * Creates a new FontSize for the specified value.
+ *
+ * @param val the value to convert
+ */
+ public FontSize(String val)
+ {
+ value = val;
+ sizeIndex = -1;
+ isRelative = false;
+ size = mapValue();
+ }
+
+ /**
+ * Returns the font size value.
+ *
+ * @return the font size value
+ */
+ public int getValue(int p)
+ {
+ if (isRelative)
+ mapRelative(p);
+ return size;
+ }
+
+ public int getValue()
+ {
+ assert ! isRelative;
+ return size;
+ }
+
+ /**
+ * Returns the converted real value in point.
+ *
+ * @return the converted real value in point
+ */
+ private int mapValue()
+ {
+ int intVal;
+ if (value.contains("pt"))
+ intVal = mapPoints();
+ else if (value.contains("px"))
+ intVal = mapPixels();
+ else if (value.contains("em") || value.contains("%")
+ || value.contains("larger") || value.contains("smaller"))
+ {
+ intVal = -1;
+ isRelative = true;
+ }
+ else
+ intVal = mapAbsolute();
+ return intVal;
+ }
+
+ /**
+ * Maps point values ('XXXpt').
+ *
+ * @return the real font size
+ */
+ private int mapPoints()
+ {
+ int end = value.indexOf("pt");
+ String number = value.substring(0, end);
+ int intVal = (int) Double.parseDouble(number);
+ return intVal;
+ }
+
+ /**
+ * Maps pixel values ('XXXpx').
+ *
+ * @return the real font size
+ */
+ private int mapPixels()
+ {
+ int end = value.indexOf("px");
+ if (end == -1)
+ end = value.length();
+ String number = value.substring(0, end);
+ try
+ {
+ int intVal = (int) Double.parseDouble(number);
+ return intVal;
+ }
+ catch (NumberFormatException ex)
+ {
+ return DEFAULT_FONT_SIZE;
+ }
+ }
+
+ private int mapPercent(int par)
+ {
+ int end = value.indexOf("%");
+ if (end == -1)
+ end = value.length();
+ String number = value.substring(0, end);
+ try
+ {
+ int intVal = (int) Double.parseDouble(number);
+ return intVal * par / 100;
+ }
+ catch (NumberFormatException ex)
+ {
+ System.err.println("couldn't map value: '" + value + "'");
+ return DEFAULT_FONT_SIZE;
+ }
+ }
+
+ private int mapEM(int par)
+ {
+ int end = value.indexOf("em");
+ if (end == -1)
+ end = value.length();
+ String number = value.substring(0, end);
+ try
+ {
+ float factor = Float.parseFloat(number);
+ // FIXME: Should be relative to the parent element's size.
+ return (int) (factor * par);
+ }
+ catch (NumberFormatException ex)
+ {
+ return DEFAULT_FONT_SIZE;
+ }
+ }
+
+ private int mapSmaller(int par)
+ {
+ return (int) (par * 0.9);
+ }
+
+ private int mapLarger(int par)
+ {
+ return (int) (par * 0.9);
+ }
+
+ /**
+ * Maps absolute font-size values.
+ *
+ * @return the real value
+ */
+ private int mapAbsolute()
+ {
+ int index;
+ if (value.equals("xx-small") || value.equals("x-small"))
+ index = 0;
+ else if (value.equals("small"))
+ index = 1;
+ else if (value.equals("medium"))
+ index = 2;
+ else if (value.equals("large"))
+ index = 3;
+ else if (value.equals("x-large"))
+ index = 4;
+ else if (value.equals("xx-large"))
+ index = 5;
+ else
+ index = 2;
+ double scale = SCALE[index];
+ // FIXME: Scale the real medium size of the document, rather than the
+ // constant here.
+ int intVal = (int) (scale * DEFAULT_FONT_SIZE);
+ sizeIndex = index;
+ return intVal;
+ }
+
+ /**
+ * Returns the string representation.
+ */
+ public String toString()
+ {
+ return value;
+ }
+
+ private int mapRelative(int par)
+ {
+ if (value.indexOf('%') != -1)
+ size = mapPercent(par);
+ else if (value.indexOf("em") != -1)
+ size = mapEM(par);
+ else if (value.indexOf("larger") != -1)
+ size = mapLarger(par);
+ else if (value.indexOf("smaller") != -1)
+ size = mapSmaller(par);
+ return size;
+ }
+
+ public boolean isRelative()
+ {
+ return isRelative;
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/css/FontStyle.java b/libjava/classpath/gnu/javax/swing/text/html/css/FontStyle.java
new file mode 100644
index 000000000..e52893193
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/css/FontStyle.java
@@ -0,0 +1,80 @@
+/* FontStyle.java -- Converts font-size CSS values
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.css;
+
+import java.awt.Font;
+
+/**
+ * Converts font-size CSS values to a form to be used by {@link java.awt.Font}.
+ *
+ * @author Roman Kennke (kennke@aicas.com)
+ */
+public class FontStyle
+{
+
+ /**
+ * The real value.
+ */
+ private String value;
+
+ /**
+ * Creates a new instance.
+ *
+ * @param val the CSS value
+ */
+ public FontStyle(String val)
+ {
+ value = val;
+ }
+
+ /**
+ * Returns the converted value.
+ *
+ * @return the converted value
+ */
+ public int getValue()
+ {
+ int intVal;
+ if (value.equals("italic") || value.equals("oblique"))
+ intVal = Font.ITALIC;
+ else
+ intVal = Font.PLAIN;
+ return intVal;
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/css/FontWeight.java b/libjava/classpath/gnu/javax/swing/text/html/css/FontWeight.java
new file mode 100644
index 000000000..d338c6f55
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/css/FontWeight.java
@@ -0,0 +1,84 @@
+/* FontWeight.java -- Converts font-weight values
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.css;
+
+import java.awt.Font;
+
+/**
+ * Converts font-weight CSS values to the constants defined for
+ * {@link java.awt.Font}
+ *
+ * @author Roman Kennke (kennke@aicas.com)
+ */
+public class FontWeight
+{
+
+ /**
+ * The value to convert.
+ */
+ private String value;
+
+ /**
+ * Creates a new instance.
+ *
+ * @param val the value to convert
+ */
+ public FontWeight(String val)
+ {
+ value = val;
+ }
+
+ /**
+ * Returns the converted value.
+ *
+ * @return the converted value
+ */
+ public int getValue()
+ {
+ int intVal;
+ if (value.equals("normal"))
+ intVal = Font.PLAIN;
+ else if (value.equals("bold"))
+ intVal = Font.BOLD;
+ else
+ // FIXME: Implement finer-grained weights.
+ intVal = Font.PLAIN;
+ return intVal;
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/css/Length.java b/libjava/classpath/gnu/javax/swing/text/html/css/Length.java
new file mode 100644
index 000000000..06fa36e3d
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/css/Length.java
@@ -0,0 +1,283 @@
+/* Length.java -- Converts CSS length values
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.css;
+
+/**
+ * Converts CSS length values to usable length values.
+ *
+ * @author Roman Kennke (kennke@aicas.com)
+ */
+public class Length
+{
+
+ /**
+ * The original value.
+ */
+ private String value;
+
+ /**
+ * The converted value.
+ */
+ protected float floatValue;
+
+ /**
+ * Indicates when the value is a percentage value.
+ */
+ private boolean isPercentage;
+
+ /**
+ * Indicates a length value that is relative to the font size (em).
+ */
+ private boolean isFontEMRelative;
+
+ /**
+ * Indicates a length value that is relative to the font size (ex).
+ */
+ private boolean isFontEXRelative;
+
+ /**
+ * The EM base size.
+ */
+ private float emBase;
+
+ /**
+ * The EX base size.
+ */
+ private float exBase;
+
+ /**
+ * Creates a new length converter instance.
+ *
+ * @param val the CSS value
+ */
+ public Length(String val)
+ {
+ isFontEMRelative = false;
+ isFontEXRelative = false;
+ isPercentage = false;
+ value = val;
+ int i = value.indexOf("px");
+ int percent = value.indexOf("%");
+ int em = value.indexOf("em");
+ int ex = value.indexOf("ex");
+ try
+ {
+ floatValue = 0.0F;
+ if (i != -1)
+ {
+ String sub = value.substring(0, i);
+ floatValue = Float.parseFloat(sub);
+ }
+ else if (percent != -1)
+ {
+ isPercentage = true;
+ String sub = value.substring(0, percent);
+ floatValue = Float.parseFloat(sub) / 100;
+ }
+ else if (em != -1)
+ {
+ isFontEMRelative = true;
+ String sub = value.substring(0, em);
+ floatValue = Float.parseFloat(sub);
+ }
+ else if (ex != -1)
+ {
+ isFontEXRelative = true;
+ String sub = value.substring(0, ex);
+ floatValue = Float.parseFloat(sub);
+ }
+ else
+ {
+ floatValue = Float.parseFloat(value);
+ }
+ }
+ catch (NumberFormatException exc)
+ {
+ // Don't let such small problems interrupt CSS parsing.
+ System.err.println("couldn't parse: " + val);
+ }
+ }
+
+ /**
+ * Returns the value converted to pixels.
+ *
+ * @return the value converted to pixels
+ */
+ public float getValue()
+ {
+ return floatValue;
+ }
+
+ /**
+ * Returns the absolute span for the case when this length value is
+ * a relative value.
+ *
+ * @param base the base span
+ *
+ * @return the absolute span
+ */
+ public float getValue(float base)
+ {
+ float span = floatValue;
+ if (isPercentage)
+ span *= base;
+ else if (isFontEMRelative)
+ span *= emBase;
+ else if (isFontEXRelative)
+ span *= exBase;
+ return span;
+ }
+
+ /**
+ * Sets the font relative EM base.
+ *
+ * @param base the font relative EM base
+ */
+ public void setEMBase(float base)
+ {
+ emBase = base;
+ }
+
+ /**
+ * Sets the font relative EX base.
+ *
+ * @param base the font relative EX base
+ */
+ public void setEXBase(float base)
+ {
+ exBase = base;
+ }
+
+ /**
+ * Sets the font relative base values.
+ *
+ * @param emBase the EM base
+ * @param exBase the EX base
+ */
+ public void setFontBases(float emBase, float exBase)
+ {
+ setEMBase(emBase);
+ setEXBase(exBase);
+ }
+
+ /**
+ * Returns true when this length value is an em font relative value. In
+ * order to get correct results, you need the exBase property set up
+ * correctly.
+ *
+ * @return true when this length value is an ex font relative value
+ */
+ public boolean isFontEMRelative()
+ {
+ return isFontEMRelative;
+ }
+
+ /**
+ * Returns true when this length value is an ex font relative value. In
+ * order to get correct results, you need the emBase property set up
+ * correctly.
+ *
+ * @return true when this length value is an ex font relative value
+ */
+ public boolean isFontEXRelative()
+ {
+ return isFontEXRelative;
+ }
+
+ /**
+ * Returns <code>true</code> when the length value is a percentage
+ * value, <code>false</code> otherwise.
+ *
+ * @return <code>true</code> when the length value is a percentage
+ * value, <code>false</code> otherwise
+ */
+ public boolean isPercentage()
+ {
+ return isPercentage;
+ }
+
+ /**
+ * Checks if the specified value makes up a valid length value.
+ *
+ * @param value the value to check
+ *
+ * @return <code>true</code> if the value is a valid length
+ */
+ public static boolean isValid(String value)
+ {
+ boolean isValid = true;
+ int px = value.indexOf("px");
+ int em = value.indexOf("em");
+ int ex = value.indexOf("ex");
+ int pc = value.indexOf('%');
+ try
+ {
+ if (px != -1)
+ {
+ Integer.parseInt(value.substring(0, px));
+ }
+ else if (em != -1)
+ {
+ Integer.parseInt(value.substring(0, em));
+ }
+ else if (ex != -1)
+ {
+ Integer.parseInt(value.substring(0, ex));
+ }
+ else if (pc != -1)
+ {
+ Integer.parseInt(value.substring(0, ex));
+ }
+ else
+ {
+ Integer.parseInt(value);
+ }
+ }
+ catch (NumberFormatException nfe)
+ {
+ isValid = false;
+ }
+ return isValid;
+ }
+
+ public String toString()
+ {
+ return value;
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/css/Selector.java b/libjava/classpath/gnu/javax/swing/text/html/css/Selector.java
new file mode 100644
index 000000000..97e582194
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/css/Selector.java
@@ -0,0 +1,245 @@
+/* Selector.java -- A CSS selector
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.css;
+
+import gnu.java.lang.CPStringBuilder;
+
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+/**
+ * A CSS selector. This provides methods to interpret a selector and
+ * query matches with an actual HTML element tree.
+ */
+public class Selector
+{
+
+ /**
+ * The actual selector. The selector tokens are stored backwards, that
+ * is the last token first. This makes matching easier.
+ */
+ private String[] selector;
+
+ private String[] elements;
+ private String[] ids;
+ private String[] classes;
+
+ /**
+ * The specificity of the selector.
+ */
+ private int specificity;
+
+ /**
+ * An implicit selector has true here. This is the case for CSS rules that
+ * are attached to HTML elements directly via style="<CSS rule>".
+ */
+ private boolean implicit;
+
+ /**
+ * Creates a new Selector instance for the specified selector string.
+ *
+ * @param sel the selector
+ */
+ public Selector(String sel)
+ {
+ StringTokenizer selectorTokens = new StringTokenizer(sel, " ");
+ selector = new String[selectorTokens.countTokens()];
+ for (int i = selector.length - 1; selectorTokens.hasMoreTokens(); i--)
+ {
+ selector[i] = selectorTokens.nextToken();
+ }
+ calculateSpecificity();
+ }
+
+ /**
+ * Determines if this selector matches the element path specified in the
+ * arguments. The arguments hold the element names as well as class
+ * and id attibutes of the HTML element to be queried. The first item
+ * in the array is the deepest element and the last on the highest up (for
+ * instance, the html tag).
+ *
+ * @param tags
+ *
+ * @return <code>true</code> when this selector matches the element path,
+ * <code>false</code> otherwise
+ */
+ public boolean matches(String[] tags, List<Map<String,String>> attributes)
+ {
+ // TODO: This implements class, id and descendent matching. These are
+ // the most commonly used selector matchers in CSS together with HTML.
+ // However, the CSS spec defines a couple of more sophisticated matches
+ // which should be implemented.
+ // http://www.w3.org/TR/CSS21/selector.html
+
+ // All parts of the selector must match at some point.
+ boolean match = false;
+ int numTags = tags.length;
+ int numSel = selector.length;
+ if (numSel <= numTags)
+ {
+ match = true;
+ int tagIndex = 0;
+ for (int j = 0; j < numSel && match; j++)
+ {
+ boolean tagMatch = false;
+ for (; tagIndex < numTags && tagMatch == false; tagIndex++)
+ {
+ Object pathClass = attributes.get(tagIndex).get("class");
+ // Try pseudo class too.
+ Object pseudoClass = attributes.get(tagIndex).get("_pseudo");
+ Object dynClass = attributes.get(tagIndex).get("_dynamic");
+ Object pathId = attributes.get(tagIndex).get("id");
+ String tag = elements[j];
+ String clazz = classes[j];
+ String id = ids[j];
+ tagMatch = tag.equals("") || tag.equals("*")
+ || tag.equals(tags[tagIndex]);
+ tagMatch = tagMatch && (clazz.equals("*")
+ || clazz.equals(dynClass)
+ || clazz.equals(pseudoClass)
+ || clazz.equals(pathClass));
+ tagMatch = tagMatch && (id.equals("*")
+ || id.equals(pathId));
+ // For the last element in the selector we must not look
+ // further.
+ if (j == 0)
+ break;
+ }
+ // If we don't come out here with a matching tag, then we're
+ // not matching at all.
+ match = tagMatch;
+ }
+ }
+ return match;
+ }
+
+ /**
+ * Returns the specificity of the selector. This is calculated according
+ * to:
+ * http://www.w3.org/TR/CSS21/cascade.html#specificity
+ *
+ * @return the specificity of the selector
+ */
+ public int getSpecificity()
+ {
+ return specificity;
+ }
+
+ /**
+ * Returns a string representation of the selector. This tries to reconstruct
+ * the original selector as closely as possible.
+ *
+ * @return a string representation of the selector
+ */
+ public String toString()
+ {
+ CPStringBuilder b = new CPStringBuilder();
+ for (int i = selector.length - 1; i >= 0; i--)
+ {
+ b.append(selector[i]);
+ if (i > 0)
+ b.append(' ');
+ }
+ return b.toString();
+ }
+
+ /**
+ * Calculates the specificity of the selector. This is calculated according
+ * to:
+ * http://www.w3.org/TR/CSS21/cascade.html#specificity
+ */
+ private void calculateSpecificity()
+ {
+ int a = implicit ? 1 : 0;
+ int b = 0;
+ int c = 0;
+ int d = 0;
+ int numSel = selector.length;
+ elements = new String[numSel];
+ ids = new String[numSel];
+ classes = new String[numSel];
+ for (int i = 0; i < numSel; i++)
+ {
+ String sel = selector[i];
+ int clazzIndex = sel.indexOf('.');
+ // Try pseudo class too.
+ if (clazzIndex == -1)
+ clazzIndex = sel.indexOf(':');
+ int idIndex = sel.indexOf('#');
+ String clazz;
+ if (clazzIndex == -1)
+ {
+ clazz = "*";
+ clazzIndex = sel.length();
+ }
+ else
+ {
+ c++;
+ clazz = sel.substring(clazzIndex + 1,
+ idIndex > 0 ? Math.min(idIndex, sel.length())
+ : sel.length());
+ }
+ String id;
+ if (idIndex == -1)
+ {
+ id = "*";
+ idIndex = sel.length();
+ }
+ else
+ {
+ b++;
+ id = sel.substring(idIndex + 1,
+ clazzIndex > 0 ? Math.min(clazzIndex, sel.length())
+ : sel.length());
+ }
+ String tag = sel.substring(0,
+ Math.min(Math.min(clazzIndex, idIndex),
+ sel.length()));
+ if (! tag.equals("") && ! tag.equals("*"))
+ d++;
+
+ elements[i] = tag;
+ ids[i] = id;
+ classes[i] = clazz;
+ }
+ // An order of 20 should be enough for everybody.
+ specificity = a * 20 ^ 3 + b * 20 ^ 2 + c * 20 + d;
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/package.html b/libjava/classpath/gnu/javax/swing/text/html/package.html
new file mode 100644
index 000000000..c7e774428
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/package.html
@@ -0,0 +1,50 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<!-- package.html - describes classes in javax.swing.text.html package.
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. -->
+
+<html>
+<head><title>GNU Classpath - javax.swing.text.html</title></head>
+
+<body>
+<p> Provides supporting classes for web browsers,
+ web robots, web page content analysers, web editors and
+ other applications applications working with Hypertext
+ Markup Language (HTML).
+</p>
+
+</body>
+</html>
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/GnuParserDelegator.java b/libjava/classpath/gnu/javax/swing/text/html/parser/GnuParserDelegator.java
new file mode 100644
index 000000000..9f3666d3a
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/GnuParserDelegator.java
@@ -0,0 +1,179 @@
+/* GnuParserDelegator.java -- The parser delegator which uses Swing DTD
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.parser;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.Serializable;
+
+import javax.swing.text.BadLocationException;
+import javax.swing.text.SimpleAttributeSet;
+import javax.swing.text.html.HTMLEditorKit;
+import javax.swing.text.html.HTMLEditorKit.ParserCallback;
+import javax.swing.text.html.parser.DTD;
+import javax.swing.text.html.parser.ParserDelegator;
+import javax.swing.text.html.parser.TagElement;
+
+/**
+ * This parser delegator uses the different DTD ({@link HTML_401Swing}).
+ * It is derived from the ParserDelegator for the compatibility reasons.
+ *
+ * @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
+ */
+public class GnuParserDelegator extends ParserDelegator implements Serializable
+{
+ class gnuParser
+ extends gnu.javax.swing.text.html.parser.support.Parser
+ {
+ private static final long serialVersionUID = 1;
+
+ gnuParser(DTD d)
+ {
+ super(d);
+ }
+
+ protected final void handleComment(char[] comment)
+ {
+ callBack.handleComment(comment, hTag.where.startPosition);
+ }
+
+ protected final void handleEmptyTag(TagElement tag)
+ throws javax.swing.text.ChangedCharSetException
+ {
+ callBack.handleSimpleTag(tag.getHTMLTag(), getAttributes(),
+ hTag.where.startPosition
+ );
+ }
+
+ protected final void handleEndTag(TagElement tag)
+ {
+ callBack.handleEndTag(tag.getHTMLTag(), hTag.where.startPosition);
+ }
+
+ protected final void handleError(int line, String message)
+ {
+ callBack.handleError(message, hTag.where.startPosition);
+ }
+
+ protected final void handleStartTag(TagElement tag)
+ {
+ SimpleAttributeSet attributes = gnu.getAttributes();
+
+ if (tag.fictional())
+ attributes.addAttribute(ParserCallback.IMPLIED, Boolean.TRUE);
+
+ callBack.handleStartTag(tag.getHTMLTag(), attributes,
+ hTag.where.startPosition
+ );
+ }
+
+ protected final void handleText(char[] text)
+ {
+ callBack.handleText(text, hTag.where.startPosition);
+ }
+
+ DTD getDTD()
+ {
+ // Accessing the inherited gnu.javax.swing.text.html.parser.support.Parser
+ // field. super. is a workaround, required to support JDK1.3's javac.
+ return super.dtd;
+ }
+ }
+
+ /**
+ * Use serialVersionUID for interoperability.
+ */
+ private static final long serialVersionUID = -1276686502624777206L;
+
+ private DTD theDtd;
+
+ /**
+ * The callback.
+ * This is package-private to avoid an accessor method.
+ */
+ HTMLEditorKit.ParserCallback callBack;
+
+ /**
+ * The reference to the working class of HTML parser that is
+ * actually used to parse the document.
+ * This is package-private to avoid an accessor method.
+ */
+ gnuParser gnu;
+
+ /**
+ * Create the parser that uses the given DTD to parse the document.
+ *
+ * @param theDtd the DTD
+ */
+ public GnuParserDelegator(DTD theDtd)
+ {
+ this.theDtd = theDtd;
+ gnu = new gnuParser(theDtd);
+ }
+
+ /**
+ * Parses the HTML document, calling methods of the provided callback. This
+ * method must be multithread - safe.
+ *
+ * @param reader The reader to read the HTML document from
+ * @param a_callback The callback that is notifyed about the presence of HTML
+ * elements in the document.
+ * @param ignoreCharSet If thrue, any charset changes during parsing are
+ * ignored.
+ * @throws java.io.IOException
+ */
+ public void parse(Reader reader,
+ HTMLEditorKit.ParserCallback a_callback,
+ boolean ignoreCharSet) throws IOException
+ {
+ callBack = a_callback;
+ gnu.parse(reader);
+
+ callBack.handleEndOfLineString(gnu.getEndOfLineSequence());
+ try
+ {
+ callBack.flush();
+ }
+ catch (BadLocationException ex)
+ {
+ // Convert this into the supported type of exception.
+ throw new IOException(ex.getMessage());
+ }
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/HTML_401F.java b/libjava/classpath/gnu/javax/swing/text/html/parser/HTML_401F.java
new file mode 100644
index 000000000..d4b061465
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/HTML_401F.java
@@ -0,0 +1,3801 @@
+/* HTML_401F.java -- HTML 4.01 FRAMESET DTD java conception.
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.parser;
+
+import gnu.javax.swing.text.html.parser.models.PCDATAonly_model;
+import gnu.javax.swing.text.html.parser.models.TableRowContentModel;
+import gnu.javax.swing.text.html.parser.models.noTagModel;
+
+import java.io.IOException;
+import java.io.Serializable;
+
+import javax.swing.text.html.parser.*;
+import javax.swing.text.html.parser.ContentModel;
+import javax.swing.text.html.parser.DTDConstants;
+
+/**
+ * This class represents the java implementation of the HTML 4.01
+ * ( -//W3C//DTD HTML 4.01 Frameset//EN ) Frameset version. The
+ * Frameset version includes as recommended, as obsoleted features and
+ * also the frameset support. This the default DTD to parse HTML
+ * documents in this implementation, containing 315 pre-defined general
+ * entities and 92 elements.
+ *
+ * @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
+ */
+public class HTML_401F
+ extends gnuDTD
+ implements DTDConstants, Serializable
+{
+ private static final long serialVersionUID = 1;
+
+ /**
+ * The standard name of this DTD,
+ * '-//W3C//DTD HTML 4.01 Frameset//EN'
+ */
+ public static final String DTD_NAME = "-//W3C//DTD HTML 4.01 Frameset//EN";
+
+ /**
+ * The integer representing length in pixels.
+ */
+ static final int PIXELS = NUMBER;
+
+ static final String[] NONE = new String[0];
+
+ /* Define the HTML tags. */
+ static final String PCDATA = "#pcdata";
+ static final String A = "a";
+ static final String ABBR = "abbr";
+ static final String ACRONYM = "acronym";
+ static final String ADDRESS = "address";
+ static final String APPLET = "applet";
+ static final String AREA = "area";
+ static final String B = "b";
+ static final String BASE = "base";
+ static final String BASEFONT = "basefont";
+ static final String BDO = "bdo";
+ static final String BIG = "big";
+ static final String BLOCKQUOTE = "blockquote";
+ static final String BODY = "body";
+ static final String BR = "br";
+ static final String BUTTON = "button";
+ static final String CAPTION = "caption";
+ static final String CENTER = "center";
+ static final String CITE = "cite";
+ static final String CODE = "code";
+ static final String COL = "col";
+ static final String COLGROUP = "colgroup";
+ static final String DEFAULTS = "default";
+ static final String DD = "dd";
+ static final String DEL = "del";
+ static final String DFN = "dfn";
+ static final String DIR = "dir";
+ static final String DIV = "div";
+ static final String DL = "dl";
+ static final String DT = "dt";
+ static final String EM = "em";
+ static final String FIELDSET = "fieldset";
+ static final String FONT = "font";
+ static final String FORM = "form";
+ static final String FRAME = "frame";
+ static final String FRAMESET = "frameset";
+ static final String H1 = "h1";
+ static final String H2 = "h2";
+ static final String H3 = "h3";
+ static final String H4 = "h4";
+ static final String H5 = "h5";
+ static final String H6 = "h6";
+ static final String HEAD = "head";
+ static final String HR = "hr";
+ static final String HTML = "html";
+ static final String I = "i";
+ static final String IFRAME = "iframe";
+ static final String IMG = "img";
+ static final String INPUT = "input";
+ static final String INS = "ins";
+ static final String ISINDEX = "isindex";
+ static final String KBD = "kbd";
+ static final String LABEL = "label";
+ static final String LEGEND = "legend";
+ static final String LI = "li";
+ static final String LINK = "link";
+ static final String MAP = "map";
+ static final String MENU = "menu";
+ static final String META = "meta";
+ static final String NOFRAMES = "noframes";
+ static final String NOSCRIPT = "noscript";
+ static final String NONES = "none";
+ static final String sNAME = "name";
+ static final String OBJECT = "object";
+ static final String OL = "ol";
+ static final String OPTGROUP = "optgroup";
+ static final String OPTION = "option";
+ static final String P = "p";
+ static final String PARAM = "param";
+ static final String PRE = "pre";
+ static final String Q = "q";
+ static final String S = "s";
+ static final String SAMP = "samp";
+ static final String SCRIPT = "script";
+ static final String SELECT = "select";
+ static final String SMALL = "small";
+ static final String SPAN = "span";
+ static final String STRIKE = "strike";
+ static final String STRONG = "strong";
+ static final String STYLE = "style";
+ static final String SUB = "sub";
+ static final String SUP = "sup";
+ static final String TABLE = "table";
+ static final String TBODY = "tbody";
+ static final String TD = "td";
+ static final String TEXTAREA = "textarea";
+ static final String TFOOT = "tfoot";
+ static final String TH = "th";
+ static final String THEAD = "thead";
+ static final String TITLE = "title";
+ static final String TR = "tr";
+ static final String TT = "tt";
+ static final String U = "u";
+ static final String UL = "ul";
+ static final String VAR = "var";
+
+ /* Define the attribute constants. */
+ static final String C_0 = "0";
+ static final String C_1 = "1";
+ static final String CHECKBOX = "checkbox";
+ static final String DATA = "data";
+ static final String FILE = "file";
+ static final String GET = "get";
+ static final String HIDDEN = "hidden";
+ static final String IMAGE = "image";
+ static final String PASSWORD = "password";
+ static final String POST = "post";
+ static final String RADIO = "radio";
+ static final String REF = "ref";
+ static final String RESET = "reset";
+ static final String SUBMIT = "submit";
+ static final String TEXT = "text";
+ static final String ABOVE = "above";
+ static final String ACCEPT = "accept";
+ static final String ACCEPTCHARSET = "accept-charset";
+ static final String ACCESSKEY = "accesskey";
+ static final String ACTION = "action";
+ static final String ALIGN = "align";
+ static final String ALINK = "alink";
+ static final String ALL = "all";
+ static final String ALT = "alt";
+ static final String APPLICATION_X_WWW_FORM_URLENCODED
+ = "application/x-www-form-urlencoded";
+ static final String ARCHIVE = "archive";
+ static final String AUTO = "auto";
+ static final String AXIS = "axis";
+ static final String BACKGROUND = "background";
+ static final String BASELINE = "baseline";
+ static final String BELOW = "below";
+ static final String BGCOLOR = "bgcolor";
+ static final String BORDER = "border";
+ static final String BOTTOM = "bottom";
+ static final String BOX = "box";
+ static final String CELLPADDING = "cellpadding";
+ static final String CELLSPACING = "cellspacing";
+ static final String CHAR = "char";
+ static final String CHAROFF = "charoff";
+ static final String CHARSET = "charset";
+ static final String CHECKED = "checked";
+ static final String CIRCLE = "circle";
+ static final String CLASS = "class";
+ static final String CLASSID = "classid";
+ static final String CLEAR = "clear";
+ static final String CODEBASE = "codebase";
+ static final String CODETYPE = "codetype";
+ static final String COLOR = "color";
+ static final String COLS = "cols";
+ static final String COLSPAN = "colspan";
+ static final String COMPACT = "compact";
+ static final String CONTENT = "content";
+ static final String COORDS = "coords";
+ static final String DATAPAGESIZE = "datapagesize";
+ static final String DATETIME = "datetime";
+ static final String DECLARE = "declare";
+ static final String DEFER = "defer";
+ static final String DISABLED = "disabled";
+ static final String DISC = "disc";
+ static final String ENCTYPE = "enctype";
+ static final String EVENT = "event";
+ static final String FACE = "face";
+ static final String FOR = "for";
+ static final String FRAMEBORDER = "frameborder";
+ static final String GROUPS = "groups";
+ static final String HEADERS = "headers";
+ static final String HEIGHT = "height";
+ static final String HREF = "href";
+ static final String HREFLANG = "hreflang";
+ static final String HSIDES = "hsides";
+ static final String HSPACE = "hspace";
+ static final String HTTPEQUIV = "http-equiv";
+ static final String sID = "id";
+ static final String ISMAP = "ismap";
+ static final String JUSTIFY = "justify";
+ static final String LANG = "lang";
+ static final String LANGUAGE = "language";
+ static final String LEFT = "left";
+ static final String LHS = "lhs";
+ static final String LONGDESC = "longdesc";
+ static final String LTR = "ltr";
+ static final String MARGINHEIGHT = "marginheight";
+ static final String MARGINWIDTH = "marginwidth";
+ static final String MAXLENGTH = "maxlength";
+ static final String MEDIA = "media";
+ static final String METHOD = "method";
+ static final String MIDDLE = "middle";
+ static final String MULTIPLE = "multiple";
+ static final String NO = "no";
+ static final String NOHREF = "nohref";
+ static final String NORESIZE = "noresize";
+ static final String NOSHADE = "noshade";
+ static final String NOWRAP = "nowrap";
+ static final String ONBLUR = "onblur";
+ static final String ONCHANGE = "onchange";
+ static final String ONCLICK = "onclick";
+ static final String ONDBLCLICK = "ondblclick";
+ static final String ONFOCUS = "onfocus";
+ static final String ONKEYDOWN = "onkeydown";
+ static final String ONKEYPRESS = "onkeypress";
+ static final String ONKEYUP = "onkeyup";
+ static final String ONLOAD = "onload";
+ static final String ONMOUSEDOWN = "onmousedown";
+ static final String ONMOUSEMOVE = "onmousemove";
+ static final String ONMOUSEOUT = "onmouseout";
+ static final String ONMOUSEOVER = "onmouseover";
+ static final String ONMOUSEUP = "onmouseup";
+ static final String ONRESET = "onreset";
+ static final String ONSELECT = "onselect";
+ static final String ONSUBMIT = "onsubmit";
+ static final String ONUNLOAD = "onunload";
+ static final String POLY = "poly";
+ static final String PROFILE = "profile";
+ static final String PROMPT = "prompt";
+ static final String READONLY = "readonly";
+ static final String RECT = "rect";
+ static final String REL = "rel";
+ static final String REV = "rev";
+ static final String RHS = "rhs";
+ static final String RIGHT = "right";
+ static final String ROW = "row";
+ static final String ROWGROUP = "rowgroup";
+ static final String ROWS = "rows";
+ static final String ROWSPAN = "rowspan";
+ static final String RTL = "rtl";
+ static final String RULES = "rules";
+ static final String SCHEME = "scheme";
+ static final String SCOPE = "scope";
+ static final String SCROLLING = "scrolling";
+ static final String SELECTED = "selected";
+ static final String SHAPE = "shape";
+ static final String SIZE = "size";
+ static final String SQUARE = "square";
+ static final String SRC = "src";
+ static final String STANDBY = "standby";
+ static final String START = "start";
+ static final String SUMMARY = "summary";
+ static final String TABINDEX = "tabindex";
+ static final String TARGET = "target";
+ static final String TOP = "top";
+ static final String TYPE = "type";
+ static final String USEMAP = "usemap";
+ static final String VALIGN = "valign";
+ static final String VALUE = "value";
+ static final String VALUETYPE = "valuetype";
+ static final String VERSION = "version";
+ static final String VLINK = "vlink";
+ static final String VOID = "void";
+ static final String VSIDES = "vsides";
+ static final String VSPACE = "vspace";
+ static final String WIDTH = "width";
+ static final String YES = "yes";
+
+ static final String[] BLOCK =
+ new String[] {
+ ADDRESS, BLOCKQUOTE, CENTER, DIR,
+ DIV, DL, FIELDSET, FORM,
+ H1, H2, H3, H4, H5, H6,
+ HR, ISINDEX, MENU, NOFRAMES, NOSCRIPT,
+ OL, P, PRE, TABLE, UL
+ };
+
+ /**
+ * Creates this DTD, filling in the entities and attributes data
+ * as defined in -//W3C//DTD HTML 4.01 Frameset//EN.
+ */
+ protected HTML_401F()
+ {
+ super(DTD_NAME);
+ defineEntities();
+ defineElements();
+ }
+
+ /**
+ * Either takes the document (by name) from DTD table, or
+ * creates a new instance and registers it in the tabe.
+ * The document is registerd under name "-//W3C//DTD HTML 4.01 Frameset//EN".
+ * @return The new or existing DTD for parsing HTML 4.01 Frameset.
+ */
+ public static DTD getInstance()
+ {
+ try
+ {
+ DTD dtd = getDTD(DTD_NAME);
+ if (dtd == null || dtd.getClass().equals(DTD.class))
+ {
+ dtd = new HTML_401F();
+ putDTDHash(DTD_NAME, dtd);
+ }
+ return dtd;
+ }
+ catch (IOException ex)
+ {
+ throw new Error("This should never happen. Report the bug.", ex);
+ }
+ }
+
+ /**
+ * Define all elements of this DTD.
+ */
+ protected void defineElements()
+ {
+ /* Define the elements. This used to be one huge method, which
+ unfortunately took too long to compile and consumed
+ too much memory while compiling it. While it can serve as
+ a good stress test for gcj, it is better to split it up
+ to save time and memory used during GCC bootstrap. */
+ defineElements1();
+ defineElements2();
+ defineElements3();
+ defineElements4();
+ defineElements5();
+ defineElements6();
+ }
+
+ /**
+ * Define first sixth of elements of this DTD.
+ */
+ private void defineElements1()
+ {
+ /* Define the elements. */
+ defElement(PCDATA, 0, false, false, null, NONE, NONE,
+ new AttributeList[ 0 ]);
+
+ defElement(A, 0, false, false, null,
+ new String[] {
+ A
+ }
+ ,
+ new String[] {
+ PCDATA, ABBR, ACRONYM, APPLET,
+ B, BASEFONT, BDO, BIG, BR,
+ BUTTON, CITE, CODE, DFN, EM,
+ FONT, I, IFRAME, IMG, INPUT,
+ KBD, LABEL, MAP, OBJECT, Q,
+ S, SAMP, SCRIPT, SELECT, SMALL,
+ SPAN, STRIKE, STRONG, SUB, SUP,
+ TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(CHARSET, null, null, 0, IMPLIED),
+ attr(TYPE, null, null, 0, IMPLIED),
+ attr(sNAME, null, null, 0, IMPLIED),
+ attr(HREF, null, null, 0, IMPLIED),
+ attr(HREFLANG, null, null, 0, IMPLIED),
+ attr(TARGET, null, null, 0, IMPLIED),
+ attr(REL, null, null, 0, IMPLIED),
+ attr(REV, null, null, 0, IMPLIED),
+ attr(ACCESSKEY, null, null, 0, IMPLIED),
+ attr(SHAPE, RECT, new String[] { RECT, CIRCLE, POLY, DEFAULTS },
+ 0, DEFAULT),
+ attr(COORDS, null, null, 0, IMPLIED),
+ attr(TABINDEX, null, null, NUMBER, IMPLIED),
+ attr(ONFOCUS, null, null, 0, IMPLIED),
+ attr(ONBLUR, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(ABBR, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(ACRONYM, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(ADDRESS, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR,
+ P
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(APPLET, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR,
+ ADDRESS, BLOCKQUOTE, CENTER, DIR, DIV,
+ DL, FIELDSET, FORM, H1, H2,
+ H3, H4, H5, H6, HR,
+ ISINDEX, MENU, NOFRAMES, NOSCRIPT, OL,
+ P, PRE, TABLE, UL, PARAM
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(CODEBASE, null, null, 0, IMPLIED),
+ attr(ARCHIVE, null, null, 0, IMPLIED),
+ attr(CODE, null, null, 0, IMPLIED),
+ attr(OBJECT, null, null, 0, IMPLIED),
+ attr(ALT, null, null, 0, IMPLIED),
+ attr(sNAME, null, null, 0, IMPLIED),
+ attr(WIDTH, null, null, 0, REQUIRED),
+ attr(HEIGHT, null, null, 0, REQUIRED),
+ attr(ALIGN, null, new String[] { TOP, MIDDLE, BOTTOM, LEFT, RIGHT },
+ 0, IMPLIED),
+ attr(HSPACE, null, null, 0, IMPLIED),
+ attr(VSPACE, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(AREA, EMPTY, false, true, null,
+ NONE
+ ,
+ NONE
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(SHAPE, RECT, new String[] { RECT, CIRCLE, POLY, DEFAULTS },
+ 0, DEFAULT),
+ attr(COORDS, null, null, 0, IMPLIED),
+ attr(HREF, null, null, 0, IMPLIED),
+ attr(TARGET, null, null, 0, IMPLIED),
+ attr(NOHREF, null, new String[] { NOHREF }, 0, IMPLIED),
+ attr(ALT, null, null, 0, REQUIRED),
+ attr(TABINDEX, null, null, NUMBER, IMPLIED),
+ attr(ACCESSKEY, null, null, 0, IMPLIED),
+ attr(ONFOCUS, null, null, 0, IMPLIED),
+ attr(ONBLUR, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(B, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(BASE, EMPTY, false, true, null,
+ NONE
+ ,
+ NONE
+ ,
+ new AttributeList[] {
+ attr(HREF, null, null, 0, IMPLIED),
+ attr(TARGET, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(BASEFONT, EMPTY, false, true, null,
+ NONE
+ ,
+ NONE
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(SIZE, null, null, 0, REQUIRED),
+ attr(COLOR, null, null, 0, IMPLIED),
+ attr(FACE, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(BDO, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, REQUIRED)
+ }
+ );
+ defElement(BIG, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(BLOCKQUOTE, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR,
+ ADDRESS, BLOCKQUOTE, CENTER, DIR, DIV,
+ DL, FIELDSET, FORM, H1, H2,
+ H3, H4, H5, H6, HR,
+ ISINDEX, MENU, NOFRAMES, NOSCRIPT, OL,
+ P, PRE, TABLE, UL
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(CITE, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(BODY, 0, true, true, null,
+ NONE
+ ,
+ getBodyElements()
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(ONLOAD, null, null, 0, IMPLIED),
+ attr(ONUNLOAD, null, null, 0, IMPLIED),
+ attr(BACKGROUND, null, null, 0, IMPLIED),
+ attr(BGCOLOR, null, null, 0, IMPLIED),
+ attr(TEXT, null, null, 0, IMPLIED),
+ attr(LINK, null, null, 0, IMPLIED),
+ attr(VLINK, null, null, 0, IMPLIED),
+ attr(ALINK, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(BR, EMPTY, false, true, null,
+ NONE
+ ,
+ NONE
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(CLEAR, "NONE", new String[] { LEFT, ALL, RIGHT, NONES },
+ 0, DEFAULT)
+ }
+ );
+ defElement(BUTTON, 0, false, false, null,
+ new String[] {
+ A, BUTTON, IFRAME, INPUT,
+ LABEL, SELECT, TEXTAREA, FIELDSET, FORM,
+ ISINDEX
+ }
+ ,
+ new String[] {
+ PCDATA, ABBR, ACRONYM, APPLET,
+ B, BASEFONT, BDO, BIG, BR,
+ CITE, CODE, DFN, EM, FONT,
+ I, IMG, KBD, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SMALL,
+ SPAN, STRIKE, STRONG, SUB, SUP,
+ TT, U, VAR, ADDRESS, BLOCKQUOTE,
+ CENTER, DIR, DIV, DL, H1,
+ H2, H3, H4, H5, H6,
+ HR, MENU, NOFRAMES, NOSCRIPT, OL,
+ P, PRE, TABLE, UL
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(sNAME, null, null, 0, IMPLIED),
+ attr(VALUE, null, null, 0, IMPLIED),
+ attr(TYPE, SUBMIT, new String[] { BUTTON, SUBMIT, RESET }, 0, DEFAULT),
+ attr(DISABLED, null, new String[] { DISABLED }, 0, IMPLIED),
+ attr(TABINDEX, null, null, NUMBER, IMPLIED),
+ attr(ACCESSKEY, null, null, 0, IMPLIED),
+ attr(ONFOCUS, null, null, 0, IMPLIED),
+ attr(ONBLUR, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(CAPTION, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(ALIGN, null, new String[] { TOP, BOTTOM, LEFT, RIGHT },
+ 0, IMPLIED)
+ }
+ );
+
+ }
+
+ /**
+ * Define second sixth of elements of this DTD.
+ */
+ private void defineElements2()
+ {
+ /* Define the elements. */
+ defElement(CENTER, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR,
+ ADDRESS, BLOCKQUOTE, CENTER, DIR, DIV,
+ DL, FIELDSET, FORM, H1, H2,
+ H3, H4, H5, H6, HR,
+ ISINDEX, MENU, NOFRAMES, NOSCRIPT, OL,
+ P, PRE, TABLE, UL
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(CITE, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(CODE, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(COL, EMPTY, false, true, null,
+ NONE
+ ,
+ NONE
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(SPAN, C_1, null, NUMBER, DEFAULT),
+ attr(WIDTH, null, null, 0, IMPLIED),
+ attr(ALIGN, null, new String[] { LEFT, CENTER, RIGHT, JUSTIFY, CHAR },
+ 0, IMPLIED),
+ attr(CHAR, null, null, 0, IMPLIED),
+ attr(CHAROFF, null, null, 0, IMPLIED),
+ attr(VALIGN, null, new String[] { TOP, MIDDLE, BOTTOM, BASELINE },
+ 0, IMPLIED)
+ }
+ );
+ defElement(COLGROUP, 0, false, true, null,
+ NONE
+ ,
+ new String[] {
+ COL
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(SPAN, C_1, null, NUMBER, DEFAULT),
+ attr(WIDTH, null, null, 0, IMPLIED),
+ attr(ALIGN, null, new String[] { LEFT, CENTER, RIGHT, JUSTIFY, CHAR },
+ 0, IMPLIED),
+ attr(CHAR, null, null, 0, IMPLIED),
+ attr(CHAROFF, null, null, 0, IMPLIED),
+ attr(VALIGN, null, new String[] { TOP, MIDDLE, BOTTOM, BASELINE },
+ 0, IMPLIED)
+ }
+ );
+ defElement(DD, 0, false, true, new ContentModel(0,
+ new noTagModel( new String[] { DD, DT } ), null ),
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR,
+ ADDRESS, BLOCKQUOTE, CENTER, DIR, DIV,
+ DL, FIELDSET, FORM, H1, H2,
+ H3, H4, H5, H6, HR,
+ ISINDEX, MENU, NOFRAMES, NOSCRIPT, OL,
+ P, PRE, TABLE, UL
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(DEL, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR,
+ ADDRESS, BLOCKQUOTE, CENTER, DIR, DIV,
+ DL, FIELDSET, FORM, H1, H2,
+ H3, H4, H5, H6, HR,
+ ISINDEX, MENU, NOFRAMES, NOSCRIPT, OL,
+ P, PRE, TABLE, UL
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(CITE, null, null, 0, IMPLIED),
+ attr(DATETIME, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(DFN, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(DIR, 0, false, false, createListModel(),
+ new String[] {
+ ADDRESS, BLOCKQUOTE, CENTER, DIR,
+ DIV, DL, FIELDSET, FORM, H1,
+ H2, H3, H4, H5, H6,
+ HR, ISINDEX, MENU, NOFRAMES, NOSCRIPT,
+ OL, P, PRE, TABLE, UL
+ }
+ ,
+ new String[] {
+ LI, UL, OL
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(COMPACT, null, new String[] { COMPACT }, 0, IMPLIED)
+ }
+ );
+ defElement(DIV, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR,
+ ADDRESS, BLOCKQUOTE, CENTER, DIR, DIV,
+ DL, FIELDSET, FORM, H1, H2,
+ H3, H4, H5, H6, HR,
+ ISINDEX, MENU, NOFRAMES, NOSCRIPT, OL,
+ P, PRE, TABLE, UL
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(ALIGN, null, new String[] { LEFT, CENTER, RIGHT, JUSTIFY },
+ 0, IMPLIED)
+ }
+ );
+ defElement(DL, 0, false, false, createDefListModel(),
+ NONE
+ ,
+ new String[] {
+ DD, DT
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(COMPACT, null, new String[] { COMPACT }, 0, IMPLIED)
+ }
+ );
+ defElement(DT, 0, false, true,
+ new ContentModel(0,
+ new noTagModel( new String[] { DT, DD } ), null),
+ BLOCK
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(EM, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(FIELDSET, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR,
+ ADDRESS, BLOCKQUOTE, CENTER, DIR, DIV,
+ DL, FIELDSET, FORM, H1, H2,
+ H3, H4, H5, H6, HR,
+ ISINDEX, MENU, NOFRAMES, NOSCRIPT, OL,
+ P, PRE, TABLE, UL, LEGEND
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED)
+ }
+ );
+
+ }
+
+ /**
+ * Define third sixth of elements of this DTD.
+ */
+ private void defineElements3()
+ {
+ /* Define the elements. */
+ defElement(FONT, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(SIZE, null, null, 0, IMPLIED),
+ attr(COLOR, null, null, 0, IMPLIED),
+ attr(FACE, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(FORM, 0, false, false, null,
+ new String[] {
+ FORM
+ }
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR,
+ ADDRESS, BLOCKQUOTE, CENTER, DIR, DIV,
+ DL, FIELDSET, H1, H2, H3,
+ H4, H5, H6, HR, ISINDEX,
+ MENU, NOFRAMES, NOSCRIPT, OL, P,
+ PRE, TABLE, UL
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(ACTION, null, null, 0, REQUIRED),
+ attr(METHOD, GET, new String[] { GET, POST }, 0, DEFAULT),
+ attr(ENCTYPE, APPLICATION_X_WWW_FORM_URLENCODED, null, 0, DEFAULT),
+ attr(ACCEPT, null, null, 0, IMPLIED),
+ attr(sNAME, null, null, 0, IMPLIED),
+ attr(ONSUBMIT, null, null, 0, IMPLIED),
+ attr(ONRESET, null, null, 0, IMPLIED),
+ attr(TARGET, null, null, 0, IMPLIED),
+ attr(ACCEPTCHARSET, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(FRAME, EMPTY, false, true, null,
+ NONE
+ ,
+ NONE
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LONGDESC, null, null, 0, IMPLIED),
+ attr(sNAME, null, null, 0, IMPLIED),
+ attr(SRC, null, null, 0, IMPLIED),
+ attr(FRAMEBORDER, C_1, new String[] { C_1, C_0 }, 0, DEFAULT),
+ attr(MARGINWIDTH, null, null, PIXELS, IMPLIED),
+ attr(MARGINHEIGHT, null, null, PIXELS, IMPLIED),
+ attr(NORESIZE, null, new String[] { NORESIZE }, 0, IMPLIED),
+ attr(SCROLLING, AUTO, new String[] { YES, NO, AUTO }, 0, DEFAULT)
+ }
+ );
+ defElement(FRAMESET, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ NOFRAMES, FRAME, FRAMESET
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(ROWS, null, null, 0, IMPLIED),
+ attr(COLS, null, null, 0, IMPLIED),
+ attr(ONLOAD, null, null, 0, IMPLIED),
+ attr(ONUNLOAD, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(H1, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(ALIGN, null, new String[] { LEFT, CENTER, RIGHT, JUSTIFY },
+ 0, IMPLIED)
+ }
+ );
+ defElement(H2, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(ALIGN, null, new String[] { LEFT, CENTER, RIGHT, JUSTIFY },
+ 0, IMPLIED)
+ }
+ );
+ defElement(H3, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(ALIGN, null, new String[] { LEFT, CENTER, RIGHT, JUSTIFY },
+ 0, IMPLIED)
+ }
+ );
+ defElement(H4, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(ALIGN, null, new String[] { LEFT, CENTER, RIGHT, JUSTIFY },
+ 0, IMPLIED)
+ }
+ );
+ defElement(H5, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(ALIGN, null, new String[] { LEFT, CENTER, RIGHT, JUSTIFY },
+ 0, IMPLIED)
+ }
+ );
+ defElement(H6, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(ALIGN, null, new String[] { LEFT, CENTER, RIGHT, JUSTIFY },
+ 0, IMPLIED)
+ }
+ );
+ defElement(HEAD, 0, true, true, null,
+ new String[] {
+ BODY
+ }
+ ,
+ new String[] {
+ TITLE, ISINDEX, BASE,
+ SCRIPT, STYLE, META, LINK, OBJECT
+ }
+ ,
+ new AttributeList[] {
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(PROFILE, null, null, 0, IMPLIED)
+ }
+ );
+
+ defElement(HR, EMPTY, false, true, null,
+ NONE
+ ,
+ NONE
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(ALIGN, null, new String[] { LEFT, CENTER, RIGHT }, 0, IMPLIED),
+ attr(NOSHADE, null, new String[] { NOSHADE }, 0, IMPLIED),
+ attr(SIZE, null, null, 0, IMPLIED),
+ attr(WIDTH, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(HTML, 0, true, true, createHtmlContentModel(),
+ NONE
+ ,
+ new String[] {
+ HEAD, BODY
+ }
+ ,
+ new AttributeList[] {
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(VERSION, DTD_NAME, null, 0, FIXED)
+ }
+ );
+ defElement(I, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(IFRAME, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR,
+ ADDRESS, BLOCKQUOTE, CENTER, DIR, DIV,
+ DL, FIELDSET, FORM, H1, H2,
+ H3, H4, H5, H6, HR,
+ ISINDEX, MENU, NOFRAMES, NOSCRIPT, OL,
+ P, PRE, TABLE, UL
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LONGDESC, null, null, 0, IMPLIED),
+ attr(sNAME, null, null, 0, IMPLIED),
+ attr(SRC, null, null, 0, IMPLIED),
+ attr(FRAMEBORDER, C_1, new String[] { C_1, C_0 }, 0, DEFAULT),
+ attr(MARGINWIDTH, null, null, PIXELS, IMPLIED),
+ attr(MARGINHEIGHT, null, null, PIXELS, IMPLIED),
+ attr(SCROLLING, AUTO, new String[] { YES, NO, AUTO }, 0, DEFAULT),
+ attr(ALIGN, null, new String[] { TOP, MIDDLE, BOTTOM, LEFT, RIGHT },
+ 0, IMPLIED),
+ attr(HEIGHT, null, null, 0, IMPLIED),
+ attr(WIDTH, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(IMG, EMPTY, false, true, null,
+ NONE
+ ,
+ NONE
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(SRC, null, null, 0, REQUIRED),
+ attr(ALT, null, null, 0, REQUIRED),
+ attr(LONGDESC, null, null, 0, IMPLIED),
+ attr(sNAME, null, null, 0, IMPLIED),
+ attr(HEIGHT, null, null, 0, IMPLIED),
+ attr(WIDTH, null, null, 0, IMPLIED),
+ attr(USEMAP, null, null, 0, IMPLIED),
+ attr(ISMAP, null, new String[] { ISMAP }, 0, IMPLIED),
+ attr(ALIGN, null, new String[] { TOP, MIDDLE, BOTTOM, LEFT, RIGHT },
+ 0, IMPLIED),
+ attr(BORDER, null, null, PIXELS, IMPLIED),
+ attr(HSPACE, null, null, 0, IMPLIED),
+ attr(VSPACE, null, null, 0, IMPLIED)
+ }
+ );
+
+ }
+
+ /**
+ * Define fourth sixth of elements of this DTD.
+ */
+ private void defineElements4()
+ {
+ /* Define the elements. */
+ defElement(INPUT, EMPTY, false, true, null,
+ NONE
+ ,
+ NONE
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(TYPE, TEXT, new String[] { TEXT, PASSWORD, CHECKBOX, RADIO,
+ SUBMIT, RESET, FILE, HIDDEN, IMAGE, BUTTON }, 0, DEFAULT),
+ attr(sNAME, null, null, 0, IMPLIED),
+ attr(VALUE, null, null, 0, IMPLIED),
+ attr(CHECKED, null, new String[] { CHECKED }, 0, IMPLIED),
+ attr(DISABLED, null, new String[] { DISABLED }, 0, IMPLIED),
+ attr(READONLY, null, new String[] { READONLY }, 0, IMPLIED),
+ attr(SIZE, null, null, 0, IMPLIED),
+ attr(MAXLENGTH, null, null, 0, IMPLIED),
+ attr(SRC, null, null, 0, IMPLIED),
+ attr(ALT, null, null, 0, IMPLIED),
+ attr(USEMAP, null, null, 0, IMPLIED),
+ attr(ISMAP, null, new String[] { ISMAP }, 0, IMPLIED),
+ attr(TABINDEX, null, null, NUMBER, IMPLIED),
+ attr(ACCESSKEY, null, null, 0, IMPLIED),
+ attr(ONFOCUS, null, null, 0, IMPLIED),
+ attr(ONBLUR, null, null, 0, IMPLIED),
+ attr(ONSELECT, null, null, 0, IMPLIED),
+ attr(ONCHANGE, null, null, 0, IMPLIED),
+ attr(ACCEPT, null, null, 0, IMPLIED),
+ attr(ALIGN, null, new String[] { TOP, MIDDLE, BOTTOM, LEFT, RIGHT },
+ 0, IMPLIED)
+ }
+ );
+ defElement(INS, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR,
+ ADDRESS, BLOCKQUOTE, CENTER, DIR, DIV,
+ DL, FIELDSET, FORM, H1, H2,
+ H3, H4, H5, H6, HR,
+ ISINDEX, MENU, NOFRAMES, NOSCRIPT, OL,
+ P, PRE, TABLE, UL
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(CITE, null, null, 0, IMPLIED),
+ attr(DATETIME, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(ISINDEX, EMPTY, false, true, null,
+ NONE
+ ,
+ NONE
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(PROMPT, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(KBD, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(LABEL, 0, false, false, null,
+ new String[] {
+ LABEL
+ }
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, MAP, OBJECT, Q,
+ S, SAMP, SCRIPT, SELECT, SMALL,
+ SPAN, STRIKE, STRONG, SUB, SUP,
+ TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(FOR, null, null, 0, IMPLIED),
+ attr(ACCESSKEY, null, null, 0, IMPLIED),
+ attr(ONFOCUS, null, null, 0, IMPLIED),
+ attr(ONBLUR, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(LEGEND, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(ACCESSKEY, null, null, 0, IMPLIED),
+ attr(ALIGN, null, new String[] { TOP, BOTTOM, LEFT, RIGHT },
+ 0, IMPLIED)
+ }
+ );
+ // LI has a special content model that will be resolved into
+ // by transformer.
+ defElement(LI, 0, false, true,
+ new ContentModel(0,
+ new noTagModel(LI), null),
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR,
+ ADDRESS, BLOCKQUOTE, CENTER, DIR, DIV,
+ DL, FIELDSET, FORM, H1, H2,
+ H3, H4, H5, H6, HR,
+ ISINDEX, MENU, NOFRAMES, NOSCRIPT, OL,
+ P, PRE, TABLE, UL
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(TYPE, null, null, 0, IMPLIED),
+ attr(VALUE, null, null, NUMBER, IMPLIED)
+ }
+ );
+ defElement(LINK, EMPTY, false, true, null,
+ NONE
+ ,
+ NONE
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(CHARSET, null, null, 0, IMPLIED),
+ attr(HREF, null, null, 0, IMPLIED),
+ attr(HREFLANG, null, null, 0, IMPLIED),
+ attr(TYPE, null, null, 0, IMPLIED),
+ attr(REL, null, null, 0, IMPLIED),
+ attr(REV, null, null, 0, IMPLIED),
+ attr(MEDIA, null, null, 0, IMPLIED),
+ attr(TARGET, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(MAP, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ ADDRESS, BLOCKQUOTE, CENTER, DIR,
+ DIV, DL, FIELDSET, FORM, H1,
+ H2, H3, H4, H5, H6,
+ HR, ISINDEX, MENU, NOFRAMES, NOSCRIPT,
+ OL, P, PRE, TABLE, UL,
+ AREA
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(sNAME, null, null, 0, REQUIRED)
+ }
+ );
+ defElement(MENU, 0, false, false, createListModel(),
+ new String[] {
+ ADDRESS, BLOCKQUOTE, CENTER, DIR,
+ DIV, DL, FIELDSET, FORM, H1,
+ H2, H3, H4, H5, H6,
+ HR, ISINDEX, MENU, NOFRAMES, NOSCRIPT,
+ OL, P, PRE, TABLE, UL
+ }
+ ,
+ new String[] {
+ LI, UL, OL
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(COMPACT, null, new String[] { COMPACT }, 0, IMPLIED)
+ }
+ );
+ defElement(META, EMPTY, false, true, null,
+ NONE
+ ,
+ NONE
+ ,
+ new AttributeList[] {
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(HTTPEQUIV, null, null, 0, IMPLIED),
+ attr(sNAME, null, null, NAME, IMPLIED),
+ attr(CONTENT, null, null, 0, REQUIRED),
+ attr(SCHEME, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(NOFRAMES, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR,
+ ADDRESS, BLOCKQUOTE, CENTER, DIR, DIV,
+ DL, FIELDSET, FORM, H1, H2,
+ H3, H4, H5, H6, HR,
+ ISINDEX, MENU, NOFRAMES, NOSCRIPT, OL,
+ P, PRE, TABLE, UL
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(NOSCRIPT, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR,
+ ADDRESS, BLOCKQUOTE, CENTER, DIR, DIV,
+ DL, FIELDSET, FORM, H1, H2,
+ H3, H4, H5, H6, HR,
+ ISINDEX, MENU, NOFRAMES, NOSCRIPT, OL,
+ P, PRE, TABLE, UL
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(OBJECT, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR,
+ ADDRESS, BLOCKQUOTE, CENTER, DIR, DIV,
+ DL, FIELDSET, FORM, H1, H2,
+ H3, H4, H5, H6, HR,
+ ISINDEX, MENU, NOFRAMES, NOSCRIPT, OL,
+ P, PRE, TABLE, UL, PARAM
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(DECLARE, null, new String[] { DECLARE }, 0, IMPLIED),
+ attr(CLASSID, null, null, 0, IMPLIED),
+ attr(CODEBASE, null, null, 0, IMPLIED),
+ attr(DATA, null, null, 0, IMPLIED),
+ attr(TYPE, null, null, 0, IMPLIED),
+ attr(CODETYPE, null, null, 0, IMPLIED),
+ attr(ARCHIVE, null, null, 0, IMPLIED),
+ attr(STANDBY, null, null, 0, IMPLIED),
+ attr(HEIGHT, null, null, 0, IMPLIED),
+ attr(WIDTH, null, null, 0, IMPLIED),
+ attr(USEMAP, null, null, 0, IMPLIED),
+ attr(sNAME, null, null, 0, IMPLIED),
+ attr(TABINDEX, null, null, NUMBER, IMPLIED),
+ attr(ALIGN, null, new String[] { TOP, MIDDLE, BOTTOM, LEFT, RIGHT },
+ 0, IMPLIED),
+ attr(BORDER, null, null, PIXELS, IMPLIED),
+ attr(HSPACE, null, null, 0, IMPLIED),
+ attr(VSPACE, null, null, 0, IMPLIED)
+ }
+ );
+
+ }
+
+ /**
+ * Define fifth sixth of elements of this DTD.
+ */
+ private void defineElements5()
+ {
+ /* Define the elements. */
+ defElement(OL, 0, false, false, createListModel(),
+ NONE
+ ,
+ new String[] {
+ // See note on the createListModel method
+ LI, UL, OL
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(TYPE, null, null, 0, IMPLIED),
+ attr(COMPACT, null, new String[] { COMPACT }, 0, IMPLIED),
+ attr(START, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(OPTGROUP, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ OPTION
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(DISABLED, null, new String[] { DISABLED }, 0, IMPLIED),
+ attr(LABEL, null, null, 0, REQUIRED)
+ }
+ );
+ defElement(OPTION, 0, false, true, new ContentModel(0,
+ new PCDATAonly_model(), null),
+ NONE,
+ new String[] {
+ PCDATA
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(SELECTED, null, new String[] { SELECTED }, 0, IMPLIED),
+ attr(DISABLED, null, new String[] { DISABLED }, 0, IMPLIED),
+ attr(LABEL, null, null, 0, IMPLIED),
+ attr(VALUE, null, null, 0, IMPLIED)
+ }
+ );
+
+ // Headers in the paragraph are not allowed.
+ defElement(P, 0, false, true, new ContentModel( 0,
+ new noTagModel(new String[] { P, H1, H2, H3, H4, H5, H6 }), null),
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(ALIGN, null, new String[] { LEFT, CENTER, RIGHT, JUSTIFY },
+ 0, IMPLIED)
+ }
+ );
+ defElement(PARAM, EMPTY, false, true, null,
+ NONE
+ ,
+ NONE
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(sNAME, null, null, 0, REQUIRED),
+ attr(VALUE, null, null, 0, IMPLIED),
+ attr(VALUETYPE, DATA, new String[] { DATA, REF, OBJECT }, 0, DEFAULT),
+ attr(TYPE, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(PRE, 0, false, false, null,
+ new String[] {
+ APPLET, BASEFONT, BIG, FONT,
+ IMG, OBJECT, SMALL, SUB, SUP
+ }
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ B, BDO, BR, BUTTON, CITE,
+ CODE, DFN, EM, I, IFRAME,
+ INPUT, KBD, LABEL, MAP, Q,
+ S, SAMP, SCRIPT, SELECT, SPAN,
+ STRIKE, STRONG, TEXTAREA, TT, U,
+ VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(WIDTH, null, null, NUMBER, IMPLIED)
+ }
+ );
+ defElement(Q, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(CITE, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(S, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(SAMP, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(SCRIPT, CDATA, false, false, null,
+ NONE
+ ,
+ NONE
+ ,
+ new AttributeList[] {
+ attr(CHARSET, null, null, 0, IMPLIED),
+ attr(TYPE, null, null, 0, REQUIRED),
+ attr(LANGUAGE, null, null, 0, IMPLIED),
+ attr(SRC, null, null, 0, IMPLIED),
+ attr(DEFER, null, new String[] { DEFER }, 0, IMPLIED),
+ attr(EVENT, null, null, 0, IMPLIED),
+ attr(FOR, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(SELECT, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ OPTGROUP, OPTION
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(sNAME, null, null, 0, IMPLIED),
+ attr(SIZE, null, null, NUMBER, IMPLIED),
+ attr(MULTIPLE, null, new String[] { MULTIPLE }, 0, IMPLIED),
+ attr(DISABLED, null, new String[] { DISABLED }, 0, IMPLIED),
+ attr(TABINDEX, null, null, NUMBER, IMPLIED),
+ attr(ONFOCUS, null, null, 0, IMPLIED),
+ attr(ONBLUR, null, null, 0, IMPLIED),
+ attr(ONCHANGE, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(SMALL, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(SPAN, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(STRIKE, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(STRONG, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(STYLE, CDATA, false, false, null,
+ NONE
+ ,
+ NONE
+ ,
+ new AttributeList[] {
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(TYPE, null, null, 0, REQUIRED),
+ attr(MEDIA, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(SUB, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED)
+ }
+ );
+
+ }
+
+ /**
+ * Define last sixth of elements of this DTD.
+ */
+ private void defineElements6()
+ {
+ /* Define the elements. */
+ defElement(SUP, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(TABLE, 0, false, false, createTableContentModel(),
+ NONE
+ ,
+ new String[] {
+ CAPTION, COL, COLGROUP, TBODY,
+ TFOOT, THEAD
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(SUMMARY, null, null, 0, IMPLIED),
+ attr(WIDTH, null, null, 0, IMPLIED),
+ attr(BORDER, null, null, PIXELS, IMPLIED),
+ attr(FRAME, null, new String[] { VOID, ABOVE, BELOW, HSIDES, LHS, RHS,
+ VSIDES, BOX, BORDER }, 0, IMPLIED),
+ attr(RULES, null, new String[] { NONES, GROUPS, ROWS, COLS, ALL },
+ 0, IMPLIED),
+ attr(CELLSPACING, null, null, 0, IMPLIED),
+ attr(CELLPADDING, null, null, 0, IMPLIED),
+ attr(ALIGN, null, new String[] { LEFT, CENTER, RIGHT }, 0, IMPLIED),
+ attr(BGCOLOR, null, null, 0, IMPLIED),
+ attr(DATAPAGESIZE, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(TBODY, 0, true, true, model(TR,'+'),
+ NONE
+ ,
+ new String[] {
+ TR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(ALIGN, null, new String[] { LEFT, CENTER, RIGHT, JUSTIFY, CHAR },
+ 0, IMPLIED),
+ attr(CHAR, null, null, 0, IMPLIED),
+ attr(CHAROFF, null, null, 0, IMPLIED),
+ attr(VALIGN, null, new String[] { TOP, MIDDLE, BOTTOM, BASELINE },
+ 0, IMPLIED)
+ }
+ );
+
+ defElement(TD, 0, false, true,
+ new ContentModel(0,
+ new noTagModel(new String[] {"TD", "TH", "TR" } ), null),
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR,
+ ADDRESS, BLOCKQUOTE, CENTER, DIR, DIV,
+ DL, FIELDSET, FORM, H1, H2,
+ H3, H4, H5, H6, HR,
+ ISINDEX, MENU, NOFRAMES, NOSCRIPT, OL,
+ P, PRE, TABLE, UL
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(ABBR, null, null, 0, IMPLIED),
+ attr(AXIS, null, null, 0, IMPLIED),
+ attr(HEADERS, null, null, 0, IMPLIED),
+ attr(SCOPE, null, new String[] { ROW, COL, ROWGROUP, COLGROUP },
+ 0, IMPLIED),
+ attr(ROWSPAN, C_1, null, NUMBER, DEFAULT),
+ attr(COLSPAN, C_1, null, NUMBER, DEFAULT),
+ attr(ALIGN, null, new String[] { LEFT, CENTER, RIGHT, JUSTIFY, CHAR },
+ 0, IMPLIED),
+ attr(CHAR, null, null, 0, IMPLIED),
+ attr(CHAROFF, null, null, 0, IMPLIED),
+ attr(VALIGN, null, new String[] { TOP, MIDDLE, BOTTOM, BASELINE },
+ 0, IMPLIED),
+ attr(NOWRAP, null, new String[] { NOWRAP }, 0, IMPLIED),
+ attr(BGCOLOR, null, null, 0, IMPLIED),
+ attr(WIDTH, null, null, 0, IMPLIED),
+ attr(HEIGHT, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(TEXTAREA, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(sNAME, null, null, 0, IMPLIED),
+ attr(ROWS, null, null, NUMBER, REQUIRED),
+ attr(COLS, null, null, NUMBER, REQUIRED),
+ attr(DISABLED, null, new String[] { DISABLED }, 0, IMPLIED),
+ attr(READONLY, null, new String[] { READONLY }, 0, IMPLIED),
+ attr(TABINDEX, null, null, NUMBER, IMPLIED),
+ attr(ACCESSKEY, null, null, 0, IMPLIED),
+ attr(ONFOCUS, null, null, 0, IMPLIED),
+ attr(ONBLUR, null, null, 0, IMPLIED),
+ attr(ONSELECT, null, null, 0, IMPLIED),
+ attr(ONCHANGE, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(TFOOT, 0, false, true, model(TR,'+'),
+ NONE
+ ,
+ new String[] {
+ TR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(ALIGN, null, new String[] { LEFT, CENTER, RIGHT, JUSTIFY, CHAR },
+ 0, IMPLIED),
+ attr(CHAR, null, null, 0, IMPLIED),
+ attr(CHAROFF, null, null, 0, IMPLIED),
+ attr(VALIGN, null, new String[] { TOP, MIDDLE, BOTTOM, BASELINE },
+ 0, IMPLIED)
+ }
+ );
+ defElement(TH, 0, false, true, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR,
+ ADDRESS, BLOCKQUOTE, CENTER, DIR, DIV,
+ DL, FIELDSET, FORM, H1, H2,
+ H3, H4, H5, H6, HR,
+ ISINDEX, MENU, NOFRAMES, NOSCRIPT, OL,
+ P, PRE, TABLE, UL
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(ABBR, null, null, 0, IMPLIED),
+ attr(AXIS, null, null, 0, IMPLIED),
+ attr(HEADERS, null, null, 0, IMPLIED),
+ attr(SCOPE, null, new String[] { ROW, COL, ROWGROUP, COLGROUP },
+ 0, IMPLIED),
+ attr(ROWSPAN, C_1, null, NUMBER, DEFAULT),
+ attr(COLSPAN, C_1, null, NUMBER, DEFAULT),
+ attr(ALIGN, null, new String[] { LEFT, CENTER, RIGHT, JUSTIFY, CHAR },
+ 0, IMPLIED),
+ attr(CHAR, null, null, 0, IMPLIED),
+ attr(CHAROFF, null, null, 0, IMPLIED),
+ attr(VALIGN, null, new String[] { TOP, MIDDLE, BOTTOM, BASELINE },
+ 0, IMPLIED),
+ attr(NOWRAP, null, new String[] { NOWRAP }, 0, IMPLIED),
+ attr(BGCOLOR, null, null, 0, IMPLIED),
+ attr(WIDTH, null, null, 0, IMPLIED),
+ attr(HEIGHT, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(THEAD, 0, false, true, model(TR,'+'),
+ NONE
+ ,
+ new String[] {
+ TR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(ALIGN, null, new String[] { LEFT, CENTER, RIGHT, JUSTIFY, CHAR },
+ 0, IMPLIED),
+ attr(CHAR, null, null, 0, IMPLIED),
+ attr(CHAROFF, null, null, 0, IMPLIED),
+ attr(VALIGN, null, new String[] { TOP, MIDDLE, BOTTOM, BASELINE },
+ 0, IMPLIED)
+ }
+ );
+ defElement(TITLE, 0, false, false, null,
+ new String[] {
+ OBJECT, SCRIPT, LINK, META,
+ STYLE
+ }
+ ,
+ new String[] {
+ PCDATA
+ }
+ ,
+ new AttributeList[] {
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED)
+ }
+ );
+ defElement(TR, 0, false, true,
+ new ContentModel(0, new TableRowContentModel(this), null),
+ NONE
+ ,
+ new String[] {
+ TD, TH
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(ALIGN, null, new String[] { LEFT, CENTER, RIGHT, JUSTIFY, CHAR },
+ 0, IMPLIED),
+ attr(CHAR, null, null, 0, IMPLIED),
+ attr(CHAROFF, null, null, 0, IMPLIED),
+ attr(VALIGN, null, new String[] { TOP, MIDDLE, BOTTOM, BASELINE },
+ 0, IMPLIED),
+ attr(BGCOLOR, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(TT, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(U, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED)
+ }
+ );
+ defElement(UL, 0, false, false, createListModel(),
+ NONE
+ ,
+ new String[] {
+ // See note on the createListModel method
+ LI, UL, OL
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED),
+ attr(TYPE, null, new String[] { DISC, SQUARE, CIRCLE }, 0, IMPLIED),
+ attr(COMPACT, null, new String[] { COMPACT }, 0, IMPLIED)
+ }
+ );
+ defElement(VAR, 0, false, false, null,
+ NONE
+ ,
+ new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR
+ }
+ ,
+ new AttributeList[] {
+ attr(sID, null, null, ID, IMPLIED),
+ attr(CLASS, null, null, 0, IMPLIED),
+ attr(STYLE, null, null, 0, IMPLIED),
+ attr(TITLE, null, null, 0, IMPLIED),
+ attr(LANG, null, null, 0, IMPLIED),
+ attr(DIR, null, new String[] { LTR, RTL }, 0, IMPLIED),
+ attr(ONCLICK, null, null, 0, IMPLIED),
+ attr(ONDBLCLICK, null, null, 0, IMPLIED),
+ attr(ONMOUSEDOWN, null, null, 0, IMPLIED),
+ attr(ONMOUSEUP, null, null, 0, IMPLIED),
+ attr(ONMOUSEOVER, null, null, 0, IMPLIED),
+ attr(ONMOUSEMOVE, null, null, 0, IMPLIED),
+ attr(ONMOUSEOUT, null, null, 0, IMPLIED),
+ attr(ONKEYPRESS, null, null, 0, IMPLIED),
+ attr(ONKEYDOWN, null, null, 0, IMPLIED),
+ attr(ONKEYUP, null, null, 0, IMPLIED)
+ }
+ );
+
+ }
+
+ /**
+ * Define all entities in this DTD.
+ */
+ protected void defineEntities()
+ {
+ /* Define general entities */
+ defineEntity("AElig", 198);
+ defineEntity("Aacute", 193);
+ defineEntity("Acirc", 194);
+ defineEntity("Agrave", 192);
+ defineEntity("Alpha", 913);
+ defineEntity("Aring", 197);
+ defineEntity("Atilde", 195);
+ defineEntity("Auml", 196);
+ defineEntity("Beta", 914);
+ defineEntity("Ccedil", 199);
+ defineEntity("Chi", 935);
+ defineEntity("Dagger", 8225);
+ defineEntity("Delta", 916);
+ defineEntity("ETH", 208);
+ defineEntity("Eacute", 201);
+ defineEntity("Ecirc", 202);
+ defineEntity("Egrave", 200);
+ defineEntity("Epsilon", 917);
+ defineEntity("Eta", 919);
+ defineEntity("Euml", 203);
+ defineEntity("Gamma", 915);
+ defineEntity("Iacute", 205);
+ defineEntity("Icirc", 206);
+ defineEntity("Igrave", 204);
+ defineEntity("Iota", 921);
+ defineEntity("Iuml", 207);
+ defineEntity("Kappa", 922);
+ defineEntity("Lambda", 923);
+ defineEntity("Mu", 924);
+ defineEntity("Ntilde", 209);
+ defineEntity("Nu", 925);
+ defineEntity("OElig", 338);
+ defineEntity("Oacute", 211);
+ defineEntity("Ocirc", 212);
+ defineEntity("Ograve", 210);
+ defineEntity("Omega", 937);
+ defineEntity("Omicron", 927);
+ defineEntity("Oslash", 216);
+ defineEntity("Otilde", 213);
+ defineEntity("Ouml", 214);
+ defineEntity("Phi", 934);
+ defineEntity("Pi", 928);
+ defineEntity("Prime", 8243);
+ defineEntity("Psi", 936);
+ defineEntity("Rho", 929);
+ defineEntity("Scaron", 352);
+ defineEntity("Sigma", 931);
+ defineEntity("THORN", 222);
+ defineEntity("Tau", 932);
+ defineEntity("Theta", 920);
+ defineEntity("Uacute", 218);
+ defineEntity("Ucirc", 219);
+ defineEntity("Ugrave", 217);
+ defineEntity("Upsilon", 933);
+ defineEntity("Uuml", 220);
+ defineEntity("Xi", 926);
+ defineEntity("Yacute", 221);
+ defineEntity("Yuml", 376);
+ defineEntity("Zeta", 918);
+ defineEntity("aacute", 225);
+ defineEntity("acirc", 226);
+ defineEntity("acute", 180);
+ defineEntity("aelig", 230);
+ defineEntity("agrave", 224);
+ defineEntity("alefsym", 8501);
+ defineEntity("alpha", 945);
+ defineEntity("amp", 38);
+ defineEntity("and", 8743);
+ defineEntity("ang", 8736);
+ defineEntity("aring", 229);
+ defineEntity("asymp", 8776);
+ defineEntity("atilde", 227);
+ defineEntity("auml", 228);
+ defineEntity("bdquo", 8222);
+ defineEntity("beta", 946);
+ defineEntity("brvbar", 166);
+ defineEntity("bull", 8226);
+ defineEntity("cap", 8745);
+ defineEntity("ccedil", 231);
+ defineEntity("cedil", 184);
+ defineEntity("cent", 162);
+ defineEntity("chi", 967);
+ defineEntity("circ", 710);
+ defineEntity("clubs", 9827);
+ defineEntity("cong", 8773);
+ defineEntity("copy", 169);
+ defineEntity("crarr", 8629);
+ defineEntity("cup", 8746);
+ defineEntity("curren", 164);
+ defineEntity("dArr", 8659);
+ defineEntity("dagger", 8224);
+ defineEntity("darr", 8595);
+ defineEntity("deg", 176);
+ defineEntity("delta", 948);
+ defineEntity("diams", 9830);
+ defineEntity("divide", 247);
+ defineEntity("eacute", 233);
+ defineEntity("ecirc", 234);
+ defineEntity("egrave", 232);
+ defineEntity("empty", 8709);
+ defineEntity("emsp", 8195);
+ defineEntity("ensp", 8194);
+ defineEntity("epsilon", 949);
+ defineEntity("equiv", 8801);
+ defineEntity("eta", 951);
+ defineEntity("eth", 240);
+ defineEntity("euml", 235);
+ defineEntity("euro", 8364);
+ defineEntity("exist", 8707);
+ defineEntity("fnof", 402);
+ defineEntity("forall", 8704);
+ defineEntity("frac12", 189);
+ defineEntity("frac14", 188);
+ defineEntity("frac34", 190);
+ defineEntity("frasl", 8260);
+ defineEntity("gamma", 947);
+ defineEntity("ge", 8805);
+ defineEntity("gt", 62);
+ defineEntity("hArr", 8660);
+ defineEntity("harr", 8596);
+ defineEntity("hearts", 9829);
+ defineEntity("hellip", 8230);
+ defineEntity("iacute", 237);
+ defineEntity("icirc", 238);
+ defineEntity("iexcl", 161);
+ defineEntity("igrave", 236);
+ defineEntity("image", 8465);
+ defineEntity("infin", 8734);
+ defineEntity("int", 8747);
+ defineEntity("iota", 953);
+ defineEntity("iquest", 191);
+ defineEntity("isin", 8712);
+ defineEntity("iuml", 239);
+ defineEntity("kappa", 954);
+ defineEntity("lArr", 8656);
+ defineEntity("lambda", 955);
+ defineEntity("lang", 9001);
+ defineEntity("laquo", 171);
+ defineEntity("larr", 8592);
+ defineEntity("lceil", 8968);
+ defineEntity("ldquo", 8220);
+ defineEntity("le", 8804);
+ defineEntity("lfloor", 8970);
+ defineEntity("lowast", 8727);
+ defineEntity("loz", 9674);
+ defineEntity("lrm", 8206);
+ defineEntity("lsaquo", 8249);
+ defineEntity("lsquo", 8216);
+ defineEntity("lt", 60);
+ defineEntity("macr", 175);
+ defineEntity("mdash", 8212);
+ defineEntity("micro", 181);
+ defineEntity("middot", 183);
+ defineEntity("minus", 8722);
+ defineEntity("mu", 956);
+ defineEntity("nabla", 8711);
+ defineEntity("nbsp", 160);
+ defineEntity("ndash", 8211);
+ defineEntity("ne", 8800);
+ defineEntity("ni", 8715);
+ defineEntity("not", 172);
+ defineEntity("notin", 8713);
+ defineEntity("nsub", 8836);
+ defineEntity("ntilde", 241);
+ defineEntity("nu", 957);
+ defineEntity("oacute", 243);
+ defineEntity("ocirc", 244);
+ defineEntity("oelig", 339);
+ defineEntity("ograve", 242);
+ defineEntity("oline", 8254);
+ defineEntity("omega", 969);
+ defineEntity("omicron", 959);
+ defineEntity("oplus", 8853);
+ defineEntity("or", 8744);
+ defineEntity("ordf", 170);
+ defineEntity("ordm", 186);
+ defineEntity("oslash", 248);
+ defineEntity("otilde", 245);
+ defineEntity("otimes", 8855);
+ defineEntity("ouml", 246);
+ defineEntity("para", 182);
+ defineEntity("part", 8706);
+ defineEntity("permil", 8240);
+ defineEntity("perp", 8869);
+ defineEntity("phi", 966);
+ defineEntity("pi", 960);
+ defineEntity("piv", 982);
+ defineEntity("plusmn", 177);
+ defineEntity("pound", 163);
+ defineEntity("prime", 8242);
+ defineEntity("prod", 8719);
+ defineEntity("prop", 8733);
+ defineEntity("psi", 968);
+ defineEntity("quot", 34);
+ defineEntity("rArr", 8658);
+ defineEntity("radic", 8730);
+ defineEntity("rang", 9002);
+ defineEntity("raquo", 187);
+ defineEntity("rarr", 8594);
+ defineEntity("rceil", 8969);
+ defineEntity("rdquo", 8221);
+ defineEntity("real", 8476);
+ defineEntity("reg", 174);
+ defineEntity("rfloor", 8971);
+ defineEntity("rho", 961);
+ defineEntity("rlm", 8207);
+ defineEntity("rsaquo", 8250);
+ defineEntity("rsquo", 8217);
+ defineEntity("sbquo", 8218);
+ defineEntity("scaron", 353);
+ defineEntity("sdot", 8901);
+ defineEntity("sect", 167);
+ defineEntity("shy", 173);
+ defineEntity("sigma", 963);
+ defineEntity("sigmaf", 962);
+ defineEntity("sim", 8764);
+ defineEntity("spades", 9824);
+ defineEntity("sub", 8834);
+ defineEntity("sube", 8838);
+ defineEntity("sum", 8721);
+ defineEntity("sup", 8835);
+ defineEntity("sup1", 185);
+ defineEntity("sup2", 178);
+ defineEntity("sup3", 179);
+ defineEntity("supe", 8839);
+ defineEntity("szlig", 223);
+ defineEntity("tau", 964);
+ defineEntity("there4", 8756);
+ defineEntity("theta", 952);
+ defineEntity("thetasym", 977);
+ defineEntity("thinsp", 8201);
+ defineEntity("thorn", 254);
+ defineEntity("tilde", 732);
+ defineEntity("times", 215);
+ defineEntity("trade", 8482);
+ defineEntity("uArr", 8657);
+ defineEntity("uacute", 250);
+ defineEntity("uarr", 8593);
+ defineEntity("ucirc", 251);
+ defineEntity("ugrave", 249);
+ defineEntity("uml", 168);
+ defineEntity("upsih", 978);
+ defineEntity("upsilon", 965);
+ defineEntity("uuml", 252);
+ defineEntity("weierp", 8472);
+ defineEntity("xi", 958);
+ defineEntity("yacute", 253);
+ defineEntity("yen", 165);
+ defineEntity("yuml", 255);
+ defineEntity("zeta", 950);
+ defineEntity("zwj", 8205);
+ defineEntity("zwnj", 8204);
+ }
+
+ /**
+ * Crate a content model, consisting of the single
+ * element, specified by name.
+ */
+ protected ContentModel model(String element)
+ {
+ return new ContentModel(getElement(element));
+ }
+
+ /**
+ * Crate a chain from the two content models,
+ * the last containing the given element and
+ * the specified unary operation.
+ */
+ private ContentModel model(String element, int unary)
+ {
+ ContentModel ct = model(element);
+ ct.type = unary;
+ return new ContentModel(0, ct);
+ }
+
+ /**
+ * Create the model HEAD, BODY
+ * @return the HTML content model of the whole document
+ */
+ protected ContentModel createHtmlContentModel()
+ {
+ ContentModel head = model(HEAD);
+ ContentModel body = model(BODY);
+ head.next = body;
+ head.type = ',';
+ return head;
+ }
+
+ /**
+ * Create the model
+ * ( CAPTION ? , ( COL * | COLGROUP * ) , THEAD ? , TFOOT ? , TBODY + )
+ */
+ protected ContentModel createTableContentModel()
+ {
+ ContentModel col_colgroup = new ContentModel
+ ('|', model(COL,'*'), model(COLGROUP,'*') );
+
+ col_colgroup = new ContentModel('*', col_colgroup);
+ col_colgroup = new ContentModel(',', col_colgroup);
+
+ ContentModel caption = model(CAPTION,'?');
+ ContentModel thead = model(THEAD, '?');
+ ContentModel tfoot = model(TFOOT, '?');
+ ContentModel tbody = model(TBODY, '+');
+
+ caption.next = col_colgroup;
+ col_colgroup.next = thead;
+ thead.next = tfoot;
+ tfoot.next = tbody;
+
+ caption.type = col_colgroup.type = thead.type = tfoot.type =
+ tbody.type = ',';
+
+ return caption;
+ }
+
+ /**
+ * Creates a model for &lt;DL&gt; tag:
+ * <code> DT+ | DL+ </code>.
+ * @return
+ */
+ protected ContentModel createDefListModel()
+ {
+ ContentModel dt = model(DT, '+');
+ ContentModel dd = model(DD, '+');
+
+ dt.next = dd;
+ dt.type = dd.type = '|';
+ return dt;
+ }
+
+ /**
+ * This model is used for UL, OL, MENU and DIR.
+ * HTML 4.01 specifies LI only, but the nested
+ * list seems rendered correctly only if
+ * it is not enclosed into <LI>-</LI> of the
+ * parent list.
+ */
+ protected ContentModel createListModel()
+ {
+ ContentModel li = model(LI, '+');
+ ContentModel ul = model(UL, '+');
+ ContentModel ol = model(OL, '+');
+
+ li.next = ul;
+ ul.next = ol;
+ li.type = ul.type = ol.type = '|';
+ return li;
+ }
+
+ /**
+ * Get elements that are allowed in the document body, at the zero level.
+ */
+ protected String[] getBodyElements()
+ {
+ return new String[] {
+ PCDATA, A, ABBR, ACRONYM,
+ APPLET, B, BASEFONT, BDO, BIG,
+ BR, BUTTON, CITE, CODE, DFN,
+ EM, FONT, I, IFRAME, IMG,
+ INPUT, KBD, LABEL, MAP, OBJECT,
+ Q, S, SAMP, SCRIPT, SELECT,
+ SMALL, SPAN, STRIKE, STRONG, SUB,
+ SUP, TEXTAREA, TT, U, VAR,
+ ADDRESS, BLOCKQUOTE, CENTER, DEL, DIR,
+ DIV, DL, FIELDSET, FORM, H1,
+ H2, H3, H4, H5, H6,
+ HR, INS, ISINDEX, MENU, NOFRAMES,
+ NOSCRIPT, OL, P, PRE, TABLE,
+ UL
+ };
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/SmallHtmlAttributeSet.java b/libjava/classpath/gnu/javax/swing/text/html/parser/SmallHtmlAttributeSet.java
new file mode 100644
index 000000000..8739ad453
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/SmallHtmlAttributeSet.java
@@ -0,0 +1,261 @@
+/* SmallHtmlAttributeSet.java -- Small fixed HTML attribute set
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.parser;
+
+import java.io.Serializable;
+import java.util.Enumeration;
+import java.util.NoSuchElementException;
+
+import javax.swing.text.AttributeSet;
+import javax.swing.text.html.HTML.Attribute;
+import javax.swing.text.html.HTML.Tag;
+
+/**
+ * Small fixed HTML attribute set. The most of the HTML elements contain only
+ * several attributes. With four attributes, the number of operations in more
+ * complex algorithms is not larger than using the naive algorithm.
+ *
+ * Same as HtmlAttributeSet, this set allows both strings and non-string as
+ * keys. The strings are case insensitive, the non strings are compared with
+ * .equals.
+ *
+ * @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
+ */
+public class SmallHtmlAttributeSet
+ implements AttributeSet, Cloneable, Serializable
+{
+ private static final long serialVersionUID = 1;
+
+ /**
+ * The keys, stored in this attribute set.
+ */
+ final Object[] keys;
+
+ /**
+ * The values, stored in this attribute set.
+ */
+ final Object[] values;
+
+ /**
+ * The parent, used for resolving the values, not found in this set.
+ */
+ final AttributeSet parent;
+
+ /**
+ * Create a new small fixed attribute set that contains the unchangeable copy
+ * of the passed attribute set and inherits its parent.
+ *
+ * @param copyFrom the attribute set, containing the attribute values to copy.
+ */
+ public SmallHtmlAttributeSet(AttributeSet copyFrom)
+ {
+ int n = copyFrom.getAttributeCount();
+
+ keys = new Object[n];
+ values = new Object[n];
+ parent = copyFrom.getResolveParent();
+
+ Enumeration en = copyFrom.getAttributeNames();
+ Object key;
+ Object value;
+
+ for (int i = 0; i < n; i++)
+ {
+ key = en.nextElement();
+ keys[i] = key;
+ value = copyFrom.getAttribute(key);
+ values[i] = value;
+ }
+ }
+
+ public boolean containsAttribute(Object name, Object value)
+ {
+ Object contains = getAttribute(name);
+ if (value == null)
+ return value == contains;
+ else
+ return value.equals(contains);
+ }
+
+ public boolean containsAttributes(AttributeSet attributes)
+ {
+ if (attributes == this)
+ return true;
+ Object v;
+ for (int i = 0; i < keys.length; i++)
+ {
+ v = attributes.getAttribute(keys[i]);
+ if (v != values[i])
+ {
+ if (values[i] == null)
+ return false;
+ else if (! values[i].equals(v))
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * THIS can be safely returned as the set is not mutable.
+ */
+ public AttributeSet copyAttributes()
+ {
+ return this;
+ }
+
+ /**
+ * Get the attribute value, matching this key. If not found in this set, the
+ * call is delegated to parent.
+ *
+ * @return the value, matching key (or null if none).
+ */
+ public Object getAttribute(Object key)
+ {
+ // Null and HTML attributes or tags can be searched by direct comparison.
+ if (key == null || key instanceof Attribute || key instanceof Tag)
+ {
+ for (int i = 0; i < keys.length; i++)
+ {
+ if (keys[i] == key)
+ return values[i];
+ }
+ }
+
+ // Strings are case insensitive. Only string can be match the string.
+ else if (key instanceof String)
+ {
+ String ks = (String) key;
+ for (int i = 0; i < keys.length; i++)
+ {
+ if (keys[i] instanceof String)
+ if (ks.equalsIgnoreCase((String) keys[i]))
+ return values[i];
+ }
+ }
+
+ // Otherwise, defaults to .equals
+ else
+ {
+ for (int i = 0; i < keys.length; i++)
+ {
+ if (key.equals(keys[i]))
+ return values[i];
+ }
+ }
+
+ if (parent != null)
+ return parent.getAttribute(key);
+ else
+ return null;
+ }
+
+ /**
+ * Get the number of the stored attributes.
+ */
+ public int getAttributeCount()
+ {
+ return keys.length;
+ }
+
+ /**
+ * Get enumeration, containing the attribute names. No guard agains the
+ * concurent modification is required as the set is not mutable.
+ */
+ public Enumeration getAttributeNames()
+ {
+ return new Enumeration()
+ {
+ int p = 0;
+
+ public boolean hasMoreElements()
+ {
+ return p < keys.length;
+ }
+
+ public Object nextElement()
+ {
+ if (p < keys.length)
+ return keys[p++];
+ else
+ throw new NoSuchElementException();
+ }
+ };
+ }
+
+ /**
+ * Get the parent that this set uses to resolve the not found attributes.
+ */
+ public AttributeSet getResolveParent()
+ {
+ return parent;
+ }
+
+ /**
+ * Check if the given attribute is defined in this set (not in the parent).
+ */
+ public boolean isDefined(Object attrName)
+ {
+ if (attrName instanceof String)
+ attrName = ((String) attrName).toLowerCase();
+
+ for (int i = 0; i < keys.length; i++)
+ {
+ if (attrName.equals(keys[i]))
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Check this set and another set for equality by content.
+ */
+ public boolean isEqual(AttributeSet attr)
+ {
+ return keys.length == attr.getAttributeCount() && containsAttributes(attr);
+ }
+
+ /**
+ * It is safe to return THIS on cloning, if one happens.
+ */
+ protected Object clone()
+ {
+ return this;
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/gnuDTD.java b/libjava/classpath/gnu/javax/swing/text/html/parser/gnuDTD.java
new file mode 100644
index 000000000..5924e0fb9
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/gnuDTD.java
@@ -0,0 +1,421 @@
+/* gnuDTD.java --
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.parser;
+
+import java.io.PrintStream;
+import java.io.Serializable;
+
+import java.util.BitSet;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Vector;
+
+import javax.swing.text.html.parser.AttributeList;
+import javax.swing.text.html.parser.ContentModel;
+import javax.swing.text.html.parser.Element;
+import javax.swing.text.html.parser.Entity;
+
+/**
+ * <p>
+ * The class is derived from {@link gnu.javax.swing.text.html.parser.DTD }
+ * making structure creation methods public. This is required when
+ * creating the DTD by SGML parser that must have access to the structure.
+ *
+ * SGML DTD representation. Provides basis for describing a syntax of the
+ * HTML documents. The fields of this class are NOT initialized in
+ * constructor. You need to do this separately before passing this data
+ * structure to the parser constructor.</p>
+ *
+ * <p>This implementation also provides you the derived class
+ * <code>gnu.javax.swing.text.html.parser.DTD.HTML_4_0_1</code>, where
+ * all fields are initialized to the values, representing HTML 4.01
+ * ("-//W3C//DTD HTML 4.01 Frameset//EN") DTD. You can use it if you do not care
+ * about the portability between different implementations of the core
+ * class libraries. </p>
+ * <p>Use {@link javax.swing.HTML.HTMLEditorKit.Parser#parse }
+ * for parsing in accordance with "-//W3C//DTD HTML 4.01 Frameset//EN"
+ * without specifying DTD separately.</p>
+ *
+ * @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
+ */
+public class gnuDTD
+ extends javax.swing.text.html.parser.DTD
+ implements javax.swing.text.html.parser.DTDConstants, Serializable
+{
+ /* The undocumented element types, used to specify types, not defined
+ in DTDConstants. */
+
+ /**
+ * The URI element type (not defined in DTDConstants).
+ */
+ public static final int URI = 512;
+
+ /**
+ * The Length element type
+ */
+ public static final int Length = 513;
+
+ /**
+ * The Char element type
+ */
+ public static final int Char = 514;
+
+ /**
+ * The Color element type
+ */
+ public static final int Color = 515;
+
+ /**
+ * Creates a new instance of gnuDTD.
+ * @param name the name of the DTD.
+ */
+ public gnuDTD(String name)
+ {
+ super(name);
+ }
+
+ /**
+ * Creates and returns new attribute (not an attribute list).
+ * @param name the name of this attribute
+ * @param type the type of this attribute (FIXED, IMPLIED or
+ * REQUIRED from <code>DTDConstants</code>).
+ * @param modifier the modifier of this attribute
+ * @param default_value the default value of this attribute or null if
+ * it is not specified.
+ * @param allowed_values the allowed values of this attribute. The multiple
+ * possible values in this parameter are supposed to be separated by
+ * '|', same as in SGML DTD <code>&lt;!ATTLIST </code>tag. This parameter
+ * can be null if no list of allowed values is specified.
+ * @param atts the previous attribute of this element. This is
+ * placed to the field
+ * {@link javax.swing.text.html.parser.AttributeList#next },
+ * creating a linked list.
+ * @return
+ */
+ public AttributeList defAttributeList(String name, int type, int modifier,
+ String default_value,
+ String allowed_values,
+ AttributeList atts
+ )
+ {
+ return super.defAttributeList(name, type, modifier, default_value,
+ allowed_values, atts
+ );
+ }
+
+ /**
+ * Define the attributes for the element with the given name.
+ * If the element is not exist, it is created. This method is
+ * needed if the element attributes are defined befor the
+ * element itself.
+ * @param forElement
+ * @param attributes
+ */
+ public void defAttrsFor(String forElement, AttributeList attributes)
+ {
+ super.defineAttributes(forElement, attributes);
+ }
+
+ /**
+ * Creates a new content model.
+ * @param type specifies the BNF operation for this content model.
+ * The valid operations are documented in the
+ * {@link javax.swing.text.html.parser.ContentModel#type }.
+ * @param content the content of this content model
+ * @param next if the content model is specified by BNF-like
+ * expression, contains the rest of this expression.
+ * @return The newly created content model.
+ */
+ public ContentModel defContentModel(int type, Object content,
+ ContentModel next
+ )
+ {
+ return super.defContentModel(type, content, next);
+ }
+
+ /**
+ * Defines a new element and adds it to the element table.
+ * If the element alredy exists,
+ * overrides it settings with the specified values.
+ * @param name the name of the new element
+ * @param type the type of the element
+ * @param headless true if the element needs no starting tag
+ * @param tailless true if the element needs no closing tag
+ * @param content the element content.
+ * @param exclusions the elements that must be excluded from the
+ * content of this element, in all levels of the hierarchy.
+ * @param inclusions the elements that can be included as the
+ * content of this element.
+ * @param attributes the element attributes.
+ * @return the created or updated element.
+ */
+ public Element defElement(String name, int type, boolean headless,
+ boolean tailless, ContentModel content,
+ String[] exclusions, String[] inclusions,
+ AttributeList attributes
+ )
+ {
+ return super.defElement(name, type, headless, tailless, content,
+ exclusions, inclusions, attributes
+ );
+ }
+
+ /**
+ * Defines a new element and adds it to the element table.
+ * If the element alredy exists,
+ * overrides it settings with the specified values.
+ * @param name the name of the new element
+ * @param type the type of the element
+ * @param headless true if the element needs no starting tag
+ * @param tailless true if the element needs no closing tag
+ * @param content the element content.
+ * @param exclusions the elements that must be excluded from the
+ * content of this element, in all levels of the hierarchy.
+ * @param inclusions the elements that can be included as the
+ * content of this element.
+ * @param attributes the element attributes.
+ * @return the created or updated element.
+ */
+ public Element defElement(String name, int type, boolean headless,
+ boolean tailless, ContentModel content,
+ Collection exclusions, Collection inclusions,
+ AttributeList attributes
+ )
+ {
+ return super.defElement(name, type, headless, tailless, content,
+ toStringArray(exclusions),
+ toStringArray(inclusions), attributes
+ );
+ }
+
+ /**
+ * Defines a new element and adds it to the element table.
+ * If the element alredy exists,
+ * overrides it settings with the specified values.
+ * @param name the name of the new element
+ * @param type the type of the element
+ * @param headless true if the element needs no starting tag
+ * @param tailless true if the element needs no closing tag
+ * @param content the element content.
+ * @param exclusions the elements that must be excluded from the
+ * content of this element, in all levels of the hierarchy.
+ * @param inclusions the elements that can be included as the
+ * content of this element.
+ * @param attributes the element attributes (an array and not a
+ * linked list). The attributes are chained into the linked list
+ * inside this method.
+ * @return the created or updated element.
+ */
+ public Element defElement(String name, int type, boolean headless,
+ boolean tailless, ContentModel content,
+ String[] exclusions, String[] inclusions,
+ AttributeList[] attributes
+ )
+ {
+ AttributeList list;
+
+ if (attributes == null || attributes.length == 0)
+ list = null;
+ else
+ {
+ if (attributes.length > 1)
+ for (int i = 1; i < attributes.length; i++)
+ {
+ attributes [ i - 1 ].next = attributes [ i ];
+ }
+ list = attributes [ 0 ];
+ }
+
+ Element e =
+ super.defElement(name, type, headless, tailless, content, exclusions,
+ inclusions, list
+ );
+ return e;
+ }
+
+ /**
+ * Creates, adds into the internal table and returns the
+ * character entity like <code>&amp;lt;</code>
+ * (means '<code>&lt;</code>' );
+ * This method inactivates the recursive refenrences to the same
+ * entity.
+ * @param name The entity name (without heading &amp; and closing ;)
+ * @param type The entity type
+ * @param character The entity value (single character)
+ * @return The created entity
+ */
+ public Entity defEntity(String name, int type, String data)
+ {
+ int r;
+ String eref = "%" + name + ";";
+ do
+ {
+ r = data.indexOf(eref);
+ if (r > 0)
+ {
+ data = data.substring(0, r) + data.substring(r + 1);
+ }
+ }
+ while (r > 0);
+
+ return super.defEntity(name, type, data);
+ }
+
+ /**
+ * Summarises the document content into the given PrintStream.
+ */
+ public void dump(PrintStream p)
+ {
+ Iterator iter = entityHash.entrySet().iterator();
+ while (iter.hasNext())
+ {
+ Map.Entry item = (Map.Entry) iter.next();
+ Entity e = (Entity) item.getValue();
+ if (e.isGeneral())
+ p.println("Entity " + e.getName() + ": " + e.getString());
+ }
+
+ iter = elementHash.entrySet().iterator();
+ while (iter.hasNext())
+ {
+ Map.Entry item = (Map.Entry) iter.next();
+ Element e = (Element) item.getValue();
+ p.println("Element " + e.getName());
+
+ System.out.println(" includes:");
+ dump(e.inclusions);
+ System.out.println(" excludes:");
+ dump(e.exclusions);
+ System.out.println(" attributes:");
+
+ AttributeList atts = e.atts;
+ while (atts != null)
+ {
+ p.print(" " + atts.name + " = " + atts.value);
+ if (atts.values == null || atts.values.size() == 0)
+ p.println();
+ else
+ {
+ Iterator viter = atts.values.iterator();
+ System.out.print(" ( ");
+ while (viter.hasNext())
+ {
+ System.out.print(viter.next());
+ if (viter.hasNext())
+ System.out.print(" | ");
+ }
+ System.out.println(" ) ");
+ }
+ atts = atts.next;
+ }
+ }
+ }
+
+ /**
+ * Prints the content of the given attribute set to the System.out.
+ * @param b
+ */
+ public void dump(BitSet b)
+ {
+ if (b != null)
+ {
+ for (int i = 0; i < b.size(); i++)
+ {
+ if (b.get(i))
+ System.out.println(" " + elements.get(i));
+ }
+ }
+ else
+ System.out.println(" NULL set");
+ }
+
+ /**
+ * Creates the attribute.
+ * @param name The attribute name.
+ * @param type The attribute type.
+ * @param modifier The attribute modifier.
+ * @param defaultValue Default value (or null)
+ * @param allowed_values Allowed values (or null)
+ * @return The newly created AttributeList. The <code>next</code>
+ * field is initialized to null.
+ */
+ protected AttributeList attr(String name, String default_value,
+ String[] allowed_values, int type, int modifier
+ )
+ {
+ Vector allowed = null;
+
+ if (allowed_values != null)
+ {
+ allowed = new Vector(allowed_values.length);
+ for (int i = 0; i < allowed_values.length; i++)
+ {
+ allowed.add(allowed_values [ i ]);
+ }
+ }
+
+ AttributeList attr =
+ new AttributeList(name, type, modifier, default_value, allowed, null);
+
+ return attr;
+ }
+
+ /**
+ * Define the general entity, holding a single character.
+ * @param name The entity name (for example, 'amp').
+ * The defined entity <b>is</b> stored into the entity table.
+ * @param character The entity character (for example, '&').
+ */
+ protected void defineEntity(String name, int character)
+ {
+ super.defEntity(name, GENERAL, character);
+ }
+
+ private String[] toStringArray(Collection c)
+ {
+ String[] s = new String[ c.size() ];
+ Iterator iter = c.iterator();
+ for (int i = 0; i < s.length; i++)
+ {
+ s [ i ] = iter.next().toString();
+ }
+ return s;
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/htmlAttributeSet.java b/libjava/classpath/gnu/javax/swing/text/html/parser/htmlAttributeSet.java
new file mode 100644
index 000000000..7eb0f616e
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/htmlAttributeSet.java
@@ -0,0 +1,183 @@
+/* htmlAttributeSet.java -- A set to store HTML attributes
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.parser;
+
+import java.util.Enumeration;
+
+import javax.swing.text.AttributeSet;
+import javax.swing.text.SimpleAttributeSet;
+import javax.swing.text.html.HTML;
+
+/**
+ * A set, adapted to store HTML attributes.
+ *
+ * @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
+ */
+public class htmlAttributeSet
+ extends SimpleAttributeSet
+{
+ public static final htmlAttributeSet EMPTY_HTML_ATTRIBUTE_SET =
+ new htmlAttributeSet();
+
+ AttributeSet parent;
+
+ /**
+ * Looks in this set and, if not found, later looks in the parent set. Calls
+ * toString(), allowing to pass as HTML.Attribute, as String to this method.
+ *
+ * @param _key A key to search for a value.
+ * @return The value, if one is defined.
+ */
+ public Object getAttribute(Object _key)
+ {
+ Object v = super.getAttribute(_key);
+ if (v != null || _key == null)
+ return v;
+
+ Object key = _key.toString().toLowerCase();
+
+ v = super.getAttribute(key);
+ if (v != null)
+ return v;
+
+ key = HTML.getAttributeKey((String) key);
+ v = super.getAttribute(key);
+ if (v != null)
+ return v;
+
+ if (parent != null)
+ return parent.getAttribute(key);
+ else
+ return null;
+ }
+
+ /**
+ * The name set must return HTML.Attribute and not a string,
+ * where applicable.
+ */
+ public Enumeration getAttributeNames()
+ {
+ // Replace the string keys by HTML.attribute, where applicable
+ final Enumeration enumeration = super.getAttributeNames();
+
+ return new Enumeration()
+ {
+ public boolean hasMoreElements()
+ {
+ return enumeration.hasMoreElements();
+ }
+
+ public Object nextElement()
+ {
+ Object key = enumeration.nextElement();
+ if (key instanceof String)
+ {
+ HTML.Attribute hKey = HTML.getAttributeKey((String) key);
+ if (hKey != null)
+ return hKey;
+ }
+ return key;
+ }
+ };
+ }
+
+ /**
+ * Set the parent set, containing the default values.
+ *
+ * @param a_parent
+ */
+ public void setResolveParent(AttributeSet a_parent)
+ {
+ parent = a_parent;
+ }
+
+ /**
+ * Get the parent set, containing the default values.
+ *
+ * @return the parent, used to resolve the attributes.
+ */
+ public AttributeSet getResolveParent()
+ {
+ return parent;
+ }
+
+ /**
+ * Add the attribute to this attribute set.
+ *
+ * @param key Attribute key (if string, it will be case insensitive)
+ * @param value Attribute value
+ */
+ public void addAttribute(Object key, Object value)
+ {
+ if (key instanceof String)
+ super.addAttribute(((String) key).toLowerCase(), value);
+ else
+ super.addAttribute(key, value);
+ }
+
+ /**
+ * Copy attributes. The returned copy does not longer contains the extended
+ * features, needed to participate in the HTML parsing. The returned set may
+ * not be mutable.
+ */
+ public AttributeSet copyAttributes()
+ {
+ if (getAttributeCount() <= 8)
+ // For the small size, typical in HTML tags, the direct iteration is
+ // faster than more complex algorithms.
+ return new SmallHtmlAttributeSet(this);
+ else
+ return (AttributeSet) clone();
+ }
+
+ /**
+ * Returns a clone of the attribute set.
+ *
+ * @return A clone of the attribute set.
+ */
+ public Object clone()
+ {
+ htmlAttributeSet set = new htmlAttributeSet();
+ set.addAttributes(this);
+ AttributeSet parent = getResolveParent();
+ if (parent != null)
+ set.setResolveParent(parent);
+ return set;
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/htmlValidator.java b/libjava/classpath/gnu/javax/swing/text/html/parser/htmlValidator.java
new file mode 100644
index 000000000..2b624cc3c
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/htmlValidator.java
@@ -0,0 +1,622 @@
+/* tagStack.java -- The HTML tag stack.
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.parser;
+
+import gnu.java.lang.CPStringBuilder;
+
+import gnu.javax.swing.text.html.parser.models.node;
+import gnu.javax.swing.text.html.parser.models.transformer;
+
+import java.util.BitSet;
+import java.util.Enumeration;
+import java.util.LinkedList;
+import java.util.ListIterator;
+
+import javax.swing.text.SimpleAttributeSet;
+import javax.swing.text.html.HTML;
+import javax.swing.text.html.parser.*;
+
+/**
+ * <p>The HTML content validator, is responsible for opening and
+ * closing elements with optional start/end tags, detecting
+ * the wrongly placed html tags and reporting errors. The working instance
+ * is the inner class inside the {@link javax.swing.text.html.parser.Parser }
+ * </p>
+ * <p>This class could potentially
+ * provide basis for automated closing and insertion of the html tags,
+ * correcting the found html errors.
+ * @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
+ */
+public abstract class htmlValidator
+{
+ /**
+ * The tag reference, holding additional information that the tag
+ * has been forcibly closed.
+ */
+ protected class hTag
+ {
+ protected final Element element;
+ protected final HTML.Tag tag;
+ protected final TagElement tgElement;
+ protected boolean forcibly_closed;
+ protected node validationTrace;
+
+ protected hTag(TagElement an_element)
+ {
+ element = an_element.getElement();
+ tag = an_element.getHTMLTag();
+ tgElement = an_element;
+
+ if (element.content != null)
+ validationTrace = transformer.transform(element.content, dtd);
+ }
+
+ /**
+ * This is called when the tag must be forcibly closed because
+ * it would make the newly appearing tag invalid.
+ * The parser is not notified about such event (just the error
+ * is reported). For such tags, the closing message does not
+ * appear when later reaching the end of stream. The exception is
+ * the &lt;head&gt; tag: the parser is notified about its silent closing
+ * when &lt;body&gt; or other html content appears.
+ */
+ protected void forciblyCloseDueContext()
+ {
+ forcibly_closed = true;
+ }
+
+ /**
+ * This is called when the tag must be forcibly closed after
+ * reaching the end of stream. The parser is notified as if
+ * closing the tag explicitly.
+ */
+ protected void forciblyCloseDueEndOfStream()
+ {
+ forcibly_closed = true;
+ handleSupposedEndTag(element);
+ }
+ }
+
+ /**
+ * The DTD, providing information about the valid document structure.
+ */
+ protected final DTD dtd;
+
+ /**
+ * The stack, holding the current tag context.
+ */
+ protected final LinkedList stack = new LinkedList();
+
+ /**
+ * Creates a new tag stack, using the given DTD.
+ * @param a_dtd A DTD, providing the information about the valid
+ * tag content.
+ */
+ public htmlValidator(DTD a_dtd)
+ {
+ dtd = a_dtd;
+ }
+
+ /**
+ * Close all opened tags (called at the end of parsing).
+ */
+ public void closeAll()
+ {
+ hTag h;
+ while (!stack.isEmpty())
+ {
+ h = (hTag) stack.getLast();
+ if (!h.forcibly_closed && !h.element.omitEnd())
+ s_error("Unclosed <" + h.tag + ">, closing at the end of stream");
+
+ handleSupposedEndTag(h.element);
+
+ closeTag(h.tgElement);
+ }
+ }
+
+ /**
+ * Remove the given tag from the stack or (if found) from the list
+ * of the forcibly closed tags.
+ */
+ public boolean closeTag(TagElement tElement)
+ {
+ HTML.Tag tag = tElement.getHTMLTag();
+ hTag x;
+ hTag close;
+
+ if (!stack.isEmpty())
+ {
+ ListIterator iter = stack.listIterator(stack.size());
+
+ while (iter.hasPrevious())
+ {
+ x = (hTag) iter.previous();
+ if (tag.equals(x.tag))
+ {
+ if (x.forcibly_closed && !x.element.omitEnd())
+ s_error("The tag <" + x.tag +
+ "> has already been forcibly closed"
+ );
+
+
+ // If the tag has a content model defined, forcibly close all
+ // tags that were opened after the tag being currently closed.
+ closing:
+ if (x.element.content != null)
+ {
+ iter = stack.listIterator(stack.size());
+ while (iter.hasPrevious())
+ {
+ close = (hTag) iter.previous();
+ if (close == x)
+ break closing;
+ handleSupposedEndTag(close.element);
+ iter.remove();
+ }
+ }
+
+ stack.remove(x);
+ return true;
+ }
+ }
+ }
+ s_error("Closing unopened <" + tag + ">");
+ return false;
+ }
+
+ /**
+ * Add the given HTML tag to the stack of the opened tags. Forcibly closes
+ * all tags in the stack that does not allow this tag in they content (error
+ * is reported).
+ * @param element
+ */
+ public void openTag(TagElement tElement, htmlAttributeSet parameters)
+ {
+ // If this is a fictional call, the message from the parser
+ // has recursively returned - ignore.
+ if (tElement.fictional())
+ return;
+
+ validateParameters(tElement, parameters);
+
+ // If the stack is empty, start from HTML
+ if (stack.isEmpty() && tElement.getHTMLTag() != HTML.Tag.HTML)
+ {
+ Element html = dtd.getElement(HTML.Tag.HTML.toString());
+ openFictionalTag(html);
+ }
+
+ Object v = tagIsValidForContext(tElement);
+ if (v != Boolean.TRUE)
+ {
+ // The tag is not valid for context, the content
+ // model suggest to open another tag.
+ if (v instanceof Element)
+ {
+ int n = 0;
+ while (v instanceof Element && (n++ < 100))
+ {
+ Element fe = (Element) v;
+
+ // notify the content model that we add the proposed tag
+ node ccm = getCurrentContentModel();
+ if (ccm != null)
+ ccm.show(fe);
+ openFictionalTag(fe);
+
+ Object vv = tagIsValidForContext(tElement);
+ if (vv instanceof Element) // One level of nesting is supported.
+ {
+ openFictionalTag((Element) vv);
+
+ Object vx = tagIsValidForContext(tElement);
+ if (vx instanceof Element)
+ openFictionalTag((Element) vx);
+ }
+ else if (vv == Boolean.FALSE)
+ {
+ // The tag is still not valid for the current
+ // content after opening a fictional element.
+ if (fe.omitEnd())
+ {
+ // close the previously opened fictional tag.
+ closeLast();
+ vv = tagIsValidForContext(tElement);
+ if (vv instanceof Element)
+
+ // another tag was suggested by the content model
+ openFictionalTag((Element) vv);
+ }
+ }
+ v = tagIsValidForContext(tElement);
+ }
+ }
+ else // If the current element has the optional end tag, close it.
+ {
+ if (!stack.isEmpty())
+ {
+ closing:
+ do
+ {
+ hTag last = (hTag) stack.getLast();
+ if (last.element.omitEnd())
+ {
+ closeLast();
+ v = tagIsValidForContext(tElement);
+ if (v instanceof Element) // another tag was suggested by the content model
+ {
+ openFictionalTag((Element) v);
+ break closing;
+ }
+ }
+ else
+ break closing;
+ }
+ while (v == Boolean.FALSE && !stack.isEmpty());
+ }
+ }
+ }
+
+ stack.add(new hTag(tElement));
+ }
+
+ /**
+ * Clear the stack.
+ */
+ public void restart()
+ {
+ stack.clear();
+ }
+
+ /**
+ * Check if this tag is valid for the current context. Return Boolean.True if
+ * it is OK, Boolean.False if it is surely not OK or the Element that the
+ * content model recommends to insert making the situation ok. If Boolean.True
+ * is returned, the content model current position is moved forward. Otherwise
+ * this position remains the same.
+ *
+ * @param tElement
+ * @return
+ */
+ public Object tagIsValidForContext(TagElement tElement)
+ {
+ // Check the current content model, if one is available.
+ node cv = getCurrentContentModel();
+
+ if (cv != null)
+ return cv.show(tElement.getElement());
+
+ // Check exclusions and inclusions.
+ ListIterator iter = stack.listIterator(stack.size());
+ hTag t = null;
+ final int idx = tElement.getElement().index;
+
+ // Check only known tags.
+ if (idx >= 0)
+ {
+ BitSet inclusions = new BitSet();
+ while (iter.hasPrevious())
+ {
+ t = (hTag) iter.previous();
+ if (! t.forcibly_closed)
+ {
+ if (t.element.exclusions != null
+ && t.element.exclusions.get(idx))
+ return Boolean.FALSE;
+
+ if (t.element.inclusions != null)
+ inclusions.or(t.element.inclusions);
+ }
+ }
+ if (! inclusions.get(idx))
+ {
+ // If we need to insert something, and cannot do this, but
+ // it is allowed to insert the paragraph here, insert the
+ // paragraph.
+ Element P = dtd.getElement(HTML_401F.P);
+ if (inclusions.get(P.index))
+ return P;
+ else
+ return Boolean.FALSE;
+ }
+ }
+ return Boolean.TRUE;
+ }
+
+ /**
+ * Validate tag without storing in into the tag stack. This is called
+ * for the empty tags and results the subsequent calls to the openTag
+ * and closeTag.
+ */
+ public void validateTag(TagElement tElement, htmlAttributeSet parameters)
+ {
+ openTag(tElement, parameters);
+ closeTag(tElement);
+ }
+
+ /**
+ * Check for mandatory elements, subsequent to the last tag:
+ * @param tElement The element that will be inserted next.
+ */
+ protected void checkContentModel(TagElement tElement, boolean first)
+ {
+ if (stack.isEmpty())
+ return;
+
+ hTag last = (hTag) stack.getLast();
+ if (last.validationTrace == null)
+ return;
+
+ Object r = last.validationTrace.show(tElement.getElement());
+ if (r == Boolean.FALSE)
+ s_error("The <" + last.element + "> does not match the content model " +
+ last.validationTrace
+ );
+ else if (r instanceof Element) // The content model recommends insertion of this element
+ {
+ if (!first)
+ closeTag(last.tgElement);
+ handleSupposedStartTag((Element) r);
+ openTag(new TagElement((Element) r), null);
+ }
+ }
+
+ /**
+ * The method is called when the tag must be closed because
+ * it does not allow the subsequent elements inside its context
+ * or the end of stream has been reached. The parser is only
+ * informed if the element being closed does not require the
+ * end tag (the "omitEnd" flag is set).
+ * The closing message must be passed to the parser mechanism
+ * before passing message about the opening the next tag.
+ *
+ * @param element The tag being fictionally (forcibly) closed.
+ */
+ protected abstract void handleSupposedEndTag(Element element);
+
+ /**
+ * The method is called when the validator decides to open the
+ * tag on its own initiative. This may happen if the content model
+ * includes the element with the optional (supposed) start tag.
+ *
+ * @param element The tag being opened.
+ */
+ protected abstract void handleSupposedStartTag(Element element);
+
+ /**
+ * Handles the error message. This method must be overridden to pass
+ * the message where required.
+ * @param msg The message text.
+ */
+ protected abstract void s_error(String msg);
+
+ /**
+ * Validate the parameters, report the error if the given parameter is
+ * not in the parameter set, valid for the given attribute. The information
+ * about the valid parameter set is taken from the Element, enclosed
+ * inside the tag. The method does not validate the default parameters.
+ * @param tag The tag
+ * @param parameters The parameters of this tag.
+ */
+ protected void validateParameters(TagElement tag, htmlAttributeSet parameters)
+ {
+ if (parameters == null ||
+ parameters == htmlAttributeSet.EMPTY_HTML_ATTRIBUTE_SET ||
+ parameters == SimpleAttributeSet.EMPTY
+ )
+ return;
+
+ Enumeration enumeration = parameters.getAttributeNames();
+
+ while (enumeration.hasMoreElements())
+ {
+ validateAttribute(tag, parameters, enumeration);
+ }
+
+ // Check for missing required values.
+ AttributeList a = tag.getElement().getAttributes();
+
+ while (a != null)
+ {
+ if (a.getModifier() == DTDConstants.REQUIRED)
+ if (parameters.getAttribute(a.getName()) == null)
+ {
+ s_error("Missing required attribute '" + a.getName() + "' for <" +
+ tag.getHTMLTag() + ">"
+ );
+ }
+ a = a.next;
+ }
+ }
+
+ private node getCurrentContentModel()
+ {
+ if (!stack.isEmpty())
+ {
+ hTag last = (hTag) stack.getLast();
+ return last.validationTrace;
+ }
+ else
+ return null;
+ }
+
+ private void closeLast()
+ {
+ handleSupposedEndTag(((hTag) stack.getLast()).element);
+ stack.removeLast();
+ }
+
+ private void openFictionalTag(Element e)
+ {
+ handleSupposedStartTag(e);
+ stack.add(new hTag(new TagElement(e, true)));
+ if (!e.omitStart())
+ s_error("<" + e + "> is expected (supposing it)");
+ }
+
+ private void validateAttribute(TagElement tag, htmlAttributeSet parameters,
+ Enumeration enumeration
+ )
+ {
+ Object foundAttribute;
+ AttributeList dtdAttribute;
+ foundAttribute = enumeration.nextElement();
+ dtdAttribute = tag.getElement().getAttribute(foundAttribute.toString());
+ if (dtdAttribute == null)
+ {
+ CPStringBuilder valid =
+ new CPStringBuilder("The tag <" + tag.getHTMLTag() +
+ "> cannot contain the attribute '" + foundAttribute +
+ "'. The valid attributes for this tag are: "
+ );
+
+ AttributeList a = tag.getElement().getAttributes();
+
+ while (a != null)
+ {
+ valid.append(a.name.toUpperCase());
+ valid.append(' ');
+ a = a.next;
+ }
+ s_error(valid.toString());
+ }
+
+ else
+ {
+ String value = parameters.getAttribute(foundAttribute).toString();
+
+ if (dtdAttribute.type == DTDConstants.NUMBER)
+ validateNumberAttribute(tag, foundAttribute, value);
+
+ if (dtdAttribute.type == DTDConstants.NAME ||
+ dtdAttribute.type == DTDConstants.ID
+ )
+ validateNameOrIdAttribute(tag, foundAttribute, value);
+
+ if (dtdAttribute.values != null)
+ validateAttributeWithValueList(tag, foundAttribute, dtdAttribute,
+ value
+ );
+ }
+ }
+
+ private void validateAttributeWithValueList(TagElement tag,
+ Object foundAttribute,
+ AttributeList dtdAttribute,
+ String value
+ )
+ {
+ if (!dtdAttribute.values.contains(value.toLowerCase()) &&
+ !dtdAttribute.values.contains(value.toUpperCase())
+ )
+ {
+ CPStringBuilder valid;
+ if (dtdAttribute.values.size() == 1)
+ valid =
+ new CPStringBuilder("The attribute '" + foundAttribute +
+ "' of the tag <" + tag.getHTMLTag() +
+ "> cannot have the value '" + value +
+ "'. The only valid value is "
+ );
+ else
+ valid =
+ new CPStringBuilder("The attribute '" + foundAttribute +
+ "' of the tag <" + tag.getHTMLTag() +
+ "> cannot have the value '" + value + "'. The " +
+ dtdAttribute.values.size() +
+ " valid values are: "
+ );
+
+ Enumeration vv = dtdAttribute.values.elements();
+ while (vv.hasMoreElements())
+ {
+ valid.append('"');
+ valid.append(vv.nextElement());
+ valid.append("\" ");
+ }
+ s_error(valid.toString());
+ }
+ }
+
+ private void validateNameOrIdAttribute(TagElement tag, Object foundAttribute,
+ String value
+ )
+ {
+ boolean ok = true;
+
+ if (!Character.isLetter(value.charAt(0)))
+ ok = false;
+
+ char c;
+ for (int i = 0; i < value.length(); i++)
+ {
+ c = value.charAt(i);
+ if (!(
+ Character.isLetter(c) || Character.isDigit(c) ||
+ "".indexOf(c) >= 0
+ )
+ )
+ ok = false;
+ }
+ if (!ok)
+ s_error("The '" + foundAttribute + "' attribute of the tag <" +
+ tag.getHTMLTag() + "> must start from letter and consist of " +
+ "letters, digits, hypens, colons, underscores and periods. " +
+ "It cannot be '" + value + "'"
+ );
+ }
+
+ private void validateNumberAttribute(TagElement tag, Object foundAttribute,
+ String value
+ )
+ {
+ try
+ {
+ Integer.parseInt(value);
+ }
+ catch (NumberFormatException ex)
+ {
+ s_error("The '" + foundAttribute + "' attribute of the tag <" +
+ tag.getHTMLTag() + "> must be a valid number and not '" +
+ value + "'"
+ );
+ }
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/models/PCDATAonly_model.java b/libjava/classpath/gnu/javax/swing/text/html/parser/models/PCDATAonly_model.java
new file mode 100644
index 000000000..5a19a1bc1
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/models/PCDATAonly_model.java
@@ -0,0 +1,62 @@
+/* PCDATAonly_model.java --
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.parser.models;
+
+import java.io.Serializable;
+
+/**
+ * The model, allowing only PCDATA in it (like for element OPTION).
+ * @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
+ */
+public class PCDATAonly_model
+ extends node
+ implements Serializable
+{
+ private static final long serialVersionUID = 1;
+
+ public PCDATAonly_model()
+ {
+ super((char) 0, (char) 0, null);
+ }
+
+ public Object show(Object x)
+ {
+ return x.toString().equalsIgnoreCase("#pcdata") ? Boolean.TRUE : Boolean.FALSE;
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/models/TableRowContentModel.java b/libjava/classpath/gnu/javax/swing/text/html/parser/models/TableRowContentModel.java
new file mode 100644
index 000000000..14514d584
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/models/TableRowContentModel.java
@@ -0,0 +1,77 @@
+/* TableRowContentModel.java --
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.parser.models;
+
+import java.io.Serializable;
+
+import javax.swing.text.html.parser.DTD;
+import javax.swing.text.html.parser.Element;
+
+/**
+ * Table row content model.
+ * @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
+ */
+public class TableRowContentModel
+ extends node
+ implements Serializable
+{
+ private static final long serialVersionUID = 1;
+ final Element TD;
+
+ public TableRowContentModel(DTD dtd)
+ {
+ super((char) 0, (char) 0, null);
+ TD = dtd.getElement("TD");
+ }
+
+ public Object show(Object x)
+ {
+ // Always accept TD and TH
+ String s = x.toString();
+ if (s.equalsIgnoreCase("TD") || s.equalsIgnoreCase("TH"))
+ return Boolean.TRUE;
+
+ // Suggest closing in response to TR:
+ if (s.equalsIgnoreCase("TR"))
+ return Boolean.FALSE;
+
+ // Recommend TD for other cases:
+ return TD;
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/models/list.java b/libjava/classpath/gnu/javax/swing/text/html/parser/models/list.java
new file mode 100644
index 000000000..1ff22f8cd
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/models/list.java
@@ -0,0 +1,384 @@
+/* list.java --
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.parser.models;
+
+import gnu.java.lang.CPStringBuilder;
+
+import java.io.Serializable;
+
+/**
+ * Part of the internal representation of the content model.
+ * @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
+ */
+public class list
+ extends node
+ implements Serializable
+{
+ private static final long serialVersionUID = 1;
+
+ /**
+ * Setting to true means that the list nodes must always be connected
+ * by the same operation. This is far safer and clearer, but not
+ * required by default standard.
+ */
+ public static boolean CLEAR;
+
+ /**
+ * A list of nodes.
+ */
+ public final node[] nodes;
+
+ /**
+ * Creates a new model list that is a member of some enclosing list.
+ * @param binary_operator An operator with that this list is connected
+ * with other members of the enclosing list.
+ * @param unary_operator The unary operator for this list.
+ * @param a_nodes The nodes inside this list.
+ */
+ public list(char binary_operator, char unary_operator, node[] a_nodes)
+ {
+ super(binary_operator, unary_operator, a_nodes);
+ nodes = a_nodes;
+ }
+
+ /**
+ * Creates a new model list. Assigns the previous field.
+ * @param a_nodes The nodes for this list.
+ * @throws an error if the node elements are connected by the
+ * different operations. This is not supported, use grouping.
+ */
+ public list(node[] a_nodes)
+ throws Error
+ {
+ this(',', (char) 0, a_nodes);
+
+ int operation = nodes [ 0 ].binary;
+
+ for (int i = 0; i < nodes.length; i++)
+ {
+ if (CLEAR && nodes [ i ].binary != operation)
+ throw new Error("List members can only be connected by " +
+ "the same operation, use grouping"
+ );
+
+ if (i > 0)
+ nodes [ i ].previous = nodes [ i - 1 ];
+ }
+ }
+
+ /**
+ * Returns true if all members in the list are closed.
+ */
+ public boolean isClosed()
+ {
+ if (super.isClosed())
+ return true;
+ for (int i = 0; i < nodes.length; i++)
+ {
+ if (!nodes [ i ].isClosed())
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Find the token that could match as the next token in
+ * the token list.
+ *
+ * @return Such token object or null if none is found.
+ */
+ public Object findFreeNode()
+ {
+ Object fn;
+ for (int j = 0; j < nodes.length; j++)
+ {
+ if (!nodes [ j ].isClosed())
+ {
+ fn = nodes [ j ].findFreeNode();
+ if (fn != null)
+ return fn;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Tries to match this list agains the given token sequence.
+ * @param tokens the sequence of the tokens to match.
+ * @return true if the valid match is found.
+ */
+ public boolean matches(Object[] tokens)
+ {
+ reset();
+
+ Object x;
+ boolean m;
+ boolean matched = false;
+
+ for (int i = 0; i < tokens.length; i++)
+ {
+ matched = false;
+ x = tokens [ i ];
+
+ nodescan:
+ for (int j = 0; j < nodes.length; j++)
+ {
+ if (!nodes [ j ].isClosed())
+ {
+ m = nodes [ j ].performMatch(x);
+
+ if (m)
+ {
+ matched = true;
+ break nodescan;
+ }
+ }
+ }
+ if (!matched)
+ return false;
+ }
+
+ boolean valid = true;
+
+ for (int i = 0; i < nodes.length; i++)
+ {
+ if (!nodes [ i ].valid())
+ valid = false;
+ }
+
+ return valid;
+ }
+
+ /**
+ * The list never closes, despite it is trated as closed
+ * if all members in the list are closed.
+ * @return false.
+ */
+ public boolean mustClose()
+ {
+ return false;
+ }
+
+ /**
+ * Perform a match operation for the single token
+ * against this list.
+ * @param token a token to match.
+ * @return true if the match is found.
+ */
+ public boolean performMatch(Object token)
+ {
+ boolean ok = false;
+ Matching:
+ for (int i = 0; i < nodes.length; i++)
+ {
+ ok = nodes [ i ].performMatch(token);
+
+ if (ok)
+ break Matching;
+ }
+
+ if (ok)
+ matches();
+
+ return ok;
+ }
+
+ /**
+ * Prepeares the list for the next matching operation.
+ */
+ public void reset()
+ {
+ super.reset();
+ for (int i = 0; i < nodes.length; i++)
+ nodes [ i ].reset();
+ }
+
+ /**
+ * Check if the provided token can match as a next token in the
+ * list. In the case of match, the list state changes, moving
+ * current position after the matched token. However if this method
+ * returns a suggested new token to insert before the provided one,
+ * the state of the list does not change.
+ * @return Boolean.TRUE if the match is found,
+ * Boolean.FALSE if the match is not possible and no token can be
+ * inserted to make the match valid. Otherwise, returns the
+ * token object that can be inserted before the last token in the
+ * list, probably (not for sure) making the match valid.
+ * If the object is an instance of Element or TagElement,
+ * it is first ensured that the object flag "omit start" is set.
+ */
+ public Object show(Object x)
+ {
+ boolean m;
+ boolean matched = false;
+
+ nodescan:
+ for (int j = 0; j < nodes.length; j++)
+ {
+ if (!nodes [ j ].isClosed())
+ {
+ m = nodes [ j ].performMatch(x);
+
+ if (m)
+ {
+ matched = true;
+ break nodescan;
+ }
+ else
+ {
+ // For comma operation, only first not closed
+ // node must be tested for a match.
+ // unless it allows matching zero times.
+ if (binary == ',' &&
+ !(nodes [ j ].unary == '?' || nodes [ j ].unary == '*')
+ )
+ break nodescan;
+ }
+ }
+ }
+
+ if (!matched)
+ {
+ // Find and return that would be matched.
+ Object freeNode = findFreeNode();
+ if (freeNode == null)
+ return Boolean.FALSE;
+ else
+ return freeNode;
+ }
+
+ for (int i = 0; i < nodes.length; i++)
+ if (!nodes [ i ].validPreliminary())
+ {
+ return Boolean.FALSE;
+ }
+
+ return Boolean.TRUE;
+ }
+
+ /**
+ * Returns a string representation of the list.
+ * @return String representation, similar to BNF expression.
+ */
+ public String toString()
+ {
+ CPStringBuilder b = new CPStringBuilder();
+ b.append(" ( ");
+ for (int i = 0; i < nodes.length; i++)
+ {
+ if (i > 0)
+ b.append(" " + (char) nodes [ i ].binary + " ");
+ b.append(nodes [ i ]);
+ }
+
+ b.append(" )");
+ if (unary != 0)
+ b.append((char) unary);
+ else
+ b.append(' ');
+ return b.toString();
+ }
+
+ /**
+ * Returns true if all memebers in the list are valid.
+ */
+ public boolean valid()
+ {
+ for (int i = 0; i < nodes.length; i++)
+ {
+ if (!nodes [ i ].valid())
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Returns true if all memebers in the list are either valid
+ * or unvisited. The unvisited members can become valid after
+ * more tokens will be shown.
+ */
+ public boolean validPreliminary()
+ {
+ if (silenceAllowed())
+ {
+ boolean everVisited = false;
+ for (int i = 0; i < nodes.length; i++)
+ {
+ if (nodes [ i ].visits > 0)
+ {
+ everVisited = true;
+ break;
+ }
+ }
+ if (!everVisited)
+ return true;
+ }
+
+ for (int i = 0; i < nodes.length; i++)
+ {
+ if (!nodes [ i ].validPreliminary())
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Closes all members in the list.
+ */
+ protected void close()
+ {
+ super.close();
+ for (int i = 0; i < nodes.length; i++)
+ {
+ nodes [ i ].close();
+ }
+ }
+
+ /**
+ * Compare given token with the token of this node.
+ * If the token represents a <code>list</code>, the call may be
+ * delegeted to the child subnodes.
+ * @param a_token A token to compare.
+ * @return True if the token matches the token of this node.
+ */
+ protected boolean compare(Object a_token)
+ {
+ return performMatch(a_token);
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/models/noTagModel.java b/libjava/classpath/gnu/javax/swing/text/html/parser/models/noTagModel.java
new file mode 100644
index 000000000..8aac14d8e
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/models/noTagModel.java
@@ -0,0 +1,75 @@
+/* noTagModel.java --
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.parser.models;
+
+import java.io.Serializable;
+
+/**
+ * Disallows a single given tag at the current content level only.
+ * <p>@author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)</p>
+ */
+public class noTagModel
+ extends node
+ implements Serializable
+{
+ private static final long serialVersionUID = 1;
+ final String[] no;
+
+ public noTagModel(String[] noTag)
+ {
+ super((char) 0, (char) 0, null);
+ no = noTag;
+ }
+
+ public noTagModel(String noTag)
+ {
+ super((char) 0, (char) 0, null);
+ no = new String[] { noTag };
+ }
+
+ public Object show(Object x)
+ {
+ for (int i = 0; i < no.length; i++)
+ {
+ if (x.toString().equalsIgnoreCase(no [ i ]))
+ return Boolean.FALSE;
+ }
+ return Boolean.TRUE;
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/models/node.java b/libjava/classpath/gnu/javax/swing/text/html/parser/models/node.java
new file mode 100644
index 000000000..f45a13b3e
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/models/node.java
@@ -0,0 +1,339 @@
+/* node.java --
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.parser.models;
+
+import gnu.java.lang.CPStringBuilder;
+
+import java.io.Serializable;
+
+/**
+ * Part of the internal representation of the content model.
+ * @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
+ */
+public class node
+ implements Serializable
+{
+ private static final long serialVersionUID = 1;
+
+ /**
+ * The token to match (can be instance of list).
+ */
+ public Object token;
+
+ /**
+ * True for the node that cannot be visited again.
+ */
+ public boolean _closed;
+
+ /**
+ * The binary operation for this node.
+ */
+ public char binary;
+
+ /**
+ * The unary opeation for this node.
+ */
+ public char unary;
+
+ /**
+ * The number of times the node already was visited.
+ */
+ public int visits;
+
+ /**
+ * The previous node in content model (used for closing nodes).
+ */
+ public node previous;
+
+ /**
+ * Creates a new node.
+ * @param binary_operator The operator, connecting all nodes in the list.
+ * The nodes, connected by the different operators, must be arranged into
+ * the different lists.
+ * @param unary_operator The unary operator for this node or zero if
+ * no such was specified.
+ * @param token The token to match. This can be either a string or
+ * the new instance of the list.
+ * @param a_previous The previous node in the list, null for the first
+ * node. This is used for propagating the closing operation for the
+ * comma delimited list.
+ */
+ public node(char binary_operator, char unary_operator, Object a_token)
+ {
+ if (a_token != null)
+ if (a_token.getClass().equals(node.class))
+ throw new Error("Creating node in node is redundant and ineffective.");
+
+ binary = binary_operator;
+ unary = unary_operator;
+ token = a_token;
+ }
+
+ /**
+ * Checks if this node is in the closed state.
+ * @return True if the node is closed.
+ */
+ public boolean isClosed()
+ {
+ return _closed;
+ }
+
+ /**
+ * Check if closing this node means closing the previous node.
+ */
+ public boolean closePrevious()
+ {
+ return binary == ',';
+ }
+
+ /**
+ * Return the token object if it could match as a next token in
+ * a token list of null if it could not.
+ * @return
+ */
+ public Object findFreeNode()
+ {
+ boolean ok;
+ if (isClosed() || silenceAllowed())
+ return null;
+
+ // Try if the node would stay valid after a one more visit.
+ visits++;
+ ok = valid();
+ visits--;
+
+ if (ok)
+ {
+ if (token instanceof node)
+ return ((node) token).findFreeNode();
+ else
+ return token;
+ }
+ else
+ return null;
+ }
+
+ /**
+ * Check if the current situation is such that the node must be closed
+ * now.
+ */
+ public boolean mustClose()
+ {
+ switch (unary)
+ {
+ case 0 :
+ return true;
+
+ case '*' :
+ return false;
+
+ case '+' :
+ return false;
+
+ case '?' :
+ return visits <= 1;
+
+ default :
+ throw new Error("Invalid unary operation " + unary + " ( '" +
+ (char) unary + "' )"
+ );
+ }
+ }
+
+ /**
+ * Do the match operation with the given token. This sets various
+ * flags.
+ * @param a_token The token to match.
+ * @return true if the the token matches node, false if it does not match
+ * or if the node is closed.
+ */
+ public boolean performMatch(Object a_token)
+ {
+ if (isClosed())
+ return false;
+
+ boolean matches = compare(a_token);
+ if (matches)
+ matches();
+
+ return matches;
+ }
+
+ /**
+ * Prepares the node for matching against a new list of tokens.
+ */
+ public void reset()
+ {
+ _closed = false;
+ visits = 0;
+ }
+
+ /**
+ * Check if the provided token can match this node.
+ * In the case of match, the node state changes, moving
+ * current position after the matched token. However if this method
+ * returns a suggested new token to insert before the provided one,
+ * the state of the list does not change.
+ * @return Boolean.TRUE if the match is found,
+ * Boolean.FALSE if the match is not possible and no token can be
+ * inserted to make the match valid. Otherwise, returns the
+ * token object that can be inserted before the last token in the
+ * list, probably (not for sure) making the match valid.
+ */
+ public Object show(Object x)
+ {
+ if (compare(x))
+ return performMatch(x) ? Boolean.TRUE : Boolean.FALSE;
+
+ Object recommended = findFreeNode();
+ return recommended != null ? recommended : Boolean.FALSE;
+ }
+
+ /**
+ * Check if it would be a valid case if this node is visited zero times.
+ * Nodes with unary operator * or ? need not be matched to make a
+ * model valid.
+ */
+ public boolean silenceAllowed()
+ {
+ return unary == '?' || unary == '*';
+ }
+
+ /**
+ * Returns a string representation of the list.
+ * @return String representation, similar to BNF expression.
+ */
+ public String toString()
+ {
+ CPStringBuilder b = new CPStringBuilder();
+
+ b.append(token);
+ if (unary != 0)
+ b.append((char) unary);
+ else
+ b.append('\'');
+
+ return b.toString();
+ }
+
+ /**
+ * Check if the node state is valid.
+ */
+ public boolean valid()
+ {
+ switch (unary)
+ {
+ case 0 :
+ if (binary == '|')
+ return true;
+ else
+ return visits == 1;
+
+ case '*' :
+ return true;
+
+ case '+' :
+ return visits > 0;
+
+ case '?' :
+ return visits <= 1;
+
+ default :
+ throw new Error("Invalid unary operation " + unary + " ( '" +
+ (char) unary + "' )"
+ );
+ }
+ }
+
+ public boolean validPreliminary()
+ {
+ return visits == 0 || valid();
+ }
+
+ /**
+ * Closes this node and, if closePrevious() returs true, calls close() for
+ * the previous node.
+ */
+ protected void close()
+ {
+ _closed = true;
+ if (previous != null && closePrevious())
+ previous.close();
+ }
+
+ /**
+ * Compare the provided token object with the token object of this node.
+ */
+ protected boolean compare(Object a_token)
+ {
+ if (token instanceof Object[])
+ throw new Error("Invalid token object, probably the 'list' " +
+ "should be used. "
+ );
+
+ if (token instanceof node[])
+ throw new Error("Do not use 'node' for the array of nodes, use 'list'. ");
+
+ if (token instanceof node)
+ {
+ return ((node) token).performMatch(a_token);
+ }
+
+ boolean rt = false;
+
+ if (token == a_token)
+ rt = true;
+ if (token.equals(a_token))
+ rt = true;
+ if (token.toString().equalsIgnoreCase(a_token.toString()))
+ rt = true;
+
+ return rt;
+ }
+
+ /**
+ * Fire the changes that must happen then the token matches this node.
+ */
+ protected void matches()
+ {
+ visits++;
+ if (mustClose())
+ close();
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/models/package.html b/libjava/classpath/gnu/javax/swing/text/html/parser/models/package.html
new file mode 100644
index 000000000..18e61aede
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/models/package.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<!-- package.html - describes classes in javax.swing.text.html.parser package.
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. -->
+
+<html>
+<head><title>GNU Classpath - gnu.javax.swing.text.html.parser.models</title></head>
+
+<body>
+<p>This package contains classes for working with content models. In this implementation, the
+standardized content model is pre-processed by <code>transformer</code> into an instance of
+<code>node</code>. Node holds a single element of the content model with the optional unary operation.
+The derived class <code>list</code> holds multiple nodes connected by the same binary operation.
+As the members of this <code>list</code> can also be lists itself, these structures support
+the most of required operations. Several cases when the model cannot be expressed using
+BNF syntax are handled providing specialised classes that are also derived from <code>node</code>.
+</p>
+@author Audrius Meskauskas, Lithuania
+</body>
+</html>
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/models/transformer.java b/libjava/classpath/gnu/javax/swing/text/html/parser/models/transformer.java
new file mode 100644
index 000000000..22ae3c3fa
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/models/transformer.java
@@ -0,0 +1,201 @@
+/* transformer.java -- Content model transforms.
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.parser.models;
+
+import java.io.Serializable;
+
+import javax.swing.text.html.parser.ContentModel;
+import javax.swing.text.html.parser.DTD;
+
+/**
+ * Transforms the standard ContentModel tree into the internal representation,
+ * used in this implementation.
+ * @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
+ */
+public class transformer
+ implements Serializable
+{
+ private static final long serialVersionUID = 1;
+
+ /**
+ * All binary operators.
+ */
+ protected static String binary = "&|,";
+
+ /**
+ * All unary operators.
+ */
+ protected static String unary = "+*?";
+
+ /**
+ * Measure length of the linked list of the content models.
+ * @param c The heading element of the linked list.
+ * @return the length of the list (0 for null 1 if c!=null and c.next==null,
+ * etc.
+ */
+ public static int measureChainLength(ContentModel c)
+ {
+ if (c == null)
+ return 0;
+ else
+ return measureChainLength(c.next) + 1;
+ }
+
+ /**
+ * Transform into internal representation without usind dtd.
+ * This should be used only for testing.
+ */
+ public static node transform(ContentModel c)
+ {
+ return transform(c, null);
+ }
+
+ /**
+ * Transform into internal representation.
+ * @param c a model to transform
+ * @return a transformed model
+ * @throws Error if the model structure contains errors.
+ */
+ public static node transform(ContentModel c, DTD dtd)
+ {
+ // Handle the special cases first.
+ if (c.content instanceof node)
+ return (node) c.content;
+
+ // Do the typical transform.
+ node n;
+
+ /* Case with the single token */
+ if (c.next == null)
+ {
+ n = optionalTransform(c, dtd);
+ }
+ else /* Case with the chain of the multiple tokens. */
+ {
+ node[] l = new node[ measureChainLength(c) ];
+ ContentModel m = c;
+ for (int i = 0; i < l.length; i++)
+ {
+ if (m.content instanceof ContentModel)
+ {
+ ContentModel nested = (ContentModel) m.content;
+ if (nested.next == null &&
+ !(nested.content instanceof ContentModel)
+ )
+ {
+ l [ i ] =
+ new node((char) m.type, (char) nested.type, nested.content);
+ }
+ else
+ {
+ l [ i ] = transform(nested, dtd);
+ }
+ }
+ else
+ l [ i ] = new node((char) 0, (char) 0, m.content);
+ addtype(l [ i ], (char) m.type);
+ m = m.next;
+ }
+
+ if (isBinary(c.type))
+ for (int i = 0; i < l.length; i++)
+ {
+ l [ i ].binary = (char) c.type;
+ }
+
+ n = new list(l);
+ }
+
+ addtype(n, (char) c.type);
+
+ return n;
+ }
+
+ /**
+ * True for binary operator
+ * @param c a character to test
+ * @return true for [ ,&| ], false otherwise.
+ */
+ private static boolean isBinary(int c)
+ {
+ return binary.indexOf((char) c) >= 0;
+ }
+
+ /**
+ * True for unary operator.
+ * @param c a character to test
+ * @return true for [ +?* ], false otherwise.
+ */
+ private static boolean isUnary(int c)
+ {
+ return unary.indexOf((char) c) >= 0;
+ }
+
+ /**
+ * Assign an operation type for the given node.
+ * @param n A node to set the operation to.
+ * @param type Either binary or unary operation, is assigned to the
+ * corresponding field of the node.
+ * @throws error if the operation type is not
+ * representing a valid unary or binary operation.
+ */
+ private static void addtype(node n, char type)
+ {
+ if (isBinary(type))
+ n.binary = type;
+
+ else if (isUnary(type))
+ n.unary = type;
+
+ else if (type != 0)
+ throw new Error("Invalid operation '" + (char) type + "'");
+ }
+
+ private static node optionalTransform(ContentModel c, DTD dtd)
+ {
+ node n;
+ if (c.content instanceof ContentModel)
+ n = transform((ContentModel) c.content, dtd);
+ else
+
+ /* A single token with the specified operation */
+ n = new node((char) 0, (char) 0, c.content);
+ return n;
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/package.html b/libjava/classpath/gnu/javax/swing/text/html/parser/package.html
new file mode 100644
index 000000000..cd050f9c2
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/package.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<!-- package.html - describes classes in javax.swing.text.html.parser package.
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. -->
+
+<html>
+<head><title>GNU Classpath - javax.swing.text.html.parser</title></head>
+
+<body>
+<p>Provides the error tolerant, DTD-driven HTML 4.01 parser.
+The parser that is used in web robots, html content analysers,
+web browsers, web editors and other related applications.
+It should compativle with the older HTML versions, supporting
+obsoleted HTML featues. This package also includes some
+supporting classes.</p>
+@author Audrius Meskauskas, Lithuania
+</body>
+</html>
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/support/Parser.java b/libjava/classpath/gnu/javax/swing/text/html/parser/support/Parser.java
new file mode 100644
index 000000000..cdefb75c8
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/support/Parser.java
@@ -0,0 +1,1532 @@
+/* Parser.java -- HTML parser.
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.parser.support;
+
+import gnu.java.lang.CPStringBuilder;
+
+import gnu.javax.swing.text.html.parser.htmlAttributeSet;
+import gnu.javax.swing.text.html.parser.htmlValidator;
+import gnu.javax.swing.text.html.parser.support.low.Constants;
+import gnu.javax.swing.text.html.parser.support.low.ParseException;
+import gnu.javax.swing.text.html.parser.support.low.ReaderTokenizer;
+import gnu.javax.swing.text.html.parser.support.low.Token;
+import gnu.javax.swing.text.html.parser.support.low.node;
+import gnu.javax.swing.text.html.parser.support.low.pattern;
+
+import java.io.IOException;
+import java.io.Reader;
+
+import java.util.Comparator;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.Vector;
+
+import javax.swing.text.ChangedCharSetException;
+import javax.swing.text.SimpleAttributeSet;
+import javax.swing.text.html.HTML;
+import javax.swing.text.html.parser.AttributeList;
+import javax.swing.text.html.parser.DTD;
+import javax.swing.text.html.parser.DTDConstants;
+import javax.swing.text.html.parser.Element;
+import javax.swing.text.html.parser.Entity;
+import javax.swing.text.html.parser.TagElement;
+
+/**
+ * <p>A simple error-tolerant HTML parser that uses a DTD document
+ * to access data on the possible tokens, arguments and syntax.</p>
+ * <p> The parser reads an HTML content from a Reader and calls various
+ * notifying methods (which should be overridden in a subclass)
+ * when tags or data are encountered.</p>
+ * <p>Some HTML elements need no opening or closing tags. The
+ * task of this parser is to invoke the tag handling methods also when
+ * the tags are not explicitly specified and must be supposed using
+ * information, stored in the DTD.
+ * For example, parsing the document
+ * <p>&lt;table&gt;&lt;tr&gt;&lt;td&gt;a&lt;td&gt;b&lt;td&gt;c&lt;/tr&gt; <br>
+ * will invoke exactly the handling methods exactly in the same order
+ * (and with the same parameters) as if parsing the document: <br>
+ * <em>&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;table&gt;&lt;
+ * tbody&gt;</em>&lt;tr&gt;&lt;td&gt;a<em>&lt;/td&gt;</em>&lt;td&gt;b<em>
+ * &lt;/td&gt;</em>&lt;td&gt;c<em>&lt;/td&gt;&lt;/tr&gt;</em>&lt;
+ * <em>/tbody&gt;&lt;/table&gt;&lt;/body&gt;&lt;/html&gt;</em></p>
+ * (supposed tags are given in italics). The parser also supports
+ * obsolete elements of HTML syntax.<p>
+ * </p>
+ * @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
+ */
+public class Parser
+ extends ReaderTokenizer
+ implements DTDConstants
+{
+ /**
+ * The current html tag.
+ */
+ public Token hTag = new Token();
+
+ /**
+ * The document template description that will be used to parse the documents.
+ */
+ protected DTD dtd;
+
+ /**
+ * The value of this field determines whether or not the Parser will be
+ * strict in enforcing SGML compatibility. The default value is false,
+ * stating that the parser should do everything to parse and get at least
+ * some information even from the incorrectly written HTML input.
+ */
+ protected boolean strict;
+
+ /**
+ * This fields has positive values in preformatted tags.
+ */
+ protected int preformatted = 0;
+
+ /**
+ * The set of the document tags. This field is used for supporting
+ * markFirstTime().
+ */
+ private Set documentTags =
+ new TreeSet(new Comparator()
+ {
+ public int compare(Object a, Object b)
+ {
+ return ((String) a).compareToIgnoreCase((String) b);
+ }
+ }
+ );
+
+ /**
+ * The buffer to collect the incremental output like text or coment.
+ */
+ private final StringBuffer buffer = new StringBuffer();
+
+ /**
+ * The buffer to store the document title.
+ */
+ private final StringBuffer title = new StringBuffer();
+
+ /**
+ * The current token.
+ */
+ private Token t;
+
+ /**
+ * True means that the 'title' tag of this document has
+ * already been handled.
+ */
+ private boolean titleHandled;
+
+ /**
+ * True means that the 'title' tag is currently open and all
+ * text is also added to the title buffer.
+ */
+ private boolean titleOpen;
+
+ /**
+ * The attributes of the current HTML element.
+ * Package-private to avoid an accessor method.
+ */
+ htmlAttributeSet attributes =
+ htmlAttributeSet.EMPTY_HTML_ATTRIBUTE_SET;
+
+ /**
+ * The validator, controlling the forcible closing of the tags that
+ * (in accordance to dtd) are not allowed in the current context.
+ */
+ private htmlValidator validator;
+
+ /**
+ * Provides the default values for parameters in the case when these
+ * values are defined in the DTD.
+ */
+ private parameterDefaulter defaulter;
+
+ /**
+ * The text pre-processor for handling line ends and tabs.
+ */
+ private textPreProcessor textProcessor = new textPreProcessor();
+
+ /**
+ * Creates a new Parser that uses the given
+ * {@link javax.swing.text.html.parser.DTD }. The only standard way
+ * to get an instance of DTD is to construct it manually, filling in
+ * all required fields.
+ * @param a_dtd The DTD to use. The parser behaviour after passing null
+ * as an argument is not documented and may vary between implementations.
+ */
+ public Parser(DTD a_dtd)
+ {
+ if (a_dtd == null)
+ dtd = gnu.javax.swing.text.html.parser.HTML_401F.getInstance();
+ else
+ dtd = a_dtd;
+
+ defaulter = new parameterDefaulter(dtd);
+
+ validator =
+ new htmlValidator(dtd)
+ {
+ /**
+ * Handles the error message. This method must be overridden to pass
+ * the message where required.
+ * @param msg The message text.
+ */
+ protected void s_error(String msg)
+ {
+ error(msg);
+ }
+
+ /**
+ * The method is called when the tag validator decides to close the
+ * tag on its own initiative. After reaching the end of stream,
+ * The tag validator closes all unclosed elements that are required
+ * to have the end (closing) tag.
+ *
+ * @param tElement The tag being fictionally (forcibly) closed.
+ */
+ protected void handleSupposedEndTag(Element tElement)
+ {
+ // The tag is cloned as the original tElement is the
+ // element from the starting tag - may be accidently used
+ // somewhere else.
+ TagElement tag = makeTag(tElement, true);
+ _handleEndTag_remaining(tag);
+ }
+
+ /**
+ * The method is called when the the tag validator decides to open
+ * the new tag on its own initiative. The tags, opened in this
+ * way, are HTML, HEAD and BODY. The attribute set is temporary
+ * assigned to the empty one, the previous value is
+ * restored before return.
+ *
+ * @param tElement The tag being fictionally (forcibly) closed.
+ */
+ protected void handleSupposedStartTag(Element tElement)
+ {
+ TagElement tag = makeTag(tElement, true);
+ htmlAttributeSet were = attributes;
+ attributes = htmlAttributeSet.EMPTY_HTML_ATTRIBUTE_SET;
+ _handleStartTag(tag);
+ attributes = were;
+ }
+ };
+ }
+
+ /**
+ * Get the attributes of the current tag.
+ * @return The attribute set, representing the attributes of the current tag.
+ */
+ public SimpleAttributeSet getAttributes()
+ {
+ return new SimpleAttributeSet(attributes);
+ }
+
+ /**
+ * Invokes the error handler. The default method in this implementation
+ * delegates the call to handleError, also providing the current line.
+ */
+ public void error(String msg)
+ {
+ error(msg, getTokenAhead());
+ }
+
+ public void error(String msg, Token atToken)
+ {
+ if (atToken != null)
+ handleError(atToken.where.beginLine,
+ msg + ": line " + atToken.where.beginLine +
+ ", absolute pos " + atToken.where.startPosition
+ );
+ else
+ handleError(0, msg);
+ }
+
+ /**
+ * Invokes the error handler. The default method in this implementation
+ * delegates the call to error (parm1+": '"+parm2+"'").
+ */
+ public void error(String msg, String invalid)
+ {
+ error(msg + ": '" + invalid + "'");
+ }
+
+ /**
+ * Invokes the error handler. The default method in this implementation
+ * delegates the call to error (parm1+" "+ parm2+" "+ parm3).
+ */
+ public void error(String parm1, String parm2, String parm3)
+ {
+ error(parm1 + " " + parm2 + " " + parm3);
+ }
+
+ /**
+ * Invokes the error handler. The default method in this implementation
+ * delegates the call to error (parm1+" "+ parm2+" "+ parm3+" "+ parm4).
+ */
+ public void error(String parm1, String parm2, String parm3, String parm4)
+ {
+ error(parm1 + " " + parm2 + " " + parm3 + " " + parm4);
+ }
+
+ public void flushAttributes()
+ {
+ }
+
+ /**
+ * Parse the HTML text, calling various methods in response to the
+ * occurence of the corresponding HTML constructions.
+ * @param reader The reader to read the source HTML from.
+ * @throws IOException If the reader throws one.
+ */
+ public synchronized void parse(Reader reader)
+ throws IOException
+ {
+ reset(reader);
+ restart();
+ try
+ {
+ parseDocument();
+ validator.closeAll();
+ }
+ catch (ParseException ex)
+ {
+ if (ex != null)
+ {
+ error("Unable to continue parsing the document", ex.getMessage());
+
+ Throwable cause = ex.getCause();
+ if (cause instanceof IOException)
+ throw (IOException) cause;
+ }
+ }
+ }
+
+ /**
+ * Parses DTD markup declaration. Currently returns null without action.
+ * @return null.
+ * @throws IOException
+ */
+ public String parseDTDMarkup()
+ throws IOException
+ {
+ return null;
+ }
+
+ /**
+ * Parse SGML insertion ( &lt;! ... &gt; ). When the
+ * the SGML insertion is found, this method is called, passing
+ * SGML in the string buffer as a parameter. The default method
+ * returns false without action and can be overridden to
+ * implement user - defined SGML support.
+ * <p>
+ * If you need more information about SGML insertions in HTML documents,
+ * the author suggests to read SGML tutorial on
+ * {@link http://www.w3.org/TR/WD-html40-970708/intro/sgmltut.html}.
+ * We also recommend Goldfarb C.F (1991) <i>The SGML Handbook</i>,
+ * Oxford University Press, 688 p, ISBN: 0198537379.
+ * </p>
+ * @param strBuff
+ * @return true if this is a valid DTD markup declaration.
+ * @throws IOException
+ */
+ public boolean parseMarkupDeclarations(StringBuffer strBuff)
+ throws IOException
+ {
+ return false;
+ }
+
+ /**
+ * Get the first line of the last parsed token.
+ */
+ protected int getCurrentLine()
+ {
+ return hTag.where.beginLine;
+ }
+
+ /**
+ * Read parseable character data, add to buffer.
+ * @param clearBuffer If true, buffer if filled by CDATA section,
+ * otherwise the section is appended to the existing content of the
+ * buffer.
+ *
+ * @throws ParseException
+ */
+ protected void CDATA(boolean clearBuffer)
+ throws ParseException
+ {
+ Token start = hTag = getTokenAhead();
+
+ if (clearBuffer)
+ buffer.setLength(0);
+
+ // Handle expected EOF.
+ if (start.kind == EOF)
+ return;
+
+ read:
+ while (true)
+ {
+ t = getTokenAhead();
+ if (t.kind == EOF)
+ {
+ error("unexpected eof", t);
+ break read;
+ }
+ else if (t.kind == BEGIN)
+ break read;
+ else if (t.kind == Constants.ENTITY)
+ {
+ resolveAndAppendEntity(t);
+ getNextToken();
+ }
+ else
+ {
+ append(t);
+ getNextToken();
+ }
+ }
+ hTag = new Token(start, getTokenAhead(0));
+ if (buffer.length() != 0)
+ _handleText();
+ }
+
+ /**
+ * Process Comment. This method skips till --> without
+ * taking SGML constructs into consideration. The supported SGML
+ * constructs are handled separately.
+ */
+ protected void Comment()
+ throws ParseException
+ {
+ buffer.setLength(0);
+
+ Token start = hTag = mustBe(BEGIN);
+ optional(WS);
+ mustBe(EXCLAMATION);
+ optional(WS);
+ mustBe(DOUBLE_DASH);
+
+ Token t;
+ Token last;
+
+ comment:
+ while (true)
+ {
+ t = getTokenAhead();
+ if (t.kind == EOF)
+ {
+ handleEOFInComment();
+ last = t;
+ break comment;
+ }
+ else if (COMMENT_END.matches(this))
+ {
+ mustBe(DOUBLE_DASH);
+ optional(WS);
+ last = mustBe(END);
+ break comment;
+ }
+ else if (COMMENT_TRIPLEDASH_END.matches(this))
+ {
+ mustBe(DOUBLE_DASH);
+ t = mustBe(NUMTOKEN);
+ if (t.getImage().equals("-"))
+ {
+ append(t);
+ last = mustBe(END);
+ break comment;
+ }
+ else
+ {
+ buffer.append("--");
+ append(t);
+ t = getTokenAhead();
+ }
+ }
+ else
+ /* The lllll-- can match as NUMTOKEN */
+ if ((t.getImage().endsWith("--")) &&
+ (
+ getTokenAhead(1).kind == END ||
+ (getTokenAhead(1).kind == WS && getTokenAhead(2).kind == END)
+ )
+ )
+ {
+ buffer.append(t.getImage().substring(0, t.getImage().length() - 2));
+
+ /* Skip the closing > that we have already checked. */
+ last = mustBe(t.kind);
+ break comment;
+ }
+ else
+ append(t);
+ mustBe(t.kind);
+ }
+ hTag = new Token(start, last);
+
+ // Consume any whitespace immediately following a comment.
+ optional(WS);
+ handleComment();
+ }
+
+ /**
+ * Read a script. The text, returned without any changes,
+ * is terminated only by the closing tag SCRIPT.
+ */
+ protected void Script()
+ throws ParseException
+ {
+ Token name;
+
+ Token start = hTag = mustBe(BEGIN);
+ optional(WS);
+
+ name = mustBe(SCRIPT);
+
+ optional(WS);
+
+ restOfTag(false, name, start);
+
+ buffer.setLength(0);
+
+ while (!SCRIPT_CLOSE.matches(this))
+ {
+ append(getNextToken());
+ }
+
+ consume(SCRIPT_CLOSE);
+
+ _handleText();
+
+ endTag(false);
+ _handleEndTag(makeTagElement(name.getImage(), false));
+ }
+
+ /**
+ * Process SGML insertion that is not a comment.
+ */
+ protected void Sgml()
+ throws ParseException
+ {
+ if (COMMENT_OPEN.matches(this))
+ Comment();
+ else // skip till ">"
+ {
+ Token start = hTag = mustBe(BEGIN);
+ optional(WS);
+ mustBe(EXCLAMATION);
+
+ buffer.setLength(0);
+ read:
+ while (true)
+ {
+ t = getNextToken();
+ if (t.kind == Constants.ENTITY)
+ {
+ resolveAndAppendEntity(t);
+ }
+ else if (t.kind == EOF)
+ {
+ error("unexpected eof", t);
+ break read;
+ }
+ else if (t.kind == END)
+ break read;
+ else
+ append(t);
+ }
+
+ try
+ {
+ parseMarkupDeclarations(buffer);
+ }
+ catch (IOException ex)
+ {
+ error("Unable to parse SGML insertion: '" + buffer + "'",
+ new Token(start, t)
+ );
+ }
+ }
+ // Consume any whitespace that follows the Sgml insertion.
+ optional(WS);
+ }
+
+ /**
+ * Read a style definition. The text, returned without any changes,
+ * is terminated only by the closing tag STYLE.
+ */
+ protected void Style()
+ throws ParseException
+ {
+ Token name;
+
+ Token start = hTag = mustBe(BEGIN);
+ optional(WS);
+
+ name = mustBe(STYLE);
+
+ optional(WS);
+
+ restOfTag(false, name, start);
+
+ buffer.setLength(0);
+
+ while (!STYLE_CLOSE.matches(this))
+ {
+ append(getNextToken());
+ }
+
+ consume(STYLE_CLOSE);
+
+ _handleText();
+
+ endTag(false);
+ _handleEndTag(makeTagElement(name.getImage(), false));
+ }
+
+ /**
+ * Read a html tag.
+ */
+ protected void Tag()
+ throws ParseException
+ {
+ mark(true);
+
+ boolean closing = false;
+ Token name;
+ Token start = hTag = mustBe(BEGIN);
+
+ optional(WS);
+ name = getNextToken();
+ optional(WS);
+
+ if (name.kind == SLASH)
+ {
+ closing = true;
+ name = getNextToken();
+ }
+
+ restOfTag(closing, name, start);
+ }
+
+ /**
+ * A hook, for operations, preceeding call to handleText.
+ * Handle text in a string buffer.
+ * In non - preformatted mode, all line breaks immediately following the
+ * start tag and immediately before an end tag is discarded,
+ * \r, \n and \t are replaced by spaces, multiple space are replaced
+ * by the single one and the result is moved into array,
+ * passing it to handleText().
+ */
+ protected void _handleText()
+ {
+ char[] text;
+
+ if (preformatted > 0)
+ text = textProcessor.preprocessPreformatted(buffer);
+ else
+ text = textProcessor.preprocess(buffer);
+
+ if (text != null && text.length > 0
+ // According to the specs we need to discard whitespace immediately
+ // before a closing tag.
+ && (text.length > 1 || text[0] != ' ' || ! TAG_CLOSE.matches(this)))
+ {
+ TagElement pcdata = new TagElement(dtd.getElement("#pcdata"));
+ attributes = htmlAttributeSet.EMPTY_HTML_ATTRIBUTE_SET;
+ _handleEmptyTag(pcdata);
+
+ handleText(text);
+ if (titleOpen)
+ title.append(text);
+ }
+ }
+
+ /**
+ * Add the image of this token to the buffer.
+ * @param t A token to append.
+ */
+ protected final void append(Token t)
+ {
+ if (t.kind != EOF)
+ t.appendTo(buffer);
+ }
+
+ /**
+ * Consume pattern that must match.
+ * @param p A pattern to consume.
+ */
+ protected final void consume(pattern p)
+ {
+ node n;
+ for (int i = 0; i < p.nodes.length; i++)
+ {
+ n = p.nodes [ i ];
+ if (n.optional)
+ optional(n.kind);
+ else
+ mustBe(n.kind);
+ }
+ }
+
+ /**
+ * The method is called when the HTML end (closing) tag is found or if
+ * the parser concludes that the one should be present in the
+ * current position. The method is called immediatly
+ * before calling the handleEndTag().
+ * @param omitted True if the tag is no actually present in the document,
+ * but is supposed by the parser (like &lt;/html&gt; at the end of the
+ * document).
+ */
+ protected void endTag(boolean omitted)
+ {
+ }
+
+ /**
+ * Handle HTML comment. The default method returns without action.
+ * @param comment
+ */
+ protected void handleComment(char[] comment)
+ {
+ }
+
+ /**
+ * This is additionally called in when the HTML content terminates
+ * without closing the HTML comment. This can only happen if the
+ * HTML document contains errors (for example, the closing --;gt is
+ * missing.
+ */
+ protected void handleEOFInComment()
+ {
+ error("Unclosed comment");
+ }
+
+ /**
+ * Handle the tag with no content, like &lt;br&gt;. The method is
+ * called for the elements that, in accordance with the current DTD,
+ * has an empty content.
+ * @param tag The tag being handled.
+ * @throws javax.swing.text.ChangedCharSetException
+ */
+ protected void handleEmptyTag(TagElement tag)
+ throws javax.swing.text.ChangedCharSetException
+ {
+ }
+
+ /**
+ * The method is called when the HTML closing tag ((like &lt;/table&gt;)
+ * is found or if the parser concludes that the one should be present
+ * in the current position.
+ * @param tag The tag
+ */
+ protected void handleEndTag(TagElement tag)
+ {
+ }
+
+ /* Handle error that has occured in the given line. */
+ protected void handleError(int line, String message)
+ {
+ }
+
+ /**
+ * The method is called when the HTML opening tag ((like &lt;table&gt;)
+ * is found or if the parser concludes that the one should be present
+ * in the current position.
+ * @param tag The tag
+ */
+ protected void handleStartTag(TagElement tag)
+ {
+ }
+
+ /**
+ * Handle the text section.
+ * <p> For non-preformatted section, the parser replaces
+ * \t, \r and \n by spaces and then multiple spaces
+ * by a single space. Additionaly, all whitespace around
+ * tags is discarded.
+ * </p>
+ * <p> For pre-formatted text (inside TEXAREA and PRE), the parser preserves
+ * all tabs and spaces, but removes <b>one</b> bounding \r, \n or \r\n,
+ * if it is present. Additionally, it replaces each occurence of \r or \r\n
+ * by a single \n.</p>
+ *
+ * @param text A section text.
+ */
+ protected void handleText(char[] text)
+ {
+ }
+
+ /**
+ * Handle HTML &lt;title&gt; tag. This method is invoked when
+ * both title starting and closing tags are already behind.
+ * The passed argument contains the concatenation of all
+ * title text sections.
+ * @param title The title text.
+ */
+ protected void handleTitle(char[] title)
+ {
+ }
+
+ /**
+ * Constructs the tag from the given element. In this implementation,
+ * this is defined, but never called.
+ * @return the tag
+ */
+ protected TagElement makeTag(Element element)
+ {
+ return makeTag(element, false);
+ }
+
+ /**
+ * Constructs the tag from the given element.
+ * @param the tag base {@link javax.swing.text.html.parser.Element}
+ * @param isSupposed true if the tag is not actually present in the
+ * html input, but the parser supposes that it should to occur in
+ * the current location.
+ * @return the tag
+ */
+ protected TagElement makeTag(Element element, boolean isSupposed)
+ {
+ return new TagElement(element, isSupposed);
+ }
+
+ /**
+ * This is called when the tag, representing the given element,
+ * occurs first time in the document.
+ * @param element
+ */
+ protected void markFirstTime(Element element)
+ {
+ }
+
+ /**
+ * Consume the token that was checked before and hence MUST be present.
+ * @param kind The kind of token to consume.
+ */
+ protected Token mustBe(int kind)
+ {
+ if (getTokenAhead().kind == kind)
+ return getNextToken();
+ else
+ {
+ String ei = "";
+ if (kind < 1000)
+ ei = " ('" + (char) kind + "') ";
+ throw new AssertionError("The token of kind " + kind + ei +
+ " MUST be here,"
+ );
+ }
+ }
+
+ /**
+ * Handle attribute without value. The default method uses
+ * the only allowed attribute value from DTD.
+ * If the attribute is unknown or allows several values,
+ * the HTML.NULL_ATTRIBUTE_VALUE is used. The attribute with
+ * this value is added to the attribute set.
+ * @param element The name of element.
+ * @param attribute The name of attribute without value.
+ */
+ protected void noValueAttribute(String element, String attribute)
+ {
+ Object value = HTML.NULL_ATTRIBUTE_VALUE;
+
+ Element e = dtd.elementHash.get(element.toLowerCase());
+ if (e != null)
+ {
+ AttributeList attr = e.getAttribute(attribute);
+ if (attr != null)
+ {
+ Vector values = attr.values;
+ if (values != null && values.size() == 1)
+ value = values.get(0);
+ }
+ }
+ attributes.addAttribute(attribute, value);
+ }
+
+ /**
+ * Consume the optional token, if present.
+ * @param kind The kind of token to consume.
+ */
+ protected Token optional(int kind)
+ {
+ if (getTokenAhead().kind == kind)
+ return getNextToken();
+ else
+ return null;
+ }
+
+ /** Parse the html document. */
+ protected void parseDocument()
+ throws ParseException
+ {
+ // Read up any initial whitespace.
+ optional(WS);
+ while (getTokenAhead().kind != EOF)
+ {
+ advanced = false;
+ if (TAG.matches(this))
+ Tag();
+ else if (COMMENT_OPEN.matches(this))
+ Comment();
+ else if (STYLE_OPEN.matches(this))
+ Style();
+ else if (SCRIPT_OPEN.matches(this))
+ Script();
+ else if (SGML.matches(this))
+ Sgml();
+ else
+ CDATA(true);
+
+ // Surely HTML error, treat as a text.
+ if (!advanced)
+ {
+ Token wrong = getNextToken();
+ error("unexpected '" + wrong.getImage() + "'", wrong);
+ buffer.setLength(0);
+ buffer.append(wrong.getImage());
+ _handleText();
+ }
+ }
+ }
+
+ /**
+ * Read the element attributes, adding them into attribute set.
+ * @param element The element name (needed to access attribute
+ * information in dtd).
+ */
+ protected void readAttributes(String element)
+ {
+ Token name;
+ Token value;
+ Token next;
+ String attrValue;
+
+ attributes = new htmlAttributeSet();
+
+ optional(WS);
+
+ attributeReading:
+ while (getTokenAhead().kind == NUMTOKEN)
+ {
+ name = getNextToken();
+ optional(WS);
+
+ next = getTokenAhead();
+ if (next.kind == EQ)
+ {
+ mustBe(EQ);
+ optional(WS);
+
+ next = getNextToken();
+
+ switch (next.kind)
+ {
+ case QUOT:
+
+ // read "quoted" attribute.
+ buffer.setLength(0);
+ readTillTokenE(QUOT);
+ attrValue = buffer.toString();
+ break;
+
+ case AP:
+
+ // read 'quoted' attribute.
+ buffer.setLength(0);
+ readTillTokenE(AP);
+ attrValue = buffer.toString();
+ break;
+
+ // read unquoted attribute.
+ case NUMTOKEN:
+ value = next;
+ optional(WS);
+
+ // Check maybe the opening quote is missing.
+ next = getTokenAhead();
+ if (bQUOTING.get(next.kind))
+ {
+ hTag = next;
+ error("The value without opening quote is closed with '"
+ + next.getImage() + "'");
+ attrValue = value.getImage();
+ }
+ else if (next.kind == SLASH || next.kind == OTHER)
+ // The slash and other characters (like %) in this context is
+ // treated as the ordinary
+ // character, not as a token. The character may be part of
+ // the unquoted URL.
+ {
+ CPStringBuilder image = new CPStringBuilder(value.getImage());
+ while (next.kind == NUMTOKEN || next.kind == SLASH
+ || next.kind == OTHER)
+ {
+ image.append(getNextToken().getImage());
+ next = getTokenAhead();
+ }
+ attrValue = image.toString();
+ }
+ else
+ attrValue = value.getImage();
+ break;
+
+ case SLASH:
+ value = next;
+ optional(WS);
+
+ // Check maybe the opening quote is missing.
+ next = getTokenAhead();
+ if (bQUOTING.get(next.kind))
+ {
+ hTag = next;
+ error("The value without opening quote is closed with '"
+ + next.getImage() + "'");
+ attrValue = value.getImage();
+ }
+ else if (next.kind == NUMTOKEN || next.kind == SLASH)
+ // The slash in this context is treated as the ordinary
+ // character, not as a token. The slash may be part of
+ // the unquoted URL.
+ {
+ CPStringBuilder image = new CPStringBuilder(value.getImage());
+ while (next.kind == NUMTOKEN || next.kind == SLASH)
+ {
+ image.append(getNextToken().getImage());
+ next = getTokenAhead();
+ }
+ attrValue = image.toString();
+ }
+ else
+ attrValue = value.getImage();
+ break;
+ default:
+ break attributeReading;
+ }
+ attributes.addAttribute(name.getImage(), attrValue);
+ optional(WS);
+ }
+ else
+ // The '=' is missing: attribute without value.
+ {
+ noValueAttribute(element, name.getImage());
+ }
+ }
+ }
+
+ /**
+ * Return string, corresponding the given named entity. The name is passed
+ * with the preceeding &, but without the ending semicolon.
+ */
+ protected String resolveNamedEntity(final String a_tag)
+ {
+ // Discard &
+ if (!a_tag.startsWith("&"))
+ throw new AssertionError("Named entity " + a_tag +
+ " must start witn '&'."
+ );
+
+ String tag = a_tag.substring(1);
+
+ try
+ {
+ Entity entity = dtd.getEntity(tag);
+ if (entity != null)
+ return entity.getString();
+
+ entity = dtd.getEntity(tag.toLowerCase());
+
+ if (entity != null)
+ {
+ error("The name of this entity should be in lowercase", a_tag);
+ return entity.getString();
+ }
+ }
+ catch (IndexOutOfBoundsException ibx)
+ {
+ /* The error will be reported. */
+ }
+
+ error("Unknown named entity", a_tag);
+ return a_tag;
+ }
+
+ /**
+ * Return char, corresponding the given numeric entity.
+ * The name is passed with the preceeding &#, but without
+ * the ending semicolon.
+ */
+ protected char resolveNumericEntity(final String a_tag)
+ {
+ // Discard &#
+ if (!a_tag.startsWith("&#"))
+ throw new AssertionError("Numeric entity " + a_tag +
+ " must start witn '&#'."
+ );
+
+ String tag = a_tag.substring(2);
+
+ try
+ {
+ // Determine the encoding type:
+ char cx = tag.charAt(0);
+ if (cx == 'x' || cx == 'X') // Hexadecimal &#Xnnn;
+
+ return (char) Integer.parseInt(tag.substring(1), 16);
+
+ return (char) Integer.parseInt(tag);
+ }
+
+ /* The error will be reported. */
+ catch (NumberFormatException nex)
+ {
+ }
+ catch (IndexOutOfBoundsException ix)
+ {
+ }
+
+ error("Invalid numeric entity", a_tag);
+ return '?';
+ }
+
+ /**
+ * Reset all fields into the intial default state, preparing the
+ * parset for parsing the next document.
+ */
+ protected void restart()
+ {
+ documentTags.clear();
+ titleHandled = false;
+ titleOpen = false;
+ buffer.setLength(0);
+ title.setLength(0);
+ validator.restart();
+ }
+
+ /**
+ * The method is called when the HTML opening tag ((like &lt;table&gt;)
+ * is found or if the parser concludes that the one should be present
+ * in the current position. The method is called immediately before
+ * calling the handleStartTag.
+ * @param tag The tag
+ */
+ protected void startTag(TagElement tag)
+ throws ChangedCharSetException
+ {
+ }
+
+ /**
+ * Handle a complete element, when the tag content is already present in the
+ * buffer and both starting and heading tags behind. This is called
+ * in the case when the tag text must not be parsed for the nested
+ * elements (elements STYLE and SCRIPT).
+ */
+ private void _handleCompleteElement(TagElement tag)
+ {
+ _handleStartTag(tag);
+
+ // Suppress inclusion of the SCRIPT ans STYLE texts into the title.
+ HTML.Tag h = tag.getHTMLTag();
+ if (h == HTML.Tag.SCRIPT || h == HTML.Tag.STYLE)
+ {
+ boolean tmp = titleOpen;
+ titleOpen = false;
+ _handleText();
+ titleOpen = tmp;
+ }
+ else
+ _handleText();
+
+ _handleEndTag(tag);
+ }
+
+ /**
+ * A hooks for operations, preceeding call to handleEmptyTag().
+ * Handle the tag with no content, like &lt;br&gt;. As no any
+ * nested tags are expected, the tag validator is not involved.
+ * @param tag The tag being handled.
+ */
+ private void _handleEmptyTag(TagElement tag)
+ {
+ try
+ {
+ validator.validateTag(tag, attributes);
+ handleEmptyTag(tag);
+ HTML.Tag h = tag.getHTMLTag();
+ // When a block tag is closed, consume whitespace that follows after
+ // it.
+ // For some unknown reason a FRAME tag is not treated as block element.
+ // However in this case it should be treated as such.
+ if (isBlock(h))
+ optional(WS);
+ }
+ catch (ChangedCharSetException ex)
+ {
+ error("Changed charset exception:", ex.getMessage());
+ }
+ }
+
+ /**
+ * A hooks for operations, preceeding call to handleEndTag().
+ * The method is called when the HTML closing tag
+ * is found. Calls handleTitle after closing the 'title' tag.
+ * @param tag The tag
+ */
+ private void _handleEndTag(TagElement tag)
+ {
+ if (validator.closeTag(tag))
+ _handleEndTag_remaining(tag);
+ }
+
+ /**
+ * Actions that are also required if the closing action was
+ * initiated by the tag validator.
+ * Package-private to avoid an accessor method.
+ */
+ void _handleEndTag_remaining(TagElement tag)
+ {
+ HTML.Tag h = tag.getHTMLTag();
+
+ handleEndTag(tag);
+ endTag(tag.fictional());
+
+ if (h.isPreformatted())
+ preformatted--;
+ if (preformatted < 0)
+ preformatted = 0;
+
+ // When a block tag is closed, consume whitespace that follows after
+ // it.
+ if (isBlock(h))
+ optional(WS);
+
+ if (h == HTML.Tag.TITLE)
+ {
+ titleOpen = false;
+ titleHandled = true;
+
+ char[] a = new char[ title.length() ];
+ title.getChars(0, a.length, a, 0);
+ handleTitle(a);
+ }
+ }
+
+ /**
+ * A hooks for operations, preceeding call to handleStartTag().
+ * The method is called when the HTML opening tag ((like &lt;table&gt;)
+ * is found.
+ * Package-private to avoid an accessor method.
+ * @param tag The tag
+ */
+ void _handleStartTag(TagElement tag)
+ {
+ validator.openTag(tag, attributes);
+ startingTag(tag);
+ handleStartTag(tag);
+
+ HTML.Tag h = tag.getHTMLTag();
+
+ if (isBlock(h))
+ optional(WS);
+
+ if (h.isPreformatted())
+ preformatted++;
+
+ if (h == HTML.Tag.TITLE)
+ {
+ if (titleHandled)
+ error("Repetetive <TITLE> tag");
+ titleOpen = true;
+ titleHandled = false;
+ }
+ }
+
+ /**
+ * Resume parsing after heavy errors in HTML tag structure.
+ * @throws ParseException
+ */
+ private void forciblyCloseTheTag()
+ throws ParseException
+ {
+ int closeAt = 0;
+ buffer.setLength(0);
+
+ ahead:
+ for (int i = 1; i < 100; i++)
+ {
+ t = getTokenAhead(i - 1);
+ if (t.kind == EOF || t.kind == BEGIN)
+ break ahead;
+ if (t.kind == END)
+ {
+ /* Closing '>' found. */
+ closeAt = i;
+ break ahead;
+ }
+ }
+ if (closeAt > 0)
+ {
+ buffer.append("Ignoring '");
+ for (int i = 1; i <= closeAt; i++)
+ {
+ t = getNextToken();
+ append(t);
+ }
+ buffer.append('\'');
+ error(buffer.toString());
+ }
+ }
+
+ /**
+ * Handle comment in string buffer. You can avoid allocating a char
+ * array each time by processing your comment directly here.
+ */
+ private void handleComment()
+ {
+ char[] a = new char[ buffer.length() ];
+ buffer.getChars(0, a.length, a, 0);
+ handleComment(a);
+ }
+
+ private TagElement makeTagElement(String name, boolean isSupposed)
+ {
+ Element e = dtd.elementHash.get(name.toLowerCase());
+ if (e == null)
+ {
+ error("Unknown tag <" + name + ">");
+ e = dtd.getElement(name);
+ e.name = name.toUpperCase();
+ e.index = -1;
+ }
+
+ if (!documentTags.contains(e.name))
+ {
+ markFirstTime(e);
+ documentTags.add(e.name);
+ }
+
+ return makeTag(e, isSupposed);
+ }
+
+ /**
+ * Read till the given token, resolving entities. Consume the given
+ * token without adding it to buffer.
+ * @param till The token to read till
+ * @throws ParseException
+ */
+ private void readTillTokenE(int till)
+ throws ParseException
+ {
+ buffer.setLength(0);
+ read:
+ while (true)
+ {
+ t = getNextToken();
+ if (t.kind == Constants.ENTITY)
+ {
+ resolveAndAppendEntity(t);
+ }
+ else if (t.kind == EOF)
+ {
+ error("unexpected eof", t);
+ break read;
+ }
+ else if (t.kind == till)
+ break read;
+ else if (t.kind == WS)
+ {
+ // Processing whitespace in accordance with CDATA rules:
+ String s = t.getImage();
+ char c;
+ for (int i = 0; i < s.length(); i++)
+ {
+ c = s.charAt(i);
+ if (c == '\r')
+ buffer.append(' '); // CR replaced by space
+ else if (c == '\n')
+ { /* LF ignored */ }
+ else if (c == '\t')
+ buffer.append(' '); // Tab replaced by space
+ else
+ buffer.append(c);
+ }
+ }
+ else
+ append(t);
+ }
+ }
+
+ /**
+ * Resolve the entity and append it to the end of buffer.
+ * @param entity
+ */
+ private void resolveAndAppendEntity(Token entity)
+ {
+ switch (entity.category)
+ {
+ case ENTITY_NAMED :
+ buffer.append(resolveNamedEntity(entity.getImage()));
+ break;
+
+ case ENTITY_NUMERIC :
+ buffer.append(resolveNumericEntity(entity.getImage()));
+ break;
+
+ default :
+ throw new AssertionError("Invalid entity category " +
+ entity.category
+ );
+ }
+ }
+
+ /**
+ * Handle the remaining of HTML tags. This is a common end for
+ * TAG, SCRIPT and STYLE.
+ * @param closing True for closing tags ( &lt;/TAG&gt; ).
+ * @param name Name of element
+ * @param start Token where element has started
+ * @throws ParseException
+ */
+ private void restOfTag(boolean closing, Token name, Token start)
+ throws ParseException
+ {
+ boolean end = false;
+ Token next;
+
+ optional(WS);
+
+ readAttributes(name.getImage());
+
+ optional(WS);
+
+ next = getTokenAhead();
+ if (next.kind == END)
+ {
+ mustBe(END);
+ end = true;
+ }
+
+ hTag = new Token(start, next);
+
+ if (!end)
+ {
+ // The tag body contains errors. If additionally the tag
+ // name is not valid, this construction is treated as text.
+ if (dtd.elementHash.get(name.getImage().toLowerCase()) == null &&
+ backupMode
+ )
+ {
+ error("Errors in tag body and unknown tag name. " +
+ "Treating the tag as a text."
+ );
+ reset();
+
+ hTag = mustBe(BEGIN);
+ buffer.setLength(0);
+ buffer.append(hTag.getImage());
+ CDATA(false);
+ return;
+ }
+ else
+ {
+ error("Forcibly closing invalid parameter list");
+ forciblyCloseTheTag();
+ }
+ }
+
+ if (closing)
+ {
+ endTag(false);
+ _handleEndTag(makeTagElement(name.getImage(), false));
+ }
+ else
+ {
+ TagElement te = makeTagElement(name.getImage(), false);
+ if (te.getElement().type == DTDConstants.EMPTY)
+ _handleEmptyTag(te);
+ else
+ {
+ // According to the specs we need to consume whitespace following
+ // immediately after a opening tag.
+ optional(WS);
+ _handleStartTag(te);
+ }
+ }
+ }
+
+ /**
+ * This should fire additional actions in response to the
+ * ChangedCharSetException. The current implementation
+ * does nothing.
+ * @param tag
+ */
+ private void startingTag(TagElement tag)
+ {
+ try
+ {
+ startTag(tag);
+ }
+ catch (ChangedCharSetException cax)
+ {
+ error("Invalid change of charset");
+ }
+ }
+
+ private void ws_error()
+ {
+ error("Whitespace here is not permitted");
+ }
+
+ /**
+ * Returns true when the specified tag should be considered a block tag
+ * wrt whitespace handling. We need this special handling, since there
+ * are a couple of tags that we must treat as block tags but which aren't
+ * officially block tags.
+ *
+ * @param tag the tag to check
+ * @return true when the specified tag should be considered a block tag
+ * wrt whitespace handling
+ */
+ private boolean isBlock(HTML.Tag tag)
+ {
+ return tag.isBlock() || tag == HTML.Tag.STYLE || tag == HTML.Tag.FRAME;
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/support/gnuStringIntMapper.java b/libjava/classpath/gnu/javax/swing/text/html/parser/support/gnuStringIntMapper.java
new file mode 100644
index 000000000..9cdf810dd
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/support/gnuStringIntMapper.java
@@ -0,0 +1,112 @@
+/* gnuStringIntMapper.java --
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.parser.support;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * A helper class, mapping between the strings and they unique integer
+ * identifiers.
+ * @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
+ */
+public abstract class gnuStringIntMapper
+{
+ /**
+ * Maps argument integer values from DTDConstants into they string
+ * names. Initialized on demand.
+ */
+ private Map is_Map;
+
+ /**
+ * Maps argument string names into they integer values from DTDConstants.
+ * Initialized on demand.
+ */
+ private Map si_Map;
+
+ /**
+ * Get string from id or null if no such id is present in the mapper.
+ */
+ public final String get(int id)
+ {
+ if (is_Map == null)
+ createTheMap();
+
+ return (String) is_Map.get(new Integer(id));
+ }
+
+ /** Get id from string or 0 if no such string is present in the mapper. */
+ public final int get(String id)
+ {
+ if (si_Map == null)
+ createTheMap();
+
+ Integer i = (Integer) si_Map.get(id);
+
+ return i != null ? i.intValue() : 0;
+ }
+
+ /**
+ * Create the mapping table for this mapper by adding the required
+ * String/int pairs. The method is invoked
+ * only once for each instance, after the first invocation of the any
+ * form of the <code>get</code> method. Use <code>add</code> to
+ * create a map for a concrete instance.
+ */
+ protected abstract void create();
+
+ /**
+ * Add an id/string pair to this mapper. This is called from
+ * the method <code>create</code> only.
+ */
+ protected void add(String name, int id)
+ {
+ Integer i = new Integer(id);
+ si_Map.put(name, i);
+ is_Map.put(i, name);
+ }
+
+ private void createTheMap()
+ {
+ is_Map = new HashMap();
+ si_Map = new TreeMap();
+ create();
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/Buffer.java b/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/Buffer.java
new file mode 100644
index 000000000..a39330af8
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/Buffer.java
@@ -0,0 +1,238 @@
+/* Buffer.java --
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.parser.support.low;
+
+/**
+ * A string buffer that additionally holds line and absolute postion
+ * information.
+ * @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
+ */
+public class Buffer
+{
+ public static int INITIAL_SIZE = 2048;
+
+ /**
+ * True if the \n symbol has been seen.
+ */
+ public boolean n_seen;
+
+ /**
+ * True if the \r symbol has been seen.
+ */
+ public boolean r_seen;
+ char[] chr = new char[ INITIAL_SIZE ];
+ int[] line = new int[ INITIAL_SIZE ];
+ int[] position = new int[ INITIAL_SIZE ];
+
+ /**
+ * Current line.
+ */
+ int current_line = 0;
+
+ /**
+ * Point to the next free position.
+ */
+ int length;
+
+ public Buffer()
+ {
+ }
+
+ public Buffer(String content)
+ {
+ for (int i = 0; i < content.length(); i++)
+ {
+ append(content.charAt(i), i);
+ }
+ }
+
+ /**
+ * Get the characters into array.
+ * @param srcBegin From, inclusive
+ * @param srcEnd To, exclusive.
+ * @param dst Into
+ * @param dstBegin Offset.
+ */
+ public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
+ {
+ System.arraycopy(chr, srcBegin, dst, dstBegin, (srcEnd - srcBegin));
+ }
+
+ /**
+ * Return the sequence, used to separate lines in the document.
+ * @return one of \n, \r or \r\n.
+ */
+ public String getEndOfLineSequence()
+ {
+ if (r_seen && n_seen)
+ return "\r\n";
+ else if (r_seen)
+ return "\r";
+ else
+
+ // This also is returned for single-line document.
+ return "\n";
+ }
+
+ /**
+ * Truncate.
+ * @param n The length to truncate till.
+ */
+ public void setLength(int n)
+ {
+ length = n;
+ }
+
+ /**
+ * Get location information for the given region.
+ * @param from Region start, inclusive.
+ * @param to Region end, exclusive.
+ * @return The location, covering the region.
+ */
+ public Location getLocation(int from, int to)
+ {
+ Location l = new Location();
+ l.beginLine = line [ from ];
+ l.endLine = line [ to - 1 ];
+
+ l.startPosition = position [ from ];
+ l.endPosition = position [ to - 1 ] + 1;
+
+ return l;
+ }
+
+ /**
+ * Add the character.
+ * @param c The character.
+ * @param pos The character position in the stream (the line number
+ * is handled internally in the buffer).
+ */
+ public void append(char c, int pos)
+ {
+ if (length >= chr.length)
+ expand();
+ chr [ length ] = c;
+ position [ length ] = pos;
+
+ if (c == '\n')
+ {
+ if (!r_seen)
+ current_line++;
+ n_seen = true;
+ }
+ else if (c == '\r')
+ {
+ current_line++;
+ r_seen = true;
+ }
+
+ line [ length ] = current_line;
+
+ length++;
+ }
+
+ /**
+ * Return char at the given positon.
+ */
+ public char charAt(int i)
+ {
+ return chr [ i ];
+ }
+
+ /**
+ * Delete the range
+ * @param from Start position, inclusive.
+ * @param to End position, exclusive.
+ */
+ public void delete(int from, int to)
+ {
+ int len = to - from;
+ if (len < 1)
+ throw new AssertionError("Deleting " + from + " till " + to);
+
+ int tail = length - to;
+
+ System.arraycopy(chr, to, chr, from, tail);
+ System.arraycopy(position, to, position, from, tail);
+ System.arraycopy(line, to, line, from, tail);
+ length = length - len;
+ }
+
+ /**
+ * Double the buffer size.
+ */
+ public void expand()
+ {
+ int nSize = 2 * chr.length;
+
+ char[] nchr = new char[ nSize ];
+ int[] nposition = new int[ nSize ];
+ int[] nline = new int[ nSize ];
+
+ System.arraycopy(chr, 0, nchr, 0, chr.length);
+ System.arraycopy(position, 0, nposition, 0, position.length);
+ System.arraycopy(line, 0, nline, 0, line.length);
+
+ chr = nchr;
+ position = nposition;
+ line = nline;
+ }
+
+ /**
+ * Return length of the occupied part of the buffer.
+ */
+ public int length()
+ {
+ return length;
+ }
+
+ /**
+ * Prepare for parsing the new document.
+ */
+ public void reset()
+ {
+ setLength(0);
+ r_seen = n_seen = false;
+ }
+
+ public String toString()
+ {
+ return new String(chr, 0, length);
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/Constants.java b/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/Constants.java
new file mode 100644
index 000000000..5416582ad
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/Constants.java
@@ -0,0 +1,433 @@
+/* Constants.java --
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.parser.support.low;
+
+import java.util.BitSet;
+
+/**
+ * The parser constants and operations, directly related to the parser
+ * constants.
+ * @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
+ */
+public class Constants
+{
+ /* Single character tokens are reflected into they ASCII codes. */
+
+ /**
+ * Start of HTML token.
+ */
+ public static final int BEGIN = '<';
+
+ /**
+ * End of HTML token.
+ */
+ public static final int END = '>';
+
+ /**
+ * Exclamation (indicates SGML or comment).
+ */
+ public static final int EXCLAMATION = '!';
+
+ /**
+ * Slash (indicates closing tag).
+ */
+ public static final int SLASH = '/';
+
+ /**
+ * Equals sign.
+ */
+ public static final int EQ = '=';
+
+ /**
+ * Quoting sign.
+ */
+ public static final int AP = '\'';
+
+ /**
+ * Quoting sign.
+ */
+ public static final int QUOT = '"';
+
+ /* The numbers of other tokens start outside the ascii space. */
+ /* String tokens */
+
+ /**
+ * Double dash (--)
+ */
+ public static final int DOUBLE_DASH = 1000;
+
+ /**
+ * The STYLE tag (needs special handling).
+ */
+ public static final int STYLE = 1001;
+
+ /**
+ * The SCRIPT tag (needs special handling).
+ */
+ public static final int SCRIPT = 1002;
+
+ /* Pattern tokens */
+
+ /**
+ * HTML whitespace.
+ */
+ public static final int WS = 1003;
+
+ /**
+ * Named or numeric entity,
+ */
+ public static final int ENTITY = 1004;
+
+ /**
+ * Sequence of valid name characters (can start from digit).
+ */
+ public static final int NUMTOKEN = 1005;
+
+ /* Complex tokens */
+
+ /**
+ * Comment opening sequence.
+ */
+ public static final pattern COMMENT_OPEN =
+ new pattern(new node[]
+ {
+ new node(BEGIN), new node(WS, true), new node(EXCLAMATION),
+ new node(WS, true), new node(DOUBLE_DASH),
+ }
+ );
+
+ /**
+ * Comment closing sequence
+ */
+ public static final pattern COMMENT_END =
+ new pattern(new node[]
+ {
+ new node(DOUBLE_DASH), new node(WS, true), new node(END)
+ }
+ );
+
+ /**
+ * Special case ---> (also is treated as end of comment).
+ */
+ public static final pattern COMMENT_TRIPLEDASH_END =
+ new pattern(new node[]
+ {
+ new node(DOUBLE_DASH), new node(NUMTOKEN), new node(END)
+ }
+ );
+
+ /**
+ * STYLE element heading pattern.
+ */
+ public static final pattern STYLE_OPEN =
+ new pattern(new node[] { new node(BEGIN), new node(WS, true), new node(STYLE) });
+
+ /**
+ * SCRIPT element heading pattern.
+ */
+ public static final pattern SCRIPT_OPEN =
+ new pattern(new node[] { new node(BEGIN), new node(WS, true), new node(SCRIPT) });
+
+ /**
+ * SGML element heading pattern.
+ */
+ public static final pattern SGML =
+ new pattern(new node[]
+ {
+ new node(BEGIN), new node(WS, true), new node(EXCLAMATION)
+ }
+ );
+
+ /**
+ * SCRIPT element closing pattern.
+ */
+ public static final pattern SCRIPT_CLOSE =
+ new pattern(new node[]
+ {
+ new node(BEGIN), new node(WS, true), new node(SLASH),
+ new node(WS, true), new node(SCRIPT), new node(WS, true),
+ new node(END)
+ }
+ );
+
+ /**
+ * STYLE element closing pattern.
+ */
+ public static final pattern STYLE_CLOSE =
+ new pattern(new node[]
+ {
+ new node(BEGIN), new node(WS, true), new node(SLASH),
+ new node(WS, true), new node(STYLE), new node(WS, true),
+ new node(END)
+ }
+ );
+
+ /**
+ * Ordinary HTML tag heading pattern.
+ */
+ public static final pattern TAG =
+ new pattern(new node[]
+ {
+ new node(BEGIN), new node(WS, true), new node(SLASH, true),
+ new node(WS, true), new node(NUMTOKEN)
+ }
+ );
+
+ /**
+ * Ordinary HTML tag closing pattern.
+ */
+ public static final pattern TAG_CLOSE =
+ new pattern(new node[]
+ {
+ new node(BEGIN), new node(WS, true), new node(SLASH),
+ new node(WS, true), new node(NUMTOKEN)
+ }
+ );
+
+ /* Special tokens */
+
+ /**
+ * All other tokens.
+ */
+ public static final int OTHER = 1999;
+
+ /**
+ * The UNICODE "end of text" control code
+ */
+ static final char ETX = 3;
+
+ /**
+ * End of file.
+ */
+ public static final int EOF = ETX;
+
+ /* Character categories */
+
+ /**
+ * All single char tokens.
+ */
+ public static final BitSet bSINGLE_CHAR_TOKEN = new BitSet();
+
+ /**
+ * Non letters and non numbers, allowed in HTML names.
+ */
+ public static final BitSet bSPECIAL = new BitSet();
+
+ /**
+ * All letters, used in HTML names.
+ */
+ public static final BitSet bLETTER = new BitSet();
+
+ /**
+ * Digits.
+ */
+ public static final BitSet bDIGIT = new BitSet();
+
+ /**
+ * Both line breaks.
+ */
+ public static final BitSet bLINEBREAK = new BitSet();
+
+ /**
+ * All whitespace.
+ */
+ public static final BitSet bWHITESPACE = new BitSet();
+
+ /**
+ * Both quoting characters.
+ */
+ public static final BitSet bQUOTING = new BitSet();
+
+ /**
+ * Valid name characters.
+ */
+ public static final BitSet bNAME = new BitSet();
+
+ /* Entity subcategories */
+
+ /**
+ * Named entity.
+ */
+ public static final int ENTITY_NAMED = 1;
+
+ /**
+ * Numeric entity.
+ */
+ public static final int ENTITY_NUMERIC = 2;
+
+ static
+ {
+ bQUOTING.set(AP);
+ bQUOTING.set(QUOT);
+
+ bSINGLE_CHAR_TOKEN.set(BEGIN);
+ bSINGLE_CHAR_TOKEN.set(END);
+ bSINGLE_CHAR_TOKEN.set(EXCLAMATION);
+ bSINGLE_CHAR_TOKEN.set(SLASH);
+ bSINGLE_CHAR_TOKEN.set(EQ);
+ bSINGLE_CHAR_TOKEN.set(EOF);
+
+ bSINGLE_CHAR_TOKEN.or(bQUOTING);
+
+ bLINEBREAK.set('\r');
+ bLINEBREAK.set('\n');
+
+ bWHITESPACE.set(' ');
+ bWHITESPACE.set('\t');
+ bWHITESPACE.set(0xC);
+ bWHITESPACE.or(bLINEBREAK);
+
+ for (char i = '0'; i <= '9'; i++)
+ {
+ bDIGIT.set(i);
+ }
+
+ for (char i = 'a'; i <= 'z'; i++)
+ {
+ bLETTER.set(i);
+ }
+
+ for (char i = 'A'; i <= 'Z'; i++)
+ {
+ bLETTER.set(i);
+ }
+
+ bSPECIAL.set('-');
+ bSPECIAL.set('_');
+ bSPECIAL.set(':');
+ bSPECIAL.set('.');
+
+ bNAME.or(bLETTER);
+ bNAME.or(bDIGIT);
+ bNAME.or(bSPECIAL);
+ }
+
+ /**
+ * Verifies if one of the tokens matches the end of string
+ * buffer. The last character in the string buffer is the
+ * "future character", some tokens needs to verify it the
+ * token does not continue "towards the future". If the token
+ * matches, it matches till "pre-last" character in the buffer.
+ * @param b
+ * @return
+ */
+ public Token endMatches(Buffer b)
+ {
+ if (b.length() < 2)
+ return null;
+
+ int p = b.length() - 2;
+
+ if (b.length() > 2 && b.charAt(p) == '-' && b.charAt(p - 1) == '-')
+ return new Token(DOUBLE_DASH, "--", b.getLocation(p - 1, p + 1));
+
+ char last = b.charAt(p);
+
+ if (bSINGLE_CHAR_TOKEN.get(last))
+ return new Token(last, last, b.getLocation(p, p + 1));
+
+ char future = b.charAt(p + 1);
+
+ // Check for numtokens, script and style:
+ if (bNAME.get(last) && !bNAME.get(future))
+ {
+ // Scan the history up:
+ int u = p - 1;
+ while (u >= 0 && bNAME.get(b.charAt(u)))
+ u--;
+ u++;
+
+ char[] token = new char[ p - u + 1 ];
+
+ // Found a numtoken
+ b.getChars(u, p + 1, token, 0);
+
+ // Verify for the built-in tokens:
+ String e = new String(token);
+
+ // found the entity reference
+ if (u > 0 && b.charAt(u - 1) == '&')
+ {
+ // The subsequent semicolon may be the part of the token
+ // as well. The semicolon must be ignored. This must be
+ // handled elsewhere.
+ return new Token(ENTITY, ENTITY_NAMED, "&" + e,
+ b.getLocation(u - 1, p + 1)
+ );
+ }
+
+ // found the numeric entity reference
+ if (u > 1 && b.charAt(u - 1) == '#' && b.charAt(u - 2) == '&')
+ {
+ // The subsequent semicolon may be the part of the token
+ // as well. The semicolon must be ignored. This must be
+ // handled elsewhere.
+ return new Token(ENTITY, ENTITY_NUMERIC, "&#" + e,
+ b.getLocation(u - 2, p + 2)
+ );
+ }
+
+ Location le = b.getLocation(u, p + 1);
+
+ if (e.equalsIgnoreCase("SCRIPT"))
+ return new Token(SCRIPT, e, le);
+ else if (e.equalsIgnoreCase("STYLE"))
+ return new Token(STYLE, e, le);
+ else
+ return new Token(NUMTOKEN, e, le);
+ }
+
+ // Check for whitespace
+ if (bWHITESPACE.get(last) && !bWHITESPACE.get(future))
+ {
+ // Scan the history up:
+ int u = p - 1;
+ while (u >= 0 && bWHITESPACE.get(b.charAt(u)))
+ u--;
+ u++;
+
+ char[] token = new char[ p - u + 1 ];
+ b.getChars(u, p + 1, token, 0);
+
+ return new Token(WS, new String(token), b.getLocation(u, p + 1));
+ }
+
+ return null;
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/Location.java b/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/Location.java
new file mode 100644
index 000000000..8a1cde1c8
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/Location.java
@@ -0,0 +1,83 @@
+/* Location.java --
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.parser.support.low;
+
+/**
+ * Defines a region in the text: its bounding positions and the line number.
+ * @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
+ */
+public class Location
+{
+ /**
+ * The line number, where the token starts.
+ */
+ public int beginLine;
+
+ /**
+ * The line, where the token ends.
+ */
+ public int endLine;
+
+ /**
+ * The absolute token end position in the input stream,
+ * exclusive.
+ */
+ public int endPosition;
+
+ /**
+ * The absolute token start position in the input stream,
+ * inclusive.
+ */
+ public int startPosition;
+
+ public Location()
+ {
+ }
+
+ /**
+ * Special case, used to mark EOF.
+ * @param p The total stream length.
+ */
+ public Location(int p)
+ {
+ startPosition = p;
+ endPosition = p + 1;
+ beginLine = endLine = -1;
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/ParseException.java b/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/ParseException.java
new file mode 100644
index 000000000..e71c0c1f6
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/ParseException.java
@@ -0,0 +1,51 @@
+/* ParseException.java --
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.parser.support.low;
+
+/**
+ * This can be thrown from various parsing methods.
+ */
+public class ParseException
+ extends RuntimeException
+{
+ public ParseException(String s, Throwable cause)
+ {
+ super(s, cause);
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/Queue.java b/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/Queue.java
new file mode 100644
index 000000000..31cf4bb4d
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/Queue.java
@@ -0,0 +1,142 @@
+/* Queue.java -- a token queue.
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.parser.support.low;
+
+import java.util.Arrays;
+
+/**
+ * A token queue.
+ * @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
+ */
+public class Queue
+{
+ Token[] m = new Token[ 64 ];
+ int a = 0;
+ int b = 0;
+
+ /**
+ * True for the empty queue.
+ */
+ public boolean isEmpty()
+ {
+ return size() == 0;
+ }
+
+ /**
+ * Add this trace to the end of the queue.
+ */
+ public void add(Token u)
+ {
+ if (a < m.length)
+ {
+ m [ a ] = u;
+ a++;
+ }
+ else // The end of array has been reached.
+ {
+ if (b > 0) // If some elements were deleted from the start of the queue, shift.
+ {
+ int d = b;
+ System.arraycopy(m, b, m, 0, a - b);
+ b = b - d;
+ a = a - d;
+ m [ a ] = u;
+ a++;
+ }
+ else // Enlarge the queue, doubling the size.
+ {
+ int n = m.length * 2;
+ Token[] nm = new Token[ 2 * n ];
+ System.arraycopy(m, 0, nm, 0, m.length);
+ Arrays.fill(m, null);
+
+ nm [ a ] = u;
+ m = nm;
+ a++;
+ }
+ }
+ }
+
+ /**
+ * Clear the queue.
+ */
+ public void clear()
+ {
+ a = b = 0;
+ Arrays.fill(m, null);
+ }
+
+ /**
+ * Read the value ahead. 0 is the value that will be returned with
+ * the following next. This method does not remove values from the
+ * queue. To test if there is enough tokens in the queue, size() must
+ * be checked before calling this method.
+ */
+ public Token get(int ahead)
+ {
+ int p = b + ahead;
+ if (p < a)
+ return m [ p ];
+ else
+ throw new ArrayIndexOutOfBoundsException("Not enough tokens");
+ }
+
+ /**
+ * Read the oldest value from the queue and remove this value from
+ * the queue.
+ */
+ public Token next()
+ {
+ if (a == b)
+ throw new ArrayIndexOutOfBoundsException("queue empty");
+
+ Token r = m [ b ];
+ m [ b ] = null;
+ b++;
+ return r;
+ }
+
+ /**
+ * Size of the queue.
+ */
+ public int size()
+ {
+ return a - b;
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/ReaderTokenizer.java b/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/ReaderTokenizer.java
new file mode 100644
index 000000000..45ac181b3
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/ReaderTokenizer.java
@@ -0,0 +1,373 @@
+/* ReaderTokenizer.java -- splits the input char sequence int tokens.
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.parser.support.low;
+
+import java.io.IOException;
+import java.io.Reader;
+
+/**
+ * Reader splits the input char sequence into tokens.
+ * @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
+ */
+public class ReaderTokenizer
+ extends Constants
+{
+ /**
+ * This is set to true each time the getNextToken is called.
+ * Used in preventing loops when all patterns refuse to accept
+ * the invalid input.
+ */
+ protected boolean advanced;
+
+ /**
+ * If true, the returned tokens are also placed in the backup
+ * queue.
+ */
+ protected boolean backupMode;
+
+ /**
+ * The buffer to read document into.
+ */
+ Buffer buffer = new Buffer();
+
+ /**
+ * The queue for supporting mark().
+ */
+ Queue backup = new Queue();
+
+ /**
+ * The queue of found tokens.
+ */
+ Queue queue = new Queue();
+
+ /**
+ * The reader to read the document from.
+ */
+ Reader reader;
+
+ /**
+ * Array of char tokens
+ */
+ char[] charTokens;
+
+ /**
+ * Array of string tokens.
+ */
+ String[] stringTokens;
+
+ /**
+ * The current reader position.
+ */
+ int readerPosition = -1;
+
+ /**
+ * Creates a new ReaderTokenizer. The reset(...) method must be
+ * subsequently called to set the reader.
+ */
+ public ReaderTokenizer()
+ {
+ }
+
+ /**
+ * Return the sequence, used to separate lines in the document.
+ * @return one of \n, \r or \r\n.
+ */
+ public String getEndOfLineSequence()
+ {
+ return buffer.getEndOfLineSequence();
+ }
+
+ /**
+ * Get the next token.
+ * @return
+ */
+ public Token getNextToken()
+ {
+ Token rt;
+ advanced = true;
+ try
+ {
+ if (queue.isEmpty())
+ read(1);
+
+ if (!queue.isEmpty())
+ rt = queue.next();
+ else
+ rt = new Token(EOF, new Location(readerPosition));
+ }
+ catch (IOException ex)
+ {
+ throw new ParseException("IO Exception", ex);
+ }
+ if (backupMode)
+ backup.add(rt);
+ return rt;
+ }
+
+ /**
+ * Get a token, lying the given number of tokens
+ * ahead. getToken(0) will return the same token,
+ * what would be returned by getNextToken().
+ * getToken(..) does change the current position
+ * in the input stream. If the end of stream is
+ * reached, the EOF token is always returned.
+ */
+ public Token getTokenAhead(int ahead)
+ {
+ try
+ {
+ read(ahead - queue.size() + 1);
+ return queue.size() >= ahead ? queue.get(ahead) : eofToken();
+ }
+ catch (IOException ex)
+ {
+ throw new ParseException("IO Exception", ex);
+ }
+ }
+
+ /**
+ * Get a token, bein immediatley ahead.
+ * If the end of stream is
+ * reached, the EOF token is always returned.
+ * The method is equivalent calling getTokenAhead(0).
+ */
+ public Token getTokenAhead()
+ {
+ try
+ {
+ if (queue.isEmpty())
+ read(1);
+ if (!queue.isEmpty())
+ return queue.get(0);
+ else
+ return eofToken();
+ }
+ catch (IOException ex)
+ {
+ throw new ParseException("IO Exception", ex);
+ }
+ }
+
+ /**
+ * Invokes the error handler.
+ */
+ public void error(String msg, Token at)
+ {
+ System.out.println(msg);
+ }
+
+ /**
+ * Turns the backup mode on or off.
+ * It is possible to return where the mark(true) was last called
+ * by calling reset().
+ * @param mode True if it is required to save tokens, making
+ * returning to the current point possible.
+ */
+ public void mark(boolean mode)
+ {
+ backup.clear();
+ backupMode = mode;
+ }
+
+ /**
+ * Prepare for new parsing from the given stream.
+ * @param a_reader A reader to parse from.
+ */
+ public void reset(Reader a_reader)
+ {
+ reader = a_reader;
+ readerPosition = -1;
+ buffer.reset();
+ queue.clear();
+ }
+
+ /**
+ * Reset the internal cursor to the position where the mark()
+ * was last time called. Switches the backup mode off.
+ */
+ public void reset()
+ {
+ if (!backupMode)
+ throw new AssertionError("Call mark(true) before using reset()!");
+ backupMode = false;
+
+ // That is now in the queue, will be appended to the end of backup.
+ while (!queue.isEmpty())
+ backup.add(queue.next());
+
+ Queue t = queue;
+ queue = backup;
+ backup = t;
+ backup.clear();
+ }
+
+ /**
+ * Read the given number of the tokens. Add the needed number of EOF
+ * tokens if there are no more data in the stream.
+ * @param numberOfTokens The number of additional tokens to read.
+ */
+ void read(int numberOfTokens)
+ throws IOException
+ {
+ if (numberOfTokens <= 0)
+ return;
+
+ for (int i = 0; i < numberOfTokens; i++)
+ readToken();
+ }
+
+ /**
+ * Read next token from the reader, add it to the queue
+ */
+ void readToken()
+ throws IOException
+ {
+ Token t;
+ int ch;
+
+ enlarging:
+ while (true)
+ {
+ t = tokenMatches();
+ if (t != null)
+ break enlarging;
+ else
+ {
+ ch = reader.read();
+ readerPosition++;
+ if (ch == ETX)
+ ch = ' ';
+ if (ch < 0)
+ {
+ if (buffer.length() == 0)
+ {
+ queue.add(eofToken());
+ return;
+ }
+ else
+ {
+ if (buffer.charAt(buffer.length() - 1) != ETX)
+ buffer.append(ETX, readerPosition++);
+ else
+ {
+ // Discard terminating ETX
+ buffer.setLength(buffer.length() - 1);
+ if (buffer.length() > 0)
+ {
+ t = new Token(OTHER, buffer.toString(),
+ buffer.getLocation(0, buffer.length())
+ );
+ queue.add(t);
+ buffer.setLength(0);
+ }
+ return;
+ }
+ }
+ }
+ else
+ buffer.append((char) ch, readerPosition);
+ }
+ }
+ }
+
+ /**
+ * Check if the end of buffer matches one of the tokens. If it does,
+ * return this token and remove the token sequence from the end of
+ * buffer.
+ * @return The matching token.
+ */
+ Token tokenMatches()
+ {
+ Token rt = endMatches(buffer);
+ if (rt != null) // Remove the matched image
+ {
+ // Consume future character if it was an entity and the future
+ // character is semicolon.
+ if (rt.kind == ENTITY)
+ {
+ if (buffer.charAt(buffer.length() - 1) == ';')
+ buffer.setLength(buffer.length() - rt.getImage().length() - 1);
+ else
+ {
+ error("Missing closing semicolon for entity '" + rt.getImage() +
+ "'", rt
+ );
+ consumeBuffer(rt);
+ }
+ }
+ else
+ {
+ consumeBuffer(rt);
+ }
+ }
+
+ // If the buffer is not empty, some sequence does not match any tokens.
+ // Add it to the queue as "OTHER".
+ if (rt != null)
+ {
+ if (buffer.length() > 1)
+ {
+ String rest = buffer.toString();
+ rest = rest.substring(0, rest.length() - 1);
+
+ Token other =
+ new Token(OTHER, rest, buffer.getLocation(0, buffer.length));
+ queue.add(other);
+ consumeBuffer(other);
+ }
+ queue.add(rt);
+ }
+ return rt;
+ }
+
+ private void consumeBuffer(Token rt)
+ {
+ buffer.delete(buffer.length() - rt.getImage().length() - 1,
+ buffer.length() - 1
+ );
+ }
+
+ /**
+ * Create EOF token.
+ */
+ private Token eofToken()
+ {
+ return new Token(EOF, "#", new Location(readerPosition));
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/Token.java b/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/Token.java
new file mode 100644
index 000000000..d91adf47a
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/Token.java
@@ -0,0 +1,169 @@
+/* Token.java --
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.parser.support.low;
+
+/**
+ * A token.
+ * @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
+ */
+public class Token
+{
+ /**
+ * The place of this token in the document.
+ */
+ public Location where;
+
+ /**
+ * The additional category of token.
+ */
+ public int category;
+
+ /**
+ * An integer that describes the kind of this token.
+ */
+ public int kind;
+
+ /**
+ * The string image of the token, null if the char image must be used.
+ */
+ private String stringImage;
+
+ /**
+ * The char image of the token.
+ */
+ private char charImage;
+
+ /**
+ * Creates a new token with fields, initialized to the default values.
+ */
+ public Token()
+ {
+ }
+
+ /**
+ * Creates a new token of the given kind.
+ */
+ public Token(int _kind, Location _where)
+ {
+ kind = _kind;
+ where = _where;
+ }
+
+ /**
+ * Creates a new token of the given kind and given single char image.
+ */
+ public Token(int _kind, char _image, Location _where)
+ {
+ kind = _kind;
+ charImage = _image;
+ where = _where;
+ }
+
+ /**
+ * Creates a new token of the given kind and given string image.
+ */
+ public Token(int _kind, String _image, Location _where)
+ {
+ kind = _kind;
+ stringImage = _image;
+ where = _where;
+ }
+
+ /**
+ * Creates a new token of the given kind, category and given string image.
+ */
+ public Token(int _kind, int _category, String _image, Location _where)
+ {
+ kind = _kind;
+ category = _category;
+ stringImage = _image;
+ where = _where;
+ }
+
+ /**
+ * Creates a new token, where location fields are set as for token,
+ * spanning over two provided tokens and any tokens between them.
+ * The image field is initialized to null, the kind field is set to -1.
+ */
+ public Token(Token fromInclusive, Token toInclusive)
+ {
+ where = new Location();
+ where.beginLine = fromInclusive.where.beginLine;
+ where.startPosition = fromInclusive.where.startPosition;
+
+ where.endLine = toInclusive.where.endLine;
+ where.endPosition = toInclusive.where.endPosition;
+ }
+
+ public String getImage()
+ {
+ if (kind == 3)
+ return "#";
+ if (stringImage == null)
+ {
+ if (charImage == 0)
+ return null;
+ stringImage = new String(new char[] { charImage });
+ }
+ return stringImage;
+ }
+
+ /**
+ * Append the token image to the given string buffer.
+ * This may be more effective that buffer.append(this.getImage()).
+ * @param buffer A buffer to append.
+ */
+ public void appendTo(StringBuffer buffer)
+ {
+ if (charImage == 0)
+ buffer.append(getImage());
+ else
+ buffer.append(charImage);
+ }
+
+ /**
+ * Returns the string image or, if null, the bounding positions.
+ */
+ public String toString()
+ {
+ return getImage() != null ? kind + "'" + getImage()
+ : "<line " + where.beginLine + ", abs pos " + where.startPosition +
+ ".." + where.endPosition + ">";
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/node.java b/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/node.java
new file mode 100644
index 000000000..b54ed86a3
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/node.java
@@ -0,0 +1,78 @@
+/* node.java --
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.parser.support.low;
+
+/**
+ * A text level content model node. The only required unary operations
+ * here are "appears" and "optionally appears" ('?').
+ * <p>@author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)</p>
+ */
+public class node
+{
+ /**
+ * True for node that is optional for the given position.
+ */
+ public boolean optional;
+
+ /**
+ * The kind of the token to match.
+ */
+ public int kind;
+
+ /**
+ * Creates the new node for matching a given kind of the token.
+ * @param kind The kind of the token to match.
+ * @param modifier The modifier (*?+).
+ */
+ public node(int kind, boolean _optional)
+ {
+ this.kind = kind;
+ optional = _optional;
+ }
+
+ /**
+ * Creates the node, indicating that token must match exactluy one time.
+ * @param kind The kind of token to match.
+ */
+ public node(int kind)
+ {
+ this.kind = kind;
+ optional = false;
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/package.html b/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/package.html
new file mode 100644
index 000000000..173583015
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/package.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<!-- package.html - describes classes in javax.swing.text.html.parser package.
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. -->
+
+<html>
+<head><title>GNU Classpath - gnu.javax.swing.text.html.parser.support.low</title></head>
+
+<body>
+<p>This package contains classes that are directly used to process
+the text input: adapted stream tokenizer, specialized buffer and text-level content models .</p>
+@author Audrius Meskauskas, Lithuania
+</body>
+</html>
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/pattern.java b/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/pattern.java
new file mode 100644
index 000000000..0fe03fdbe
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/support/low/pattern.java
@@ -0,0 +1,105 @@
+/* pattern.java --
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.parser.support.low;
+
+
+/**
+ * The simple pattern, consisting from the sequence of tokens that
+ * may have the unary modifier '?'. Choices and grouping
+ * are not required here.
+ * @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
+ */
+public class pattern
+{
+ /**
+ * The nodes of this pattern.
+ */
+ public final node[] nodes;
+
+ /**
+ * Create a pattern, containing the given list of nodes.
+ * @param a_nodes
+ */
+ public pattern(node[] a_nodes)
+ {
+ nodes = a_nodes;
+ }
+
+ /**
+ * Checks if the pattern can match the tokens in this
+ * tokenizer. Does not change the state of tokenizer.
+ * @param stream The tokenizer to read data from
+ * @return True if the pattern sequence matches the
+ * beginning of the tokenizer content.
+ */
+ public boolean matches(ReaderTokenizer stream)
+ {
+ try
+ {
+ int pt = 0;
+ int pn = 0;
+ Token t;
+ node n;
+
+ while (pn < nodes.length)
+ {
+ n = nodes [ pn ];
+ t = stream.getTokenAhead(pt);
+
+ if (t.kind == n.kind)
+ {
+ pn++;
+ pt++;
+ }
+ else
+ {
+ if (!n.optional)
+ return false;
+ else
+ pn++;
+ }
+ }
+ return true;
+ }
+ catch (Exception ex)
+ {
+ throw new ParseException("Exception", ex);
+ }
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/support/package.html b/libjava/classpath/gnu/javax/swing/text/html/parser/support/package.html
new file mode 100644
index 000000000..97c6439b3
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/support/package.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<!-- package.html - describes classes in javax.swing.text.html.parser package.
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. -->
+
+<html>
+<head><title>GNU Classpath - gnu.javax.swing.text.html.parser.support</title></head>
+
+<body>
+<p>This package provides various specialised classes, needed by HTML parser.
+</p>
+@author Audrius Meskauskas, Lithuania
+</body>
+</html>
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/support/parameterDefaulter.java b/libjava/classpath/gnu/javax/swing/text/html/parser/support/parameterDefaulter.java
new file mode 100644
index 000000000..43c07572a
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/support/parameterDefaulter.java
@@ -0,0 +1,106 @@
+/* parameterDefaulter.java --
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.parser.support;
+
+import gnu.javax.swing.text.html.parser.htmlAttributeSet;
+
+import java.util.Hashtable;
+
+import javax.swing.text.html.parser.AttributeList;
+import javax.swing.text.html.parser.DTD;
+import javax.swing.text.html.parser.Element;
+
+/**
+ * Returns an attribute set, containing default
+ * parameters for the given element. Caches sets of default
+ * parameters.
+ * @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
+ */
+public class parameterDefaulter
+{
+ public final DTD dtd;
+ Hashtable sets = new Hashtable();
+
+ /**
+ * Create a parameterDefaulter that looks for the default attribute
+ * values in the given DTD.
+ * @param a_dtd
+ */
+ public parameterDefaulter(DTD a_dtd)
+ {
+ dtd = a_dtd;
+ }
+
+ /**
+ * Get the default parameter set for the given element.
+ * @param element The element name (case insensitive).
+ * @return the default attrbute set.
+ */
+ public htmlAttributeSet getDefaultParameters(String element)
+ {
+ String key = element.toLowerCase();
+ htmlAttributeSet atts = (htmlAttributeSet) sets.get(key);
+
+ if (atts == null)
+ {
+ htmlAttributeSet set = new htmlAttributeSet();
+ Element e = dtd.elementHash.get(element.toLowerCase());
+
+ if (e != null)
+ {
+ AttributeList a = e.getAttributes();
+
+ while (a != null)
+ {
+ if (a.value != null)
+ set.addAttribute(a.name, a.value);
+ a = a.next;
+ }
+ }
+
+ if (set.getAttributeCount() > 0)
+ sets.put(key, set);
+ else
+ sets.put(key, htmlAttributeSet.EMPTY_HTML_ATTRIBUTE_SET);
+
+ atts = set;
+ }
+ return atts;
+ }
+}
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/support/textPreProcessor.java b/libjava/classpath/gnu/javax/swing/text/html/parser/support/textPreProcessor.java
new file mode 100644
index 000000000..22c44be4f
--- /dev/null
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/support/textPreProcessor.java
@@ -0,0 +1,189 @@
+/* textPreProcessor.java --
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.parser.support;
+
+import gnu.javax.swing.text.html.parser.support.low.Constants;
+
+/**
+ * Pre - processes text in text parts of the html document.
+ *
+ * @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
+ */
+public class textPreProcessor
+{
+ /**
+ * Pre - process non-preformatted text. \t, \r and \n mutate into spaces, then
+ * multiple spaces mutate into single one, all whitespace around tags is
+ * consumed. The content of the passed buffer is destroyed.
+ *
+ * @param a_text A text to pre-process.
+ */
+ public char[] preprocess(StringBuffer a_text)
+ {
+ if (a_text.length() == 0)
+ return null;
+
+ char[] text = toCharArray(a_text);
+
+ int a = 0;
+ int b = text.length - 1;
+
+ // Remove leading/trailing whitespace, leaving at most one character
+ int len = text.length;
+ while (a + 1 < len && Constants.bWHITESPACE.get(text[a])
+ && Constants.bWHITESPACE.get(text[a + 1]))
+ a++;
+
+ while (b > a && Constants.bWHITESPACE.get(text[b])
+ && Constants.bWHITESPACE.get(text[b - 1]))
+ b--;
+
+ a_text.setLength(0);
+
+ boolean spacesWere = false;
+ boolean spaceNow;
+ char c;
+
+ chars: for (int i = a; i <= b; i++)
+ {
+ c = text[i];
+ spaceNow = Constants.bWHITESPACE.get(c);
+ if (spacesWere && spaceNow)
+ continue chars;
+ if (spaceNow)
+ a_text.append(' ');
+ else
+ a_text.append(c);
+ spacesWere = spaceNow;
+ }
+
+ if (a_text.length() == text.length)
+ {
+ a_text.getChars(0, a_text.length(), text, 0);
+ return text;
+ }
+ else
+ return toCharArray(a_text);
+ }
+
+ /**
+ * Pre - process pre-formatted text.
+ * Heading/closing spaces and tabs preserved.
+ * ONE bounding \r, \n or \r\n is removed.
+ * \r or \r\n mutate into \n. Tabs are
+ * preserved.
+ * The content of the passed buffer is destroyed.
+ * @param a_text
+ * @return
+ */
+ public char[] preprocessPreformatted(StringBuffer a_text)
+ {
+ if (a_text.length() == 0)
+ return null;
+
+ char[] text = toCharArray(a_text);
+
+ int a = 0;
+ int n = text.length - 1;
+ int b = n;
+
+ if (text [ 0 ] == '\n')
+ a++;
+ else
+ {
+ if (text [ 0 ] == '\r')
+ {
+ a++;
+ if (text.length > 1 && text [ 1 ] == '\n')
+ a++;
+ }
+ }
+
+ if (text [ n ] == '\r')
+ b--;
+ else
+ {
+ if (text [ n ] == '\n')
+ {
+ b--;
+ if (n > 0 && text [ n - 1 ] == '\r')
+ b--;
+ }
+ }
+
+ a_text.setLength(0);
+
+ if (a > b)
+ return null;
+
+ char c;
+
+ for (int i = a; i <= b; i++)
+ {
+ c = text [ i ];
+ if (c == '\r')
+ {
+ if (i == b || text [ i + 1 ] != '\n')
+ a_text.append('\n');
+ }
+ else
+ a_text.append(c);
+ }
+
+ if (a_text.length() == text.length)
+ {
+ a_text.getChars(0, a_text.length(), text, 0);
+ return text;
+ }
+ else
+ return toCharArray(a_text);
+ }
+
+ /**
+ * Return array of chars, present in the given buffer.
+ * @param a_text The buffer
+ * @return
+ */
+ private static char[] toCharArray(StringBuffer a_text)
+ {
+ char[] text = new char[ a_text.length() ];
+ a_text.getChars(0, text.length, text, 0);
+ return text;
+ }
+}