Functions/GenXdev.Webbrowser/Open-BrowserBookmarks.ps1

################################################################################
<#
.SYNOPSIS
Opens browser bookmarks that match specified search criteria.
 
.DESCRIPTION
Searches bookmarks across Microsoft Edge, Google Chrome, and Mozilla Firefox
browsers based on provided search queries. Opens matching bookmarks in the
selected browser with configurable window settings and browser modes.
 
.PARAMETER Queries
Search terms used to filter bookmarks by title or URL.
 
.PARAMETER Edge
Use Microsoft Edge browser bookmarks as search source.
 
.PARAMETER Chrome
Use Google Chrome browser bookmarks as search source.
 
.PARAMETER Firefox
Use Mozilla Firefox browser bookmarks as search source.
 
.PARAMETER OpenInEdge
Open found bookmarks in Microsoft Edge browser.
 
.PARAMETER OpenInChrome
Open found bookmarks in Google Chrome browser.
 
.PARAMETER OpenInFirefox
Open found bookmarks in Mozilla Firefox browser.
 
.PARAMETER Monitor
Specifies target monitor: 0=default, -1=discard, -2=secondary monitor.
 
.PARAMETER Private
Opens bookmarks in private/incognito browsing mode.
 
.PARAMETER Force
Forces enabling of debugging port, stops existing browser instances if needed.
 
.PARAMETER FullScreen
Opens browser windows in fullscreen mode.
 
.PARAMETER Width
Sets initial browser window width in pixels.
 
.PARAMETER Height
Sets initial browser window height in pixels.
 
.PARAMETER X
Sets initial browser window X position.
 
.PARAMETER Y
Sets initial browser window Y position.
 
.PARAMETER Left
Places browser window on left side of screen.
 
.PARAMETER Right
Places browser window on right side of screen.
 
.PARAMETER Top
Places browser window on top of screen.
 
.PARAMETER Bottom
Places browser window on bottom of screen.
 
.PARAMETER Centered
Centers browser window on screen.
 
.PARAMETER ApplicationMode
Hides browser controls for clean app-like experience.
 
.PARAMETER NoBrowserExtensions
Prevents loading of browser extensions.
 
.PARAMETER AcceptLang
Sets browser accept-language HTTP header.
 
.PARAMETER RestoreFocus
Restores PowerShell window focus after opening bookmarks.
 
.PARAMETER NewWindow
Creates new browser window instead of reusing existing one.
 
.PARAMETER Count
Maximum number of bookmarks to open (default 50).
 
.EXAMPLE
Open-BrowserBookmarks -Queries "github" -Edge -OpenInChrome -Count 5
 
.EXAMPLE
sites gh -e -och -c 5
#>

function Open-BrowserBookmarks {

    [CmdletBinding(DefaultParameterSetName = 'Default')]
    [Alias("sites")]
    param (
        ###############################################################################
        [parameter(
            Mandatory = $false,
            Position = 0,
            ValueFromRemainingArguments,
            ValueFromPipeline,
            ValueFromPipelineByPropertyName,
            HelpMessage = "Search terms to filter bookmarks"
        )]
        [Alias("q", "Value", "Name", "Text", "Query")]
        [string[]] $Queries,
        ###############################################################################
        [parameter(
            Mandatory = $false,
            HelpMessage = "Select in Microsoft Edge"
        )]
        [Alias("e")]
        [switch] $Edge,
        ###############################################################################
        [parameter(
            Mandatory = $false,
            HelpMessage = "Select in Google Chrome"
        )]
        [Alias("ch")]
        [switch] $Chrome,
        ###############################################################################
        [parameter(
            Mandatory = $false,
            HelpMessage = "Select in Firefox"
        )]
        [Alias("ff")]
        [switch] $Firefox,
        ###############################################################################
        [parameter(
            Mandatory = $false,
            HelpMessage = "Open urls in Microsoft Edge"
        )]
        [Alias("oe")]
        [switch] $OpenInEdge,
        ###############################################################################
        [parameter(
            Mandatory = $false,
            HelpMessage = "Open urls in Google Chrome"
        )]
        [Alias("och")]
        [switch] $OpenInChrome,
        ###############################################################################
        [parameter(
            Mandatory = $false,
            HelpMessage = "Open urls in Firefox"
        )]
        [Alias("off")]
        [switch] $OpenInFirefox,
        ###############################################################################
        [parameter(
            Mandatory = $false,
            HelpMessage = "Monitor to use (0=default, -1=discard, -2=secondary)"
        )]
        [Alias("m", "mon")]
        [int] $Monitor = -1,

        ###############################################################################
        [Parameter(
            Mandatory = $false,
            HelpMessage = "Opens in incognito/private browsing mode"
        )]
        [Alias("incognito", "inprivate")]
        [switch] $Private,

        ###############################################################################
        [Parameter(
            Mandatory = $false,
            HelpMessage = "Force enable debugging port, stopping existing browsers if needed"
        )]
        [switch] $Force,

        ###############################################################################
        [Alias("fs", "f")]
        [Parameter(
            Mandatory = $false,
            HelpMessage = "Opens in fullscreen mode"
        )]
        [switch] $FullScreen,

        ###############################################################################
        [Parameter(
            Mandatory = $false,
            HelpMessage = "The initial width of the webbrowser window"
        )]
        [int] $Width = -1,

        ###############################################################################
        [Parameter(
            Mandatory = $false,
            HelpMessage = "The initial height of the webbrowser window"
        )]
        [int] $Height = -1,

        ###############################################################################
        [Parameter(
            Mandatory = $false,
            HelpMessage = "The initial X position of the webbrowser window"
        )]
        [int] $X = -999999,

        ###############################################################################
        [Parameter(
            Mandatory = $false,
            HelpMessage = "The initial Y position of the webbrowser window"
        )]
        [int] $Y = -999999,

        ###############################################################################
        [Parameter(
            Mandatory = $false,
            HelpMessage = "Place browser window on the left side of the screen"
        )]
        [switch] $Left,

        ###############################################################################
        [Parameter(
            Mandatory = $false,
            HelpMessage = "Place browser window on the right side of the screen"
        )]
        [switch] $Right,

        ###############################################################################
        [Parameter(
            Mandatory = $false,
            HelpMessage = "Place browser window on the top side of the screen"
        )]
        [switch] $Top,

        ###############################################################################
        [Parameter(
            Mandatory = $false,
            HelpMessage = "Place browser window on the bottom side of the screen"
        )]
        [switch] $Bottom,

        ###############################################################################
        [Parameter(
            Mandatory = $false,
            HelpMessage = "Place browser window in the center of the screen"
        )]
        [switch] $Centered,

        ###############################################################################
        [Alias("a", "app", "appmode")]
        [Parameter(
            Mandatory = $false,
            HelpMessage = "Hide the browser controls"
        )]
        [switch] $ApplicationMode,

        ###############################################################################
        [Alias("de", "ne", "NoExtensions")]
        [Parameter(
            Mandatory = $false,
            HelpMessage = "Prevent loading of browser extensions"
        )]
        [switch] $NoBrowserExtensions,

        ###############################################################################
        [Alias("lang", "locale")]
        [Parameter(
            Mandatory = $false,
            HelpMessage = "Set the browser accept-lang http header"
        )]
        [string] $AcceptLang = $null,

        ###############################################################################
        [Alias("bg")]
        [Parameter(
            Mandatory = $false,
            HelpMessage = "Restore PowerShell window focus"
        )]
        [switch] $RestoreFocus,

        ###############################################################################
        [Alias("nw", "new")]
        [Parameter(
            Mandatory = $false,
            HelpMessage = "Don't re-use existing browser window, instead, create a new one"
        )]
        [switch] $NewWindow,
        ###############################################################################
        [parameter(
            Mandatory = $false,
            HelpMessage = "Maximum number of urls to open"
        )]
        [int] $Count = 50
        ###############################################################################
    )

    begin {

        # prepare browser opening parameters by copying relevant ones
        $boundParams = @{}
        $boundParams["Monitor"] = $Monitor

        # set target browser based on parameters
        if ($OpenInEdge) { $boundParams["Edge"] = $true }
        if ($OpenInChrome) { $boundParams["Chrome"] = $true }
        if ($OpenInFirefox) { $boundParams["Firefox"] = $true }

        # copy remaining window/browser configuration parameters
        foreach ($key in $PSBoundParameters.Keys) {
            if ($key -notin @('Queries', 'Chrome', 'Firefox', 'Edge', 'Count',
                    'OpenInEdge', 'OpenInChrome', 'OpenInFirefox', 'Monitor')) {
                $boundParams[$key] = $PSBoundParameters[$key]
            }
        }

        Write-Verbose "Initialized browser parameters for bookmark opening"
    }

    process {

        # setup bookmark search parameters
        $findParams = @{
            PassThru = $true
            Queries  = $Queries
        }

        # configure which browsers to search
        if ($Chrome) { $findParams["Chrome"] = $true }
        if ($Edge) { $findParams["Edge"] = $true }
        if ($Firefox) { $findParams["Firefox"] = $true }

        Write-Verbose "Searching bookmarks with criteria: $($Queries -join ',')"

        # find matching bookmarks and extract urls
        $urls = @(Find-BrowserBookmarks @findParams |
            ForEach-Object Url |
            Select-Object -First $Count)

        # handle case when no bookmarks found
        if ($urls.Length -eq 0) {
            Write-Host "No bookmarks found matching the criteria"
            return
        }

        Write-Verbose "Found $($urls.Length) matching bookmarks, opening in browser"

        # pass urls to browser opening function
        $boundParams["Url"] = $urls
        Open-Webbrowser @boundParams
    }

    end {
    }
}
################################################################################