private IEnumerable <TagSegment> GetAllTags(TextTagsState state) { var nextStates = new Stack <TextTagsState>(); for (var index = 0; index < state.Text.Length; index++) { var tag = finder.GetFirstTagOnSegment(state); if (tag == null) { if (nextStates.Count == 0) { break; } index = nextStates.Peek().Start - 1; state = nextStates.Pop(); continue; } yield return(tag); var newStart = tag.CloseIndex + Tags.GetMd(tag.TagName).Length; if (newStart < state.End) { nextStates.Push(state.ChangeSegment(newStart, state.End)); } index = tag.OpenIndex + Tags.GetMd(tag.TagName).Length; if (index <= state.End - 1) { state = state.SwitchTag(tag.TagName).ChangeSegment(index, tag.CloseIndex - 1); } index -= 1; } }
public void SwitchTag_InverseBitInMask() { var expectedState = !textTagsState.IsInTag(TagName.Em); textTagsState = textTagsState.SwitchTag(TagName.Em); textTagsState.IsInTag(TagName.Em).Should().Be(expectedState); }