예제 #1
0
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;
}
예제 #2
0
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;
}