void SyntaxHighlighter_HTML::process( QTextDocument *doc, QTextParagraph *string, int, bool invalidate ) { QTextFormat *formatStandard = format( Standard ); QTextFormat *formatKeyword = format( Keyword ); QTextFormat *formatAttribute = format( Attribute ); QTextFormat *formatAttribValue = format( AttribValue ); const int StateStandard = 0; const int StateTag = 1; const int StateAttribute = 2; const int StateAttribVal = 3; QString buffer = ""; int state = StateStandard; if ( string->prev() ) { if ( string->prev()->endState() == -1 ) process( doc, string->prev(), 0, FALSE ); state = string->prev()->endState(); } int i = 0; for ( ;; ) { QChar c = string->at( i )->c; if ( c == '<' ) { if ( state != StateStandard ) string->setFormat( i - buffer.length(), buffer.length(), formatStandard, FALSE ); buffer = c; state = StateTag; string->setFormat( i, 1, formatKeyword, FALSE ); } else if ( c == '>' && ( state != StateStandard ) ) { string->setFormat( i, 1, formatKeyword, FALSE ); buffer = ""; state = StateStandard; } else if ( c == ' ' && state == StateTag ) { buffer += c; string->setFormat( i, 1, formatStandard, FALSE ); state = StateAttribute; } else if ( c == '=' && state == StateAttribute ) { buffer += c; string->setFormat( i, 1, formatStandard, FALSE ); state = StateAttribute; } else if ( c == '\"' && state == StateAttribute ) { buffer += c; string->setFormat( i, 1, formatStandard, FALSE ); state = StateAttribVal; } else if ( c == '\"' && state == StateAttribVal ) { buffer += c; string->setFormat( i, 1, formatStandard, FALSE ); state = StateAttribute; } else if ( state == StateAttribute ) { buffer += c; string->setFormat( i, 1, formatAttribute, FALSE ); } else if ( state == StateAttribVal ) { buffer += c; string->setFormat( i, 1, formatAttribValue, FALSE ); } else if ( state == StateTag ) { string->setFormat( i, 1, formatKeyword, FALSE ); buffer += c; } else if ( state == StateStandard ) { string->setFormat( i, 1, formatStandard, FALSE ); } i++; if ( i >= string->length() ) break; } string->setEndState( state ); string->setFirstPreProcess( FALSE ); if ( invalidate && string->next() && !string->next()->firstPreProcess() && string->next()->endState() != -1 ) { QTextParagraph *p = string->next(); while ( p ) { if ( p->endState() == -1 ) return; p->setEndState( -1 ); p = p->next(); } } }
void QSASyntaxHighlighter::process( QTextDocument *doc, QTextParagraph *string, int, bool invalidate ) { // ### AbanQ if (this == 0) return; QTextFormat *formatStandard = format( Standard ); QTextFormat *formatComment = format( Comment ); QTextFormat *formatNumber = format( Number ); QTextFormat *formatString = format( String ); QTextFormat *formatType = format( Type ); QTextFormat *formatPreProcessor = format( PreProcessor ); QTextFormat *formatLabel = format( Label ); // states const int StateStandard = 0; const int StateCommentStart1 = 1; const int StateCCommentStart2 = 2; const int StateCppCommentStart2 = 3; const int StateCComment = 4; const int StateCppComment = 5; const int StateCCommentEnd1 = 6; const int StateCCommentEnd2 = 7; const int StateStringStart = 8; const int StateString = 9; const int StateStringEnd = 10; const int StateString2Start = 11; const int StateString2 = 12; const int StateString2End = 13; const int StateNumber = 14; const int StatePreProcessor = 15; // tokens const int InputAlpha = 0; const int InputNumber = 1; const int InputAsterix = 2; const int InputSlash = 3; const int InputParen = 4; const int InputSpace = 5; const int InputHash = 6; const int InputQuotation = 7; const int InputApostrophe = 8; const int InputSep = 9; static const uchar table[ 16 ][ 10 ] = { { StateStandard, StateNumber, StateStandard, StateCommentStart1, StateStandard, StateStandard, StatePreProcessor, StateStringStart, StateString2Start, StateStandard }, // StateStandard { StateStandard, StateNumber, StateCCommentStart2, StateCppCommentStart2, StateStandard, StateStandard, StatePreProcessor, StateStringStart, StateString2Start, StateStandard }, // StateCommentStart1 { StateCComment, StateCComment, StateCCommentEnd1, StateCComment, StateCComment, StateCComment, StateCComment, StateCComment, StateCComment, StateCComment }, // StateCCommentStart2 { StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment }, // CppCommentStart2 { StateCComment, StateCComment, StateCCommentEnd1, StateCComment, StateCComment, StateCComment, StateCComment, StateCComment, StateCComment, StateCComment }, // StateCComment { StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment }, // StateCppComment { StateCComment, StateCComment, StateCCommentEnd1, StateCCommentEnd2, StateCComment, StateCComment, StateCComment, StateCComment, StateCComment, StateCComment }, // StateCCommentEnd1 { StateStandard, StateNumber, StateStandard, StateCommentStart1, StateStandard, StateStandard, StatePreProcessor, StateStringStart, StateString2Start, StateStandard }, // StateCCommentEnd2 { StateString, StateString, StateString, StateString, StateString, StateString, StateString, StateStringEnd, StateString, StateString }, // StateStringStart { StateString, StateString, StateString, StateString, StateString, StateString, StateString, StateStringEnd, StateString, StateString }, // StateString { StateStandard, StateStandard, StateStandard, StateCommentStart1, StateStandard, StateStandard, StatePreProcessor, StateStringStart, StateString2Start, StateStandard }, // StateStringEnd { StateString2, StateString2, StateString2, StateString2, StateString2, StateString2, StateString2, StateString2, StateString2End, StateString2 }, // StateString2Start { StateString2, StateString2, StateString2, StateString2, StateString2, StateString2, StateString2, StateString2, StateString2End, StateString2 }, // StateString2 { StateStandard, StateStandard, StateStandard, StateCommentStart1, StateStandard, StateStandard, StatePreProcessor, StateStringStart, StateString2Start, StateStandard }, // StateString2End { StateNumber, StateNumber, StateStandard, StateCommentStart1, StateStandard, StateStandard, StatePreProcessor, StateStringStart, StateString2Start, StateStandard }, // StateNumber { StatePreProcessor, StateStandard, StateStandard, StateCommentStart1, StateStandard, StateStandard, StatePreProcessor, StateStringStart, StateString2Start, StateStandard } // StatePreProcessor }; QString buffer; int state = StateStandard; if ( string->prev() ) { if ( string->prev()->endState() == -1 ) process( doc, string->prev(), 0, FALSE ); state = string->prev()->endState(); } int input = -1; int i = 0; bool lastWasBackSlash = FALSE; bool makeLastStandard = FALSE; ParagData *paragData = (ParagData*)string->extraData(); if ( paragData ) paragData->parenList.clear(); else paragData = new ParagData; string->setExtraData( paragData ); static QString alphabeth = QString::fromLatin1("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"); static QString mathChars = QString::fromLatin1("xXeE"); static QString numbers = QString::fromLatin1("0123456789"); bool questionMark = FALSE; bool resetLineState = TRUE; QChar lastChar; QString firstWord; while ( TRUE ) { QChar c = string->at( i )->c; if ( lastWasBackSlash ) { input = InputSep; } else { switch ( c.latin1() ) { case '*': input = InputAsterix; break; case '/': input = InputSlash; break; case '(': case '[': case '{': input = InputParen; if ( state == StateStandard || state == StateNumber || state == StatePreProcessor || state == StateCCommentEnd2 || state == StateCCommentEnd1 || state == StateString2End || state == StateStringEnd ) paragData->parenList << Paren( Paren::Open, c, i ); break; case ')': case ']': case '}': input = InputParen; if ( state == StateStandard || state == StateNumber || state == StatePreProcessor || state == StateCCommentEnd2 || state == StateCCommentEnd1 || state == StateString2End || state == StateStringEnd ) { paragData->parenList << Paren( Paren::Closed, c, i ); if ( c == '}' ) { if ( checkFunctionEnd( string, i ) ) resetLineState = FALSE; } } break; case '#': input = InputHash; break; case '"': input = InputQuotation; break; case '\'': input = InputApostrophe; break; case ' ': input = InputSpace; if ( firstWord == QString::fromLatin1("function") || firstWord == QString::fromLatin1("constructor") || firstWord == QString::fromLatin1("class")/* || firstWord == "if" || firstWord == "for" || firstWord == "while" || firstWord == "else"*/ ) { paragData->lineState = ParagData::FunctionStart; resetLineState = FALSE; } break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '0': if ( alphabeth.find( lastChar ) != -1 && ( mathChars.find( lastChar ) == -1 || numbers.find( string->at( i - 1 )->c ) == -1 ) ) { input = InputAlpha; } else { if ( input == InputAlpha && numbers.find( lastChar ) != -1 ) input = InputAlpha; else input = InputNumber; } break; case ':': { input = InputAlpha; QChar nextChar = ' '; if ( i < string->length() - 1 ) nextChar = string->at( i + 1 )->c; if ( state == StateStandard && !questionMark && lastChar != ':' && nextChar != ':' && lastChar.isLetter() ) { for ( int j = 0; j < i; ++j ) { if ( string->at( j )->format() == formatStandard ) string->setFormat( j, 1, formatLabel, FALSE ); } } break; } default: { if ( c != '\t' ) firstWord += c; QString s = firstWord.simplifyWhiteSpace(); if ( s == QString::fromLatin1("private") || s == QString::fromLatin1("protected") || s == QString::fromLatin1("public") || s == QString::fromLatin1("static") ) firstWord = ""; if ( !questionMark && c == '?' ) questionMark = TRUE; if ( c.isLetter() || c == '_' ) input = InputAlpha; else input = InputSep; } break; } } lastWasBackSlash = !lastWasBackSlash && c == '\\'; if ( input == InputAlpha ) buffer += c; state = table[ state ][ input ]; switch ( state ) { case StateStandard: { int len = buffer.length(); string->setFormat( i, 1, formatStandard, FALSE ); if ( makeLastStandard ) string->setFormat( i - 1, 1, formatStandard, FALSE ); makeLastStandard = FALSE; if ( buffer.length() > 0 && input != InputAlpha ) { if ( buffer == QString::fromLatin1("true") || buffer == QString::fromLatin1("false") || buffer == QString::fromLatin1("NaN") || buffer == QString::fromLatin1("Infinity") || buffer == QString::fromLatin1("undefined") ) { string->setFormat( i - buffer.length(), buffer.length(), formatType, FALSE ); } else { QMap<int, QMap<QString, int > >::Iterator it = wordMap->find( len ); if ( it != wordMap->end() ) { QMap<QString, int >::Iterator it2 = ( *it ).find( buffer ); if ( it2 != ( *it ).end() ) string->setFormat( i - buffer.length(), buffer.length(), format( ( *it2 ) ), FALSE ); } } buffer = QString::null; } } break; case StateCommentStart1: if ( makeLastStandard ) string->setFormat( i - 1, 1, formatStandard, FALSE ); makeLastStandard = TRUE; buffer = QString::null; break; case StateCCommentStart2: string->setFormat( i - 1, 2, formatComment, FALSE ); makeLastStandard = FALSE; buffer = QString::null; break; case StateCppCommentStart2: string->setFormat( i - 1, 2, formatComment, FALSE ); makeLastStandard = FALSE; buffer = QString::null; break; case StateCComment: if ( makeLastStandard ) string->setFormat( i - 1, 1, formatStandard, FALSE ); makeLastStandard = FALSE; string->setFormat( i, 1, formatComment, FALSE ); buffer = QString::null; break; case StateCppComment: if ( makeLastStandard ) string->setFormat( i - 1, 1, formatStandard, FALSE ); makeLastStandard = FALSE; string->setFormat( i, 1, formatComment, FALSE ); buffer = QString::null; break; case StateCCommentEnd1: if ( makeLastStandard ) string->setFormat( i - 1, 1, formatStandard, FALSE ); makeLastStandard = FALSE; string->setFormat( i, 1, formatComment, FALSE ); buffer = QString::null; break; case StateCCommentEnd2: if ( makeLastStandard ) string->setFormat( i - 1, 1, formatStandard, FALSE ); makeLastStandard = FALSE; string->setFormat( i, 1, formatComment, FALSE ); buffer = QString::null; break; case StateStringStart: if ( makeLastStandard ) string->setFormat( i - 1, 1, formatStandard, FALSE ); makeLastStandard = FALSE; string->setFormat( i, 1, formatStandard, FALSE ); buffer = QString::null; break; case StateString: if ( makeLastStandard ) string->setFormat( i - 1, 1, formatStandard, FALSE ); makeLastStandard = FALSE; string->setFormat( i, 1, formatString, FALSE ); buffer = QString::null; break; case StateStringEnd: if ( makeLastStandard ) string->setFormat( i - 1, 1, formatStandard, FALSE ); makeLastStandard = FALSE; string->setFormat( i, 1, formatStandard, FALSE ); buffer = QString::null; break; case StateString2Start: if ( makeLastStandard ) string->setFormat( i - 1, 1, formatStandard, FALSE ); makeLastStandard = FALSE; string->setFormat( i, 1, formatStandard, FALSE ); buffer = QString::null; break; case StateString2: if ( makeLastStandard ) string->setFormat( i - 1, 1, formatStandard, FALSE ); makeLastStandard = FALSE; string->setFormat( i, 1, formatString, FALSE ); buffer = QString::null; break; case StateString2End: if ( makeLastStandard ) string->setFormat( i - 1, 1, formatStandard, FALSE ); makeLastStandard = FALSE; string->setFormat( i, 1, formatStandard, FALSE ); buffer = QString::null; break; case StateNumber: if ( makeLastStandard ) string->setFormat( i - 1, 1, formatStandard, FALSE ); makeLastStandard = FALSE; string->setFormat( i, 1, formatNumber, FALSE ); buffer = QString::null; break; case StatePreProcessor: if ( makeLastStandard ) string->setFormat( i - 1, 1, formatStandard, FALSE ); makeLastStandard = FALSE; string->setFormat( i, 1, formatPreProcessor, FALSE ); buffer = QString::null; break; } lastChar = c; i++; if ( i >= string->length() ) break; } if ( resetLineState ) paragData->lineState = ParagData::InFunction; string->setExtraData( paragData ); int oldEndState = string->endState(); if ( state == StateCComment || state == StateCCommentEnd1 ) { string->setEndState( StateCComment ); } else if ( state == StateString ) { string->setEndState( StateString ); } else if ( state == StateString2 ) { string->setEndState( StateString2 ); } else { string->setEndState( StateStandard ); } string->setFirstPreProcess( FALSE ); QTextParagraph *p = string->next(); if ( (!!oldEndState || !!string->endState()) && oldEndState != string->endState() && invalidate && p && !p->firstPreProcess() && p->endState() != -1 ) { while ( p ) { if ( p->endState() == -1 ) return; p->setEndState( -1 ); p = p->next(); } } }