public TextAmenderBuilder(string text, AmendmentBuilder builder, List <TextAmendment> amends, bool markDown = false)
 {
     MarkDown = markDown;
     Builder  = builder;
     Amends   = amends;
     Text     = new AmendedText()
     {
         LHS       = "",
         RHS       = "",
         InnerText = text
     };
     foreach (var amend in amends)
     {
         if (amend.Type == AmendType.Insert)
         {
             insert(amend);
         }
         else if (amend.Type == AmendType.Repeal)
         {
             remove(amend);
         }
         else
         {
             replace(amend);
         }
     }
 }
        void remove(TextAmendment amend)
        {
            AmendedText toAmend = Text;

            while ((toAmend.StartIndex + toAmend.Length) < amend.Start && toAmend != null)
            {
                toAmend = toAmend.Next;
            }
            if (toAmend == null)
            {
                return;
            }
            var next    = Builder.GetNextNumber(amend);
            var remover = new AmendedText()
            {
                LHS       = lhsRemove(next),
                RHS       = "",
                InnerText = ""
            };
            var wordsAfter    = toAmend.Words.Skip(amend.Start - toAmend.StartIndex);
            var wordsRemoved  = wordsAfter.Take(amend.Length);
            var wordsAfterStr = string.Join(' ', wordsAfter);
            var wordsRemStr   = string.Join(' ', wordsRemoved);
            var text          = toAmend.InnerText;

            text = text.Substring(0, text.Length - wordsAfterStr.Length);
            var afterText = toAmend.InnerText.Substring(text.Length + wordsRemStr.Length);
            var after     = new AmendedText()
            {
                LHS       = "",
                RHS       = toAmend.RHS,
                InnerText = afterText
            };

            toAmend.RHS       = "";
            toAmend.InnerText = text;

            after.Next   = toAmend.Next;
            toAmend.Next = remover;
            remover.Next = after;
        }
        void insert(TextAmendment amend)
        {
            AmendedText toAmend = Text;

            while ((toAmend.StartIndex + toAmend.Length) < amend.Start && toAmend != null)
            {
                toAmend = toAmend.Next;
            }
            if (toAmend == null)
            {
                return;
            }
            var next     = Builder.GetNextNumber(amend);
            var inserter = new AmendedText()
            {
                LHS       = lhsInsertReplace(next),
                RHS       = rhs(),
                InnerText = amend.New
            };
            var wordsAfter  = toAmend.Words.Skip(amend.Start - toAmend.StartIndex);
            var wordsBefore = toAmend.Words.Take(toAmend.Words.Count - wordsAfter.Count());

            toAmend.InnerText = string.Join(' ', wordsBefore);
            var after = new AmendedText()
            {
                RHS       = toAmend.RHS,
                InnerText = string.Join(' ', wordsAfter)
            };

            toAmend.RHS = "";

            after.Next     = toAmend.Next;
            after.Previous = inserter;

            inserter.Next     = after;
            inserter.Previous = toAmend;

            toAmend.Next = inserter;
        }