code: protected List<DCTree> htmlAttrs() {
          ListBuffer<DCTree> attrs = new ListBuffer<DCTree>();
          skipWhitespace();
  
          loop:
          while (isIdentifierStart(ch)) {
              int namePos = bp;
              Name name = readIdentifier();
              skipWhitespace();
              List<DCTree> value = null;
              ValueKind vkind = ValueKind.EMPTY;
              if (ch == '=') {
                  ListBuffer<DCTree> v = new ListBuffer<DCTree>();
                  nextChar();
                  skipWhitespace();
                  if (ch == '\'' || ch == '"') {
                      vkind = (ch == '\'') ? ValueKind.SINGLE : ValueKind.DOUBLE;
                      char quote = ch;
                      nextChar();
                      textStart = bp;
                      while (bp < buflen && ch != quote) {
                          if (newline && ch == '@') {
                              attrs.add(erroneous("dc.unterminated.string", namePos));
                              // No point trying to read more.
                              // In fact, all attrs get discarded by the caller
                              // and superseded by a malformed.html node because
                              // the html tag itself is not terminated correctly.
                              break loop;
                          }
                          attrValueChar(v);
                      }
                      addPendingText(v, bp - 1);
                      nextChar();
                  } else {
                      vkind = ValueKind.UNQUOTED;
                      textStart = bp;
                      while (bp < buflen && !isUnquotedAttrValueTerminator(ch)) {
                          attrValueChar(v);
                      }
                      addPendingText(v, bp - 1);
                  }
                  skipWhitespace();
                  value = v.toList();
              }
              DCAttribute attr = m.at(namePos).Attribute(name, vkind, value);
              attrs.add(attr);
          }
  
          return attrs.toList();
      }
docs: Read a series of HTML attributes, terminated by {@literal > }.
  Each attribute is of the form {@literal identifier[=value] }.
  "value" may be unquoted, single-quoted, or double-quoted.