예제 #1
0
        internal FormattedString Insert(int startIndex, string value, Span span, SpanOperand operand)
        {
            if (startIndex < 0 || startIndex >= TextLength)
            {
                throw new ArgumentOutOfRangeException(nameof(startIndex));
            }
            if (value == null)
            {
                throw new ArgumentNullException(nameof(value));
            }
            if (value.Length == 0)
            {
                return(this);
            }

            CharSpan[] sAr = ToCharSpanArray();
            CharSpan[] nAr = new CharSpan[TextLength + value.Length];

            Span newSpan;

            if (operand == SpanOperand.Left && startIndex - 1 >= 0)
            {
                newSpan = sAr[startIndex - 1].Span;
            }
            else
            {
                newSpan = sAr[startIndex].Span;
            }

            CharSpan[] iAr = new CharSpan[value.Length];
            for (int i = 0; i < value.Length; i++)
            {
                iAr[i] = new CharSpan(value[i], newSpan);
            }

            Array.Copy(sAr, nAr, startIndex);
            Array.Copy(sAr, startIndex, nAr, startIndex + iAr.Length, sAr.Length - startIndex);
            Array.Copy(iAr, 0, nAr, startIndex, iAr.Length);

            return(MergeCharSpan(nAr));
        }
예제 #2
0
        public FormattedStringBuilder Replace(string oldValue, string newValue, Span newSpan, SpanOperand operand, int startIndex, int count)
        {
            if (startIndex < 0)
            {
                throw new ArgumentOutOfRangeException(nameof(startIndex));
            }
            if (count < 0)
            {
                throw new ArgumentOutOfRangeException(nameof(count));
            }
            if (startIndex + count > Length)
            {
                throw new ArgumentOutOfRangeException($"{nameof(startIndex)} + {nameof(count)}");
            }
            if (oldValue == null)
            {
                throw new ArgumentNullException(nameof(oldValue));
            }
            if (newValue == null)
            {
                newValue = string.Empty;
            }

            int[] replacements      = new int[5];
            int   replacementsCount = 0;

            for (int i = startIndex; i < startIndex + count - (oldValue.Length - 1);)
            {
                if (startWith(oldValue, i) == false)
                {
                    i++;
                    continue;
                }

                if (replacementsCount < replacements.Length)
                {
                    replacements[replacementsCount] = i;
                }
                else
                {
                    int[] newArray = new int[replacements.Length * 3 / 2 + 4];
                    Array.Copy(replacements, newArray, replacements.Length);
                    replacements = newArray;
                    replacements[replacementsCount] = i;
                }
                replacementsCount++;

                i += oldValue.Length;
            }

            EnsureCapacity(Length + (newValue.Length - oldValue.Length) * replacementsCount);

            for (int i = replacementsCount - 1; i >= 0; i--)
            {
                int replacementsStartIndex = replacements[i];

                Array.Copy(
                    values, replacementsStartIndex + oldValue.Length,
                    values, replacementsStartIndex + newValue.Length,
                    Length - (replacementsStartIndex + oldValue.Length));

                if (newSpan == null && operand == SpanOperand.Left)
                {
                    newSpan = values[i].Span;
                }
                else if (newSpan == null)
                {
                    newSpan = values[i + oldValue.Length - 1].Span;
                }

                newSpan.Text = newValue;
                CharSpan[] rAr = newSpan.ToArray();

                Array.Copy(rAr, 0, values, replacementsStartIndex, rAr.Length);

                Length += newValue.Length - oldValue.Length;
            }

            return(this);
        }
예제 #3
0
 public FormattedStringBuilder Replace(string oldValue, string newValue, SpanOperand operand, int startIndex, int count)
 {
     return(Replace(oldValue, newValue, null, operand, startIndex, count));
 }
예제 #4
0
 public FormattedStringBuilder Replace(string oldValue, string newValue, SpanOperand operand)
 {
     return(Replace(oldValue, newValue, operand, 0, Length));
 }
예제 #5
0
        internal FormattedString Replace(string oldValue, string newValue, Span newSpan, SpanOperand operand)
        {
            if (oldValue == null)
            {
                throw new ArgumentNullException(nameof(oldValue));
            }
            if (oldValue.Length == 0)
            {
                throw new ArgumentException(nameof(oldValue));
            }
            if (newValue == null)
            {
                newValue = string.Empty;
            }

            int replaceCount = 0;
            int offset       = 0;

            while ((offset = Text.IndexOf(oldValue, offset)) != -1)
            {
                replaceCount++;
                offset += oldValue.Length;
            }

            CharSpan[] sAr = ToCharSpanArray();
            CharSpan[] nAr = new CharSpan[sAr.Length + (newValue.Length - oldValue.Length) * replaceCount];

            int oldIndex = 0;
            int newIndex = 0;

            for (int i = 0; i < replaceCount; i++)
            {
                int index    = Text.IndexOf(oldValue, oldIndex);
                int copySize = index - oldIndex;

                Array.Copy(sAr, oldIndex, nAr, newIndex, copySize);

                oldIndex += copySize + oldValue.Length;
                newIndex += copySize;

                if (newSpan == null && operand == SpanOperand.Left)
                {
                    newSpan = sAr[index].Span;
                }
                else if (newSpan == null)
                {
                    newSpan = sAr[index + oldValue.Length - 1].Span;
                }

                newSpan      = newSpan.Clone();
                newSpan.Text = newValue;
                CharSpan[] rAr = newSpan.ToArray();

                Array.Copy(rAr, 0, nAr, newIndex, rAr.Length);
                newIndex += rAr.Length;
            }

            Array.Copy(sAr, oldIndex, nAr, newIndex, TextLength - oldIndex);

            return(MergeCharSpan(nAr));
        }
예제 #6
0
 public FormattedString Replace(string oldValue, string newValue, SpanOperand operand)
 {
     return(Replace(oldValue, newValue, null, operand));
 }
예제 #7
0
 public FormattedString Insert(int startIndex, string value, SpanOperand operand)
 {
     return(Insert(startIndex, value, null, operand));
 }