functions/Join-Emoji.ps1
|
function Join-Emoji { <# .SYNOPSIS Combines multiple emojis into a single composed emoji using Zero Width Joiner. .DESCRIPTION Joins emojis together using the Unicode Zero Width Joiner (ZWJ) character (U+200D). This creates composed emojis like family members, professions, or combined symbols. Note: Not all emoji combinations are valid or supported by all systems. The result depends on font and platform support for the specific ZWJ sequence. .PARAMETER Emojis Array of emojis to combine. Can be emoji characters or names. .PARAMETER AsString Return the composed emoji as a string instead of an object .PARAMETER ShowComponents Display the individual components being combined .EXAMPLE Join-Emoji -Emojis "👨", "👩", "👧" Creates a family emoji (man-woman-girl) .EXAMPLE Join-Emoji -Emojis "🏳️", "🌈" Creates a rainbow flag .EXAMPLE "👁️", "🗨️" | Join-Emoji -AsString Creates an eye in speech bubble emoji and returns as string .EXAMPLE Join-Emoji -Emojis "man", "laptop" -ShowComponents Joins man + laptop emojis with component display .NOTES Common ZWJ sequences: - Family compositions: Person + Person + Child - Profession: Person + Object (👨💻 = man + laptop) - Flags: Flag + Symbol (🏳️🌈 = white flag + rainbow) - Skin tones: Use Get-EmojiWithSkinTone for those #> [CmdletBinding()] param( [Parameter(Mandatory = $true, ValueFromPipeline = $true, Position = 0)] [string[]]$Emojis, [Parameter(Mandatory = $false)] [switch]$AsString, [Parameter(Mandatory = $false)] [switch]$ShowComponents ) begin { $datasetPath = Join-Path $PSScriptRoot "..\data\emoji.csv" if (-not (Test-Path $datasetPath)) { Write-Error "Emoji dataset not found at $datasetPath" return } $allEmojis = Import-Csv -Path $datasetPath -Encoding UTF8 $components = @() } process { foreach ($emoji in $Emojis) { # Check if it's already an emoji character # Emojis can be 1-10+ chars due to modifiers and ZWJ sequences if ($emoji.Length -le 20) { # Assume short strings might be emojis - try using directly first $isEmoji = $false foreach ($char in $emoji.ToCharArray()) { $cat = [System.Char]::GetUnicodeCategory($char) if ($cat -eq [System.Globalization.UnicodeCategory]::OtherSymbol -or $cat -eq [System.Globalization.UnicodeCategory]::Surrogate -or [int]$char -ge 0x1F000) { $isEmoji = $true break } } if ($isEmoji) { $components += $emoji if ($ShowComponents) { Write-Host " $emoji - (emoji character)" -ForegroundColor Cyan } continue } } # Try to find by name $found = $allEmojis | Where-Object { $_.name -like "*$emoji*" } | Select-Object -First 1 if ($found) { $components += $found.emoji if ($ShowComponents) { Write-Host " $($found.emoji) - $($found.name)" -ForegroundColor Cyan } } else { Write-Warning "Could not find emoji matching '$emoji'" } } } end { if ($components.Count -lt 2) { Write-Error "Need at least 2 emojis to join. Found: $($components.Count)" return } # Zero Width Joiner $zwj = [char]0x200D # Join emojis with ZWJ $composed = $components -join $zwj if ($ShowComponents) { Write-Host "`nComponents:" -ForegroundColor Yellow foreach ($comp in $components) { Write-Host " $comp" -ForegroundColor White } Write-Host "`nZWJ Sequence:" -ForegroundColor Yellow Write-Host " $composed" -ForegroundColor Green -NoNewline Write-Host " (U+" -NoNewline -ForegroundColor Gray foreach ($char in $composed.ToCharArray()) { Write-Host ([int][char]$char).ToString("X4") -NoNewline -ForegroundColor Gray Write-Host " " -NoNewline } Write-Host ")" -ForegroundColor Gray } if ($AsString) { return $composed } else { # Try to find if this is a known composed emoji $name = "Composed: " + ($components -join " + ") [PSCustomObject]@{ Emoji = $composed Name = $name Components = $components CodePoints = ($composed.ToCharArray() | ForEach-Object { "U+{0:X4}" -f [int][char]$_ }) -join " " IsSupported = "Unknown (depends on system font support)" } } } } |