private void CategorizeTokens(List<UnitTestUSFMTextToken> tokens)
{
List<string> noteEndMarkers = new List<string>();
bool inNote = false;
bool inPublishable = false;
bool paragraphStyleIsVerseText = false;
bool characterStyleIsVerseText = false;
foreach (UnitTestUSFMTextToken tok in tokens)
{
if (tok.ParaStyleName == "")
{
// This is the second token created form splitting the verse number from \v N abc...
characterStyleIsVerseText = true;
paragraphStyleIsVerseText = true;
inPublishable = true;
inNote = false;
}
else if (tok.IsChapter || tok.IsVerse)
{
if (tok.IsChapter)
paragraphStyleIsVerseText = false;
characterStyleIsVerseText = false;
inPublishable = true;
inNote = false;
}
else if (tok.IsParagraphStart)
{
inPublishable = tok.IsPublishable;
paragraphStyleIsVerseText = tok.IsVerseTextStyle;
characterStyleIsVerseText = paragraphStyleIsVerseText;
inNote = false;
}
else if (tok.IsNoteStart)
{
inNote = true;
// We have to build a list of note end markers. Otherwise there
// is no way to distinguish between character end markers and
// note ending markers. Sigh.
if (!noteEndMarkers.Contains("f*"))
noteEndMarkers.Add("f*");
if (!noteEndMarkers.Contains("x*"))
noteEndMarkers.Add("x*");
}
else if (tok.IsEndStyle)
{
if (noteEndMarkers.Contains(tok.CharStyleName))
inNote = false;
characterStyleIsVerseText = paragraphStyleIsVerseText;
tok.ParaStyleName = "";
}
else if (tok.IsCharacterStyle)
{
characterStyleIsVerseText = tok.IsVerseTextStyle;
}
else { Debug.Assert(false); }
tok.IsNoteText = inNote;
tok.IsPublishableText = inPublishable;
tok.IsVerseText = !inNote && characterStyleIsVerseText && paragraphStyleIsVerseText;
}
}