Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright (c) 2007-2012 Mozilla Foundation
   *
   * Permission is hereby granted, free of charge, to any person obtaining a 
   * copy of this software and associated documentation files (the "Software"), 
   * to deal in the Software without restriction, including without limitation 
   * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
   * and/or sell copies of the Software, and to permit persons to whom the 
   * Software is furnished to do so, subject to the following conditions:
  *
  * The above copyright notice and this permission notice shall be included in 
  * all copies or substantial portions of the Software.
  *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
  * DEALINGS IN THE SOFTWARE.
  */
 
 package nu.validator.spec.html5;
 
 import java.util.Map;
 
 
 
 
 public final class Html5SpecBuilder implements ContentHandler {
 
     private static final String NS = "http://www.w3.org/1999/xhtml";
 
     private static final String SPEC_LINK_URI = System.getProperty(
             "nu.validator.spec.html5-link",
             "http://www.whatwg.org/specs/web-apps/current-work/");
 
     private static final String SPEC_LOAD_URI = System.getProperty(
             "nu.validator.spec.html5-load",
             "http://www.whatwg.org/specs/web-apps/current-work/");
 
     private static final Pattern THE = Pattern.compile("^.*The.*$".);
 
     private static final Pattern ELEMENT = Pattern.compile("^.*The.*element\\s*$".);
 
     private static final Pattern CATEGORIES = Pattern.compile("^\\s*Categories\\s*");
 
     private static final Pattern CONTEXT = Pattern.compile("^\\s*Contexts\\s+in\\s+which\\s+th(is|ese)\\s+element[s]?\\s+can\\s+be\\s+used:?\\s*");
 
     private static final Pattern CONTENT_MODEL = Pattern.compile("^\\s*Content\\s+model:?\\s*$");
 
     private static final Pattern ATTRIBUTES = Pattern.compile("^\\s*Content\\s+attributes:?\\s*$");
 
     private enum State {
         AWAITING_HEADING, IN_H4, IN_CODE_IN_H4, AWAITING_ELEMENT_DL, IN_ELEMENT_DL_START, IN_CATEGORIES_DT, CAPTURING_CATEGORIES_DDS, IN_CONTEXT_DT, CAPTURING_CONTEXT_DDS, IN_CONTENT_MODEL_DT, CAPTURING_CONTENT_MODEL_DDS, IN_ATTRIBUTES_DT, CAPTURING_ATTRIBUTES_DDS
     }
 
     private Locator locator;
     
     private State state = .;
 
     private int captureDepth = 0;
 
     private String currentId;
 
     private StringBuilder nameText = new StringBuilder();
 
     private StringBuilder referenceText = new StringBuilder();
 
     private TreeBuilder fragmentBuilder;
 
     private Name currentName;
 
     private Map<NameStringurisByElement = new HashMap<NameString>();
 
 
 
    private boolean ignoreTextNodes = false;
    public static Spec parseSpec(InputSource inthrows IOExceptionSAXException {
        HtmlParser parser = new HtmlParser(.);
        Html5SpecBuilder handler = new Html5SpecBuilder();
        parser.setContentHandler(handler);
        parser.parse(in);
        return handler.buildSpec();
    }
    public static Spec parseSpec() throws IOExceptionSAXException {
        return parseSpec(new InputSource());
    }
    
    public static void main(String[] argsthrows IOExceptionSAXException {
        try {
            parseSpec();            
        } catch (SAXParseException e) {
            ..printf("Line: %d Col: %d\n"e.getLineNumber(), e.getColumnNumber());
            e.printStackTrace();
        }
    }
    
    public static Spec parseSpec(InputStream html5SpecAsStreamthrows IOExceptionSAXException {
        return parseSpec(new InputSource(html5SpecAsStream));
    }
    private Spec buildSpec() {
        return new Spec(,
                );
    }

    
    private Html5SpecBuilder() {
        super();
    }

    
    public void characters(char[] chint startint length)
            throws SAXException {
        switch () {
            case :
                break;
            case :
                .append(chstartlength);
                if (.length() != 0) {
                  Matcher m = .matcher();
                  if (m.matches()) {
                    String ln = .toString().intern();
                    if ("" == ln) {
                      throw new SAXParseException(
                          "Malformed spec: no element "+);
                    }
                     = new Name(ln);
                    if (!.containsKey()) {
                      if ( == null) {
                         = .;
                        //                                throw new SAXParseException(
                        //                                        "Malformed spec: no element id.", locator);
                      }
                      .put( + "#"
                          + );
                    }
                  }
                }
                break;
            case :
                .append(chstartlength);
                break;
            case :
                break;
            case :
                break;
            case :
            case :
            case :
            case :
                .append(chstartlength);
                break;
            case :
            case :
            case :
            case :
                if () {
                     = false;
                } else {
                    .characters(chstartlength);
                }
                break;
        }
    }
    public void endDocument() throws SAXException {
        switch () {
            case :
            case :
                // XXX finish
                break;
            case :
            case :
            case :
            case :
            case :
            case :
            case :
            case :
            case :
            case :
            case :
                throw new SAXException(
                        "Malformed spec: Wrong state for document end.");
        }
    }
    public void endElement(String uriString localNameString qName)
            throws SAXException {
        switch () {
            case :
                break;
            case :
                if ("h4" == localName &&  == uri) {
                    Matcher m = .matcher();
                    if (m.matches()) {
                        String ln = .toString().intern();
                        if ("" == ln) {
                            throw new SAXParseException(
                                    "Malformed spec: no element"+);
                        }
                            if ( == null) {
                                 = .;
//                                throw new SAXParseException(
//                                        "Malformed spec: no element id.", locator);
                            }
                             = .;
                    } else {
                         = null;
                        .setLength(0);
                         = .;
                    }
                }
                break;
            case :
                if ("code" == localName &&  == uri) {
                     = .;
                }
                break;
            case :
                break;
            case :
                throw new SAXParseException(
                        "Malformed spec: no children in element dl.");
            case :
                if ("a" == localName &&  == uri) {
                    Matcher m = .matcher();
                    if (m.matches()) {
                         = .;
                         = 0;
                         = new TreeBuilder(truetrue);
                    } else {
                        throw new SAXParseException(
                                "Malformed spec: Expected dt to be categories dt but it was not.");
                    }
                }
                break;
            case :
                if ("a" == localName &&  == uri) {
                    Matcher m = .matcher();
                    if (m.matches()) {
                         = .;
                         = 0;
                         = new TreeBuilder(truetrue);
                    } else {
                      ..printf("Line: %d Col: %d\n".getLineNumber(), .getColumnNumber());
                        throw new SAXParseException(
                                "Malformed spec at element " + .getLocalName() + " (" +  + "): Expected dt to be context dt but it was not.");
                    }
                }
                break;
            case :
                if ("a" == localName &&  == uri) {
                    Matcher m = .matcher();
                    if (m.matches()) {
                         = .;
                         = 0;
                         = new TreeBuilder(truetrue);
                    } else {
                        throw new SAXParseException(
                                "Malformed spec: Expected dt to be content-model dt but it was not.");
                    }
                }
                break;
            case :
                if ("a" == localName &&  == uri) {
                    Matcher m = .matcher();
                    if (m.matches()) {
                         = .;
                         = 0;
                         = new TreeBuilder(truetrue);
                    } else {
                        throw new SAXParseException(
                                "Malformed spec: Expected dt to be content-attributes dt but it was not.");
                    }
                }
                break;
            case :
            case :
            case :
            case :
                if ("dt" == localName) {
                    break;
                }
                if ( == 0) {
                    throw new SAXParseException(
                            "Malformed spec: Did not see following dt when capturing dds.");
                }
                --;
                .endElement(urilocalNameqName);
                break;
        }
    }
    public void endPrefixMapping(String prefixthrows SAXException {
    }
    public void ignorableWhitespace(char[] chint startint length)
            throws SAXException {
    }
    public void processingInstruction(String targetString data)
            throws SAXException {
    }
    public void setDocumentLocator(Locator locator) {
        this. = locator;
    }
    public void skippedEntity(String namethrows SAXException {
    }
    public void startDocument() throws SAXException {
        // TODO Auto-generated method stub
    }
    public void startElement(String uriString localNameString qName,
            Attributes attsthrows SAXException {
        switch () {
            case :
                if ("h4" == localName &&  == uri) {
                    .setLength(0);
                     = atts.getValue("""id");
                     = null;
                     = .;
                }
                break;
            case :
                if ("code" == localName &&  == uri) {
                    .setLength(0);
                     = .;
                }
                break;
            case :
                break;
            case :
                if ("dl" == localName &&  == uri
                        && "element".equals(atts.getValue("""class"))) {
                     = .;
                }
                break;
            case :
                if ("dt" == localName &&  == uri) {
                    .setLength(0);
                     = .;
                } else {
                    throw new SAXParseException("Malformed spec: Expected dt in dl.");
                }
                break;
            case :
                if ("a" == localName &&  == uri) {
                     = .;
                    break;
                }
            case :
                if ("a" == localName &&  == uri) {
                     = .;
                    break;
                }
            case :
                if ("a" == localName &&  == uri) {
                     = .;
                    break;
                }
            case :
                if ("a" == localName &&  == uri) {
                     = .;
                    break;
                }
                throw new SAXParseException(
                        "Malformed spec: Not expecting children in dts.");
            case :
            case :
            case :
            case :
                if ("dt" == localName &&  == uri &&  == 0) {
                     = true;
                    DocumentFragment fragment = (DocumentFragment.getRoot();
                     = null;
                    .setLength(0);
                    if ( == .) {
                        .put(fragment);
                         = .;
                    } else if ( == .) {
                        .put(fragment);
                         = .;
                    } else if ( == .) {
                        .put(fragment);
                         = .;
                    } else {
                        .put(fragment);
                         = .;
                    }
                } else {
                    ++;
                    String href = null;
                    if ("a" == localName &&  == uri
                            && (href = atts.getValue("""href")) != null) {
                        if (href.startsWith("#")) {
                            href =  + href;
                        }
                        AttributesImpl attributesImpl = new AttributesImpl();
                        attributesImpl.addAttribute("href"href);
                        .startElement(urilocalNameqName,
                                attributesImpl);
                    } else {
                        .startElement(urilocalNameqName,
                                .);
                    }
                }
                break;
        }
    }
    public void startPrefixMapping(String prefixString uri)
            throws SAXException {
    }
New to GrepCode? Check out our FAQ X