code: protected void htmlAttrs() {
          skipWhitespace();
  
          loop:
          while (isIdentifierStart(ch)) {
              int namePos = bp;
              String name = readAttributeName();
              skipWhitespace();
              StringBuilder value = new StringBuilder();
              if (ch == '=') {
                  nextChar();
                  skipWhitespace();
                  if (ch == '\'' || ch == '"') {
                      char quote = ch;
                      nextChar();
                      while (bp < buflen && ch != quote) {
                          if (newline && ch == '@') {
                              // 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;
                          }
                          value.append(ch);
                          nextChar();
                      }
                      nextChar();
                  } else {
                      while (bp < buflen && !isUnquotedAttrValueTerminator(ch)) {
                          value.append(ch);
                          nextChar();
                      }
                  }
                  skipWhitespace();
              }
              checkHtmlAttr(name, value.toString());
          }
      }
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.