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
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
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