next method

Reads the next token.

At the end of the data it returns a PdfContentTokenKind.endOfData token; calling again keeps returning the same one.

Implementation

PdfContentToken next() {
  skipWhitespace();
  if (position >= end) {
    return PdfContentToken(PdfContentTokenKind.endOfData, position, position);
  }

  final start = position;
  final byte = data[position];

  switch (byte) {
    case 0x25: // %
      return _readComment(start);
    case 0x2F: // /
      return _readName(start);
    case 0x28: // (
      return _readLiteralString(start);
    case 0x3C: // <
      if (position + 1 < end && data[position + 1] == 0x3C) {
        position += 2;
        return PdfContentToken(
            PdfContentTokenKind.dictStart, start, position,
            text: '<<');
      }
      return _readHexString(start);
    case 0x3E: // >
      if (position + 1 < end && data[position + 1] == 0x3E) {
        position += 2;
        return PdfContentToken(PdfContentTokenKind.dictEnd, start, position,
            text: '>>');
      }
      // Stray `>`: garbage, consumed as a one-byte keyword.
      position++;
      return PdfContentToken(PdfContentTokenKind.keyword, start, position,
          text: '>');
    case 0x5B: // [
      position++;
      return PdfContentToken(PdfContentTokenKind.arrayStart, start, position,
          text: '[');
    case 0x5D: // ]
      position++;
      return PdfContentToken(PdfContentTokenKind.arrayEnd, start, position,
          text: ']');
    case 0x7B: // {
    case 0x7D: // }
      position++;
      return PdfContentToken(PdfContentTokenKind.keyword, start, position,
          text: String.fromCharCode(byte));
    case 0x29: // stray )
      position++;
      return PdfContentToken(PdfContentTokenKind.keyword, start, position,
          text: ')');
  }

  if (_startsNumber(byte)) {
    return _readNumber(start);
  }
  return _readKeyword(start);
}