Methods Summary |
---|
private static void | crunch(java.lang.StringBuilder sb)
int i = 0;
int len = sb.length();
while (i < len) {
char c = sb.charAt(i);
if (c == '\0") {
if (i == 0 || i == len - 1 ||
sb.charAt(i - 1) == ' " ||
sb.charAt(i - 1) == '\0" ||
sb.charAt(i + 1) == ' " ||
sb.charAt(i + 1) == '\0") {
sb.deleteCharAt(i);
len--;
} else {
i++;
}
} else {
i++;
}
}
for (i = 0; i < len; i++) {
if (sb.charAt(i) == '\0") {
sb.setCharAt(i, ' ");
}
}
|
public int | findTokenEnd(java.lang.CharSequence text, int cursor){@inheritDoc}
int len = text.length();
int i = cursor;
while (i < len) {
char c = text.charAt(i);
if (c == '," || c == ';") {
return i;
} else if (c == '"") {
i++;
while (i < len) {
c = text.charAt(i);
if (c == '"") {
i++;
break;
} else if (c == '\\") {
i += 2;
} else {
i++;
}
}
} else if (c == '(") {
int level = 1;
i++;
while (i < len && level > 0) {
c = text.charAt(i);
if (c == ')") {
level--;
i++;
} else if (c == '(") {
level++;
i++;
} else if (c == '\\") {
i += 2;
} else {
i++;
}
}
} else if (c == '<") {
i++;
while (i < len) {
c = text.charAt(i);
if (c == '>") {
i++;
break;
} else {
i++;
}
}
} else {
i++;
}
}
return i;
|
public int | findTokenStart(java.lang.CharSequence text, int cursor){@inheritDoc}
/*
* It's hard to search backward, so search forward until
* we reach the cursor.
*/
int best = 0;
int i = 0;
while (i < cursor) {
i = findTokenEnd(text, i);
if (i < cursor) {
i++; // Skip terminating punctuation
while (i < cursor && text.charAt(i) == ' ") {
i++;
}
if (i < cursor) {
best = i;
}
}
}
return best;
|
public java.lang.CharSequence | terminateToken(java.lang.CharSequence text)Terminates the specified address with a comma and space.
This assumes that the specified text already has valid syntax.
The Adapter subclass's convertToString() method must make that
guarantee.
return text + ", ";
|
public static Rfc822Token[] | tokenize(java.lang.CharSequence text)This constructor will try to take a string like
"Foo Bar (something) <foo\@google.com>,
blah\@google.com (something)"
and convert it into one or more Rfc822Tokens.
It does *not* decode MIME encoded-words; charset conversion
must already have taken place if necessary.
It will try to be tolerant of broken syntax instead of
returning an error.
ArrayList<Rfc822Token> out = new ArrayList<Rfc822Token>();
StringBuilder name = new StringBuilder();
StringBuilder address = new StringBuilder();
StringBuilder comment = new StringBuilder();
int i = 0;
int cursor = text.length();
while (i < cursor) {
char c = text.charAt(i);
if (c == '," || c == ';") {
i++;
while (i < cursor && text.charAt(i) == ' ") {
i++;
}
crunch(name);
if (address.length() > 0) {
out.add(new Rfc822Token(name.toString(),
address.toString(),
comment.toString()));
} else if (name.length() > 0) {
out.add(new Rfc822Token(null,
name.toString(),
comment.toString()));
}
name.setLength(0);
address.setLength(0);
address.setLength(0);
} else if (c == '"") {
i++;
while (i < cursor) {
c = text.charAt(i);
if (c == '"") {
i++;
break;
} else if (c == '\\") {
name.append(text.charAt(i + 1));
i += 2;
} else {
name.append(c);
i++;
}
}
} else if (c == '(") {
int level = 1;
i++;
while (i < cursor && level > 0) {
c = text.charAt(i);
if (c == ')") {
if (level > 1) {
comment.append(c);
}
level--;
i++;
} else if (c == '(") {
comment.append(c);
level++;
i++;
} else if (c == '\\") {
comment.append(text.charAt(i + 1));
i += 2;
} else {
comment.append(c);
i++;
}
}
} else if (c == '<") {
i++;
while (i < cursor) {
c = text.charAt(i);
if (c == '>") {
i++;
break;
} else {
address.append(c);
i++;
}
}
} else if (c == ' ") {
name.append('\0");
i++;
} else {
name.append(c);
i++;
}
}
crunch(name);
if (address.length() > 0) {
out.add(new Rfc822Token(name.toString(),
address.toString(),
comment.toString()));
} else if (name.length() > 0) {
out.add(new Rfc822Token(null,
name.toString(),
comment.toString()));
}
return out.toArray(new Rfc822Token[out.size()]);
|