TextToken* TextToken::tokenizeLinks(const wchar_t *text) { TextToken *firstToken = NULL, *lastToken = NULL; int textLen = 0; int l = wcslen(text); for (int i=0; i<=l;) { int newTokenType, newTokenSize; int urlLen = Utils::detectURL(text+i); if (i == l) { newTokenType = END; newTokenSize = 1; } else if (urlLen > 0) { newTokenType = LINK; newTokenSize = urlLen; } else if (!wcsncmp(text+i, L"www.", 4)) { newTokenType = WWWLINK; newTokenSize = countNoWhitespace(text+i); } else if (!wcsncmp(text+i, L"mailto:", 7)) { newTokenType = LINK; newTokenSize = countNoWhitespace(text+i); } else { newTokenType = TEXT; newTokenSize = 1; } if (newTokenType != TEXT) { if (textLen >0 ) { TextToken *newToken = new TextToken(TEXT, text+i-textLen, textLen); textLen = 0; if (lastToken == NULL) { firstToken = newToken; } else { lastToken->setNext(newToken); } lastToken = newToken; } if (newTokenType == WWWLINK || newTokenType == LINK) { TextToken *newToken = new TextToken(newTokenType, text+i, newTokenSize); newToken->setLink(newToken->getText()); if (lastToken == NULL) { firstToken = newToken; } else { lastToken->setNext(newToken); } lastToken = newToken; } } else { textLen += newTokenSize; } i += newTokenSize; } return firstToken; }
int Utils::detectURL(const wchar_t *text) { int i; for (i=0; text[i]!='\0'; i++) { if (!((text[i] >= '0' && text[i]<='9') || iswalpha(text[i]))) { break; } } if (i > 0 && text[i]==':' && text[i+1]=='/' && text[i+2]=='/') { i += countNoWhitespace(text+i); for (; i > 0; i --) { if ((text[i-1] >= '0' && text[i-1]<='9') || iswalpha(text[i-1]) || text[i-1]=='/') { break; } } return i; } return 0; }