示例#1
0
void
CBHTMLStyler::Scan
	(
	istream&			input,
	const TokenExtra&	initData
	)
{
	BeginScan(input, initData.lexerState);
	itsLatestTagName.Clear();

	const JString& text = GetText();

	JBoolean keepGoing;
	Token token;
	JFontStyle style;
	do
		{
		token = NextToken();
		if (token.type == kEOF)
			{
			break;
			}

		// save token starts

		if ((yy_start_stack_ptr == 0 &&
			 (token.type == kHTMLText    ||
			  token.type == kHTMLComment ||
			  token.type == kJSPComment  ||
			  (token.type == kHTMLTag &&
			   text.GetCharacter(token.range.first) == '<'))) ||
			(yy_start_stack_ptr > 0 && yy_top_state() == 0 &&
			 (token.type == kPHPID                ||
			  token.type == kPHPVariable          ||
			  token.type == kPHPReservedKeyword   ||
			  token.type == kPHPBuiltInDataType   ||
			  token.type == kPHPSingleQuoteString ||
			  token.type == kPHPDoubleQuoteString ||
			  token.type == kPHPHereDocString     ||
			  token.type == kPHPExecString        ||
			  token.type == kJavaID               ||
			  token.type == kJavaReservedKeyword  ||
			  token.type == kJavaBuiltInDataType  ||
			  token.type == kJavaString           ||
			  token.type == kJSID                 ||
			  token.type == kJSReservedKeyword    ||
			  token.type == kComment)))
			{
			TokenExtra data;
			data.lexerState = GetCurrentLexerState();
			SaveTokenStart(data);

//			const JString s = text.GetSubstring(token.range);
//			cout << yy_top_state() << ' ' << yy_start_stack_ptr << ": " << s << endl;
			}

		// handle special cases

		if (token.type == kPHPDoubleQuoteString ||
			token.type == kPHPExecString)
			{
			ExtendCheckRangeForString(token.range);
			}
		else if (token.type == kPHPStartEnd)
			{
			ExtendCheckRangeForPHPStartEnd(token.range);
			}
		else if (token.type == kJSPStartEnd)
			{
			ExtendCheckRangeForJSPStartEnd(token.range);
			}

		// set the style

		const JIndex typeIndex = token.type - kWhitespace;
		if (token.type == kWhitespace)
			{
			style = GetDefaultFontStyle();
			}
		else if ((token.type == kHTMLNamedCharacter ||
				  token.type == kHTMLInvalidNamedCharacter) &&
				 GetCurrentLexerState() != 0)
			{
			style = GetStyle(kHTMLTag - kWhitespace, itsLatestTagName);
			if (token.type == kHTMLInvalidNamedCharacter)
				{
				style.strike = !style.strike;
				}
			else
				{
				style.underlineCount++;
				}
			}
		else if (token.type == kHTMLText             ||
				 token.type == kHTMLComment          ||
				 token.type == kCDATABlock           ||
				 token.type == kMustacheCommand      ||
				 token.type == kPHPStartEnd          ||
				 token.type == kPHPSingleQuoteString ||
				 token.type == kPHPDoubleQuoteString ||
				 token.type == kPHPHereDocString     ||
				 token.type == kPHPExecString        ||
				 token.type == kJSPStartEnd          ||
				 token.type == kJSPComment           ||
				 token.type == kJavaString           ||
				 token.type == kJSString             ||
				 token.type == kJSRegexSearch        ||
				 token.type == kComment)
			{
			style = GetTypeStyle(typeIndex);
			}
		else if (token.type < kWhitespace)
			{
			style = GetTypeStyle(kError - kWhitespace);
			}
		else if (token.type == kHTMLTag)
			{
			style = GetTagStyle(token.range, typeIndex);
			}
		else if (token.type == kHTMLScript)
			{
			style = GetStyle(typeIndex, *(token.language));
			}
		else if (token.type == kHTMLNamedCharacter)
			{
			JIndexRange r = token.range;
			r.first++;
			if (text.GetCharacter(r.last) == ';')
				{
				r.last--;
				}
			style = GetStyle(typeIndex, text.GetSubstring(r));
			}
		else
			{
			if (token.type == kDocCommentHTMLTag ||
				token.type == kDocCommentSpecialTag)
				{
				if (!(token.docCommentRange).IsEmpty())
					{
					SetStyle(token.docCommentRange, GetTypeStyle(kComment - kWhitespace));
					}
				ExtendCheckRange(token.range.last+1);
				}

			style = GetStyle(typeIndex, text.GetSubstring(token.range));
			}

		keepGoing = SetStyle(token.range, style);

		if (token.type == kPHPDoubleQuoteString ||
			token.type == kPHPHereDocString     ||
			token.type == kPHPExecString)
			{
			StyleEmbeddedVariables(token);
			}
		}
		while (keepGoing);
}
void
CBPythonStyler::Scan
	(
	istream&			input,
	const TokenExtra&	initData
	)
{
	BeginScan(input);

	const JString& text = GetText();

	Token token;
	JFontStyle style;
	do
		{
		token = NextToken();
		if (token.type == kEOF)
			{
			break;
			}

		// save token starts

		if (token.type == kID              ||
			token.type == kReservedKeyword ||
			token.type == kString          ||
			token.type == kComment)
			{
			SaveTokenStart(TokenExtra());
			}

		// set the style

		const JIndex typeIndex = token.type - kWhitespace;
		if (token.type == kWhitespace)
			{
			style = GetDefaultFontStyle();
			}
		else if (token.type == kComment ||
				 token.type == kString)
			{
			style = GetTypeStyle(typeIndex);
			}
		else if (token.type < kWhitespace)
			{
			style = GetTypeStyle(kError - kWhitespace);
			}
		else if (token.type > kError)	// misc
			{
			if (!GetWordStyle(text.GetSubstring(token.range), &style))
				{
				style = GetDefaultFontStyle();
				}
			}
		else
			{
			style = GetStyle(typeIndex, text.GetSubstring(token.range));
			}
		}
		while (SetStyle(token.range, style));
}
void
CBTCLStyler::Scan
	(
	istream&			input,
	const TokenExtra&	initData
	)
{
	BeginScan(input);

	const JString& text = GetText();

	JBoolean keepGoing;
	Token token;
	JFontStyle style;
	do
		{
		token = NextToken();
		if (token.type == kEOF)
			{
			break;
			}

		// save token starts

		if (token.type == kPredefinedWord ||
			token.type == kOtherWord ||
			token.type == kVariable ||
			token.type == kString ||
			token.type == kComment)
			{
			SaveTokenStart(TokenExtra());
			}

		// handle special cases

		if (token.type == kString ||
			token.type == kUnterminatedString)
			{
			ExtendCheckRangeForString(token.range);
			}

		// set the style

		const JIndex typeIndex = token.type - kWhitespace;
		if (token.type == kWhitespace)
			{
			style = GetDefaultFontStyle();
			}
		else if (token.type == kComment       ||
				 token.type == kString        ||
				 token.type == kBrace         ||
				 token.type == kSquareBracket ||
				 token.type == kParenthesis)
			{
			style = GetTypeStyle(typeIndex);
			}
		else if (token.type < kWhitespace)
			{
			style = GetTypeStyle(kError - kWhitespace);
			}
		else
			{
			style = GetStyle(typeIndex, text.GetSubstring(token.range));
			}

		keepGoing = SetStyle(token.range, style);

		if (token.type == kString)
			{
			StyleEmbeddedVariables(token);
			}
		}
		while (keepGoing);
}
void
CBJavaStyler::Scan
	(
	istream&			input,
	const TokenExtra&	initData
	)
{
	BeginScan(input);

	const JString& text = GetText();

	Token token;
	JFontStyle style;
	do
		{
		token = NextToken();
		if (token.type == kEOF)
			{
			break;
			}

		// save token starts

		if (token.type == kID              ||
			token.type == kReservedKeyword ||
			token.type == kBuiltInDataType ||
			token.type == kString)
			{
			SaveTokenStart(TokenExtra());
			}

		// set the style

		const JIndex typeIndex = token.type - kWhitespace;
		if (token.type == kWhitespace)
			{
			style = GetDefaultFontStyle();
			}
		else if (token.type == kComment ||
				 token.type == kString)
			{
			style = GetTypeStyle(typeIndex);
			}
		else if (token.type < kWhitespace)
			{
			style = GetTypeStyle(kError - kWhitespace);
			}
		else
			{
			if (token.type == kDocCommentHTMLTag ||
				token.type == kDocCommentSpecialTag)
				{
				if (!(token.docCommentRange).IsEmpty())
					{
					SetStyle(token.docCommentRange, GetTypeStyle(kComment - kWhitespace));
					}
				ExtendCheckRange(token.range.last+1);
				}

			style = GetStyle(typeIndex, text.GetSubstring(token.range));
			}
		}
		while (SetStyle(token.range, style));
}
void
CBCShellStyler::Scan
(
    istream&			input,
    const TokenExtra&	initData
)
{
    BeginScan(input);

    const JString& text = GetText();

    JBoolean keepGoing;
    Token token;
    JFontStyle style;
    do
    {
        token = NextToken();
        if (token.type == kEOF)
        {
            break;
        }

        // save token starts

        if (token.type == kID                ||
                token.type == kVariable          ||
                token.type == kReservedWord      ||
                token.type == kSingleQuoteString ||
                token.type == kDoubleQuoteString ||
                token.type == kExecString        ||
                token.type == kComment)
        {
            SaveTokenStart(TokenExtra());
        }

        // handle special cases

        if (token.type == kDoubleQuoteString ||
                token.type == kExecString)
        {
            ExtendCheckRangeForString(token.range);
        }

        // set the style

        const JIndex typeIndex = token.type - kWhitespace;
        if (token.type == kWhitespace)
        {
            style = GetDefaultFontStyle();
        }
        else if (token.type == kSingleQuoteString ||
                 token.type == kDoubleQuoteString ||
                 token.type == kExecString        ||
                 token.type == kComment)
        {
            style = GetTypeStyle(typeIndex);
        }
        else if (token.type < kWhitespace)
        {
            style = GetTypeStyle(kError - kWhitespace);
        }
        else if (token.type > kError)	// misc
        {
            if (!GetWordStyle(text.GetSubstring(token.range), &style))
            {
                style = GetDefaultFontStyle();
            }
        }
        else
        {
            style = GetStyle(typeIndex, text.GetSubstring(token.range));
        }

        keepGoing = SetStyle(token.range, style);

        if (token.type == kDoubleQuoteString ||
                token.type == kExecString)
        {
            StyleEmbeddedVariables(token);
        }
    }
    while (keepGoing);
}