aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--XMonad/Util/Search.hs78
1 files changed, 78 insertions, 0 deletions
diff --git a/XMonad/Util/Search.hs b/XMonad/Util/Search.hs
new file mode 100644
index 0000000..ec627ab
--- /dev/null
+++ b/XMonad/Util/Search.hs
@@ -0,0 +1,78 @@
+{- |
+ Module : XMonad.Util.Search
+ Copyright : (C) 2007 Gwern Branwen
+ License : None; public domain
+
+ Maintainer : <gwern0@gmail.com>
+ Stability : unstable
+ Portability : unportable
+
+ A module for easily running Internet searches on web sites through XMonad.
+ Modeled after the handy Surfraw CLI search tools
+ <https://secure.wikimedia.org/wikipedia/en/wiki/Surfraw>.
+
+ Additional sites welcomed.
+--------------------------------------------------------------------------- -}
+module XMonad.Util.Search ( -- * Usage
+ -- $usage
+ google,
+ googleSelection,
+ wayback,
+ waybackSelection,
+ wikipedia,
+ wikipediaSelection,
+ promptSearch,
+ search
+ ) where
+
+import Data.Char (isAlpha, isDigit, isMark)
+import XMonad (io, X())
+import XMonad.Util.Run (safeSpawn)
+import Network.URI (escapeURIString)
+import XMonad.Prompt.Shell (getShellCompl)
+import XMonad.Prompt (XPrompt(showXPrompt), mkXPrompt, XPConfig())
+import XMonad.Util.XSelection (getSelection)
+
+-- A customized prompt
+data Search = Search
+instance XPrompt Search where
+ showXPrompt Search = "Search: "
+
+-- | Escape the search string so search engines understand it.
+-- We could just go (const False) and escape anything that even looks at us
+-- funny, but that produces obfuscated search queries. So we merely escape
+-- anything that doesn't look unfunny.
+escape :: String -> String
+escape = escapeURIString (\c -> isAlpha c || isDigit c || isMark c)
+
+-- | Given the base search URL, a browser to use, and the actual query, escape
+-- the query, prepend the base URL, and hand it off to the browser.
+search :: String -> FilePath -> String -> IO ()
+search site browser search = safeSpawn browser $ site ++ escape search
+
+promptSearch :: (String -> String -> IO ()) -> String -> XPConfig -> X ()
+promptSearch engine browser config = mkXPrompt Search config (getShellCompl []) $ io . (engine browser)
+
+-- The engines
+googleSearch, waybackSearch, wikipediaSearch :: String -> String -> IO ()
+googleSearch = search "http://www.google.com/search?num=100&q="
+wikipediaSearch = search "https://secure.wikimedia.org/wikipedia/en/wiki/Special:Search?go=Go&search="
+{- This doesn't seem to work, but nevertheless, it seems to be the official
+ method at <http://web.archive.org/collections/web/advanced.html> to get the
+ latest backup. -}
+waybackSearch = search "http://web.archive.org/"
+
+-- | Search the particular site; these are suitable for binding to a key. Use them like this:
+-- > , ((modm, xK_g ), google "firefox" defaultXPConfig)
+-- First argument is the browser you want to use, the second the prompt configuration
+google, wayback, wikipedia :: String -> XPConfig -> X ()
+google = promptSearch googleSearch
+wikipedia = promptSearch wikipediaSearch
+wayback = promptSearch waybackSearch
+
+-- | See previous. Like google/wikipedia, but one less argument - the query is
+-- extracted from the copy-paste buffer of X Windows.
+googleSelection, waybackSelection, wikipediaSelection :: String -> X ()
+googleSelection browser = io $ googleSearch browser =<< getSelection
+wikipediaSelection browser = io $ wikipediaSearch browser =<< getSelection
+waybackSelection browser = io $ waybackSearch browser =<< getSelection