Switch-Toolbox/Switch_Toolbox_Library/IO/Extensions/StringExtension.cs
KillzXGaming e1fd664112 Few more additions
Start to impliment a muunt editor. This plans to use the 2D engine i've been using with layouts mixed with 3d to fully edit object and path placements.
Start to add pane copying.
Brlyt improvements with window pane support.
Add bflyt texture combiner UI.
2019-10-16 20:15:36 -04:00

114 lines
4.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
namespace System
{
public static class StringExtension
{
//https://stackoverflow.com/questions/5617320/given-full-path-check-if-path-is-subdirectory-of-some-other-path-or-otherwise/31941159
/// <summary>
/// Returns true if <paramref name="path"/> starts with the path <paramref name="baseDirPath"/>.
/// The comparison is case-insensitive, handles / and \ slashes as folder separators and
/// only matches if the base dir folder name is matched exactly ("c:\foobar\file.txt" is not a sub path of "c:\foo").
/// </summary>
public static bool IsSubPathOf(this string path, string baseDirPath)
{
string normalizedPath = Path.GetFullPath(path.Replace('/', '\\')
.WithEnding("\\"));
string normalizedBaseDirPath = Path.GetFullPath(baseDirPath.Replace('/', '\\')
.WithEnding("\\"));
return normalizedPath.StartsWith(normalizedBaseDirPath, StringComparison.OrdinalIgnoreCase);
}
public static string RemoveNumbersAtEnd(this string str)
{
Regex rgx = new Regex(@"\d+$");
return rgx.Replace(str, string.Empty);
}
/// <summary>
/// Returns <paramref name="str"/> with the minimal concatenation of <paramref name="ending"/> (starting from end) that
/// results in satisfying .EndsWith(ending).
/// </summary>
/// <example>"hel".WithEnding("llo") returns "hello", which is the result of "hel" + "lo".</example>
public static string WithEnding( this string str, string ending)
{
if (str == null)
return ending;
string result = str;
// Right() is 1-indexed, so include these cases
// * Append no characters
// * Append up to N characters, where N is ending length
for (int i = 0; i <= ending.Length; i++)
{
string tmp = result + ending.Right(i);
if (tmp.EndsWith(ending))
return tmp;
}
return result;
}
/// <summary>Gets the rightmost <paramref name="length" /> characters from a string.</summary>
/// <param name="value">The string to retrieve the substring from.</param>
/// <param name="length">The number of characters to retrieve.</param>
/// <returns>The substring.</returns>
public static string Right( this string value, int length)
{
if (value == null)
{
throw new ArgumentNullException("value");
}
if (length < 0)
{
throw new ArgumentOutOfRangeException("length", length, "Length is less than zero");
}
return (length < value.Length) ? value.Substring(value.Length - length) : value;
}
public static string Strip(this string value)
{
return value.Replace(" ", string.Empty);
}
public static string Repeat(this string value, int count)
{
return new StringBuilder(value.Length * count).Insert(0, value, count).ToString();
}
public static unsafe string TruncateAndFill(this string s, int length, char fillChar)
{
char* buffer = stackalloc char[length];
int i;
int min = Math.Min(s.Length, length);
for (i = 0; i < min; i++)
buffer[i] = s[i];
while (i < length)
buffer[i++] = fillChar;
return new string(buffer, 0, length);
}
public static String ToFixedString(this String value, int length, char appendChar = ' ')
{
int currlen = value.Length;
int needed = length == currlen ? 0 : (length - currlen);
return needed == 0 ? value :
(needed > 0 ? value + new string(' ', needed) :
new string(new string(value.ToCharArray().Reverse().ToArray()).
Substring(needed * -1, value.Length - (needed * -1)).ToCharArray().Reverse().ToArray()));
}
}
}