From ec481040cf268fac8f527a7946e3ca92de09278d Mon Sep 17 00:00:00 2001 From: Spencer Janssen Date: Sat, 22 Dec 2007 05:47:14 +0100 Subject: Refactor Search.hs darcs-hash:20071222044714-a5988-0c4a07c1f51845086668bf5536fb6f365e204441.gz --- XMonad/Util/Search.hs | 72 +++++++++++++++++++++------------------------------ 1 file changed, 29 insertions(+), 43 deletions(-) (limited to 'XMonad/Util/Search.hs') diff --git a/XMonad/Util/Search.hs b/XMonad/Util/Search.hs index 48e1d4a..ef88058 100644 --- a/XMonad/Util/Search.hs +++ b/XMonad/Util/Search.hs @@ -15,19 +15,20 @@ --------------------------------------------------------------------------- -} module XMonad.Util.Search ( -- * Usage -- $usage - amazon, amazonSelection, amazonSearch, - google, googleSelection, googleSearch, - imdb, imdbSelection, imdbSearch, - wayback, waybackSelection, waybackSearch, - wikipedia, wikipediaSelection, wikipediaSearch, + search, promptSearch, - search + selectSearch, + + amazon, + google, + imdb, + wayback, + wikipedia ) where -import Control.Monad.Trans (MonadIO()) -- for select's type signature import Data.Char (chr, ord, isAlpha, isMark, isDigit) import Numeric (showIntAtBase) -import XMonad (io, X()) +import XMonad (X(), MonadIO) import XMonad.Prompt (XPrompt(showXPrompt), mkXPrompt, XPConfig()) import XMonad.Prompt.Shell (getShellCompl) import XMonad.Util.Run (safeSpawn) @@ -63,51 +64,36 @@ escape = escapeURIString (\c -> isAlpha c || isDigit c || isMark c) | d < 10 = chr (ord '0' + fromIntegral d) | otherwise = chr (ord 'A' + fromIntegral (d - 10)) --- | 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 query = safeSpawn browser $ site ++ escape query +type Browser = FilePath +type SearchEngine = String -> String + +search :: MonadIO m => Browser -> SearchEngine -> String -> m () +search browser site query = safeSpawn browser $ site query + +-- | Given a base URL, create the SearchEngine that escapes the query and +-- appends it to the base +simpleEngine :: String -> SearchEngine +simpleEngine site query = site ++ escape query -- The engines -amazonSearch, googleSearch, imdbSearch, waybackSearch, wikipediaSearch :: String -> String -> IO () -amazonSearch = search "http://www.amazon.com/exec/obidos/external-search?index=all&keyword=" -googleSearch = search "http://www.google.com/search?num=100&q=" -imdbSearch = search "http://www.imdb.com/Find?select=all&for=" -wikipediaSearch = search "https://secure.wikimedia.org/wikipedia/en/wiki/Special:Search?go=Go&search=" -waybackSearch = search "http://web.archive.org/" +amazon, google, imdb, wayback, wikipedia :: SearchEngine +amazon = simpleEngine "http://www.amazon.com/exec/obidos/external-search?index=all&keyword=" +google = simpleEngine "http://www.google.com/search?num=100&q=" +imdb = simpleEngine "http://www.imdb.com/Find?select=all&for=" +wikipedia = simpleEngine "https://secure.wikimedia.org/wikipedia/en/wiki/Special:Search?go=Go&search=" +wayback = simpleEngine "http://web.archive.org/" {- This doesn't seem to work, but nevertheless, it seems to be the official method at to get the latest backup. -} -- | Like 'search', but in this case, the string is not specified but grabbed -- from the user's response to a prompt. -promptSearch :: (String -> String -> IO ()) -> String -> XPConfig -> X () -promptSearch searchEngine browser config = mkXPrompt Search config (getShellCompl []) $ io . (searchEngine browser) - --- | 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. -amazon, google, imdb, wayback, wikipedia :: String -> XPConfig -> X () -amazon = promptSearch amazonSearch -google = promptSearch googleSearch -imdb = promptSearch imdbSearch -wikipedia = promptSearch wikipediaSearch -wayback = promptSearch waybackSearch +promptSearch :: XPConfig -> Browser -> SearchEngine -> X () +promptSearch config browser site = mkXPrompt Search config (getShellCompl []) $ search browser site -- | Like search, but for use with the X selection; it grabs the selection, -- passes it to a given searchEngine and opens it in a browser. The various -- *Selection functions specialize this to a particular search engine to make -- things easier. -select :: (Control.Monad.Trans.MonadIO m) => (t -> String -> IO a) -> t -> m a -select browser searchEngine = io $ browser searchEngine =<< getSelection - --- | Like the google\/wikipedia functions, but one less argument - the query is --- extracted from the copy-paste buffer of X Windows. -amazonSelection, googleSelection, imdbSelection, waybackSelection, wikipediaSelection :: String -> X () -amazonSelection = select amazonSearch -googleSelection = select googleSearch -imdbSelection = select imdbSearch -wikipediaSelection = select wikipediaSearch -waybackSelection = select waybackSearch +selectSearch :: MonadIO m => Browser -> SearchEngine -> m () +selectSearch browser searchEngine = search browser searchEngine =<< getSelection -- cgit v1.2.3