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)); }
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); }
public FormattedStringBuilder Replace(string oldValue, string newValue, SpanOperand operand, int startIndex, int count) { return(Replace(oldValue, newValue, null, operand, startIndex, count)); }
public FormattedStringBuilder Replace(string oldValue, string newValue, SpanOperand operand) { return(Replace(oldValue, newValue, operand, 0, Length)); }
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)); }
public FormattedString Replace(string oldValue, string newValue, SpanOperand operand) { return(Replace(oldValue, newValue, null, operand)); }
public FormattedString Insert(int startIndex, string value, SpanOperand operand) { return(Insert(startIndex, value, null, operand)); }