Skip to content

Instantly share code, notes, and snippets.

@pierre3
Last active December 3, 2015 12:51
Show Gist options
  • Save pierre3/3d4d7663b1f07dad7a2d to your computer and use it in GitHub Desktop.
Save pierre3/3d4d7663b1f07dad7a2d to your computer and use it in GitHub Desktop.
TabExpansion++ Argument Completer for Search-Google
# TabExpansion++ を使用する場合
function GoogleSuggestCompletion {
# この属性でターゲットとなるコマンドとパラメータを指定する
[ArgumentCompleter(
Parameter = 'SearchWords',
Command = 'Search-Google',
Description='TabExpansion++ Argument Completer for Search-Google')]
# 入力パラメータこの通りにする。$wordToComplete に入力中の値が入ってくる。
param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameter)
# GoogleサジェストのリクエストURL
$url = "https://www.google.com/complete/search?output=toolbar&q=$wordToComplete"
$res = Invoke-WebRequest -Uri $url
# ストリームを先頭に戻し、Shift-jis エンコーディングで読み直す
$res.RawContentStream.Position = 0
$reader = New-Object System.IO.StreamReader $res.RawContentStream,[System.Text.Encoding]::Default
try{
# 結果はXMLで返ってくる
$xml = New-Object System.Xml.XmlDocument
$xml.Load($reader)
# <suggestion data="結果ワード" /> suggestion タグのdata 属性から結果を取得
$xml.GetElementsByTagName("suggestion") | % {$_.Attributes["data"].Value } | % {
# スペースで区切られた複数単語の場合は引用符で囲む
if($_.Contains(" ")){ $word = '"' + $_ + '"' }else{ $word = $_ }
# 結果は System.Management.Automation.CompletionResult のオブジェクトとして返す
New-CompletionResult $word $_ $_
}
}
finally
{
$reader.Dispose();
}
}
# PS v5.0 から コマンドレットで登録できる。
# パラメータでターゲットとなるコマンドとパラメータ名を指定する。メインの処理は ScriptBlock で渡す。
Register-ArgumentCompleter -CommandName Search-Google -ParameterName SearchWords -ScriptBlock {
# 入力パラメータこの通りにする。$wordToComplete に入力中の値が入ってくる。
param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameter)
# GoogleサジェストのリクエストURL
$url = "https://www.google.com/complete/search?output=toolbar&q=$wordToComplete"
$res = Invoke-WebRequest -Uri $url
# ストリームを先頭に戻し、Shift-jis エンコーディングで読み直す
$res.RawContentStream.Position = 0
$reader = New-Object System.IO.StreamReader $res.RawContentStream,[System.Text.Encoding]::Default
try{
# 結果はXMLで返ってくる
$xml = New-Object System.Xml.XmlDocument
$xml.Load($reader)
# <suggestion data="結果ワード" /> suggestion タグのdata 属性から結果を取得
$xml.GetElementsByTagName("suggestion") | % {$_.Attributes["data"].Value } | % {
if($_.Contains(" ")){ $word = '"' + $_ + '"' }else{ $word = $_ }
# 標準ではNew-CompletionResult コマンドレットが無いので、オブジェクトを直接生成
[System.Management.Automation.CompletionResult]::new($word, $_,
[System.Management.Automation.CompletionResultType]::ParameterValue, $_ );
}
}
finally
{
$reader.Dispose();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment