dotfiles/win/Modules/Bookmark/Bookmark.psm1
2021-01-16 14:06:00 +08:00

113 lines
2.6 KiB
PowerShell

$BOOKMARK_PATH = "~\Nextcloud\bookmarks.md"
function Get-Bookmark {
[CmdletBinding()]
param(
[string[]] $args
)
$categories = [System.Collections.ArrayList] @()
$names = [System.Collections.ArrayList] @()
foreach ($arg in $args) {
if ($arg.StartsWith('#')) {
[void]$categories.Add($arg)
} else {
[void]$names.Add($arg)
}
}
Get-Content $BOOKMARK_PATH | FilterByCategory $categories | FilterByName $names
}
function Open-Bookmark {
[CmdletBinding()]
param(
[string[]] $urls
)
if ($urls.Length -eq 0) {
SearchBookmark
} else {
Get-Bookmark $urls | OpenUrls
}
}
function FilterByCategory {
[CmdletBinding()]
param(
[string[]] $categories,
[Parameter(Mandatory, ValueFromPipeline)] [array] $lines
)
BEGIN {
$current_indent = 0
}
PROCESS {
foreach ($line in $lines) {
if ($line -match '^(#+) (.*)$') {
$heading_indent = $matches[1].Length
if ($current_indent -eq 0) {
if ($categories.Contains("$line")) {
$current_indent = $heading_indent
}
} else {
if ($heading_indent -le $current_indent) {
$current_indent = 0
}
}
}
if ($current_indent -gt 0) {
echo $line
}
}
}
}
function FilterByName {
param(
[string[]] $names,
[Parameter(ValueFromPipeline)] [array] $lines
)
BEGIN {
$pattern = $names -join "|"
}
PROCESS {
if ($names.Length -eq 0) {
return $lines
}
foreach ($line in $lines) {
if ($line -match $pattern) {
echo $line
}
}
}
}
function OpenUrls {
param(
[Parameter(ValueFromPipeline)] [array] $lines
)
PROCESS {
foreach ($line in $lines) {
if ($line -match '\[(.*?)\]\((.*?)\)') {
start $matches[2]
}
}
}
}
function SearchBookmark {
$query = Get-Content $BOOKMARK_PATH | Where {$_.Length -gt 0} | fzf
if ($query.Length -eq 0) {
return
}
if ($query -match '^#') {
Open-Bookmark $query
} else {
@($query) | OpenUrls
}
}
Export-ModuleMember -Function Get-Bookmark,Open-Bookmark,FilterByCategory,FilterByName,OpenUrls,SearchBookmark