public virtual IEnumerable <TextFragmentResource> ParseForQuranReferences(string text)
        {
            var matches          = QuranRefRegex.Matches(text);
            var fragments        = new List <TextFragmentResource>();
            var currentTextIndex = 0;

            for (var i = 0; i < matches.Count; i++)
            {
                var match = matches[i];
                if (match.Groups.Count == 3)
                {
                    fragments.Add(new TextFragmentResource {
                        IsPlainText = true, Text = text.Substring(currentTextIndex, match.Index - currentTextIndex)
                    });
                    fragments.Add(new TextFragmentResource
                    {
                        QuranReference = new QuranReferenceResource
                        {
                            Surah = int.Parse(match.Groups[1].Value),
                            Verse = int.Parse(match.Groups[2].Value)
                        }
                    });
                    currentTextIndex = match.Index + match.Length;
                }
            }
            var lastFragment = new TextFragmentResource {
                IsPlainText = true, Text = text.Substring(currentTextIndex)
            };

            if (!string.IsNullOrEmpty(lastFragment.Text))
            {
                fragments.Add(lastFragment);
            }
            return(fragments);
        }
                                public void ListContainsThreeFragments()
                                {
                                    MethodToTest(() => service.Split(A <TextFragmentResource> .Ignored, A <MembershipRuleTermDefinition> .Ignored));

                                    var fragment = new TextFragmentResource
                                    {
                                        Text        = "some rule or other for a term and another one",
                                        IsPlainText = true
                                    };
                                    var term = new MembershipRuleTermDefinition
                                    {
                                        Term = "A Term",
                                        Id   = 687
                                    };

                                    var result = service.Split(fragment, term);

                                    Assert.AreEqual(3, result.Count);
                                    Assert.AreEqual("some rule or other for ", result.First().Text);
                                    Assert.IsTrue(result[0].IsPlainText);
                                    Assert.AreEqual(term.Term, result[1].Text);
                                    Assert.AreEqual(term.Id, result[1].TermId);
                                    Assert.IsFalse(result[1].IsPlainText);
                                    Assert.AreEqual(" and another one", result[2].Text);
                                    Assert.IsTrue(result[2].IsPlainText);
                                }
                        public void BuildsAFragmentListBySplittingWithTheTerm()
                        {
                            MethodToTest(() => service.ApplyTerm(A <List <TextFragmentResource> > .Ignored, A <MembershipRuleTermDefinition> .Ignored));

                            var fragments = new List <TextFragmentResource>();
                            var term      = new MembershipRuleTermDefinition();

                            var exampleFragment             = new TextFragmentResource();
                            var exampleReturnedFragmentList = new List <TextFragmentResource>();

                            A.CallTo(() => service.Split(exampleFragment, term)).Returns(exampleReturnedFragmentList);

                            var fragmentsAfterSplit = new List <TextFragmentResource>();

                            A.CallTo(() => dependencies.LinqService.SelectMany(fragments,
                                                                               A <Func <TextFragmentResource, IEnumerable <TextFragmentResource> > > .That.Matches(x =>
                                                                                                                                                                   x.Invoke(exampleFragment) == exampleReturnedFragmentList
                                                                                                                                                                   ))).Returns(fragmentsAfterSplit);
                            var fragmentsAfterSplitList = new List <TextFragmentResource>();

                            A.CallTo(() => dependencies.LinqService.EnumerableToList(fragmentsAfterSplit))
                            .Returns(fragmentsAfterSplitList);

                            var result = service.ApplyTerm(fragments, term);

                            Assert.AreSame(fragmentsAfterSplitList, result);
                        }
 public virtual IEnumerable <TextFragmentResource> AddQuranReferences(TextFragmentResource textFragmentResource)
 {
     if (!textFragmentResource.IsPlainText)
     {
         return(new List <TextFragmentResource>()
         {
             textFragmentResource
         });
     }
     return(ParseForQuranReferences(textFragmentResource.Text));
 }
                            public void ListContainsTheOriginalFragmentOnly()
                            {
                                MethodToTest(() => service.Split(A <TextFragmentResource> .Ignored, A <MembershipRuleTermDefinition> .Ignored));

                                var fragment = new TextFragmentResource
                                {
                                    IsPlainText = false
                                };
                                var term = new MembershipRuleTermDefinition();

                                var result = service.Split(fragment, term);

                                Assert.AreEqual(1, result.Count);
                                Assert.AreSame(fragment, result.First());
                            }
        public virtual List <TextFragmentResource> Split(TextFragmentResource fragment, MembershipRuleTermDefinition term)
        {
            if (!fragment.IsPlainText)
            {
                return(new List <TextFragmentResource> {
                    fragment
                });
            }
            var indexOfMatch = fragment.Text.ToLower().IndexOf(term.Term.ToLower(), StringComparison.Ordinal);

            if (indexOfMatch == -1)
            {
                return(new List <TextFragmentResource> {
                    fragment
                });
            }

            var results    = new List <TextFragmentResource>();
            var textBefore = fragment.Text.Substring(0, indexOfMatch);

            if (textBefore != string.Empty)
            {
                results.Add(new TextFragmentResource
                {
                    IsPlainText = true,
                    Text        = textBefore
                });
            }
            results.Add(new TextFragmentResource
            {
                IsPlainText = false,
                IsTerm      = true,
                Text        = term.Term,
                TermSlug    = _dependencies.UrlSlugService.GetSlug(term.Term),
                TermId      = term.Id
            });
            var textAfter = fragment.Text.Substring(indexOfMatch + term.Term.Length);

            if (textAfter != string.Empty)
            {
                results.Add(new TextFragmentResource
                {
                    IsPlainText = true,
                    Text        = textAfter
                });
            }
            return(results);
        }