public IEnumerable <ITagSpan <IClassificationTag> > GetTags(NormalizedSnapshotSpanCollection spans) { var tags = new List <ITagSpan <IClassificationTag> >(); if (spans.Count < 1) { return(tags); } var newSpanshot = spans[0].Snapshot; if (m_Snapshot == newSpanshot) { return(m_Oldtags); } m_Snapshot = newSpanshot; var text = new SnapshotSpan(m_Snapshot, new Span(0, m_Snapshot.Length)).GetText(); var k = 0; while (k < text.Length) //#[] - area { if (text[k] == '#') { if (text.Length - k > 1 && text[k + 1] == '[' && text[k] == '#' && (k == 0 || text[k - 1] != '#')) { var o = k + 1; while (o < text.Length) { if (text[o] == ']') { tags.Add(CreateTagSpan(k, 2, NfxTokenTypes.ExpressionBrace)); //#[ tags.Add(CreateTagSpan(o, 1, NfxTokenTypes.ExpressionBrace)); //] var j = k + 2; FindAdditionalsTokens(tags, NfxTokenTypes.KeyWord, text, j, o - j + 1); tags.Add(CreateTagSpan(j, o - j, NfxTokenTypes.Area)); break; } o++; } } } if (text[k] == '@') //@[statement] { if (text.Length - k > 1 && text[k] == '@' && text[k + 1] == '[' && (k == 0 || text[k - 1] != '@')) { var o = k + 1; while (o < text.Length) { if (text[o] == ']') { tags.Add(CreateTagSpan(k, 2, NfxTokenTypes.ExpressionBrace)); //#[ tags.Add(CreateTagSpan(o, 1, NfxTokenTypes.ExpressionBrace)); //] var j = k + 2; FindCSharpTokens(tags, text, j, o - j); FindAdditionalsTokens(tags, NfxTokenTypes.KeyWord, text, j, o - j + 1); tags.Add(CreateTagSpan(j, o - j, NfxTokenTypes.StatementArea)); break; } o++; } } } if (text[k] == '?') //Experession ?[] { if (text.Length - k > 1 && text[k + 1] == '[' && text[k] == '?' && (k == 0 || text[k - 1] != '?')) { var o = k + 1; while (o < text.Length) { if (text[o] == ']') { tags.Add(CreateTagSpan(k, 2, NfxTokenTypes.ExpressionBrace)); //?[ tags.Add(CreateTagSpan(o, 1, NfxTokenTypes.ExpressionBrace)); //] var j = k + 2; FindCSharpTokens(tags, text, j, o - j); FindAdditionalsTokens(tags, NfxTokenTypes.KeyWord, text, j, o - j + 1); tags.Add(CreateTagSpan(j, o - j, NfxTokenTypes.ExpressionArea)); break; } o++; } } } if (text[k] == '#' && text[k] == '#' && (k == 0 || text[k - 1] != '#')) //class section { if (text.Length - k >= CLASS_AREA_FULL.Length && text.Substring(k, CLASS_AREA_FULL.Length) == CLASS_AREA_FULL) //#[class] { var j = k + CLASS_AREA_FULL.Length; var o = text.IndexOf("#[", j, StringComparison.OrdinalIgnoreCase); FindCSharpTokens(tags, text, j, o > -1 ? o - j : text.Length - j); FindAdditionalsTokens(tags, NfxTokenTypes.KeyWord, text, j, o > -1 ? o - j : text.Length - j); } } if (text[k] == '#' && text[k] == '#' && (k == 0 || text[k - 1] != '#')) //laconic config { if (text.Length - k >= LACONFIG_START.Length && text.Substring(k, LACONFIG_START.Length) == LACONFIG_START) //#<laconf> { var o = k + 1; while (o < text.Length) { if (text.Length - o >= LACONFIG_END.Length && text[o] == '#' && text.Substring(o, LACONFIG_END.Length) == LACONFIG_END) //#<laconf> { tags.Add(CreateTagSpan(k, LACONFIG_START.Length, NfxTokenTypes.Laconf)); //#<laconf> tags.Add(CreateTagSpan(o, LACONFIG_END.Length, NfxTokenTypes.Laconf)); //#<laconf> var j = k + LACONFIG_START.Length; GetLaconicTags(ref tags, text.Substring(j, o - j), j); break; } o++; } } } if (text[k] == '<') //styles { if (text.Length - k > STYLE_START.Length && text.Substring(k, STYLE_START.Length) == STYLE_START) { var o = k + STYLE_START.Length; while (o < text.Length) { if (text.Length - o >= STYLE_END.Length && text.Substring(o, STYLE_END.Length) == STYLE_END) { var tt = text.Substring(k + STYLE_START.Length, o - k - STYLE_START.Length); FindPropTags(tags, m_CssContentType, tt, k + STYLE_START.Length); break; } o++; } } } if (text[k] == '<') //scripts { if (text.Length - k > SCRIPT_START.Length && text.Substring(k, SCRIPT_START.Length) == SCRIPT_START) { var o = k + SCRIPT_START.Length; while (o < text.Length) { if (text.Length - o >= SCRIP_END.Length && text.Substring(o, SCRIP_END.Length) == SCRIP_END) { var tt = text.Substring(k + SCRIPT_START.Length, o - k - SCRIPT_START.Length); FindPropTags(tags, m_JavaScripContentType, tt, k + STYLE_START.Length); break; } o++; } } } k++; } SynchronousUpdate(); m_Oldtags = tags; return(tags); }