text.ps1
Write-Verbose "Include script '$PSCommandPath'" ### Includes: #. "$PSScriptRoot\common.ps1" ### Variables: ### Functions: function Translit-EngToRus { [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [string]$Text ) Write-Verbose "Translit-EngToRus: Text: '$Text'" $Text = "$Text".Trim().ToLower() if (!$Text) { Write-Warning "Translit-EngToRus: Text is empty" return $Text } $map = [ordered]@{ 'iya' = 'ия' 'iyu' = 'ию' 'jsh' = 'щ' 'sch' = 'щ' 'yiy' = 'ый' 'ch' = 'ч' 'eh' = 'э' 'ey' = 'ей' 'hh' = 'ъ' 'ih' = 'ы' 'iy' = 'ий' 'ja' = 'я' 'je' = 'ё' 'jh' = 'ь' 'ju' = 'ю' 'kh' = 'х' 'sh' = 'ш' 'ts' = 'ц' 'ya' = 'я' 'yj' = 'ый' 'yo' = 'ё' 'yu' = 'ю' 'zh' = 'ж' 'a' = 'а' 'b' = 'б' 'c' = 'ц' 'd' = 'д' 'e' = 'е' 'f' = 'ф' 'g' = 'г' 'h' = 'х' 'i' = 'и' 'j' = 'дж' 'k' = 'к' 'l' = 'л' 'm' = 'м' 'n' = 'н' 'o' = 'о' 'p' = 'п' 'q' = 'ку' 'r' = 'р' 's' = 'с' 't' = 'т' 'u' = 'у' 'v' = 'в' 'w' = 'в' 'x' = 'кс' 'y' = 'ы' 'z' = 'з' } $result = [System.Text.StringBuilder]::new() $text_len = $Text.Length $pos = 0 try { :top_while while ($pos -lt $text_len) { # Write-Verbose "Translit-EngToRus: text: '$($Text.Substring($pos))'" :foreach_map foreach ($kv in $map.GetEnumerator()) { $eng = $kv.Key # Write-Verbose "Translit-EngToRus: check '$eng'" $eng_len = $eng.Length if (($pos + $eng_len) -le $text_len) { $sub_str = $Text.Substring($pos, $eng_len) # Write-Verbose "Translit-EngToRus: compare '$sub_str' with '$eng'" if ($sub_str -eq $eng) { # Write-Verbose "Translit-EngToRus: $sub_str -> $($kv.Value)" $result.Append($kv.Value) >$null $pos += $eng_len # throw "TEST" continue top_while } } } ### If not found: $result.Append($Text.Substring($pos, 1)) >$null $pos++ } } catch { Write-Host ("ERROR: " + ($_ | fl * -Force | Out-String).Trim()) -ForegroundColor 'Red' Write-Host "Result: '$($result.ToString())'" -fo Cyan throw } $result_str = $result.ToString() Write-Verbose "Translit-EngToRus: result: '$result_str'" return $result_str } |