// TODO: process CDATA, scripts
static LS htmlcoarsetok(S s) {
new LS tok;
int l = s == null ? 0 : s.length();
int i = 0;
while (i < l) {
int j = i;
char c;
// scan for non-tags
while (j < l) {
if (s.charAt(j) != '<')
// regular character
++j;
else if (s.substring(j, Math.min(j+4, l)).equals(""));
j = Math.min(j+3, l);
} else {
char c = charAt(s, j+1); // character after <
if (c == '/' || isLetter(c))
// it's a tag
break;
else
++j;
}
}
tok.add(s.substring(i, j)); // add non-tag content
i = j;
if (i >= l) break;
c = s.charAt(i);
// scan over tag
if (c == '<') {
++j;
while (j < l && s.charAt(j) != '>') ++j; // TODO: strings in tag?
if (j < l) ++j;
}
tok.add(s.substring(i, j)); // add tag
i = j;
}
if ((tok.size() & 1) == 0) tok.add("");
return tok;
}