StringManager.ps1

<#
    Defining main class [StringManager]:
     
    // Using Classes to develop the word combinations :: NOTES ::
        What is a class? - A Class is a blueprint which is used to create the instance of an object at run time.
        That is, when a class is instantiated the object is the instance of your class with certain properties
        and methods.
        Why classes? - There are many advantages of using classes in the script. The main advantage of using classes
        is code reuse-ability and redundancy. All the instances can be encapsulated in a single class and the main
        advantage is that formatting output.
 
    // Use Case ::
        The StringManager class gives the flexibility of picking the random alphabets from alphabet library
        and it actually forms all possible words with it. And finally it finds the synonyms for the words formed
        which are meaningful and return as an object.
        Now, the result can be formatted to various outputs for better visualisation.
 
    // Class Functionality ::
        StringManager class have multiple functionalities. They are -
            1. Pick alphabets for given number/s randomly and forms a word from the randomly picked alphabets
                E.g. "abc"
            2. Find the factorial of formed word. Plainly, it can give the number of possible combinations
            that can be formed from the formed word.
                E.g. Possible combinations that can be made from "abc" is 6.
            3. Remove the repeated letters in the word.
                E.g. "aabbc" Will be formatted to "abc"
            4. Find the word combinations or permutations for the word.
                E.g. for "abc" the word combinations are ( "abc","acb","bac","bca","cab","cba")
            5. Find the synonyms for meaningful word.
                E.g. Synonym for "cab" is taxi.
 
    // Notes ::
        Author : B Harish Karthic
        Date : 03/01/2020
        Version : v1.1
        Comments : Initial Script
 
    // Examples ::
        Instantiating the class -
        E.g. Instantiating a new class without passing arguments -
        $MyString = [StringManager]::new()
 
        Instantiating a new class by passing one argument -
        $MyString = [StringManager]::new(3)
         
        Instantiating a new class by passing two arguments -
        $MyString = [StringManager]::new(3,"Fun")
 
        Getting random alphabets from alphabets library
        $Word = $MyString.GetRandomAlphabets(3)
 
        Assigning the property to get random alphabets
        $Word = $MyString.GetRandomAlphabets($MyString.Number)
         
        Getting number of combinations that can be made from the word
        $MyString.GetFactorial($Word.Length)
 
        Removing repeated letters from the word
        $MyString.RemoveDuplicateLetters($Word)
 
        Generating all possible permutations of the word
        $Permutations = $MyString.GetPermutations($Word)
 
        Getting synonyms for generated permutations
        $MyString.GetSynonyms($Word)
#>


## Defining main class StringManager
Class StringManager {

    ## Defining Properties
    [int]$Number = 0
    [string]$String = "StringManager"

    ## hidden property
    hidden [array]$AlphabetsLibrary = @(for($i=0;$i -lt ([Char[]](97..122)).Count;$i++) { ([Char[]](97..122))[$i] })

    ## Constructors
    StringManager() {
        ## pass
    }

    StringManager([int]$Number) {
        $this.Number = $Number
    }

    StringManager([int]$Number,[string]$String) {
        $this.Number = $Number
        $this.String = $String
    }

    ## getting factorial of given number
    [bigint] GetFactorial([bigint]$number) {

        if($number -le 1) {
            return $number
        }
        else {
            return $number * $this.GetFactorial($number-1)           
        }        
    }

    ## getting random letters from AlphabetsLibrary
    [String] GetRandomAlphabets([int]$Number) {

        if($Number -lt 1) {
            return ""
        }
        else {
            $counter = 1
            $Word = ""

            While($counter -le $Number) { 
                $counter = $counter+1
                $Word += Get-Random $this.AlphabetsLibrary
            }
            return $Word
        }
    }

    ## removing repeated letters in the string
    [string] RemoveDuplicateLetters([string]$Word) {

        if(-not $PSBoundParameters.ContainsKey("Word")) {
            return ""
        }
        else {
            $FinalWord = ""
            $Word = ($Word.ToCharArray() | Group-Object -NoElement).Name

            foreach($letter in $Word) {
                $FinalWord += $letter
            }
            $FinalWord = $FinalWord -replace " ",""
            return $FinalWord
        }
    }

    ## finding string permutations
    [array] GetPermutations([string]$PermutationWord) {

        if ($PermutationWord.Length -eq 0) {
            return ""
        }
    
        elseif ($PermutationWord.Length -eq 1) {
            return $PermutationWord
        }
    
        else {
            $PermWord = @()
            $counter = $PermutationWord.Length
        
            for($i=0;$i -lt $PermutationWord.Length;$i++) {
                $FirstLetter = $PermutationWord[$i]
                $RemainingLetters = $PermutationWord.Substring(0,$i) + $PermutationWord.Substring(($i+1),($counter-1))
                $counter -= 1
    
                foreach($letter in $this.GetPermutations($RemainingLetters)) {
                    $PermWord += $FirstLetter + $letter
                }          
            }
            return $PermWord
        }
    }

    ## finding synonyms of the word/s
    [array] GetSynonyms([String[]]$Words) {
        
        $result = @()
        $Uri = "https://www.synonym.com/synonyms"

        foreach($Word in $Words) {
        
            try {
                $WebRequest = Invoke-WebRequest -Uri "$($Uri)/$($Word)"

                $Synonyms = ($WebRequest.ParsedHtml.IHTMLDocument2_body.getElementsByClassName("card-content") `
                | Select-Object innerText -First 2 -ExpandProperty innerText)[1]
                $Synonyms = $Synonyms.Replace(" ",",").TrimEnd(",") -split ","

                $Hash = [PSCustomObject]@{
                    "Words" = $Word
                    "Synonyms" = $Synonyms
                }
                $result += $Hash
            }
            catch {
                $Hash = [PSCustomObject]@{
                    "Words" = $Word
                    "Synonyms" = "No synonym for the word!"
                }
                $result += $Hash
            }
        }
            return $result
    }

}