Imports System.Drawing Imports System.Runtime.CompilerServices Imports System.Text Imports System.Text.RegularExpressions Imports System.Windows.Forms ''' ''' Provides common utility functions that do not require a specific context. ''' Public Class Utils ''' ''' Generates a random short (8 characters) guid ''' ''' The generated guid as a String Public Shared Function ShortGUID() As String Return Guid.NewGuid().ToString().GetHashCode().ToString("x") End Function ''' ''' Converts a String value to the given Enum ''' ''' The Enum Type ''' The string value to convert Public Shared Function ToEnum(Of T)(value As String) As T Return [Enum].Parse(GetType(T), value) End Function ''' ''' Converts an Integer value to the given Enum ''' ''' The Enum Type ''' The integer value to convert Public Shared Function ToEnum(Of T)(value As Integer) As T Return [Enum].ToObject(GetType(T), value) End Function ''' ''' Converts a Long value to the given Enum ''' ''' The Enum Type ''' The long value to convert Public Shared Function ToEnum(Of T)(value As Long) As T Return [Enum].ToObject(GetType(T), value) End Function ''' ''' Converts a string to boolean. Accepts true and 1 as truthy values ''' ''' The input string ''' True if input is true or 1, otherwise false. Public Shared Function ToBoolean(input As String) As Boolean If String.IsNullOrEmpty(input) Then Return False Return (input.Trim().ToLower() = "true") OrElse (input.Trim() = "1") End Function ''' ''' Checks a value for three different `null` values, ''' Nothing, Empty String, DBNull ''' ''' Returns the original value if the value is not null, or `defaultValue` ''' ''' The type of the value ''' The value ''' The default Value ''' The original value or the default value Public Shared Function NotNull(Of T)(ByVal value As T, ByVal defaultValue As T) As T If IsNothing(value) OrElse String.IsNullOrEmpty(value.ToString) OrElse IsDBNull(value) Then Return defaultValue Else Return value End If End Function ''' ''' Checks a Row value for three different `null` values, ''' Nothing, Empty String, DBNull ''' ''' Returns the original value if the value is not null, or `defaultValue` ''' ''' The type of the value ''' The DataRow that contains the value ''' The column name ''' The default value ''' The original value or the default value Public Shared Function NotNull(Of T)(ByVal Row As DataRow, Column As String, DefaultValue As T) As T Return NotNull(Row.Item(Column), DefaultValue) End Function ''' ''' Creates a "slug" from text that can be used as part of a valid URL. ''' Invalid characters are converted to hyphens. Punctuation that Is ''' perfect valid in a URL Is also converted to hyphens to keep the ''' result mostly text. Steps are taken to prevent leading, trailing, ''' And consecutive hyphens. ''' ''' The string to convert Public Shared Function ConvertTextToSlug(ByVal s As String) As String Dim oBuilder As StringBuilder = New StringBuilder() Dim oWasHyphen As Boolean = True For Each oChar As Char In s If Char.IsLetterOrDigit(oChar) Then oBuilder.Append(Char.ToLower(oChar)) oWasHyphen = False ElseIf Char.IsWhiteSpace(oChar) AndAlso Not oWasHyphen Then oBuilder.Append("-"c) oWasHyphen = True End If Next If oWasHyphen AndAlso oBuilder.Length > 0 Then oBuilder.Length -= 1 Return oBuilder.ToString() End Function ''' ''' Removes Invalid characters from a string, suitable for file and path names ''' ''' Removed characters are: ''' ''' * Illegal File-characters ''' * Illegal Path-characters ''' * Unicode characters that classify as Emoji ''' * All characters above codepoint U+10000 ''' ''' See: ''' https://stackoverflow.com/questions/46905176/detecting-all-emojis ''' https://stackoverflow.com/questions/28023682/how-do-i-remove-emoji-characters-from-a-string ''' ''' Public Shared Function RemoveInvalidCharacters(pString As String) As String Dim oResult = pString Try ' Remove all Unicode above Codepoint U+10000 oResult = Regex.Replace(oResult, InvalidChars.UnicodeSurrogates, String.Empty) ' Remove all Emojis (Version 13) oResult = Regex.Replace(oResult, InvalidChars.Emojis, String.Empty) ' Remove Invalid filename characters oResult = Regex.Replace(oResult, InvalidChars.Filenames, String.Empty) ' Remove Invalid filename characters oResult = Regex.Replace(oResult, InvalidChars.Paths, String.Empty) ' Remove Uneccessary characters oResult = Regex.Replace(oResult, "\s{2,}", " ") oResult = Regex.Replace(oResult, "\.{2,}", ".") ' Remove excess space chars oResult = oResult.Trim() Return oResult Catch ex As Exception Return oResult End Try End Function ''' ''' Checks if string contains invalid characters ''' ''' ''' Public Shared Function TestContainsInvalidCharacters(pString As String) As Boolean Return Not pString.Equals(RemoveInvalidCharacters(pString)) End Function ''' ''' Checks if a point is Visible on any screen ''' Public Shared Function IsVisibleOnAnyScreen(Location As Point) As Boolean Try Dim oRect As New Rectangle(Location, New Size(0, 0)) For Each oScreen In Screen.AllScreens If oScreen.WorkingArea.IntersectsWith(oRect) Then Return True End If Next Return False Catch ex As Exception Return False End Try End Function ''' ''' Checks if Size is not negative ''' Public Shared Function SizeIsVisible(Size As Size) As Boolean If Size.Width >= 0 And Size.Height >= 0 Then Return True End If Return False End Function ''' ''' Checks if Location is not negative ''' Public Shared Function LocationIsVisible(Location As Point) As Boolean If Location.X >= 0 And Location.Y >= 0 Then Return True End If Return False End Function Public Shared Function BytesToString(ByteCount As Long) As String Dim oSuffixes As New List(Of String) From {"B", "KB", "MB", "GB", "TB", "PB", "EB"} If ByteCount = 0 Then Return "0" & oSuffixes.First() End If Dim oBytes = Math.Abs(ByteCount) Dim oIndex = Convert.ToInt32(Math.Floor(Math.Log(oBytes, 1024))) Dim oNum = Math.Round(oBytes / Math.Pow(1024, oIndex), 1) Return (Math.Sign(ByteCount) * oNum).ToString() & oSuffixes.Item(oIndex) End Function End Class