WPF RichTextEditorを使用して、基本的な構文の強調表示を実装しようとしています。このために、{}gropusをさまざまな色で表示したいと思います。
RichTextBoxのコンテンツをさまざまなグループに分割することになっているコードは次のとおりです。
List<Tag> SplitIntoParts(TextRange textRange, int level)
{
if (textRange==null||textRange.IsEmpty)
{
return new List<Tag>();
}
string text = textRange.Text;
if (text.Length==0)
{
return new List<Tag>();
}
int startPos=-1, counter = 0;
List<Tag> result=new List<Tag>();
for (int i = 0; i < text.Length; i++)
{
if (text[i]=='{')
{
if (counter==0)
{
startPos = i;
}
counter++;
}
if (text[i]=='}')
{
if (counter==1)
{
Tag t = new Tag()
{
StartPosition = textRange.Start.GetPositionAtOffset(startPos),
EndPosition = textRange.Start.GetPositionAtOffset(i+1),
Level = level,
Word = text.Substring(startPos,i+1-startPos)
};
result.Add(t);
var tr=new TextRange(textRange.Start.GetPositionAtOffset(startPos + 1), textRange.Start.GetPositionAtOffset(i));
result.AddRange(SplitIntoParts(tr, level + 1));
}
counter--;
}
}
if (counter>0)//some open branches still left
{
var i = text.Length;
Tag t = new Tag()
{
StartPosition = textRange.Start.GetPositionAtOffset(startPos),
EndPosition = textRange.End,
Level = level,
Word = text.Substring(startPos, i - startPos)
};
result.Add(t);
result.AddRange(SplitIntoParts(new TextRange(textRange.Start.GetPositionAtOffset(startPos + 1), textRange.Start.GetPositionAtOffset(i - 1)), level + 1));
}
return result;
}
このコードでは、textRange.Start.GetPositionAtOffset(startPos + 1)が奇妙に動作することがわかりました。
たとえば、コードが次のグループを検出したとします。
{test|try}
次のコードで選択しました。
var t=new Tag()
{
StartPosition = textRange.Start.GetPositionAtOffset(startPos),
EndPosition = textRange.Start.GetPositionAtOffset(i+1),
Level = level,
Word = text.Substring(startPos,i+1-startPos)
};
(egtWord =='{test | try}')
通過することで同じことを再帰的に行おうとすると
var tr=new TextRange(textRange.Start.GetPositionAtOffset(startPos + 1), textRange.Start.GetPositionAtOffset(i));
result.AddRange(SplitIntoParts(tr, level + 1));
「test|try」の代わりに、tr.Text == "{test"
なぜこの動作が発生するのですか?また、どのように対処する必要がありますか?