예제 #1
0
  /**
   * Tries to restore the key
   *
   * @return rest of key on success, otherwise empty string
   * @throws IOException on Reader-Error
   */
  private String fixKey() throws IOException {
    StringBuilder key = new StringBuilder();
    int lookahead_used = 0;
    char currentChar;

    // Find a char which ends key (','&&'\n') or entryfield ('='):
    do {
      currentChar = (char) read();
      key.append(currentChar);
      lookahead_used++;
    } while ((currentChar != ',' && currentChar != '\n' && currentChar != '=')
        && (lookahead_used < LOOKAHEAD));

    // Consumed a char too much, back into reader and remove from key:
    unread(currentChar);
    key.deleteCharAt(key.length() - 1);

    // Restore if possible:
    switch (currentChar) {
      case '=':

        // Get entryfieldname, push it back and take rest as key
        key = key.reverse();

        boolean matchedAlpha = false;
        for (int i = 0; i < key.length(); i++) {
          currentChar = key.charAt(i);

          /// Skip spaces:
          if (!matchedAlpha && currentChar == ' ') {
            continue;
          }
          matchedAlpha = true;

          // Begin of entryfieldname (e.g. author) -> push back:
          unread(currentChar);
          if (currentChar == ' ' || currentChar == '\n') {

            /*
             * found whitespaces, entryfieldname completed -> key in
             * keybuffer, skip whitespaces
             */
            StringBuilder newKey = new StringBuilder();
            for (int j = i; j < key.length(); j++) {
              currentChar = key.charAt(j);
              if (!Character.isWhitespace(currentChar)) {
                newKey.append(currentChar);
              }
            }

            // Finished, now reverse newKey and remove whitespaces:
            _pr.addWarning(
                Globals.lang("Line %0: Found corrupted BibTeX-key.", String.valueOf(line)));
            key = newKey.reverse();
          }
        }
        break;

      case ',':
        _pr.addWarning(
            Globals.lang(
                "Line %0: Found corrupted BibTeX-key (contains whitespaces).",
                String.valueOf(line)));

      case '\n':
        _pr.addWarning(
            Globals.lang(
                "Line %0: Found corrupted BibTeX-key (comma missing).", String.valueOf(line)));

        break;

      default:

        // No more lookahead, give up:
        unreadBuffer(key);
        return "";
    }

    return removeWhitespaces(key).toString();
  }