Library Support added BLD200611241700
authorjjancura@netbeans.org
Fri, 24 Nov 2006 13:53:28 +0000
changeset 771121748b20db2a
parent 7710 39a6ac303f3b
child 7712 d86cfba8bbb5
Library Support added
Parse Tree Path added
HTML code completion redone
HTML deprecated attributes / tags highlighting added
languages.html/src/org/netbeans/modules/languages/html/HTML.java
languages.html/src/org/netbeans/modules/languages/html/HTML.nbs
languages.html/src/org/netbeans/modules/languages/html/HTML401.xml
     1.1 --- a/languages.html/src/org/netbeans/modules/languages/html/HTML.java	Wed Nov 22 13:39:38 2006 +0000
     1.2 +++ b/languages.html/src/org/netbeans/modules/languages/html/HTML.java	Fri Nov 24 13:53:28 2006 +0000
     1.3 @@ -9,29 +9,15 @@
     1.4  
     1.5  package org.netbeans.modules.languages.html;
     1.6  
     1.7 -import java.io.BufferedReader;
     1.8 -import java.io.File;
     1.9 -import java.io.FileWriter;
    1.10 -import java.io.InputStream;
    1.11 -import java.io.InputStreamReader;
    1.12 -import java.net.MalformedURLException;
    1.13 -import java.net.URL;
    1.14  import java.util.ArrayList;
    1.15 -import java.util.HashMap;
    1.16  import java.util.Iterator;
    1.17  import java.util.List;
    1.18 -import java.util.Map;
    1.19  import java.util.Stack;
    1.20 -import org.netbeans.modules.languages.Language;
    1.21 -import org.netbeans.modules.languages.LanguagesManager;
    1.22  import org.netbeans.modules.languages.fold.DatabaseManager;
    1.23 +import org.netbeans.modules.languages.LibrarySupport;
    1.24  import org.netbeans.modules.languages.parser.ASTNode;
    1.25 -import org.netbeans.modules.languages.parser.Input;
    1.26 +import org.netbeans.modules.languages.parser.PTPath;
    1.27  import org.netbeans.modules.languages.parser.SToken;
    1.28 -import org.netbeans.modules.languages.parser.TokenInput;
    1.29 -import org.openide.ErrorManager;
    1.30 -import org.openide.filesystems.FileUtil;
    1.31 -import org.openide.modules.InstalledFileLocator;
    1.32  import org.openide.text.Line;
    1.33  
    1.34  /**
    1.35 @@ -40,10 +26,12 @@
    1.36   */
    1.37  public class HTML {
    1.38      
    1.39 -    private static final String HTML40DOC = "modules/ext/html40.zip";
    1.40 +//    private static final String HTML40DOC = "modules/ext/html40.zip";
    1.41 +    private static final String HTML401 = "org/netbeans/modules/languages/html/HTML401.xml";
    1.42      
    1.43      
    1.44 -    public static Runnable hyperlink (SToken t) {
    1.45 +    public static Runnable hyperlink (PTPath path) {
    1.46 +        SToken t = (SToken) path.getLeaf ();
    1.47          String s = t.getIdentifier ();
    1.48          s = s.substring (1, s.length () - 1).trim ();
    1.49          if (!s.endsWith (")")) return null;
    1.50 @@ -60,96 +48,150 @@
    1.51          return null;
    1.52      }
    1.53  
    1.54 -    public static boolean isDeprecatedTag (SToken t) {
    1.55 -        Map tags = getTags ();
    1.56 +    public static boolean isDeprecatedTag (PTPath path) {
    1.57 +        SToken t = (SToken) path.getLeaf ();
    1.58          String tagName = t.getIdentifier ().toLowerCase ();
    1.59 -        Map m = (Map) tags.get (tagName);
    1.60 -        if (m == null) return false;
    1.61 -        return "D".equals (m.get ("Depr."));
    1.62 +        return "true".equals (getLibrary ().getProperty ("TAG", tagName, "deprecated"));
    1.63 +//        Map tags = getTags ();
    1.64 +//        Map m = (Map) tags.get (tagName);
    1.65 +//        if (m == null) return false;
    1.66 +//        return "D".equals (m.get ("Depr."));
    1.67      }
    1.68  
    1.69 -    public static boolean isEndTagRequired (SToken t) {
    1.70 +    public static boolean isEndTagRequired (PTPath path) {
    1.71 +        SToken t = (SToken) path.getLeaf ();
    1.72          return isEndTagRequired (t.getIdentifier ().toLowerCase ());
    1.73      }
    1.74  
    1.75      static boolean isEndTagRequired (String tagName) {
    1.76 -        Map tags = getTags ();
    1.77 -        Map m = (Map) tags.get (tagName);
    1.78 -        if (m == null) return false;
    1.79 -        return !"O".equals (m.get ("End Tag")) &&
    1.80 -               !"F".equals (m.get ("End Tag"));
    1.81 +        String v = getLibrary ().getProperty ("TAG", tagName, "endTag");
    1.82 +        return !"O".equals (v) && !"F".equals (v);
    1.83 +//        Map tags = getTags ();
    1.84 +//        Map m = (Map) tags.get (tagName);
    1.85 +//        if (m == null) return false;
    1.86 +//        return !"O".equals (m.get ("End Tag")) &&
    1.87 +//               !"F".equals (m.get ("End Tag"));
    1.88      }
    1.89  
    1.90 -    private static List tags = null;
    1.91 +//    private static List tags = null;
    1.92      
    1.93 -    public static List tags (SToken t) {
    1.94 -        Map m = getTags ();
    1.95 -        if (tags == null)
    1.96 -            tags = new ArrayList (m.keySet ());
    1.97 -        return tags;
    1.98 +    public static List tags (PTPath path) {
    1.99 +        return getLibrary ().getItems ("TAG");
   1.100 +//        Map m = getTags ();
   1.101 +//        if (tags == null)
   1.102 +//            tags = new ArrayList (m.keySet ());
   1.103 +//        return tags;
   1.104      }
   1.105  
   1.106      private static List tagDescriptions = null;
   1.107      
   1.108 -    public static List tagDescriptions (SToken t) {
   1.109 -        Map tags = getTags ();
   1.110 +    public static List tagDescriptions (PTPath path) {
   1.111          if (tagDescriptions == null) {
   1.112 +            List tags = getLibrary ().getItems ("TAG");
   1.113              tagDescriptions = new ArrayList (tags.size ());
   1.114 -            Iterator it = tags.keySet ().iterator ();
   1.115 +            Iterator it = tags.iterator ();
   1.116              while (it.hasNext ()) {
   1.117 -                String name = (String) it.next ();
   1.118 -                Map properties = (Map) tags.get (name);
   1.119 -                String description = (String) properties.get ("Description");
   1.120 +                String tag = (String) it.next ();
   1.121 +                String description = getLibrary ().getProperty 
   1.122 +                    ("TAG", tag, "description");
   1.123                  tagDescriptions.add (
   1.124 -                    "<html><b><font color=blue>" + name.toUpperCase () + 
   1.125 -                    ": </font></b><font color=#aaaaaa> " + 
   1.126 +                    "<html><b><font color=blue>" + tag.toUpperCase () + 
   1.127 +                    ": </font></b><font color=black> " + 
   1.128                      description + "</font></html>"
   1.129                  );
   1.130              }
   1.131 -        } 
   1.132 +        }
   1.133          return tagDescriptions;
   1.134 +//        Map tags = getTags ();
   1.135 +//        if (tagDescriptions == null) {
   1.136 +//            tagDescriptions = new ArrayList (tags.size ());
   1.137 +//            Iterator it = tags.keySet ().iterator ();
   1.138 +//            while (it.hasNext ()) {
   1.139 +//                String name = (String) it.next ();
   1.140 +//                Map properties = (Map) tags.get (name);
   1.141 +//                String description = (String) properties.get ("Description");
   1.142 +//                tagDescriptions.add (
   1.143 +//                    "<html><b><font color=blue>" + name.toUpperCase () + 
   1.144 +//                    ": </font></b><font color=#aaaaaa> " + 
   1.145 +//                    description + "</font></html>"
   1.146 +//                );
   1.147 +//            }
   1.148 +//        } 
   1.149 +//        return tagDescriptions;
   1.150      }
   1.151  
   1.152 -    private static List attributes = null;
   1.153 +//    private static List attributes = null;
   1.154      
   1.155 -    public static List attributes (SToken t) {
   1.156 -        Map m = getAttributes ();
   1.157 -        if (attributes == null)
   1.158 -            attributes = new ArrayList (m.keySet ());
   1.159 -        return attributes;
   1.160 +    public static List attributes (PTPath path) {
   1.161 +        ASTNode n = (ASTNode) path.get (path.size () - 2);
   1.162 +        n = n.getParent ("startTag");
   1.163 +        List r = getLibrary ().getItems (n.getTokenTypeIdentifier ("html-element_name"));
   1.164 +        System.out.println("attributes " + r);
   1.165 +        return r;
   1.166 +//        Map m = getAttributes ();
   1.167 +//        if (attributes == null)
   1.168 +//            attributes = new ArrayList (m.keySet ());
   1.169 +//        return attributes;
   1.170      }
   1.171  
   1.172 -    private static List attributeDescriptions = null;
   1.173 +    //private static List attributeDescriptions = null;
   1.174      
   1.175 -    public static List attributeDescriptions (SToken t) {
   1.176 -        Map attribs = getAttributes ();
   1.177 -        if (attributeDescriptions == null) {
   1.178 -            attributeDescriptions = new ArrayList (attribs.size ());
   1.179 -            Iterator it = attribs.keySet ().iterator ();
   1.180 -            while (it.hasNext ()) {
   1.181 -                String name = (String) it.next ();
   1.182 -                Map properties = (Map) attribs.get (name);
   1.183 -                String description = (String) properties.get ("Comment");
   1.184 -                attributeDescriptions.add (
   1.185 -                    "<html><b><font color=blue>" + name.toUpperCase () + 
   1.186 -                    ": </font></b><font color=#aaaaaa> " + 
   1.187 -                    description + "</font></html>"
   1.188 -                );
   1.189 -            }
   1.190 -        } 
   1.191 +    public static List attributeDescriptions (PTPath path) {
   1.192 +        ASTNode n = (ASTNode) path.get (path.size () - 2);
   1.193 +        n = n.getParent ("startTag");
   1.194 +        String tagName = n.getTokenTypeIdentifier ("html-element_name");
   1.195 +        List as = getLibrary ().getItems (tagName);
   1.196 +        List attributeDescriptions = new ArrayList (as.size ());
   1.197 +        Iterator it = as.iterator ();
   1.198 +        while (it.hasNext ()) {
   1.199 +            String tag = (String) it.next ();
   1.200 +            String description = getLibrary ().getProperty 
   1.201 +                (tagName, tag, "description");
   1.202 +            attributeDescriptions.add (
   1.203 +                "<html><b><font color=blue>" + tag.toUpperCase () + 
   1.204 +                ": </font></b><font color=black> " + 
   1.205 +                description + "</font></html>"
   1.206 +            );
   1.207 +        }
   1.208 +        System.out.println("attributeDescriptions " + attributeDescriptions);
   1.209          return attributeDescriptions;
   1.210 +//        Map attribs = getAttributes ();
   1.211 +//        if (attributeDescriptions == null) {
   1.212 +//            attributeDescriptions = new ArrayList (attribs.size ());
   1.213 +//            Iterator it = attribs.keySet ().iterator ();
   1.214 +//            while (it.hasNext ()) {
   1.215 +//                String name = (String) it.next ();
   1.216 +//                Map properties = (Map) attribs.get (name);
   1.217 +//                String description = (String) properties.get ("Comment");
   1.218 +//                attributeDescriptions.add (
   1.219 +//                    "<html><b><font color=blue>" + name.toUpperCase () + 
   1.220 +//                    ": </font></b><font color=#aaaaaa> " + 
   1.221 +//                    description + "</font></html>"
   1.222 +//                );
   1.223 +//            }
   1.224 +//        } 
   1.225 +//        return attributeDescriptions;
   1.226      }
   1.227      
   1.228  
   1.229 -    public static boolean isDeprecatedAttribute (SToken t) {
   1.230 -        Map tags = getAttributes ();
   1.231 -        String tagName = t.getIdentifier ().toLowerCase ();
   1.232 -        Map m = (Map) tags.get (tagName);
   1.233 -        if (m == null) return false;
   1.234 -        return "D".equals (m.get ("Depr."));
   1.235 +    public static boolean isDeprecatedAttribute (PTPath path) {
   1.236 +        ASTNode n = (ASTNode) path.get (path.size () - 2);
   1.237 +        ASTNode nn = n.getParent ("startTag");
   1.238 +        String tagName = nn.getTokenTypeIdentifier ("html-element_name");
   1.239 +        SToken t = (SToken) path.getLeaf ();
   1.240 +        String attribName = n.getTokenTypeIdentifier ("html-attribute-name");
   1.241 +        if (attribName == null) return false;
   1.242 +        attribName = attribName.toLowerCase ();
   1.243 +        return "true".equals (getLibrary ().getProperty (tagName, attribName, "deprecated"));
   1.244 +//        Map tags = getAttributes ();
   1.245 +//        String tagName = t.getIdentifier ().toLowerCase ();
   1.246 +//        Map m = (Map) tags.get (tagName);
   1.247 +//        if (m == null) return false;
   1.248 +//        return "D".equals (m.get ("Depr."));
   1.249      }
   1.250      
   1.251 -    public static ASTNode process (ASTNode n) {
   1.252 +    public static ASTNode process (PTPath path) {
   1.253 +        ASTNode n = (ASTNode) path.getRoot ();
   1.254          List l = new ArrayList ();
   1.255          resolve (n, new Stack (), l, true);
   1.256          return ASTNode.create (n.getMimeType (), n.getNT (), n.getRule (), n.getParent (), l, n.getOffset ());
   1.257 @@ -158,6 +200,14 @@
   1.258      
   1.259      // private methods .........................................................
   1.260      
   1.261 +    private static LibrarySupport library;
   1.262 +    
   1.263 +    private static LibrarySupport getLibrary () {
   1.264 +        if (library == null)
   1.265 +            library = LibrarySupport.create (HTML401);
   1.266 +        return library;
   1.267 +    }
   1.268 +    
   1.269      private static ASTNode create (ASTNode n, String nt) {
   1.270          return ASTNode.create (n.getMimeType (), nt, n.getRule (), n.getParent (), n.getChildren (), n.getOffset ());
   1.271      }
   1.272 @@ -225,246 +275,268 @@
   1.273          }
   1.274      }
   1.275  
   1.276 -    private static Map tagsMap = null;
   1.277 -    
   1.278 -    private static Map getTags () {
   1.279 -        if (tagsMap == null) {
   1.280 -            ASTNode n = parseHTML ("index/elements.html");
   1.281 -            if (n != null)
   1.282 -                tagsMap = readTags (n);
   1.283 -            else
   1.284 -                tagsMap = new HashMap ();
   1.285 -        }
   1.286 -        return tagsMap;
   1.287 -    }
   1.288 -    
   1.289 -    private static ASTNode parseHTML (String resourceName) {
   1.290 -        long start = System.currentTimeMillis ();
   1.291 -        try {
   1.292 -            File f = InstalledFileLocator.getDefault().locate 
   1.293 -                (HTML40DOC, null, false); //NoI18N
   1.294 -            if (f == null) {
   1.295 -                System.out.println("File " + HTML40DOC + " not found!");
   1.296 -                return null;
   1.297 -            }
   1.298 -            InputStream in = null;
   1.299 -            try {
   1.300 -                URL url = f.toURL ();
   1.301 -                url = FileUtil.getArchiveRoot (url);
   1.302 -                url = new URL (url.toString () + resourceName);
   1.303 -                in = url.openStream ();
   1.304 -            } catch (MalformedURLException e){
   1.305 -                ErrorManager.getDefault().notify(ErrorManager.EXCEPTION, e);
   1.306 -                return null;
   1.307 -            }
   1.308 -            InputStreamReader r = new InputStreamReader (in);
   1.309 -            BufferedReader br = new BufferedReader (r);
   1.310 -            StringBuilder sb = new StringBuilder ();
   1.311 -            String ln = br.readLine ();
   1.312 -            while (ln != null) {
   1.313 -                sb.append (ln).append ('\n');
   1.314 -                ln = br.readLine ();
   1.315 -            }
   1.316 -            Language l = LanguagesManager.getDefault ().getLanguage ("text/html2");
   1.317 -            TokenInput ti = TokenInput.create (
   1.318 -                l.getParser (), 
   1.319 -                Input.create (sb.toString (), resourceName),
   1.320 -                l.getSkipTokenTypes ()
   1.321 -            );
   1.322 -            ASTNode node = l.getAnalyser ().read (ti, false);
   1.323 -            List rl = new ArrayList ();
   1.324 -            resolve (node, new Stack (), rl, false);
   1.325 -            node = ASTNode.create (
   1.326 -                node.getMimeType (), 
   1.327 -                node.getNT (), 
   1.328 -                node.getRule (), 
   1.329 -                node.getParent (), 
   1.330 -                rl, 
   1.331 -                node.getOffset ()
   1.332 -            );
   1.333 -            in.close ();
   1.334 -            System.out.println("parse " + resourceName + " " + (System.currentTimeMillis () - start));
   1.335 -            return node;
   1.336 -        } catch (Exception ex) {
   1.337 -            System.out.println("parse-error " + resourceName + " " + (System.currentTimeMillis () - start));
   1.338 -            ErrorManager.getDefault ().notify (ex);
   1.339 -            return null;
   1.340 -        }
   1.341 -    }
   1.342 -    
   1.343 -    private static Map readTags (ASTNode node) {
   1.344 -        Map result = new HashMap ();
   1.345 -        node = getFirstTag (node, "html");
   1.346 -        node = getFirstTag (node, "body");
   1.347 -        node = getFirstTag (node, "table");
   1.348 -        Iterator it = getTags (node, "tr").iterator ();
   1.349 -        while (it.hasNext ()) {
   1.350 -            ASTNode tr = (ASTNode) it.next ();
   1.351 -            String name = null;
   1.352 -            Map params = new HashMap ();
   1.353 -            Iterator it2 = getTags (tr, "td").iterator ();
   1.354 -            while (it2.hasNext ()) {
   1.355 -                ASTNode td = (ASTNode) it2.next ();
   1.356 -                String title = getAttributeValue (td, "title");
   1.357 -                String url = getAttributeValue (
   1.358 -                    td.getNode ("tag"),
   1.359 -                    "href"
   1.360 -                ), value = null;
   1.361 -                if (url != null) {
   1.362 -                    value = td.getNode ("tag").getNode ("etext").
   1.363 -                        getTokenType ("html-text").getIdentifier ().toLowerCase ();
   1.364 -                    params.put (title + "_URL", url);
   1.365 -                } else
   1.366 -                    value = td.getNode ("etext").getAsText ();
   1.367 -                if (value.equals ("&nbsp;"))
   1.368 -                    value = "";
   1.369 -                params.put (title, value);
   1.370 -                if (title.equals ("Name")) {
   1.371 -                    name = value;
   1.372 -                    result.put (name, params);
   1.373 -                }
   1.374 -            }
   1.375 -        }
   1.376 -        try {
   1.377 -            FileWriter fw = new FileWriter ("c:\\tags.xml");
   1.378 -            it = result.keySet ().iterator ();
   1.379 -            while (it.hasNext ()) {
   1.380 -                String tagName = (String) it.next ();
   1.381 -                Map params = (Map) result.get (tagName);
   1.382 -                boolean deprecated = "D".equals (params.get ("Depr."));
   1.383 -                String description = (String) params.get ("Description");
   1.384 -                String endTag = (String) params.get ("End Tag");
   1.385 -                fw.write ("\t<node key = \"" + tagName + "\"\tcontext = \"TAG\"\tdeprecated = \"" + deprecated + "\"\tendTag = \"" + endTag + "\"\tdescription = \"" + description + "\"/>\n");
   1.386 -            }
   1.387 -            fw.close ();
   1.388 -        } catch (Exception ex) {
   1.389 -            ex.printStackTrace();
   1.390 -        }
   1.391 -        return result;
   1.392 -    }
   1.393 -    
   1.394 -    private static Map attributesMap = null;
   1.395 -    
   1.396 -    private static Map getAttributes () {
   1.397 -        if (attributesMap == null) {
   1.398 -            ASTNode n = parseHTML ("index/attributes.html");
   1.399 -            if (n != null)
   1.400 -                attributesMap = readAttributes (n);
   1.401 -            else
   1.402 -                attributesMap = new HashMap ();
   1.403 -        }
   1.404 -        return attributesMap;
   1.405 -    }
   1.406 -    
   1.407 -    private static Map readAttributes (ASTNode node) {
   1.408 -        Map result = new HashMap ();
   1.409 -        node = getFirstTag (node, "html");
   1.410 -        node = getFirstTag (node, "body");
   1.411 -        node = getFirstTag (node, "table");
   1.412 -        Iterator it = getTags (node, "tr").iterator ();
   1.413 -        while (it.hasNext ()) {
   1.414 -            ASTNode tr = (ASTNode) it.next ();
   1.415 -            String name = null;
   1.416 -            Map params = new HashMap ();
   1.417 -            Iterator it2 = getTags (tr, "td").iterator ();
   1.418 -            while (it2.hasNext ()) {
   1.419 -                ASTNode td = (ASTNode) it2.next ();
   1.420 -                String title = getAttributeValue (td, "title");
   1.421 -                String url = getAttributeValue (
   1.422 -                    td.getNode ("tag"),
   1.423 -                    "href"
   1.424 -                ), value = null;
   1.425 -                if (!title.equals ("Related Elements")) {
   1.426 -                    if (url != null) {
   1.427 -                        value = td.getNode ("tag").getNode ("etext").
   1.428 -                            getTokenType ("html-text").getIdentifier ().toLowerCase ();
   1.429 -                        params.put (title + "_URL", url);
   1.430 -                    } else
   1.431 -                        value = td.getNode ("etext").getAsText ();
   1.432 -                    if (value.equals ("&nbsp;"))
   1.433 -                        value = "";
   1.434 -                } else {
   1.435 -                    List l = td.getChildren ();
   1.436 -                    Iterator ii = l.iterator ();
   1.437 -                    while (ii.hasNext ()) {
   1.438 -                        Object elem = ii.next ();
   1.439 -                        if (!(elem instanceof ASTNode)) continue;
   1.440 -                        if (!((ASTNode) elem).getNT ().equals ("tag")) continue;
   1.441 -                        if (value == null)
   1.442 -                            value = ((ASTNode) elem).getNode ("etext").getAsText ();
   1.443 -                        else
   1.444 -                            value += "," + ((ASTNode) elem).getNode ("etext").getAsText ();
   1.445 -                    }
   1.446 -                }
   1.447 -                params.put (title, value);
   1.448 -                if (title.equals ("Name")) {
   1.449 -                    name = value;
   1.450 -                    result.put (name, params);
   1.451 -                }
   1.452 -            }
   1.453 -            //System.out.println(name + " : " + params);
   1.454 -        }
   1.455 -        
   1.456 -        try {
   1.457 -            FileWriter fw = new FileWriter ("c:\\attribs.xml");
   1.458 -            it = result.keySet ().iterator ();
   1.459 -            while (it.hasNext ()) {
   1.460 -                String tagName = (String) it.next ();
   1.461 -                Map params = (Map) result.get (tagName);
   1.462 -                boolean deprecated = "D".equals (params.get ("Depr."));
   1.463 -                String description = (String) params.get ("Comment");
   1.464 -                String endTag = (String) params.get ("End Tag");
   1.465 -                String context = (String) params.get ("Related Elements");
   1.466 -                fw.write ("\t<node key = \"" + tagName + "\"\tcontext = \"" + context + "\"\tdeprecated = \"" + deprecated + "\"\tdescription = \"" + description + "\"/>\n");
   1.467 -            }
   1.468 -            fw.close ();
   1.469 -        } catch (Exception ex) {
   1.470 -            ex.printStackTrace();
   1.471 -        }
   1.472 -        return result;
   1.473 -    }
   1.474 -    
   1.475 -    private static String getAttributeValue (ASTNode node, String attributeName) {
   1.476 -        if (node == null) return null;
   1.477 -        List path = node.getNode ("startTag").findToken 
   1.478 -            ("html-attribute-name", attributeName);
   1.479 -        if (path == null) return null;
   1.480 -        ASTNode attributes = (ASTNode) path.get (1);
   1.481 -        List path2 = attributes.findToken ("html-attribute-value", null);
   1.482 -        String value = ((SToken) path2.get (0)).getIdentifier ();
   1.483 -        if (value.startsWith ("\"")) value = value.substring (1, value.length () - 1);
   1.484 -        return value;
   1.485 -    }
   1.486 -    
   1.487 -    private static List getTags (ASTNode node, String tagName) {
   1.488 -        List result = new ArrayList ();
   1.489 -        Iterator it = node.getChildren ().iterator ();
   1.490 -        while (it.hasNext ()) {
   1.491 -            Object e = it.next ();
   1.492 -            if (e instanceof SToken) continue;
   1.493 -            ASTNode n = (ASTNode) e;
   1.494 -            if (n.getNT ().equals ("tag")) {
   1.495 -                ASTNode startTag = n.getNode ("startTag");
   1.496 -                String tn = startTag.getTokenTypeIdentifier ("html-element_name");
   1.497 -                if (tn.equals (tagName)) result.add (n);
   1.498 -            }
   1.499 -        }
   1.500 -        return result;
   1.501 -    }
   1.502 -    
   1.503 -    private static ASTNode getFirstTag (ASTNode node, String tagName) {
   1.504 -        Iterator it = node.getChildren ().iterator ();
   1.505 -        while (it.hasNext ()) {
   1.506 -            Object e = it.next ();
   1.507 -            if (e instanceof SToken) continue;
   1.508 -            ASTNode n = (ASTNode) e;
   1.509 -            if (n.getNT ().equals ("tag")) {
   1.510 -                ASTNode startTag = n.getNode ("startTag");
   1.511 -                String tn = startTag.getTokenTypeIdentifier ("html-element_name");
   1.512 -                if (tn.equals (tagName)) return n;
   1.513 -            }
   1.514 -        }
   1.515 -        return null;
   1.516 -    }
   1.517 +//    private static Map tagsMap = null;
   1.518 +//    
   1.519 +//    private static Map getTags () {
   1.520 +//        if (tagsMap == null) {
   1.521 +//            ASTNode n = parseHTML ("index/elements.html");
   1.522 +//            if (n != null)
   1.523 +//                tagsMap = readTags (n);
   1.524 +//            else
   1.525 +//                tagsMap = new HashMap ();
   1.526 +//        }
   1.527 +//        return tagsMap;
   1.528 +//    }
   1.529 +//    
   1.530 +//    private static ASTNode parseHTML (String resourceName) {
   1.531 +//        long start = System.currentTimeMillis ();
   1.532 +//        try {
   1.533 +//            File f = InstalledFileLocator.getDefault().locate 
   1.534 +//                (HTML40DOC, null, false); //NoI18N
   1.535 +//            if (f == null) {
   1.536 +//                System.out.println("File " + HTML40DOC + " not found!");
   1.537 +//                return null;
   1.538 +//            }
   1.539 +//            InputStream in = null;
   1.540 +//            try {
   1.541 +//                URL url = f.toURL ();
   1.542 +//                url = FileUtil.getArchiveRoot (url);
   1.543 +//                url = new URL (url.toString () + resourceName);
   1.544 +//                in = url.openStream ();
   1.545 +//            } catch (MalformedURLException e){
   1.546 +//                ErrorManager.getDefault().notify(ErrorManager.EXCEPTION, e);
   1.547 +//                return null;
   1.548 +//            }
   1.549 +//            InputStreamReader r = new InputStreamReader (in);
   1.550 +//            BufferedReader br = new BufferedReader (r);
   1.551 +//            StringBuilder sb = new StringBuilder ();
   1.552 +//            String ln = br.readLine ();
   1.553 +//            while (ln != null) {
   1.554 +//                sb.append (ln).append ('\n');
   1.555 +//                ln = br.readLine ();
   1.556 +//            }
   1.557 +//            Language l = LanguagesManager.getDefault ().getLanguage ("text/html2");
   1.558 +//            TokenInput ti = TokenInput.create (
   1.559 +//                l.getParser (), 
   1.560 +//                Input.create (sb.toString (), resourceName),
   1.561 +//                Collections.EMPTY_SET// l.getSkipTokenTypes ()
   1.562 +//            );
   1.563 +//            ASTNode node = l.getAnalyser ().read (ti, false);
   1.564 +//            List rl = new ArrayList ();
   1.565 +//            resolve (node, new Stack (), rl, false);
   1.566 +//            node = ASTNode.create (
   1.567 +//                node.getMimeType (), 
   1.568 +//                node.getNT (), 
   1.569 +//                node.getRule (), 
   1.570 +//                node.getParent (), 
   1.571 +//                rl, 
   1.572 +//                node.getOffset ()
   1.573 +//            );
   1.574 +//            in.close ();
   1.575 +//            System.out.println("parse " + resourceName + " " + (System.currentTimeMillis () - start));
   1.576 +//            return node;
   1.577 +//        } catch (Exception ex) {
   1.578 +//            System.out.println("parse-error " + resourceName + " " + (System.currentTimeMillis () - start));
   1.579 +//            ErrorManager.getDefault ().notify (ex);
   1.580 +//            return null;
   1.581 +//        }
   1.582 +//    }
   1.583 +//    
   1.584 +//    private static Map readTags (ASTNode node) {
   1.585 +//        Map result = new HashMap ();
   1.586 +//        List result2 = new ArrayList ();
   1.587 +//        node = getFirstTag (node, "html");
   1.588 +//        node = getFirstTag (node, "body");
   1.589 +//        node = getFirstTag (node, "table");
   1.590 +//        Iterator it = getTags (node, "tr").iterator ();
   1.591 +//        while (it.hasNext ()) {
   1.592 +//            ASTNode tr = (ASTNode) it.next ();
   1.593 +//            String name = null;
   1.594 +//            Map params = new HashMap ();
   1.595 +//            Iterator it2 = getTags (tr, "td").iterator ();
   1.596 +//            while (it2.hasNext ()) {
   1.597 +//                ASTNode td = (ASTNode) it2.next ();
   1.598 +//                String title = getAttributeValue (td, "title");
   1.599 +//                String url = getAttributeValue (
   1.600 +//                    td.getNode ("tag"),
   1.601 +//                    "href"
   1.602 +//                ), value = null;
   1.603 +//                if (url != null) {
   1.604 +//                    value = td.getNode ("tag").getNode ("etext").
   1.605 +//                        getTokenType ("html-text").getIdentifier ().toLowerCase ();
   1.606 +//                    params.put (title + "_URL", url);
   1.607 +//                } else
   1.608 +//                    value = td.getNode ("etext").getAsText ();
   1.609 +//                if (value.equals ("&nbsp;"))
   1.610 +//                    value = "";
   1.611 +//                params.put (title, value);
   1.612 +//                if (title.equals ("Name")) {
   1.613 +//                    name = value;
   1.614 +//                    result.put (name, params);
   1.615 +//                    result2.add (params);
   1.616 +//                }
   1.617 +//            }
   1.618 +//        }
   1.619 +//        try {
   1.620 +//            FileWriter fw = new FileWriter ("c:\\tags.xml");
   1.621 +//            it = result2.iterator ();
   1.622 +//            while (it.hasNext ()) {
   1.623 +//                Map params = (Map) it.next ();
   1.624 +//                String tagName = (String) params.get ("Name");
   1.625 +//                boolean deprecated = "D".equals (params.get ("Depr."));
   1.626 +//                String description = (String) params.get ("Description");
   1.627 +//                String endTag = (String) params.get ("End Tag");
   1.628 +//                fw.write ("\t<node key = \"" + tagName + "\"\tcontext = \"TAG\"\tdeprecated = \"" + deprecated + "\"\tendTag = \"" + endTag + "\"\tdescription = \"" + description + "\"/>\n");
   1.629 +//            }
   1.630 +//            fw.close ();
   1.631 +//        } catch (Exception ex) {
   1.632 +//            ex.printStackTrace();
   1.633 +//        }
   1.634 +//        return result;
   1.635 +//    }
   1.636 +//    
   1.637 +//    private static Map attributesMap = null;
   1.638 +//    
   1.639 +//    private static Map getAttributes () {
   1.640 +//        if (attributesMap == null) {
   1.641 +//            ASTNode n = parseHTML ("index/attributes.html");
   1.642 +//            if (n != null)
   1.643 +//                attributesMap = readAttributes (n);
   1.644 +//            else
   1.645 +//                attributesMap = new HashMap ();
   1.646 +//        }
   1.647 +//        return attributesMap;
   1.648 +//    }
   1.649 +//    
   1.650 +//    private static Map readAttributes (ASTNode node) {
   1.651 +//        Map result = new HashMap ();
   1.652 +//        List result2 = new ArrayList ();
   1.653 +//        Set tags = getTags ().keySet();
   1.654 +//        node = getFirstTag (node, "html");
   1.655 +//        node = getFirstTag (node, "body");
   1.656 +//        node = getFirstTag (node, "table");
   1.657 +//        Iterator it = getTags (node, "tr").iterator ();
   1.658 +//        while (it.hasNext ()) {
   1.659 +//            ASTNode tr = (ASTNode) it.next ();
   1.660 +//            String name = null;
   1.661 +//            Map params = new HashMap ();
   1.662 +//            Iterator it2 = getTags (tr, "td").iterator ();
   1.663 +//            while (it2.hasNext ()) {
   1.664 +//                ASTNode td = (ASTNode) it2.next ();
   1.665 +//                String title = getAttributeValue (td, "title");
   1.666 +//                String url = getAttributeValue (
   1.667 +//                    td.getNode ("tag"),
   1.668 +//                    "href"
   1.669 +//                ), value = null;
   1.670 +//                if (!title.equals ("Related Elements")) {
   1.671 +//                    if (url != null) {
   1.672 +//                        value = td.getNode ("tag").getNode ("etext").
   1.673 +//                            getTokenType ("html-text").getIdentifier ().toLowerCase ();
   1.674 +//                        params.put (title + "_URL", url);
   1.675 +//                    } else
   1.676 +//                        value = td.getNode ("etext").getAsText ();
   1.677 +//                    if (value.equals ("&nbsp;"))
   1.678 +//                        value = "";
   1.679 +//                } else {
   1.680 +//                    List l = td.getChildren ();
   1.681 +//                    Set neg = null;
   1.682 +//                    Iterator ii = l.iterator ();
   1.683 +//                    while (ii.hasNext ()) {
   1.684 +//                        Object elem = ii.next ();
   1.685 +//                        if (!(elem instanceof ASTNode)) continue;
   1.686 +//                        if (!((ASTNode) elem).getNT ().equals ("tag")) continue;
   1.687 +//                        if (neg != null)
   1.688 +//                            neg.remove (((ASTNode) elem).getNode ("etext").getAsText ().toLowerCase ());
   1.689 +//                        else
   1.690 +//                        if (value == null) {
   1.691 +//                            value = ((ASTNode) elem).getNode ("etext").getAsText ().toLowerCase ();
   1.692 +//                            if (value.equals ("all elements"))
   1.693 +//                                neg = new HashSet (tags);
   1.694 +//                        } else
   1.695 +//                            value += "," + ((ASTNode) elem).getNode ("etext").getAsText ().toLowerCase ();
   1.696 +//                    }
   1.697 +//                    if (neg != null) {
   1.698 +//                        value = null;
   1.699 +//                        ii = neg.iterator ();
   1.700 +//                        while (ii.hasNext ()) {
   1.701 +//                            String t = (String) ii.next ();
   1.702 +//                            if (value == null)
   1.703 +//                                value = t;
   1.704 +//                            else
   1.705 +//                                value += "," + t;
   1.706 +//                        }
   1.707 +//                    }
   1.708 +//                }
   1.709 +//                params.put (title, value);
   1.710 +//                if (title.equals ("Name")) {
   1.711 +//                    name = value;
   1.712 +//                    result.put (name, params);
   1.713 +//                    result2.add (params);
   1.714 +//                }
   1.715 +//            }
   1.716 +//            //System.out.println(name + " : " + params);
   1.717 +//        }
   1.718 +//        
   1.719 +//        try {
   1.720 +//            FileWriter fw = new FileWriter ("c:\\attribs.xml");
   1.721 +//            it = result2.iterator ();
   1.722 +//            while (it.hasNext ()) {
   1.723 +//                Map params = (Map) it.next ();
   1.724 +//                String tagName = (String) params.get ("Name");
   1.725 +//                boolean deprecated = "D".equals (params.get ("Depr."));
   1.726 +//                String description = (String) params.get ("Comment");
   1.727 +//                String endTag = (String) params.get ("End Tag");
   1.728 +//                String context = (String) params.get ("Related Elements");
   1.729 +//                fw.write ("\t<node key = \"" + tagName + "\"\tcontext = \"" + context + "\"\tdeprecated = \"" + deprecated + "\"\tdescription = \"" + description + "\"/>\n");
   1.730 +//            }
   1.731 +//            fw.close ();
   1.732 +//        } catch (Exception ex) {
   1.733 +//            ex.printStackTrace();
   1.734 +//        }
   1.735 +//        return result;
   1.736 +//    }
   1.737 +//    
   1.738 +//    private static String getAttributeValue (ASTNode node, String attributeName) {
   1.739 +//        if (node == null) return null;
   1.740 +//        List path = node.getNode ("startTag").findToken 
   1.741 +//            ("html-attribute-name", attributeName);
   1.742 +//        if (path == null) return null;
   1.743 +//        ASTNode attributes = (ASTNode) path.get (1);
   1.744 +//        List path2 = attributes.findToken ("html-attribute-value", null);
   1.745 +//        String value = ((SToken) path2.get (0)).getIdentifier ();
   1.746 +//        if (value.startsWith ("\"")) value = value.substring (1, value.length () - 1);
   1.747 +//        return value;
   1.748 +//    }
   1.749 +//    
   1.750 +//    private static List getTags (ASTNode node, String tagName) {
   1.751 +//        List result = new ArrayList ();
   1.752 +//        Iterator it = node.getChildren ().iterator ();
   1.753 +//        while (it.hasNext ()) {
   1.754 +//            Object e = it.next ();
   1.755 +//            if (e instanceof SToken) continue;
   1.756 +//            ASTNode n = (ASTNode) e;
   1.757 +//            if (n.getNT ().equals ("tag")) {
   1.758 +//                ASTNode startTag = n.getNode ("startTag");
   1.759 +//                String tn = startTag.getTokenTypeIdentifier ("html-element_name");
   1.760 +//                if (tn.equals (tagName)) result.add (n);
   1.761 +//            }
   1.762 +//        }
   1.763 +//        return result;
   1.764 +//    }
   1.765 +//    
   1.766 +//    private static ASTNode getFirstTag (ASTNode node, String tagName) {
   1.767 +//        Iterator it = node.getChildren ().iterator ();
   1.768 +//        while (it.hasNext ()) {
   1.769 +//            Object e = it.next ();
   1.770 +//            if (e instanceof SToken) continue;
   1.771 +//            ASTNode n = (ASTNode) e;
   1.772 +//            if (n.getNT ().equals ("tag")) {
   1.773 +//                ASTNode startTag = n.getNode ("startTag");
   1.774 +//                String tn = startTag.getTokenTypeIdentifier ("html-element_name");
   1.775 +//                if (tn.equals (tagName)) return n;
   1.776 +//            }
   1.777 +//        }
   1.778 +//        return null;
   1.779 +//    }
   1.780  }
   1.781  
     2.1 --- a/languages.html/src/org/netbeans/modules/languages/html/HTML.nbs	Wed Nov 22 13:39:38 2006 +0000
     2.2 +++ b/languages.html/src/org/netbeans/modules/languages/html/HTML.nbs	Fri Nov 24 13:53:28 2006 +0000
     2.3 @@ -172,6 +172,10 @@
     2.4  COLOR:html-attribute-value {
     2.5      default-coloring:"string";
     2.6  }
     2.7 +COLOR:attribute {
     2.8 +    strike-through-color:"black";
     2.9 +    condition:org.netbeans.modules.languages.html.HTML.isDeprecatedAttribute;
    2.10 +}
    2.11  
    2.12  
    2.13  ########### code folding #######################################################
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/languages.html/src/org/netbeans/modules/languages/html/HTML401.xml	Fri Nov 24 13:53:28 2006 +0000
     3.3 @@ -0,0 +1,291 @@
     3.4 +<?xml version="1.0" encoding="UTF-8"?>
     3.5 +<documentation>
     3.6 +	<node key = "a"	context = "TAG"	deprecated = "false"	endTag = ""	description = "anchor"/>
     3.7 +	<node key = "abbr"	context = "TAG"	deprecated = "false"	endTag = ""	description = "abbreviated form (e.g., WWW, HTTP,
     3.8 +etc.)"/>
     3.9 +	<node key = "acronym"	context = "TAG"	deprecated = "false"	endTag = ""	description = ""/>
    3.10 +	<node key = "address"	context = "TAG"	deprecated = "false"	endTag = ""	description = "information on author"/>
    3.11 +	<node key = "applet"	context = "TAG"	deprecated = "true"	endTag = ""	description = "Java applet"/>
    3.12 +	<node key = "area"	context = "TAG"	deprecated = "false"	endTag = "F"	description = "client-side image map area"/>
    3.13 +	<node key = "b"	context = "TAG"	deprecated = "false"	endTag = ""	description = "bold text style"/>
    3.14 +	<node key = "base"	context = "TAG"	deprecated = "false"	endTag = "F"	description = "document base URI"/>
    3.15 +	<node key = "basefont"	context = "TAG"	deprecated = "true"	endTag = "F"	description = "base font size"/>
    3.16 +	<node key = "bdo"	context = "TAG"	deprecated = "false"	endTag = ""	description = "I18N BiDi over-ride"/>
    3.17 +	<node key = "big"	context = "TAG"	deprecated = "false"	endTag = ""	description = "large text style"/>
    3.18 +	<node key = "blockquote"	context = "TAG"	deprecated = "false"	endTag = ""	description = "long quotation"/>
    3.19 +	<node key = "body"	context = "TAG"	deprecated = "false"	endTag = "O"	description = "document body"/>
    3.20 +	<node key = "br"	context = "TAG"	deprecated = "false"	endTag = "F"	description = "forced line break"/>
    3.21 +	<node key = "button"	context = "TAG"	deprecated = "false"	endTag = ""	description = "push button"/>
    3.22 +	<node key = "caption"	context = "TAG"	deprecated = "false"	endTag = ""	description = "table caption"/>
    3.23 +	<node key = "center"	context = "TAG"	deprecated = "true"	endTag = ""	description = "shorthand for DIV align=center"/>
    3.24 +	<node key = "cite"	context = "TAG"	deprecated = "false"	endTag = ""	description = "citation"/>
    3.25 +	<node key = "code"	context = "TAG"	deprecated = "false"	endTag = ""	description = "computer code fragment"/>
    3.26 +	<node key = "col"	context = "TAG"	deprecated = "false"	endTag = "F"	description = "table column"/>
    3.27 +	<node key = "colgroup"	context = "TAG"	deprecated = "false"	endTag = "O"	description = "table column group"/>
    3.28 +	<node key = "dd"	context = "TAG"	deprecated = "false"	endTag = "O"	description = "definition description"/>
    3.29 +	<node key = "del"	context = "TAG"	deprecated = "false"	endTag = ""	description = "deleted text"/>
    3.30 +	<node key = "dfn"	context = "TAG"	deprecated = "false"	endTag = ""	description = "instance definition"/>
    3.31 +	<node key = "dir"	context = "TAG"	deprecated = "true"	endTag = ""	description = "directory list"/>
    3.32 +	<node key = "div"	context = "TAG"	deprecated = "false"	endTag = ""	description = "generic language/style container"/>
    3.33 +	<node key = "dl"	context = "TAG"	deprecated = "false"	endTag = ""	description = "definition list"/>
    3.34 +	<node key = "dt"	context = "TAG"	deprecated = "false"	endTag = "O"	description = "definition term"/>
    3.35 +	<node key = "em"	context = "TAG"	deprecated = "false"	endTag = ""	description = "emphasis"/>
    3.36 +	<node key = "fieldset"	context = "TAG"	deprecated = "false"	endTag = ""	description = "form control group"/>
    3.37 +	<node key = "font"	context = "TAG"	deprecated = "true"	endTag = ""	description = "local change to font"/>
    3.38 +	<node key = "form"	context = "TAG"	deprecated = "false"	endTag = ""	description = "interactive form"/>
    3.39 +	<node key = "frame"	context = "TAG"	deprecated = "false"	endTag = "F"	description = "subwindow"/>
    3.40 +	<node key = "frameset"	context = "TAG"	deprecated = "false"	endTag = ""	description = "window subdivision"/>
    3.41 +	<node key = "h1"	context = "TAG"	deprecated = "false"	endTag = ""	description = "heading"/>
    3.42 +	<node key = "h2"	context = "TAG"	deprecated = "false"	endTag = ""	description = "heading"/>
    3.43 +	<node key = "h3"	context = "TAG"	deprecated = "false"	endTag = ""	description = "heading"/>
    3.44 +	<node key = "h4"	context = "TAG"	deprecated = "false"	endTag = ""	description = "heading"/>
    3.45 +	<node key = "h5"	context = "TAG"	deprecated = "false"	endTag = ""	description = "heading"/>
    3.46 +	<node key = "h6"	context = "TAG"	deprecated = "false"	endTag = ""	description = "heading"/>
    3.47 +	<node key = "head"	context = "TAG"	deprecated = "false"	endTag = "O"	description = "document head"/>
    3.48 +	<node key = "hr"	context = "TAG"	deprecated = "false"	endTag = "F"	description = "horizontal rule"/>
    3.49 +	<node key = "html"	context = "TAG"	deprecated = "false"	endTag = "O"	description = "document root element"/>
    3.50 +	<node key = "i"	context = "TAG"	deprecated = "false"	endTag = ""	description = "italic text style"/>
    3.51 +	<node key = "iframe"	context = "TAG"	deprecated = "false"	endTag = ""	description = "inline subwindow"/>
    3.52 +	<node key = "img"	context = "TAG"	deprecated = "false"	endTag = "F"	description = "Embedded image"/>
    3.53 +	<node key = "input"	context = "TAG"	deprecated = "false"	endTag = "F"	description = "form control"/>
    3.54 +	<node key = "ins"	context = "TAG"	deprecated = "false"	endTag = ""	description = "inserted text"/>
    3.55 +	<node key = "isindex"	context = "TAG"	deprecated = "true"	endTag = "F"	description = "single line prompt"/>
    3.56 +	<node key = "kbd"	context = "TAG"	deprecated = "false"	endTag = ""	description = "text to be entered by the user"/>
    3.57 +	<node key = "label"	context = "TAG"	deprecated = "false"	endTag = ""	description = "form field label text"/>
    3.58 +	<node key = "legend"	context = "TAG"	deprecated = "false"	endTag = ""	description = "fieldset legend"/>
    3.59 +	<node key = "li"	context = "TAG"	deprecated = "false"	endTag = "O"	description = "list item"/>
    3.60 +	<node key = "link"	context = "TAG"	deprecated = "false"	endTag = "F"	description = "a media-independent link"/>
    3.61 +	<node key = "map"	context = "TAG"	deprecated = "false"	endTag = ""	description = "client-side image map"/>
    3.62 +	<node key = "menu"	context = "TAG"	deprecated = "true"	endTag = ""	description = "menu list"/>
    3.63 +	<node key = "meta"	context = "TAG"	deprecated = "false"	endTag = "F"	description = "generic metainformation"/>
    3.64 +	<node key = "noframes"	context = "TAG"	deprecated = "false"	endTag = ""	description = "alternate content container for non
    3.65 +frame-based rendering"/>
    3.66 +	<node key = "noscript"	context = "TAG"	deprecated = "false"	endTag = ""	description = "alternate content container for non
    3.67 +script-based rendering"/>
    3.68 +	<node key = "object"	context = "TAG"	deprecated = "false"	endTag = ""	description = "generic embedded object"/>
    3.69 +	<node key = "ol"	context = "TAG"	deprecated = "false"	endTag = ""	description = "ordered list"/>
    3.70 +	<node key = "optgroup"	context = "TAG"	deprecated = "false"	endTag = ""	description = "option group"/>
    3.71 +	<node key = "option"	context = "TAG"	deprecated = "false"	endTag = "O"	description = "selectable choice"/>
    3.72 +	<node key = "p"	context = "TAG"	deprecated = "false"	endTag = "O"	description = "paragraph"/>
    3.73 +	<node key = "param"	context = "TAG"	deprecated = "false"	endTag = "F"	description = "named property value"/>
    3.74 +	<node key = "pre"	context = "TAG"	deprecated = "false"	endTag = ""	description = "preformatted text"/>
    3.75 +	<node key = "q"	context = "TAG"	deprecated = "false"	endTag = ""	description = "short inline quotation"/>
    3.76 +	<node key = "s"	context = "TAG"	deprecated = "true"	endTag = ""	description = "strike-through text style"/>
    3.77 +	<node key = "samp"	context = "TAG"	deprecated = "false"	endTag = ""	description = "sample program output, scripts,
    3.78 +etc."/>
    3.79 +	<node key = "script"	context = "TAG"	deprecated = "false"	endTag = ""	description = "script statements"/>
    3.80 +	<node key = "select"	context = "TAG"	deprecated = "false"	endTag = ""	description = "option selector"/>
    3.81 +	<node key = "small"	context = "TAG"	deprecated = "false"	endTag = ""	description = "small text style"/>
    3.82 +	<node key = "span"	context = "TAG"	deprecated = "false"	endTag = ""	description = "generic language/style container"/>
    3.83 +	<node key = "strike"	context = "TAG"	deprecated = "true"	endTag = ""	description = "strike-through text"/>
    3.84 +	<node key = "strong"	context = "TAG"	deprecated = "false"	endTag = ""	description = "strong emphasis"/>
    3.85 +	<node key = "style"	context = "TAG"	deprecated = "false"	endTag = ""	description = "style info"/>
    3.86 +	<node key = "sub"	context = "TAG"	deprecated = "false"	endTag = ""	description = "subscript"/>
    3.87 +	<node key = "sup"	context = "TAG"	deprecated = "false"	endTag = ""	description = "superscript"/>
    3.88 +	<node key = "table"	context = "TAG"	deprecated = "false"	endTag = ""	description = ""/>
    3.89 +	<node key = "tbody"	context = "TAG"	deprecated = "false"	endTag = "O"	description = "table body"/>
    3.90 +	<node key = "td"	context = "TAG"	deprecated = "false"	endTag = "O"	description = "table data cell"/>
    3.91 +	<node key = "textarea"	context = "TAG"	deprecated = "false"	endTag = ""	description = "multi-line text field"/>
    3.92 +	<node key = "tfoot"	context = "TAG"	deprecated = "false"	endTag = "O"	description = "table footer"/>
    3.93 +	<node key = "th"	context = "TAG"	deprecated = "false"	endTag = "O"	description = "table header cell"/>
    3.94 +	<node key = "thead"	context = "TAG"	deprecated = "false"	endTag = "O"	description = "table header"/>
    3.95 +	<node key = "title"	context = "TAG"	deprecated = "false"	endTag = ""	description = "document title"/>
    3.96 +	<node key = "tr"	context = "TAG"	deprecated = "false"	endTag = "O"	description = "table row"/>
    3.97 +	<node key = "tt"	context = "TAG"	deprecated = "false"	endTag = ""	description = "teletype or monospaced text style"/>
    3.98 +	<node key = "u"	context = "TAG"	deprecated = "true"	endTag = ""	description = "underlined text style"/>
    3.99 +	<node key = "ul"	context = "TAG"	deprecated = "false"	endTag = ""	description = "unordered list"/>
   3.100 +	<node key = "var"	context = "TAG"	deprecated = "false"	endTag = ""	description = "instance of a variable or program
   3.101 +argument"/>
   3.102 +
   3.103 +	<node key = "abbr"	context = "td,th"	deprecated = "false"	description = "abbreviation for header cell"/>
   3.104 +	<node key = "accept-charset"	context = "form"	deprecated = "false"	description = "list of supported charsets"/>
   3.105 +	<node key = "accept"	context = "input"	deprecated = "false"	description = "list of MIME types for file upload"/>
   3.106 +	<node key = "accesskey"	context = "a,area,button,input,label,legend,textarea"	deprecated = "false"	description = "accessibility key character"/>
   3.107 +	<node key = "action"	context = "form"	deprecated = "false"	description = "server-side form handler"/>
   3.108 +	<node key = "align"	context = "caption"	deprecated = "true"	description = "relative to table"/>
   3.109 +	<node key = "align"	context = "applet,iframe,img,input,object"	deprecated = "true"	description = "vertical or horizontal alignment"/>
   3.110 +	<node key = "align"	context = "legend"	deprecated = "true"	description = "relative to fieldset"/>
   3.111 +	<node key = "align"	context = "table"	deprecated = "true"	description = "table position relative to window"/>
   3.112 +	<node key = "align"	context = "hr"	deprecated = "true"	description = ""/>
   3.113 +	<node key = "align"	context = "div,h1,h2,h3,h4,h5,h6,p"	deprecated = "true"	description = "align, text alignment"/>
   3.114 +	<node key = "align"	context = "col,colgroup,tbody,td,tfoot,th,thead,tr"	deprecated = "false"	description = ""/>
   3.115 +	<node key = "alink"	context = "body"	deprecated = "true"	description = "color of selected links"/>
   3.116 +	<node key = "alt"	context = "applet"	deprecated = "true"	description = "short description"/>
   3.117 +	<node key = "alt"	context = "area,img"	deprecated = "false"	description = "short description"/>
   3.118 +	<node key = "alt"	context = "input"	deprecated = "false"	description = "short description"/>
   3.119 +	<node key = "archive"	context = "object"	deprecated = "false"	description = "space separated archive list"/>
   3.120 +	<node key = "archive"	context = "applet"	deprecated = "true"	description = "comma separated archive list"/>
   3.121 +	<node key = "axis"	context = "td,th"	deprecated = "false"	description = "names groups of related headers"/>
   3.122 +	<node key = "background"	context = "body"	deprecated = "true"	description = "texture tile for document background"/>
   3.123 +	<node key = "bgcolor"	context = "table"	deprecated = "true"	description = "background color for cells"/>
   3.124 +	<node key = "bgcolor"	context = "tr"	deprecated = "true"	description = "background color for row"/>
   3.125 +	<node key = "bgcolor"	context = "td,th"	deprecated = "true"	description = "cell background color"/>
   3.126 +	<node key = "bgcolor"	context = "body"	deprecated = "true"	description = "document background color"/>
   3.127 +	<node key = "border"	context = "table"	deprecated = "false"	description = "controls frame width around table"/>
   3.128 +	<node key = "border"	context = "img,object"	deprecated = "true"	description = "link border width"/>
   3.129 +	<node key = "cellpadding"	context = "table"	deprecated = "false"	description = "spacing within cells"/>
   3.130 +	<node key = "cellspacing"	context = "table"	deprecated = "false"	description = "spacing between cells"/>
   3.131 +	<node key = "char"	context = "col,colgroup,tbody,td,tfoot,th,thead,tr"	deprecated = "false"	description = "alignment char, e.g. char=':'"/>
   3.132 +	<node key = "charoff"	context = "col,colgroup,tbody,td,tfoot,th,thead,tr"	deprecated = "false"	description = "offset for alignment char"/>
   3.133 +	<node key = "charset"	context = "a,link,script"	deprecated = "false"	description = "char encoding of linked resource"/>
   3.134 +	<node key = "checked"	context = "input"	deprecated = "false"	description = "for radio buttons and check boxes"/>
   3.135 +	<node key = "cite"	context = "blockquote,q"	deprecated = "false"	description = "URI for source document or msg"/>
   3.136 +	<node key = "cite"	context = "del,ins"	deprecated = "false"	description = "info on reason for change"/>
   3.137 +	<node key = "class"	context = "colgroup,table,frameset,kbd,p,isindex,caption,col,q,tr,button,dir,tfoot,th,font,small,ins,code,td,fieldset,object,a,option,optgroup,u,abbr,noframes,hr,h4,menu,body,pre,var,iframe,b,em,select,legend,strong,big,applet,dt,map,del,thead,input,h5,form,sub,address,h6,blockquote,h2,i,div,ul,img,tt,center,s,tbody,textarea,dd,sup,h1,link,noscript,cite,dl,frame,label,dfn,strike,br,li,samp,h3,area,ol,span,bdo,acronym"	deprecated = "false"	description = "space separated list of classes"/>
   3.138 +	<node key = "classid"	context = "object"	deprecated = "false"	description = "identifies an implementation"/>
   3.139 +	<node key = "clear"	context = "br"	deprecated = "true"	description = "control of text flow"/>
   3.140 +	<node key = "code"	context = "applet"	deprecated = "true"	description = "applet class file"/>
   3.141 +	<node key = "codebase"	context = "object"	deprecated = "false"	description = "base URI for classid, data, archive"/>
   3.142 +	<node key = "codebase"	context = "applet"	deprecated = "true"	description = "optional base URI for applet"/>
   3.143 +	<node key = "codetype"	context = "object"	deprecated = "false"	description = "content type for code"/>
   3.144 +	<node key = "color"	context = "basefont,font"	deprecated = "true"	description = "text color"/>
   3.145 +	<node key = "cols"	context = "frameset"	deprecated = "false"	description = "list of lengths, default: 100% (1 col)"/>
   3.146 +	<node key = "cols"	context = "textarea"	deprecated = "false"	description = ""/>
   3.147 +	<node key = "colspan"	context = "td,th"	deprecated = "false"	description = "number of cols spanned by cell"/>
   3.148 +	<node key = "compact"	context = "dir,dl,menu,ol,ul"	deprecated = "true"	description = "reduced interitem spacing"/>
   3.149 +	<node key = "content"	context = "meta"	deprecated = "false"	description = "associated information"/>
   3.150 +	<node key = "coords"	context = "area"	deprecated = "false"	description = "comma separated list of lengths"/>
   3.151 +	<node key = "coords"	context = "a"	deprecated = "false"	description = "for use with client-side image maps"/>
   3.152 +	<node key = "data"	context = "object"	deprecated = "false"	description = "reference to object's data"/>
   3.153 +	<node key = "datetime"	context = "del,ins"	deprecated = "false"	description = "date and time of change"/>
   3.154 +	<node key = "declare"	context = "object"	deprecated = "false"	description = "declare but don't instantiate flag"/>
   3.155 +	<node key = "defer"	context = "script"	deprecated = "false"	description = "UA may defer execution of script"/>
   3.156 +	<node key = "dir"	context = "colgroup,table,kbd,html,p,isindex,caption,col,q,tr,button,dir,meta,tfoot,th,font,small,ins,code,td,fieldset,object,a,option,optgroup,u,abbr,style,noframes,hr,h4,menu,body,pre,var,b,em,select,legend,strong,big,dt,map,del,thead,input,h5,form,title,sub,address,h6,blockquote,h2,i,div,ul,img,tt,center,s,tbody,textarea,dd,sup,h1,link,noscript,cite,dl,label,dfn,strike,head,li,samp,h3,area,ol,span,acronym"	deprecated = "false"	description = "direction for weak/neutral text"/>
   3.157 +	<node key = "dir"	context = "bdo"	deprecated = "false"	description = "directionality"/>
   3.158 +	<node key = "disabled"	context = "button,input,optgroup,option,select,textarea"	deprecated = "false"	description = "unavailable in this context"/>
   3.159 +	<node key = "enctype"	context = "form"	deprecated = "false"	description = ""/>
   3.160 +	<node key = "face"	context = "basefont,font"	deprecated = "true"	description = "comma separated list of font names"/>
   3.161 +	<node key = "for"	context = "label"	deprecated = "false"	description = "matches field ID value"/>
   3.162 +	<node key = "frame"	context = "table"	deprecated = "false"	description = "which parts of frame to render"/>
   3.163 +	<node key = "frameborder"	context = "frame,iframe"	deprecated = "false"	description = "request frame borders?"/>
   3.164 +	<node key = "headers"	context = "td,th"	deprecated = "false"	description = "list of id's for header cells"/>
   3.165 +	<node key = "height"	context = "iframe"	deprecated = "false"	description = "frame height"/>
   3.166 +	<node key = "height"	context = "img,object"	deprecated = "false"	description = "override height"/>
   3.167 +	<node key = "height"	context = "applet"	deprecated = "true"	description = "initial height"/>
   3.168 +	<node key = "height"	context = "td,th"	deprecated = "true"	description = "height for cell"/>
   3.169 +	<node key = "href"	context = "a,area,link"	deprecated = "false"	description = "URI for linked resource"/>
   3.170 +	<node key = "href"	context = "base"	deprecated = "false"	description = "URI that acts as base URI"/>
   3.171 +	<node key = "hreflang"	context = "a,link"	deprecated = "false"	description = "language code"/>
   3.172 +	<node key = "hspace"	context = "applet,img,object"	deprecated = "true"	description = "horizontal gutter"/>
   3.173 +	<node key = "http-equiv"	context = "meta"	deprecated = "false"	description = "HTTP response header name"/>
   3.174 +	<node key = "id"	context = "colgroup,table,frameset,kbd,p,isindex,caption,col,q,tr,button,dir,tfoot,th,font,small,ins,code,td,fieldset,object,a,option,optgroup,u,abbr,noframes,hr,h4,menu,body,pre,var,iframe,b,em,select,legend,strong,big,applet,dt,map,del,thead,input,h5,form,sub,basefont,address,h6,blockquote,h2,i,div,ul,img,tt,center,s,tbody,textarea,dd,sup,h1,link,noscript,cite,dl,frame,label,dfn,strike,br,li,param,samp,h3,area,ol,span,bdo,acronym"	deprecated = "false"	description = "document-wide unique id"/>
   3.175 +	<node key = "ismap"	context = "img,input"	deprecated = "false"	description = "use server-side image map"/>
   3.176 +	<node key = "label"	context = "option"	deprecated = "false"	description = "for use in hierarchical menus"/>
   3.177 +	<node key = "label"	context = "optgroup"	deprecated = "false"	description = "for use in hierarchical menus"/>
   3.178 +	<node key = "lang"	context = "colgroup,table,kbd,html,p,isindex,caption,col,q,tr,button,dir,meta,tfoot,th,font,small,ins,code,td,fieldset,object,a,option,optgroup,u,abbr,style,noframes,hr,h4,menu,body,pre,var,b,em,select,legend,strong,big,dt,map,del,thead,input,h5,form,title,sub,address,h6,blockquote,h2,i,div,ul,img,tt,center,s,tbody,textarea,dd,sup,h1,link,noscript,cite,dl,label,dfn,strike,head,li,samp,h3,area,ol,span,bdo,acronym"	deprecated = "false"	description = "language code"/>
   3.179 +	<node key = "language"	context = "script"	deprecated = "true"	description = "predefined script language name"/>
   3.180 +	<node key = "link"	context = "body"	deprecated = "true"	description = "color of links"/>
   3.181 +	<node key = "longdesc"	context = "img"	deprecated = "false"	description = "link to long description (complements
   3.182 +alt)"/>
   3.183 +	<node key = "longdesc"	context = "frame,iframe"	deprecated = "false"	description = "link to long description (complements
   3.184 +title)"/>
   3.185 +	<node key = "marginheight"	context = "frame,iframe"	deprecated = "false"	description = "margin height in pixels"/>
   3.186 +	<node key = "marginwidth"	context = "frame,iframe"	deprecated = "false"	description = "margin widths in pixels"/>
   3.187 +	<node key = "maxlength"	context = "input"	deprecated = "false"	description = "max chars for text fields"/>
   3.188 +	<node key = "media"	context = "style"	deprecated = "false"	description = "designed for use with these media"/>
   3.189 +	<node key = "media"	context = "link"	deprecated = "false"	description = "for rendering on these media"/>
   3.190 +	<node key = "method"	context = "form"	deprecated = "false"	description = "HTTP method used to submit the form"/>
   3.191 +	<node key = "multiple"	context = "select"	deprecated = "false"	description = "default is single selection"/>
   3.192 +	<node key = "name"	context = "button,textarea"	deprecated = "false"	description = ""/>
   3.193 +	<node key = "name"	context = "applet"	deprecated = "true"	description = "allows applets to find each other"/>
   3.194 +	<node key = "name"	context = "select"	deprecated = "false"	description = "field name"/>
   3.195 +	<node key = "name"	context = "form"	deprecated = "false"	description = "name of form for scripting"/>
   3.196 +	<node key = "name"	context = "frame,iframe"	deprecated = "false"	description = "name of frame for targetting"/>
   3.197 +	<node key = "name"	context = "img"	deprecated = "false"	description = "name of image for scripting"/>
   3.198 +	<node key = "name"	context = "a"	deprecated = "false"	description = "named link end"/>
   3.199 +	<node key = "name"	context = "input,object"	deprecated = "false"	description = "submit as part of form"/>
   3.200 +	<node key = "name"	context = "map"	deprecated = "false"	description = "for reference by usemap"/>
   3.201 +	<node key = "name"	context = "param"	deprecated = "false"	description = "property name"/>
   3.202 +	<node key = "name"	context = "meta"	deprecated = "false"	description = "metainformation name"/>
   3.203 +	<node key = "nohref"	context = "area"	deprecated = "false"	description = "this region has no action"/>
   3.204 +	<node key = "noresize"	context = "frame"	deprecated = "false"	description = "allow users to resize frames?"/>
   3.205 +	<node key = "noshade"	context = "hr"	deprecated = "true"	description = ""/>
   3.206 +	<node key = "nowrap"	context = "td,th"	deprecated = "true"	description = "suppress word wrap"/>
   3.207 +	<node key = "object"	context = "applet"	deprecated = "true"	description = "serialized applet file"/>
   3.208 +	<node key = "onblur"	context = "a,area,button,input,label,select,textarea"	deprecated = "false"	description = "the element lost the focus"/>
   3.209 +	<node key = "onchange"	context = "input,select,textarea"	deprecated = "false"	description = "the element value was changed"/>
   3.210 +	<node key = "onclick"	context = "colgroup,table,kbd,p,caption,col,q,tr,button,dir,tfoot,th,small,ins,code,td,fieldset,object,a,option,optgroup,u,abbr,noframes,hr,h4,menu,body,pre,var,b,em,select,legend,strong,big,dt,map,del,thead,input,h5,form,sub,address,h6,blockquote,h2,i,div,ul,img,tt,center,s,tbody,textarea,dd,sup,h1,link,noscript,cite,dl,label,dfn,strike,li,samp,h3,area,ol,span,acronym"	deprecated = "false"	description = "a pointer button was clicked"/>
   3.211 +	<node key = "ondblclick"	context = "colgroup,table,kbd,p,caption,col,q,tr,button,dir,tfoot,th,small,ins,code,td,fieldset,object,a,option,optgroup,u,abbr,noframes,hr,h4,menu,body,pre,var,b,em,select,legend,strong,big,dt,map,del,thead,input,h5,form,sub,address,h6,blockquote,h2,i,div,ul,img,tt,center,s,tbody,textarea,dd,sup,h1,link,noscript,cite,dl,label,dfn,strike,li,samp,h3,area,ol,span,acronym"	deprecated = "false"	description = "a pointer button was double clicked"/>
   3.212 +	<node key = "onfocus"	context = "a,area,button,input,label,select,textarea"	deprecated = "false"	description = "the element got the focus"/>
   3.213 +	<node key = "onkeydown"	context = "colgroup,table,kbd,p,caption,col,q,tr,button,dir,tfoot,th,small,ins,code,td,fieldset,object,a,option,optgroup,u,abbr,noframes,hr,h4,menu,body,pre,var,b,em,select,legend,strong,big,dt,map,del,thead,input,h5,form,sub,address,h6,blockquote,h2,i,div,ul,img,tt,center,s,tbody,textarea,dd,sup,h1,link,noscript,cite,dl,label,dfn,strike,li,samp,h3,area,ol,span,acronym"	deprecated = "false"	description = "a key was pressed down"/>
   3.214 +	<node key = "onkeypress"	context = "colgroup,table,kbd,p,caption,col,q,tr,button,dir,tfoot,th,small,ins,code,td,fieldset,object,a,option,optgroup,u,abbr,noframes,hr,h4,menu,body,pre,var,b,em,select,legend,strong,big,dt,map,del,thead,input,h5,form,sub,address,h6,blockquote,h2,i,div,ul,img,tt,center,s,tbody,textarea,dd,sup,h1,link,noscript,cite,dl,label,dfn,strike,li,samp,h3,area,ol,span,acronym"	deprecated = "false"	description = "a key was pressed and released"/>
   3.215 +	<node key = "onkeyup"	context = "colgroup,table,kbd,p,caption,col,q,tr,button,dir,tfoot,th,small,ins,code,td,fieldset,object,a,option,optgroup,u,abbr,noframes,hr,h4,menu,body,pre,var,b,em,select,legend,strong,big,dt,map,del,thead,input,h5,form,sub,address,h6,blockquote,h2,i,div,ul,img,tt,center,s,tbody,textarea,dd,sup,h1,link,noscript,cite,dl,label,dfn,strike,li,samp,h3,area,ol,span,acronym"	deprecated = "false"	description = "a key was released"/>
   3.216 +	<node key = "onload"	context = "frameset"	deprecated = "false"	description = "all the frames have been loaded"/>
   3.217 +	<node key = "onload"	context = "body"	deprecated = "false"	description = "the document has been loaded"/>
   3.218 +	<node key = "onmousedown"	context = "colgroup,table,kbd,p,caption,col,q,tr,button,dir,tfoot,th,small,ins,code,td,fieldset,object,a,option,optgroup,u,abbr,noframes,hr,h4,menu,body,pre,var,b,em,select,legend,strong,big,dt,map,del,thead,input,h5,form,sub,address,h6,blockquote,h2,i,div,ul,img,tt,center,s,tbody,textarea,dd,sup,h1,link,noscript,cite,dl,label,dfn,strike,li,samp,h3,area,ol,span,acronym"	deprecated = "false"	description = "a pointer button was pressed down"/>
   3.219 +	<node key = "onmousemove"	context = "colgroup,table,kbd,p,caption,col,q,tr,button,dir,tfoot,th,small,ins,code,td,fieldset,object,a,option,optgroup,u,abbr,noframes,hr,h4,menu,body,pre,var,b,em,select,legend,strong,big,dt,map,del,thead,input,h5,form,sub,address,h6,blockquote,h2,i,div,ul,img,tt,center,s,tbody,textarea,dd,sup,h1,link,noscript,cite,dl,label,dfn,strike,li,samp,h3,area,ol,span,acronym"	deprecated = "false"	description = "a pointer was moved within"/>
   3.220 +	<node key = "onmouseout"	context = "colgroup,table,kbd,p,caption,col,q,tr,button,dir,tfoot,th,small,ins,code,td,fieldset,object,a,option,optgroup,u,abbr,noframes,hr,h4,menu,body,pre,var,b,em,select,legend,strong,big,dt,map,del,thead,input,h5,form,sub,address,h6,blockquote,h2,i,div,ul,img,tt,center,s,tbody,textarea,dd,sup,h1,link,noscript,cite,dl,label,dfn,strike,li,samp,h3,area,ol,span,acronym"	deprecated = "false"	description = "a pointer was moved away"/>
   3.221 +	<node key = "onmouseover"	context = "colgroup,table,kbd,p,caption,col,q,tr,button,dir,tfoot,th,small,ins,code,td,fieldset,object,a,option,optgroup,u,abbr,noframes,hr,h4,menu,body,pre,var,b,em,select,legend,strong,big,dt,map,del,thead,input,h5,form,sub,address,h6,blockquote,h2,i,div,ul,img,tt,center,s,tbody,textarea,dd,sup,h1,link,noscript,cite,dl,label,dfn,strike,li,samp,h3,area,ol,span,acronym"	deprecated = "false"	description = "a pointer was moved onto"/>
   3.222 +	<node key = "onmouseup"	context = "colgroup,table,kbd,p,caption,col,q,tr,button,dir,tfoot,th,small,ins,code,td,fieldset,object,a,option,optgroup,u,abbr,noframes,hr,h4,menu,body,pre,var,b,em,select,legend,strong,big,dt,map,del,thead,input,h5,form,sub,address,h6,blockquote,h2,i,div,ul,img,tt,center,s,tbody,textarea,dd,sup,h1,link,noscript,cite,dl,label,dfn,strike,li,samp,h3,area,ol,span,acronym"	deprecated = "false"	description = "a pointer button was released"/>
   3.223 +	<node key = "onreset"	context = "form"	deprecated = "false"	description = "the form was reset"/>
   3.224 +	<node key = "onselect"	context = "input,textarea"	deprecated = "false"	description = "some text was selected"/>
   3.225 +	<node key = "onsubmit"	context = "form"	deprecated = "false"	description = "the form was submitted"/>
   3.226 +	<node key = "onunload"	context = "frameset"	deprecated = "false"	description = "all the frames have been removed"/>
   3.227 +	<node key = "onunload"	context = "body"	deprecated = "false"	description = "the document has been removed"/>
   3.228 +	<node key = "profile"	context = "head"	deprecated = "false"	description = "named dictionary of meta info"/>
   3.229 +	<node key = "prompt"	context = "isindex"	deprecated = "true"	description = "prompt message"/>
   3.230 +	<node key = "readonly"	context = "textarea"	deprecated = "false"	description = ""/>
   3.231 +	<node key = "readonly"	context = "input"	deprecated = "false"	description = "for text and passwd"/>
   3.232 +	<node key = "rel"	context = "a,link"	deprecated = "false"	description = "forward link types"/>
   3.233 +	<node key = "rev"	context = "a,link"	deprecated = "false"	description = "reverse link types"/>
   3.234 +	<node key = "rows"	context = "frameset"	deprecated = "false"	description = "list of lengths, default: 100% (1 row)"/>
   3.235 +	<node key = "rows"	context = "textarea"	deprecated = "false"	description = ""/>
   3.236 +	<node key = "rowspan"	context = "td,th"	deprecated = "false"	description = "number of rows spanned by cell"/>
   3.237 +	<node key = "rules"	context = "table"	deprecated = "false"	description = "rulings between rows and cols"/>
   3.238 +	<node key = "scheme"	context = "meta"	deprecated = "false"	description = "select form of content"/>
   3.239 +	<node key = "scope"	context = "td,th"	deprecated = "false"	description = "scope covered by header cells"/>
   3.240 +	<node key = "scrolling"	context = "frame,iframe"	deprecated = "false"	description = "scrollbar or none"/>
   3.241 +	<node key = "selected"	context = "option"	deprecated = "false"	description = ""/>
   3.242 +	<node key = "shape"	context = "area"	deprecated = "false"	description = "controls interpretation of coords"/>
   3.243 +	<node key = "shape"	context = "a"	deprecated = "false"	description = "for use with client-side image maps"/>
   3.244 +	<node key = "size"	context = "hr"	deprecated = "true"	description = ""/>
   3.245 +	<node key = "size"	context = "font"	deprecated = "true"	description = "[+|-]nn e.g. size=+1, size=4"/>
   3.246 +	<node key = "size"	context = "input"	deprecated = "false"	description = "specific to each type of field"/>
   3.247 +	<node key = "size"	context = "basefont"	deprecated = "true"	description = "base font size for FONT elements"/>
   3.248 +	<node key = "size"	context = "select"	deprecated = "false"	description = "rows visible"/>
   3.249 +	<node key = "span"	context = "col"	deprecated = "false"	description = "COL attributes affect N columns"/>
   3.250 +	<node key = "span"	context = "colgroup"	deprecated = "false"	description = "default number of columns in group"/>
   3.251 +	<node key = "src"	context = "script"	deprecated = "false"	description = "URI for an external script"/>
   3.252 +	<node key = "src"	context = "input"	deprecated = "false"	description = "for fields with images"/>
   3.253 +	<node key = "src"	context = "frame,iframe"	deprecated = "false"	description = "source of frame content"/>
   3.254 +	<node key = "src"	context = "img"	deprecated = "false"	description = "URI of image to embed"/>
   3.255 +	<node key = "standby"	context = "object"	deprecated = "false"	description = "message to show while loading"/>
   3.256 +	<node key = "start"	context = "ol"	deprecated = "true"	description = "starting sequence number"/>
   3.257 +	<node key = "style"	context = "colgroup,table,frameset,kbd,p,isindex,caption,col,q,tr,button,dir,tfoot,th,font,small,ins,code,td,fieldset,object,a,option,optgroup,u,abbr,noframes,hr,h4,menu,body,pre,var,iframe,b,em,select,legend,strong,big,applet,dt,map,del,thead,input,h5,form,sub,address,h6,blockquote,h2,i,div,ul,img,tt,center,s,tbody,textarea,dd,sup,h1,link,noscript,cite,dl,frame,label,dfn,strike,br,li,samp,h3,area,ol,span,bdo,acronym"	deprecated = "false"	description = "associated style info"/>
   3.258 +	<node key = "summary"	context = "table"	deprecated = "false"	description = "purpose/structure for speech output"/>
   3.259 +	<node key = "tabindex"	context = "a,area,button,input,object,select,textarea"	deprecated = "false"	description = "position in tabbing order"/>
   3.260 +	<node key = "target"	context = "a,area,base,form,link"	deprecated = "false"	description = "render in this frame"/>
   3.261 +	<node key = "text"	context = "body"	deprecated = "true"	description = "document text color"/>
   3.262 +	<node key = "title"	context = "colgroup,table,frameset,kbd,p,isindex,caption,col,q,tr,button,dir,tfoot,th,font,small,ins,code,td,fieldset,object,a,option,optgroup,u,abbr,style,noframes,hr,h4,menu,body,pre,var,iframe,b,em,select,legend,strong,big,applet,dt,map,del,thead,input,h5,form,sub,address,h6,blockquote,h2,i,div,ul,img,tt,center,s,tbody,textarea,dd,sup,h1,link,noscript,cite,dl,frame,label,dfn,strike,br,li,samp,h3,area,ol,span,bdo,acronym"	deprecated = "false"	description = "advisory title"/>
   3.263 +	<node key = "type"	context = "a,link"	deprecated = "false"	description = "advisory content type"/>
   3.264 +	<node key = "type"	context = "object"	deprecated = "false"	description = "content type for data"/>
   3.265 +	<node key = "type"	context = "param"	deprecated = "false"	description = "content type for value when
   3.266 +valuetype=ref"/>
   3.267 +	<node key = "type"	context = "script"	deprecated = "false"	description = "content type of script language"/>
   3.268 +	<node key = "type"	context = "style"	deprecated = "false"	description = "content type of style language"/>
   3.269 +	<node key = "type"	context = "input"	deprecated = "false"	description = "what kind of widget is needed"/>
   3.270 +	<node key = "type"	context = "li"	deprecated = "true"	description = "list item style"/>
   3.271 +	<node key = "type"	context = "ol"	deprecated = "true"	description = "numbering style"/>
   3.272 +	<node key = "type"	context = "ul"	deprecated = "true"	description = "bullet style"/>
   3.273 +	<node key = "type"	context = "button"	deprecated = "false"	description = "for use as form button"/>
   3.274 +	<node key = "usemap"	context = "img,input,object"	deprecated = "false"	description = "use client-side image map"/>
   3.275 +	<node key = "valign"	context = "col,colgroup,tbody,td,tfoot,th,thead,tr"	deprecated = "false"	description = "vertical alignment in cells"/>
   3.276 +	<node key = "value"	context = "option"	deprecated = "false"	description = "defaults to element content"/>
   3.277 +	<node key = "value"	context = "param"	deprecated = "false"	description = "property value"/>
   3.278 +	<node key = "value"	context = "input"	deprecated = "false"	description = "required for radio and checkboxes"/>
   3.279 +	<node key = "value"	context = "button"	deprecated = "false"	description = "sent to server when submitted"/>
   3.280 +	<node key = "value"	context = "li"	deprecated = "true"	description = "reset sequence number"/>
   3.281 +	<node key = "valuetype"	context = "param"	deprecated = "false"	description = "How to interpret value"/>
   3.282 +	<node key = "version"	context = "html"	deprecated = "true"	description = "Constant"/>
   3.283 +	<node key = "vlink"	context = "body"	deprecated = "true"	description = "color of visited links"/>
   3.284 +	<node key = "vspace"	context = "applet,img,object"	deprecated = "true"	description = "vertical gutter"/>
   3.285 +	<node key = "width"	context = "hr"	deprecated = "true"	description = ""/>
   3.286 +	<node key = "width"	context = "iframe"	deprecated = "false"	description = "frame width"/>
   3.287 +	<node key = "width"	context = "img,object"	deprecated = "false"	description = "override width"/>
   3.288 +	<node key = "width"	context = "table"	deprecated = "false"	description = "table width"/>
   3.289 +	<node key = "width"	context = "applet"	deprecated = "true"	description = "initial width"/>
   3.290 +	<node key = "width"	context = "col"	deprecated = "false"	description = "column width specification"/>
   3.291 +	<node key = "width"	context = "colgroup"	deprecated = "false"	description = "default width for enclosed COLs"/>
   3.292 +	<node key = "width"	context = "td,th"	deprecated = "true"	description = "width for cell"/>
   3.293 +	<node key = "width"	context = "pre"	deprecated = "true"	description = ""/>
   3.294 +</documentation>