File: Utils.cs
Web Access
Project: src\src\SingleProject\Resizetizer\src\Resizetizer.csproj (Microsoft.Maui.Resizetizer)
using System;
using System.IO;
using System.Text.RegularExpressions;
using SkiaSharp;
 
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("Microsoft.Maui.Resizetizer.Tests")]
 
namespace Microsoft.Maui.Resizetizer
{
	internal class Utils
	{
		static readonly Regex rxResourceFilenameValidation
			= new Regex(@"^[a-z]([a-z0-9_]*[a-z0-9])?$", RegexOptions.Singleline | RegexOptions.Compiled);
 
		public static bool IsValidResourceFilename(string filename)
			=> rxResourceFilenameValidation.IsMatch(Path.GetFileNameWithoutExtension(filename));
 
		public static SKColor? ParseColorString(string tint)
		{
			if (string.IsNullOrEmpty(tint))
				return null;
 
			if (SKColor.TryParse(tint, out var color))
			{
				return color;
			}
 
			if (ColorTable.TryGetNamedColor(tint, out color))
			{
				return color;
			}
 
			return null;
		}
 
		public static SKSize? ParseSizeString(string size)
		{
			if (string.IsNullOrEmpty(size))
				return null;
 
			var parts = size.Split(new char[] { ',', ';' }, 2);
 
			if (parts.Length > 0 && int.TryParse(parts[0], out var width))
			{
				if (parts.Length > 1 && int.TryParse(parts[1], out var height))
					return new SKSize(width, height);
				else
					return new SKSize(width, width);
			}
 
			return null;
		}
 
		public static (bool Exists, DateTime Modified) FileExists(string path)
		{
			var exists = File.Exists(path);
			var modified = exists ? File.GetLastWriteTimeUtc(path) : System.DateTime.MinValue;
			return (exists, modified);
		}
 
		public static void SetWriteable(string source, bool checkExists = true)
		{
			if (checkExists && !File.Exists(source))
				return;
 
			var attributes = File.GetAttributes(source);
			if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
				File.SetAttributes(source, attributes & ~FileAttributes.ReadOnly);
		}
	}
}