@Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        switch (state) {
            case AWAITING_HEADING:
                break;
            case IN_H4:
                referenceText.append(ch, start, length);
                if (nameText.length() != 0) {
                  Matcher m = THE.matcher(referenceText);
                  if (m.matches()) {
                    String ln = nameText.toString().intern();
                    if ("" == ln) {
                      throw new SAXParseException(
                          "Malformed spec: no element "+currentName, locator);
                    }
                    currentName = new Name(NS, ln);
                    if (!urisByElement.containsKey(currentName)) {
                      if (currentId == null) {
                        state = State.AWAITING_HEADING;
                        //                                throw new SAXParseException(
                        //                                        "Malformed spec: no element id.", locator);
                      }
                      urisByElement.put(currentName, SPEC_LINK_URI + "#"
                          + currentId);
                    }
                  }
                }
                break;
            case IN_CODE_IN_H4:
                nameText.append(ch, start, length);
                break;
            case AWAITING_ELEMENT_DL:
                break;
            case IN_ELEMENT_DL_START:
                break;
            case IN_CATEGORIES_DT:
            case IN_CONTEXT_DT:
            case IN_CONTENT_MODEL_DT:
            case IN_TAG_OMISSION_DT:
            case IN_ATTRIBUTES_DT:
                referenceText.append(ch, start, length);
                break;
            case CAPTURING_CATEGORIES_DDS:
            case CAPTURING_CONTEXT_DDS:
            case CAPTURING_CONTENT_MODEL_DDS:
            case CAPTURING_TAG_OMISSION_DDS:
            case CAPTURING_ATTRIBUTES_DDS:
                if (ignoreTextNodes) {
                    ignoreTextNodes = false;
                } else {
                    fragmentBuilder.characters(ch, start, length);
                }
                break;
        }
    }
@see org.xml.sax.ContentHandler#characters(char[], int, int)
src/nu/validator/spec/html5/Html5SpecBuilder.java