Source/Classes/Abbreviate.ps1

Class Abbreviate {
    hidden static [String]$Ellipses = [Char]0x2026

    hidden [String] $Prefix
    hidden [String] $String
    hidden [String] $AndSoForth = [Abbreviate]::Ellipses
    hidden [String] $Suffix
    hidden [Int] $MaxLength

    Abbreviate([String]$Prefix, [String]$String, [Int]$MaxLength, [String]$AndSoForth, [String]$Suffix) {
        $this.Prefix     = $Prefix
        $this.String     = $String
        $this.MaxLength  = $MaxLength
        $this.AndSoForth = $AndSoForth
        $this.Suffix     = $Suffix
    }
    Abbreviate([String]$Prefix, [String]$String, [Int]$MaxLength, [String]$Suffix) {
        $this.Prefix    = $Prefix
        $this.String    = $String
        $this.MaxLength = $MaxLength
        $this.Suffix    = $Suffix
    }
    Abbreviate([String]$String, [Int]$MaxLength) {
        $this.String    = $String
        $this.MaxLength = $MaxLength
    }

    [String] ToString() {
        if ($this.MaxLength -le 0) { return $this.String }
        if ($this.String.Length -gt 3 * $this.MaxLength) { $this.String = $this.String.SubString(0, (3 * $this.MaxLength)) } # https://stackoverflow.com/q/78787537/1701026
        $this.String = [Regex]::Replace($this.String, '\s+', ' ')
        if ($this.Prefix.Length + $this.String.Length + $this.Suffix.Length -gt $this.MaxLength) {
            $Length = $this.MaxLength - $this.Prefix.Length - $this.AndSoForth.Length - $this.Suffix.Length
            if ($Length -gt 0) { $this.String = $this.String.SubString(0, $Length) + $this.AndSoForth } else { $this.String = $this.AndSoForth }
        }
        return $this.Prefix + $this.String + $this.Suffix
    }
}