Sophie

Sophie

distrib > Fedora > 16 > i386 > by-pkgid > 420a649e6f65db30aa7451f64d08ff92 > files > 991

ghc-xmonad-contrib-devel-0.9.2-4.fc16.i686.rpm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://code.haskell.org/~malcolm/hscolour/ -->
<title>XMonad/Actions/Search.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>{- | Module      :  XMonad.Actions.Search
<a name="line-2"></a>   Copyright   :  (C) 2007 Gwern Branwen
<a name="line-3"></a>   License     :  None; public domain
<a name="line-4"></a>
<a name="line-5"></a>   Maintainer  :  &lt;gwern0@gmail.com&gt;
<a name="line-6"></a>   Stability   :  unstable
<a name="line-7"></a>   Portability :  unportable; depends on XSelection, XPrompt
<a name="line-8"></a>
<a name="line-9"></a>   A module for easily running Internet searches on web sites through xmonad.
<a name="line-10"></a>   Modeled after the handy Surfraw CLI search tools at &lt;https://secure.wikimedia.org/wikipedia/en/wiki/Surfraw&gt;.
<a name="line-11"></a>
<a name="line-12"></a>   Additional sites welcomed. -}</span>
<a name="line-13"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>XMonad</span><span class='hs-varop'>.</span><span class='hs-conid'>Actions</span><span class='hs-varop'>.</span><span class='hs-conid'>Search</span> <span class='hs-layout'>(</span>   <span class='hs-comment'>-- * Usage</span>
<a name="line-14"></a>                                 <span class='hs-comment'>-- $usage</span>
<a name="line-15"></a>                                 <span class='hs-varid'>search</span><span class='hs-layout'>,</span>
<a name="line-16"></a>                                 <span class='hs-conid'>SearchEngine</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-17"></a>                                 <span class='hs-varid'>searchEngine</span><span class='hs-layout'>,</span>
<a name="line-18"></a>                                 <span class='hs-varid'>searchEngineF</span><span class='hs-layout'>,</span>
<a name="line-19"></a>                                 <span class='hs-varid'>promptSearch</span><span class='hs-layout'>,</span>
<a name="line-20"></a>                                 <span class='hs-varid'>promptSearchBrowser</span><span class='hs-layout'>,</span>
<a name="line-21"></a>                                 <span class='hs-varid'>selectSearch</span><span class='hs-layout'>,</span>
<a name="line-22"></a>                                 <span class='hs-varid'>selectSearchBrowser</span><span class='hs-layout'>,</span>
<a name="line-23"></a>                                 <span class='hs-varid'>isPrefixOf</span><span class='hs-layout'>,</span>
<a name="line-24"></a>                                 <span class='hs-varid'>escape</span><span class='hs-layout'>,</span>
<a name="line-25"></a>                                 <span class='hs-varid'>use</span><span class='hs-layout'>,</span>
<a name="line-26"></a>                                 <span class='hs-varid'>intelligent</span><span class='hs-layout'>,</span>
<a name="line-27"></a>                                 <span class='hs-layout'>(</span><span class='hs-varop'>!&gt;</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-28"></a>                                 <span class='hs-varid'>prefixAware</span><span class='hs-layout'>,</span>
<a name="line-29"></a>                                 <span class='hs-varid'>namedEngine</span><span class='hs-layout'>,</span>
<a name="line-30"></a>
<a name="line-31"></a>                                 <span class='hs-varid'>amazon</span><span class='hs-layout'>,</span>
<a name="line-32"></a>                                 <span class='hs-varid'>alpha</span><span class='hs-layout'>,</span>
<a name="line-33"></a>                                 <span class='hs-varid'>codesearch</span><span class='hs-layout'>,</span>
<a name="line-34"></a>                                 <span class='hs-varid'>deb</span><span class='hs-layout'>,</span>
<a name="line-35"></a>                                 <span class='hs-varid'>debbts</span><span class='hs-layout'>,</span>
<a name="line-36"></a>                                 <span class='hs-varid'>debpts</span><span class='hs-layout'>,</span>
<a name="line-37"></a>                                 <span class='hs-varid'>dictionary</span><span class='hs-layout'>,</span>
<a name="line-38"></a>                                 <span class='hs-varid'>google</span><span class='hs-layout'>,</span>
<a name="line-39"></a>                                 <span class='hs-varid'>hackage</span><span class='hs-layout'>,</span>
<a name="line-40"></a>                                 <span class='hs-varid'>hoogle</span><span class='hs-layout'>,</span>
<a name="line-41"></a>                                 <span class='hs-varid'>images</span><span class='hs-layout'>,</span>
<a name="line-42"></a>                                 <span class='hs-varid'>imdb</span><span class='hs-layout'>,</span>
<a name="line-43"></a>                                 <span class='hs-varid'>isohunt</span><span class='hs-layout'>,</span>
<a name="line-44"></a>                                 <span class='hs-varid'>lucky</span><span class='hs-layout'>,</span>
<a name="line-45"></a>                                 <span class='hs-varid'>maps</span><span class='hs-layout'>,</span>
<a name="line-46"></a>                                 <span class='hs-varid'>mathworld</span><span class='hs-layout'>,</span>
<a name="line-47"></a>                                 <span class='hs-varid'>scholar</span><span class='hs-layout'>,</span>
<a name="line-48"></a>                                 <span class='hs-varid'>thesaurus</span><span class='hs-layout'>,</span>
<a name="line-49"></a>                                 <span class='hs-varid'>wayback</span><span class='hs-layout'>,</span>
<a name="line-50"></a>                                 <span class='hs-varid'>wikipedia</span><span class='hs-layout'>,</span>
<a name="line-51"></a>                                 <span class='hs-varid'>wiktionary</span><span class='hs-layout'>,</span>
<a name="line-52"></a>                                 <span class='hs-varid'>youtube</span><span class='hs-layout'>,</span>
<a name="line-53"></a>                                 <span class='hs-varid'>multi</span>
<a name="line-54"></a>                                  <span class='hs-comment'>-- * Use case: searching with a submap</span>
<a name="line-55"></a>                                  <span class='hs-comment'>-- $tip</span>
<a name="line-56"></a>                          <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-57"></a>
<a name="line-58"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Char</span> <span class='hs-layout'>(</span><span class='hs-varid'>chr</span><span class='hs-layout'>,</span> <span class='hs-varid'>ord</span><span class='hs-layout'>,</span> <span class='hs-varid'>isAlpha</span><span class='hs-layout'>,</span> <span class='hs-varid'>isMark</span><span class='hs-layout'>,</span> <span class='hs-varid'>isDigit</span><span class='hs-layout'>)</span>
<a name="line-59"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>List</span> <span class='hs-layout'>(</span><span class='hs-varid'>isPrefixOf</span><span class='hs-layout'>)</span>
<a name="line-60"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Numeric</span> <span class='hs-layout'>(</span><span class='hs-varid'>showIntAtBase</span><span class='hs-layout'>)</span>
<a name="line-61"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>XMonad</span> <span class='hs-layout'>(</span><span class='hs-conid'>X</span><span class='hs-conid'>()</span><span class='hs-layout'>,</span> <span class='hs-conid'>MonadIO</span><span class='hs-layout'>,</span> <span class='hs-varid'>liftIO</span><span class='hs-layout'>)</span>
<a name="line-62"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>XMonad</span><span class='hs-varop'>.</span><span class='hs-conid'>Prompt</span> <span class='hs-layout'>(</span><span class='hs-conid'>XPrompt</span><span class='hs-layout'>(</span><span class='hs-varid'>showXPrompt</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkXPrompt</span><span class='hs-layout'>,</span> <span class='hs-conid'>XPConfig</span><span class='hs-conid'>()</span><span class='hs-layout'>,</span> <span class='hs-varid'>historyCompletionP</span><span class='hs-layout'>)</span>
<a name="line-63"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>XMonad</span><span class='hs-varop'>.</span><span class='hs-conid'>Prompt</span><span class='hs-varop'>.</span><span class='hs-conid'>Shell</span> <span class='hs-layout'>(</span><span class='hs-varid'>getBrowser</span><span class='hs-layout'>)</span>
<a name="line-64"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>XMonad</span><span class='hs-varop'>.</span><span class='hs-conid'>Util</span><span class='hs-varop'>.</span><span class='hs-conid'>Run</span> <span class='hs-layout'>(</span><span class='hs-varid'>safeSpawn</span><span class='hs-layout'>)</span>
<a name="line-65"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>XMonad</span><span class='hs-varop'>.</span><span class='hs-conid'>Util</span><span class='hs-varop'>.</span><span class='hs-conid'>XSelection</span> <span class='hs-layout'>(</span><span class='hs-varid'>getSelection</span><span class='hs-layout'>)</span>
<a name="line-66"></a>
<a name="line-67"></a><span class='hs-comment'>{- $usage
<a name="line-68"></a>
<a name="line-69"></a>   This module is intended to allow easy access to databases on the
<a name="line-70"></a>   Internet through xmonad's interface. The idea is that one wants to
<a name="line-71"></a>   run a search but the query string and the browser to use must come
<a name="line-72"></a>   from somewhere. There are two places the query string can come from
<a name="line-73"></a>   - the user can type it into a prompt which pops up, or the query
<a name="line-74"></a>   could be available already in the X Windows copy\/paste buffer
<a name="line-75"></a>   (perhaps you just highlighted the string of interest).
<a name="line-76"></a>
<a name="line-77"></a>   Thus, there are two main functions: 'promptSearch', and
<a name="line-78"></a>   'selectSearch' (implemented using the more primitive 'search'). To
<a name="line-79"></a>   each of these is passed an engine function; this is a function that
<a name="line-80"></a>   knows how to search a particular site.
<a name="line-81"></a>
<a name="line-82"></a>   For example, the 'google' function knows how to search Google, and
<a name="line-83"></a>   so on. You pass 'promptSearch' and 'selectSearch' the engine you
<a name="line-84"></a>   want, the browser you want, and anything special they might need;
<a name="line-85"></a>   this whole line is then bound to a key of you choosing in your
<a name="line-86"></a>   xmonad.hs. For specific examples, see each function.  This module
<a name="line-87"></a>   is easily extended to new sites by using 'searchEngine'.
<a name="line-88"></a>
<a name="line-89"></a>   The currently available search engines are:
<a name="line-90"></a>
<a name="line-91"></a>* 'amazon' -- Amazon keyword search.
<a name="line-92"></a>
<a name="line-93"></a>* 'alpha' -- Wolfram|Alpha query.
<a name="line-94"></a>
<a name="line-95"></a>* 'codesearch' -- Google Labs Code Search search.
<a name="line-96"></a>
<a name="line-97"></a>* 'deb'    -- Debian package search.
<a name="line-98"></a>
<a name="line-99"></a>* 'debbts' -- Debian Bug Tracking System.
<a name="line-100"></a>
<a name="line-101"></a>* 'debpts'  -- Debian Package Tracking System.
<a name="line-102"></a>
<a name="line-103"></a>* 'dictionary' -- dictionary.reference.com search.
<a name="line-104"></a>
<a name="line-105"></a>* 'google' -- basic Google search.
<a name="line-106"></a>
<a name="line-107"></a>* 'hackage' -- Hackage, the Haskell package database.
<a name="line-108"></a>
<a name="line-109"></a>* 'hoogle' -- Hoogle, the Haskell libraries API search engine.
<a name="line-110"></a>
<a name="line-111"></a>* 'images' -- Google images.
<a name="line-112"></a>
<a name="line-113"></a>* 'imdb'   -- the Internet Movie Database.
<a name="line-114"></a>
<a name="line-115"></a>* 'isohunt' -- isoHunt search.
<a name="line-116"></a>
<a name="line-117"></a>* 'lucky' -- Google "I'm feeling lucky" search.
<a name="line-118"></a>
<a name="line-119"></a>* 'maps'   -- Google maps.
<a name="line-120"></a>
<a name="line-121"></a>* 'mathworld' -- Wolfram MathWorld search.
<a name="line-122"></a>
<a name="line-123"></a>* 'scholar' -- Google scholar academic search.
<a name="line-124"></a>
<a name="line-125"></a>* 'thesaurus' -- thesaurus.reference.com search.
<a name="line-126"></a>
<a name="line-127"></a>* 'wayback' -- the Wayback Machine.
<a name="line-128"></a>
<a name="line-129"></a>* 'wikipedia' -- basic Wikipedia search.
<a name="line-130"></a>
<a name="line-131"></a>* 'youtube' -- Youtube video search.
<a name="line-132"></a>
<a name="line-133"></a>* 'multi' -- Search based on the prefix. \"amazon:Potter\" will use amazon, etc. With no prefix searches google.
<a name="line-134"></a>
<a name="line-135"></a>Feel free to add more! -}</span>
<a name="line-136"></a>
<a name="line-137"></a><span class='hs-comment'>{- $tip
<a name="line-138"></a>
<a name="line-139"></a>In combination with "XMonad.Actions.Submap" you can create a powerful
<a name="line-140"></a>and easy way to search without adding a whole bunch of bindings.
<a name="line-141"></a>
<a name="line-142"></a>First import the necessary modules:
<a name="line-143"></a>
<a name="line-144"></a>&gt; import qualified XMonad.Prompt         as P
<a name="line-145"></a>&gt; import qualified XMonad.Actions.Submap as SM
<a name="line-146"></a>&gt; import qualified XMonad.Actions.Search as S
<a name="line-147"></a>
<a name="line-148"></a>Then add the following to your key bindings:
<a name="line-149"></a>
<a name="line-150"></a>&gt; ...
<a name="line-151"></a>&gt; -- Search commands
<a name="line-152"></a>&gt; , ((modm, xK_s), SM.submap $ searchEngineMap $ S.promptSearch P.defaultXPConfig)
<a name="line-153"></a>&gt; , ((modm .|. shiftMask, xK_s), SM.submap $ searchEngineMap $ S.selectSearch)
<a name="line-154"></a>&gt;
<a name="line-155"></a>&gt; ...
<a name="line-156"></a>&gt;
<a name="line-157"></a>&gt; searchEngineMap method = M.fromList $
<a name="line-158"></a>&gt;       [ ((0, xK_g), method S.google)
<a name="line-159"></a>&gt;       , ((0, xK_h), method S.hoogle)
<a name="line-160"></a>&gt;       , ((0, xK_w), method S.wikipedia)
<a name="line-161"></a>&gt;       ]
<a name="line-162"></a>
<a name="line-163"></a>Or in combination with XMonad.Util.EZConfig:
<a name="line-164"></a>
<a name="line-165"></a>&gt; ...
<a name="line-166"></a>&gt; ] -- end of regular keybindings
<a name="line-167"></a>&gt; -- Search commands
<a name="line-168"></a>&gt; ++ [("M-s " ++ k, S.promptSearch P.defaultXPConfig f) | (k,f) &lt;- searchList ]
<a name="line-169"></a>&gt; ++ [("M-S-s " ++ k, S.selectSearch f) | (k,f) &lt;- searchList ]
<a name="line-170"></a>&gt;
<a name="line-171"></a>&gt; ...
<a name="line-172"></a>&gt;
<a name="line-173"></a>&gt; searchList :: [(String, S.SearchEngine)]
<a name="line-174"></a>&gt; searchList = [ ("g", S.google)
<a name="line-175"></a>&gt;              , ("h", S.hoohle)
<a name="line-176"></a>&gt;              , ("w", S.wikipedia)
<a name="line-177"></a>&gt;              ]
<a name="line-178"></a>
<a name="line-179"></a>Make sure to set firefox to open new pages in a new window instead of
<a name="line-180"></a>in a new tab: @Firefox -&gt; Edit -&gt; Preferences -&gt; Tabs -&gt; New pages
<a name="line-181"></a>should be opened in...@
<a name="line-182"></a>
<a name="line-183"></a>Now /mod-s/ + /g/\//h/\//w/ prompts you for a search string, then
<a name="line-184"></a>opens a new firefox window that performs the search on Google, Hoogle
<a name="line-185"></a>or Wikipedia respectively.
<a name="line-186"></a>
<a name="line-187"></a>If you select something in whatever application and hit /mod-shift-s/ +
<a name="line-188"></a>/g/\//h/\//w/ it will search the selected string with the specified
<a name="line-189"></a>engine.
<a name="line-190"></a>
<a name="line-191"></a>Happy searching! -}</span>
<a name="line-192"></a>
<a name="line-193"></a><a name="Search"></a><span class='hs-comment'>-- | A customized prompt indicating we are searching, and the name of the site.</span>
<a name="line-194"></a><a name="Search"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Search</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Search</span> <span class='hs-conid'>Name</span>
<a name="line-195"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>XPrompt</span> <span class='hs-conid'>Search</span> <span class='hs-keyword'>where</span>
<a name="line-196"></a>    <span class='hs-varid'>showXPrompt</span> <span class='hs-layout'>(</span><span class='hs-conid'>Search</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>=</span> <span class='hs-str'>"Search ["</span> <span class='hs-varop'>++</span> <span class='hs-varid'>name</span> <span class='hs-varop'>++</span> <span class='hs-str'>"]: "</span>
<a name="line-197"></a>
<a name="line-198"></a><a name="escape"></a><span class='hs-comment'>-- | Escape the search string so search engines understand it.</span>
<a name="line-199"></a><span class='hs-comment'>-- Note that everything is escaped; we could be smarter and use 'isAllowedInURI'</span>
<a name="line-200"></a><span class='hs-comment'>-- but then that'd be hard enough to copy-and-paste we'd need to depend on @network@.</span>
<a name="line-201"></a><span class='hs-definition'>escape</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-202"></a><span class='hs-definition'>escape</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>escapeURIString</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>c</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>isAlpha</span> <span class='hs-varid'>c</span> <span class='hs-varop'>||</span> <span class='hs-varid'>isDigit</span> <span class='hs-varid'>c</span> <span class='hs-varop'>||</span> <span class='hs-varid'>isMark</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span>
<a name="line-203"></a>         <span class='hs-keyword'>where</span> <span class='hs-comment'>-- Copied from Network.URI.</span>
<a name="line-204"></a>           <span class='hs-varid'>escapeURIString</span> <span class='hs-keyglyph'>::</span>
<a name="line-205"></a>               <span class='hs-layout'>(</span><span class='hs-conid'>Char</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span>      <span class='hs-comment'>-- a predicate which returns 'False' if should escape</span>
<a name="line-206"></a>               <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>           <span class='hs-comment'>-- the string to process</span>
<a name="line-207"></a>               <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>           <span class='hs-comment'>-- the resulting URI string</span>
<a name="line-208"></a>           <span class='hs-varid'>escapeURIString</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>concatMap</span> <span class='hs-varop'>.</span> <span class='hs-varid'>escapeURIChar</span>
<a name="line-209"></a>           <span class='hs-varid'>escapeURIChar</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Char</span><span class='hs-keyglyph'>-&gt;</span><span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Char</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-210"></a>           <span class='hs-varid'>escapeURIChar</span> <span class='hs-varid'>p</span> <span class='hs-varid'>c</span>
<a name="line-211"></a>               <span class='hs-keyglyph'>|</span> <span class='hs-varid'>p</span> <span class='hs-varid'>c</span>       <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>c</span><span class='hs-keyglyph'>]</span>
<a name="line-212"></a>               <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-chr'>'%'</span> <span class='hs-conop'>:</span> <span class='hs-varid'>myShowHex</span> <span class='hs-layout'>(</span><span class='hs-varid'>ord</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-str'>""</span>
<a name="line-213"></a>               <span class='hs-keyword'>where</span>
<a name="line-214"></a>                 <span class='hs-varid'>myShowHex</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ShowS</span>
<a name="line-215"></a>                 <span class='hs-varid'>myShowHex</span> <span class='hs-varid'>n</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span>  <span class='hs-keyword'>case</span> <span class='hs-varid'>showIntAtBase</span> <span class='hs-num'>16</span> <span class='hs-varid'>toChrHex</span> <span class='hs-varid'>n</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>of</span>
<a name="line-216"></a>                                    <span class='hs-conid'>[]</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-str'>"00"</span>
<a name="line-217"></a>                                    <span class='hs-keyglyph'>[</span><span class='hs-varid'>ch</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-chr'>'0'</span><span class='hs-layout'>,</span><span class='hs-varid'>ch</span><span class='hs-keyglyph'>]</span>
<a name="line-218"></a>                                    <span class='hs-varid'>cs</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>cs</span>
<a name="line-219"></a>                 <span class='hs-varid'>toChrHex</span> <span class='hs-varid'>d</span>
<a name="line-220"></a>                   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>d</span> <span class='hs-varop'>&lt;</span> <span class='hs-num'>10</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>chr</span> <span class='hs-layout'>(</span><span class='hs-varid'>ord</span> <span class='hs-chr'>'0'</span> <span class='hs-varop'>+</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span>
<a name="line-221"></a>                   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>chr</span> <span class='hs-layout'>(</span><span class='hs-varid'>ord</span> <span class='hs-chr'>'A'</span> <span class='hs-varop'>+</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-layout'>(</span><span class='hs-varid'>d</span> <span class='hs-comment'>-</span> <span class='hs-num'>10</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-222"></a>
<a name="line-223"></a><a name="Browser"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Browser</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>FilePath</span>
<a name="line-224"></a><a name="Query"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Query</span>        <span class='hs-keyglyph'>=</span> <span class='hs-conid'>String</span>
<a name="line-225"></a><a name="Site"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Site</span>         <span class='hs-keyglyph'>=</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-226"></a><a name="Name"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Name</span>         <span class='hs-keyglyph'>=</span> <span class='hs-conid'>String</span>
<a name="line-227"></a><a name="SearchEngine"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>SearchEngine</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SearchEngine</span> <span class='hs-conid'>Name</span> <span class='hs-conid'>Site</span>
<a name="line-228"></a>
<a name="line-229"></a><a name="use"></a><span class='hs-comment'>-- | Given an already defined search engine, extracts its transformation</span>
<a name="line-230"></a><span class='hs-comment'>--   function, making it easy to create compound search engines.</span>
<a name="line-231"></a><span class='hs-comment'>--   For an instance you can use @use google@ to get a function which</span>
<a name="line-232"></a><span class='hs-comment'>--   makes the same transformation as the google search engine would.</span>
<a name="line-233"></a><span class='hs-definition'>use</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SearchEngine</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Site</span>
<a name="line-234"></a><span class='hs-definition'>use</span> <span class='hs-layout'>(</span><span class='hs-conid'>SearchEngine</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>engine</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>engine</span>
<a name="line-235"></a>
<a name="line-236"></a><a name="search"></a><span class='hs-comment'>-- | Given a browser, a search engine's transformation function, and a search term, perform the</span>
<a name="line-237"></a><span class='hs-comment'>--   requested search in the browser.</span>
<a name="line-238"></a><span class='hs-definition'>search</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Browser</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Site</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Query</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-239"></a><span class='hs-definition'>search</span> <span class='hs-varid'>browser</span> <span class='hs-varid'>site</span> <span class='hs-varid'>query</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>safeSpawn</span> <span class='hs-varid'>browser</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>site</span> <span class='hs-varid'>query</span><span class='hs-keyglyph'>]</span>
<a name="line-240"></a>
<a name="line-241"></a><a name="searchEngine"></a><span class='hs-comment'>{- | Given a base URL, create the 'SearchEngine' that escapes the query and
<a name="line-242"></a>   appends it to the base. You can easily define a new engine locally using
<a name="line-243"></a>   exported functions without needing to modify "XMonad.Actions.Search":
<a name="line-244"></a>
<a name="line-245"></a>&gt; myNewEngine = searchEngine "site" "<a href="http://site.com/search=">http://site.com/search=</a>"
<a name="line-246"></a>
<a name="line-247"></a>   The important thing is that the site has a interface which accepts the escaped query
<a name="line-248"></a>   string as part of the URL. Alas, the exact URL to feed searchEngine varies
<a name="line-249"></a>   from site to site, often considerably, so there\'s no general way to cover this.
<a name="line-250"></a>
<a name="line-251"></a>   Generally, examining the resultant URL of a search will allow you to reverse-engineer
<a name="line-252"></a>   it if you can't find the necessary URL already described in other projects such as Surfraw. -}</span>
<a name="line-253"></a><span class='hs-definition'>searchEngine</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SearchEngine</span>
<a name="line-254"></a><span class='hs-definition'>searchEngine</span> <span class='hs-varid'>name</span> <span class='hs-varid'>site</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>searchEngineF</span> <span class='hs-varid'>name</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>site</span> <span class='hs-varop'>++</span> <span class='hs-layout'>(</span><span class='hs-varid'>escape</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-255"></a>
<a name="line-256"></a><a name="searchEngineF"></a><span class='hs-comment'>{- | If your search engine is more complex than this (you may want to identify
<a name="line-257"></a>   the kind of input and make the search URL dependent on the input or put the query
<a name="line-258"></a>   inside of a URL instead of in the end) you can use the alternative 'searchEngineF' function.
<a name="line-259"></a>
<a name="line-260"></a>&gt; searchFunc :: String -&gt; String
<a name="line-261"></a>&gt; searchFunc s | s `isPrefixOf` "wiki:"   = "<a href="http://en.wikipedia.org/wiki/">http://en.wikipedia.org/wiki/</a>" ++ (escape $ tail $ snd $ break (==':') s)
<a name="line-262"></a>&gt;              | s `isPrefixOf` "<a href="http://">http://</a>" = s
<a name="line-263"></a>&gt;              | otherwise               = (use google) s
<a name="line-264"></a>&gt; myNewEngine = searchEngineF "mymulti" searchFunc
<a name="line-265"></a>
<a name="line-266"></a>   @searchFunc@ here searches for a word in wikipedia if it has a prefix
<a name="line-267"></a>   of \"wiki:\" (you can use the 'escape' function to escape any forbidden characters), opens an address
<a name="line-268"></a>   directly if it starts with \"http:\/\/\" and otherwise uses the provided google search engine.
<a name="line-269"></a>   You can use other engines inside of your own through the 'use' function as shown above to make
<a name="line-270"></a>   complex searches.
<a name="line-271"></a>
<a name="line-272"></a>   The user input will be automatically escaped in search engines created with 'searchEngine',
<a name="line-273"></a>   'searchEngineF', however, completely depends on the transformation function passed to it. -}</span>
<a name="line-274"></a><span class='hs-definition'>searchEngineF</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Site</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SearchEngine</span>
<a name="line-275"></a><span class='hs-definition'>searchEngineF</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SearchEngine</span>
<a name="line-276"></a>
<a name="line-277"></a><a name="amazon"></a><span class='hs-comment'>-- The engines.</span>
<a name="line-278"></a><span class='hs-definition'>amazon</span><span class='hs-layout'>,</span> <span class='hs-varid'>alpha</span><span class='hs-layout'>,</span> <span class='hs-varid'>codesearch</span><span class='hs-layout'>,</span> <span class='hs-varid'>deb</span><span class='hs-layout'>,</span> <span class='hs-varid'>debbts</span><span class='hs-layout'>,</span> <span class='hs-varid'>debpts</span><span class='hs-layout'>,</span> <span class='hs-varid'>dictionary</span><span class='hs-layout'>,</span> <span class='hs-varid'>google</span><span class='hs-layout'>,</span> <span class='hs-varid'>hackage</span><span class='hs-layout'>,</span> <span class='hs-varid'>hoogle</span><span class='hs-layout'>,</span>
<a name="line-279"></a>  <span class='hs-varid'>images</span><span class='hs-layout'>,</span> <span class='hs-varid'>imdb</span><span class='hs-layout'>,</span> <span class='hs-varid'>isohunt</span><span class='hs-layout'>,</span> <span class='hs-varid'>lucky</span><span class='hs-layout'>,</span> <span class='hs-varid'>maps</span><span class='hs-layout'>,</span> <span class='hs-varid'>mathworld</span><span class='hs-layout'>,</span> <span class='hs-varid'>scholar</span><span class='hs-layout'>,</span> <span class='hs-varid'>thesaurus</span><span class='hs-layout'>,</span> <span class='hs-varid'>wayback</span><span class='hs-layout'>,</span> <span class='hs-varid'>wikipedia</span><span class='hs-layout'>,</span> <span class='hs-varid'>wiktionary</span><span class='hs-layout'>,</span>
<a name="line-280"></a>  <span class='hs-varid'>youtube</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SearchEngine</span>
<a name="line-281"></a><span class='hs-definition'>amazon</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>searchEngine</span> <span class='hs-str'>"amazon"</span>     <span class='hs-str'>"http://www.amazon.com/exec/obidos/external-search?index=all&amp;keyword="</span>
<a name="line-282"></a><a name="alpha"></a><span class='hs-definition'>alpha</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>searchEngine</span> <span class='hs-str'>"alpha"</span>      <span class='hs-str'>"http://www.wolframalpha.com/input/?i="</span>
<a name="line-283"></a><a name="codesearch"></a><span class='hs-definition'>codesearch</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>searchEngine</span> <span class='hs-str'>"codesearch"</span> <span class='hs-str'>"http://www.google.com/codesearch?q="</span>
<a name="line-284"></a><a name="deb"></a><span class='hs-definition'>deb</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>searchEngine</span> <span class='hs-str'>"deb"</span>        <span class='hs-str'>"http://packages.debian.org/"</span>
<a name="line-285"></a><a name="debbts"></a><span class='hs-definition'>debbts</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>searchEngine</span> <span class='hs-str'>"debbts"</span>     <span class='hs-str'>"http://bugs.debian.org/"</span>
<a name="line-286"></a><a name="debpts"></a><span class='hs-definition'>debpts</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>searchEngine</span> <span class='hs-str'>"debpts"</span>     <span class='hs-str'>"http://packages.qa.debian.org/"</span>
<a name="line-287"></a><a name="dictionary"></a><span class='hs-definition'>dictionary</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>searchEngine</span> <span class='hs-str'>"dict"</span>       <span class='hs-str'>"http://dictionary.reference.com/browse/"</span>
<a name="line-288"></a><a name="google"></a><span class='hs-definition'>google</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>searchEngine</span> <span class='hs-str'>"google"</span>     <span class='hs-str'>"http://www.google.com/search?num=100&amp;q="</span>
<a name="line-289"></a><a name="hackage"></a><span class='hs-definition'>hackage</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>searchEngine</span> <span class='hs-str'>"hackage"</span>    <span class='hs-str'>"http://hackage.haskell.org/package/"</span>
<a name="line-290"></a><a name="hoogle"></a><span class='hs-definition'>hoogle</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>searchEngine</span> <span class='hs-str'>"hoogle"</span>     <span class='hs-str'>"http://www.haskell.org/hoogle/?q="</span>
<a name="line-291"></a><a name="images"></a><span class='hs-definition'>images</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>searchEngine</span> <span class='hs-str'>"images"</span>     <span class='hs-str'>"http://images.google.fr/images?q="</span>
<a name="line-292"></a><a name="imdb"></a><span class='hs-definition'>imdb</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>searchEngine</span> <span class='hs-str'>"imdb"</span>       <span class='hs-str'>"http://www.imdb.com/Find?select=all&amp;for="</span>
<a name="line-293"></a><a name="isohunt"></a><span class='hs-definition'>isohunt</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>searchEngine</span> <span class='hs-str'>"isohunt"</span>    <span class='hs-str'>"http://isohunt.com/torrents/?ihq="</span>
<a name="line-294"></a><a name="lucky"></a><span class='hs-definition'>lucky</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>searchEngine</span> <span class='hs-str'>"lucky"</span>      <span class='hs-str'>"http://www.google.com/search?btnI&amp;q="</span>
<a name="line-295"></a><a name="maps"></a><span class='hs-definition'>maps</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>searchEngine</span> <span class='hs-str'>"maps"</span>       <span class='hs-str'>"http://maps.google.com/maps?q="</span>
<a name="line-296"></a><a name="mathworld"></a><span class='hs-definition'>mathworld</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>searchEngine</span> <span class='hs-str'>"mathworld"</span>  <span class='hs-str'>"http://mathworld.wolfram.com/search/?query="</span>
<a name="line-297"></a><a name="scholar"></a><span class='hs-definition'>scholar</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>searchEngine</span> <span class='hs-str'>"scholar"</span>    <span class='hs-str'>"http://scholar.google.com/scholar?q="</span>
<a name="line-298"></a><a name="thesaurus"></a><span class='hs-definition'>thesaurus</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>searchEngine</span> <span class='hs-str'>"thesaurus"</span>  <span class='hs-str'>"http://thesaurus.reference.com/search?q="</span>
<a name="line-299"></a><a name="wikipedia"></a><span class='hs-definition'>wikipedia</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>searchEngine</span> <span class='hs-str'>"wiki"</span>       <span class='hs-str'>"https://secure.wikimedia.org/wikipedia/en/wiki/Special:Search?go=Go&amp;search="</span>
<a name="line-300"></a><a name="wiktionary"></a><span class='hs-definition'>wiktionary</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>searchEngine</span> <span class='hs-str'>"wikt"</span>      <span class='hs-str'>"http://en.wiktionary.org/wiki/Special:Search?go=Go&amp;search="</span>
<a name="line-301"></a><a name="youtube"></a><span class='hs-definition'>youtube</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>searchEngine</span> <span class='hs-str'>"youtube"</span>    <span class='hs-str'>"http://www.youtube.com/results?search_type=search_videos&amp;search_query="</span>
<a name="line-302"></a><a name="wayback"></a><span class='hs-comment'>{- This doesn't seem to work, but nevertheless, it seems to be the official
<a name="line-303"></a>   method at &lt;<a href="http://web.archive.org/collections/web/advanced.html">http://web.archive.org/collections/web/advanced.html</a>&gt; to get the
<a name="line-304"></a>   latest backup. -}</span>
<a name="line-305"></a><span class='hs-definition'>wayback</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>searchEngine</span> <span class='hs-str'>"wayback"</span> <span class='hs-str'>"http://web.archive.org/"</span>
<a name="line-306"></a>
<a name="line-307"></a><a name="multi"></a><span class='hs-definition'>multi</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SearchEngine</span>
<a name="line-308"></a><span class='hs-definition'>multi</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>namedEngine</span> <span class='hs-str'>"multi"</span> <span class='hs-varop'>$</span> <span class='hs-varid'>foldr1</span> <span class='hs-layout'>(</span><span class='hs-varop'>!&gt;</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>amazon</span><span class='hs-layout'>,</span> <span class='hs-varid'>alpha</span><span class='hs-layout'>,</span> <span class='hs-varid'>codesearch</span><span class='hs-layout'>,</span> <span class='hs-varid'>deb</span><span class='hs-layout'>,</span> <span class='hs-varid'>debbts</span><span class='hs-layout'>,</span> <span class='hs-varid'>debpts</span><span class='hs-layout'>,</span> <span class='hs-varid'>dictionary</span><span class='hs-layout'>,</span> <span class='hs-varid'>google</span><span class='hs-layout'>,</span> <span class='hs-varid'>hackage</span><span class='hs-layout'>,</span> <span class='hs-varid'>hoogle</span><span class='hs-layout'>,</span> <span class='hs-varid'>images</span><span class='hs-layout'>,</span> <span class='hs-varid'>imdb</span><span class='hs-layout'>,</span> <span class='hs-varid'>isohunt</span><span class='hs-layout'>,</span> <span class='hs-varid'>lucky</span><span class='hs-layout'>,</span> <span class='hs-varid'>maps</span><span class='hs-layout'>,</span> <span class='hs-varid'>mathworld</span><span class='hs-layout'>,</span> <span class='hs-varid'>scholar</span><span class='hs-layout'>,</span> <span class='hs-varid'>thesaurus</span><span class='hs-layout'>,</span> <span class='hs-varid'>wayback</span><span class='hs-layout'>,</span> <span class='hs-varid'>wikipedia</span><span class='hs-layout'>,</span> <span class='hs-varid'>wiktionary</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>prefixAware</span> <span class='hs-varid'>google</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-309"></a>
<a name="line-310"></a><a name="intelligent"></a><span class='hs-comment'>{- | This function wraps up a search engine and creates a new one, which works
<a name="line-311"></a>   like the argument, but goes directly to a URL if one is given rather than
<a name="line-312"></a>   searching.
<a name="line-313"></a>
<a name="line-314"></a>&gt; myIntelligentGoogleEngine = intelligent google
<a name="line-315"></a>
<a name="line-316"></a>   Now if you search for http:\/\/xmonad.org it will directly open in your browser-}</span>
<a name="line-317"></a><span class='hs-definition'>intelligent</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SearchEngine</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SearchEngine</span>
<a name="line-318"></a><span class='hs-definition'>intelligent</span> <span class='hs-layout'>(</span><span class='hs-conid'>SearchEngine</span> <span class='hs-varid'>name</span> <span class='hs-varid'>site</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>searchEngineF</span> <span class='hs-varid'>name</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>if</span> <span class='hs-layout'>(</span><span class='hs-varid'>fst</span> <span class='hs-varop'>$</span> <span class='hs-varid'>break</span> <span class='hs-layout'>(</span><span class='hs-varop'>==</span><span class='hs-chr'>':'</span><span class='hs-layout'>)</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-varop'>`elem`</span> <span class='hs-keyglyph'>[</span><span class='hs-str'>"http"</span><span class='hs-layout'>,</span> <span class='hs-str'>"https"</span><span class='hs-layout'>,</span> <span class='hs-str'>"ftp"</span><span class='hs-keyglyph'>]</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>s</span> <span class='hs-keyword'>else</span> <span class='hs-layout'>(</span><span class='hs-varid'>site</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-319"></a>
<a name="line-320"></a><a name="removeColonPrefix"></a><span class='hs-comment'>-- | &gt; removeColonPrefix "foo://bar" ~&gt; "//bar"</span>
<a name="line-321"></a><span class='hs-comment'>-- &gt; removeColonPrefix "foo//bar" ~&gt; "foo//bar"</span>
<a name="line-322"></a><span class='hs-definition'>removeColonPrefix</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-323"></a><span class='hs-definition'>removeColonPrefix</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-chr'>':'</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>s</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>drop</span> <span class='hs-num'>1</span> <span class='hs-varop'>$</span> <span class='hs-varid'>dropWhile</span> <span class='hs-layout'>(</span><span class='hs-chr'>':'</span> <span class='hs-varop'>/=</span><span class='hs-layout'>)</span> <span class='hs-varid'>s</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>s</span>
<a name="line-324"></a>
<a name="line-325"></a><a name="!%3e"></a><span class='hs-comment'>{- | Connects a few search engines into one. If the search engines\' names are
<a name="line-326"></a>   \"s1\", \"s2\" and \"s3\", then the resulting engine will use s1 if the query
<a name="line-327"></a>   is @s1:word@, s2 if you type @s2:word@ and s3 in all other cases.
<a name="line-328"></a>
<a name="line-329"></a>   Example:
<a name="line-330"></a>
<a name="line-331"></a>&gt; multiEngine = intelligent (wikipedia !&gt; mathworld !&gt; (prefixAware google))
<a name="line-332"></a>
<a name="line-333"></a>  Now if you type \"wiki:Haskell\" it will search for \"Haskell\" in Wikipedia,
<a name="line-334"></a>  \"mathworld:integral\" will search mathworld, and everything else will fall back to
<a name="line-335"></a>  google. The use of intelligent will make sure that URLs are opened directly. -}</span>
<a name="line-336"></a><span class='hs-layout'>(</span><span class='hs-varop'>!&gt;</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SearchEngine</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SearchEngine</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SearchEngine</span>
<a name="line-337"></a><span class='hs-layout'>(</span><span class='hs-conid'>SearchEngine</span> <span class='hs-varid'>name1</span> <span class='hs-varid'>site1</span><span class='hs-layout'>)</span> <span class='hs-varop'>!&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>SearchEngine</span> <span class='hs-varid'>name2</span> <span class='hs-varid'>site2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>searchEngineF</span> <span class='hs-layout'>(</span><span class='hs-varid'>name1</span> <span class='hs-varop'>++</span> <span class='hs-str'>"/"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>name2</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>s</span> <span class='hs-varop'>`isPrefixOf`</span> <span class='hs-layout'>(</span><span class='hs-varid'>name1</span><span class='hs-varop'>++</span><span class='hs-str'>":"</span><span class='hs-layout'>)</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>site1</span> <span class='hs-layout'>(</span><span class='hs-varid'>removeColonPrefix</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>site2</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-338"></a>
<a name="line-339"></a><a name="prefixAware"></a><span class='hs-comment'>{- | Makes a search engine prefix-aware. Especially useful together with '!&gt;'.
<a name="line-340"></a>   It will automatically remove the prefix from a query so that you don\'t end
<a name="line-341"></a>     up searching for google:xmonad if google is your fallback engine and you
<a name="line-342"></a>     explicitly add the prefix. -}</span>
<a name="line-343"></a><span class='hs-definition'>prefixAware</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SearchEngine</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SearchEngine</span>
<a name="line-344"></a><span class='hs-definition'>prefixAware</span> <span class='hs-layout'>(</span><span class='hs-conid'>SearchEngine</span> <span class='hs-varid'>name</span> <span class='hs-varid'>site</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SearchEngine</span> <span class='hs-varid'>name</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>s</span> <span class='hs-varop'>`isPrefixOf`</span> <span class='hs-layout'>(</span><span class='hs-varid'>name</span><span class='hs-varop'>++</span><span class='hs-str'>":"</span><span class='hs-layout'>)</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>site</span> <span class='hs-varop'>$</span> <span class='hs-varid'>removeColonPrefix</span> <span class='hs-varid'>s</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>site</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-345"></a>
<a name="line-346"></a><a name="namedEngine"></a><span class='hs-comment'>{- | Changes search engine's name -}</span>
<a name="line-347"></a><span class='hs-definition'>namedEngine</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SearchEngine</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SearchEngine</span>
<a name="line-348"></a><span class='hs-definition'>namedEngine</span> <span class='hs-varid'>name</span> <span class='hs-layout'>(</span><span class='hs-conid'>SearchEngine</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>site</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>searchEngineF</span> <span class='hs-varid'>name</span> <span class='hs-varid'>site</span>
<a name="line-349"></a>
<a name="line-350"></a><a name="promptSearchBrowser"></a><span class='hs-comment'>{- | Like 'search', but for use with the output from a Prompt; it grabs the
<a name="line-351"></a>   Prompt's result, passes it to a given searchEngine and opens it in a given
<a name="line-352"></a>   browser. -}</span>
<a name="line-353"></a><span class='hs-definition'>promptSearchBrowser</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>XPConfig</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Browser</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SearchEngine</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-354"></a><span class='hs-definition'>promptSearchBrowser</span> <span class='hs-varid'>config</span> <span class='hs-varid'>browser</span> <span class='hs-layout'>(</span><span class='hs-conid'>SearchEngine</span> <span class='hs-varid'>name</span> <span class='hs-varid'>site</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-355"></a>    <span class='hs-varid'>mkXPrompt</span> <span class='hs-layout'>(</span><span class='hs-conid'>Search</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span> <span class='hs-varid'>config</span> <span class='hs-layout'>(</span><span class='hs-varid'>historyCompletionP</span> <span class='hs-layout'>(</span><span class='hs-str'>"Search ["</span> <span class='hs-varop'>`isPrefixOf`</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>search</span> <span class='hs-varid'>browser</span> <span class='hs-varid'>site</span>
<a name="line-356"></a>
<a name="line-357"></a><a name="promptSearch"></a><span class='hs-comment'>{- | Like 'search', but in this case, the string is not specified but grabbed
<a name="line-358"></a> from the user's response to a prompt. Example:
<a name="line-359"></a>
<a name="line-360"></a>&gt; , ((modm, xK_g), promptSearch greenXPConfig google)
<a name="line-361"></a>
<a name="line-362"></a>   This specializes "promptSearchBrowser" by supplying the browser argument as
<a name="line-363"></a>   supplied by 'getBrowser' from "XMonad.Prompt.Shell". -}</span>
<a name="line-364"></a><span class='hs-definition'>promptSearch</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>XPConfig</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SearchEngine</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-365"></a><span class='hs-definition'>promptSearch</span> <span class='hs-varid'>config</span> <span class='hs-varid'>engine</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>liftIO</span> <span class='hs-varid'>getBrowser</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>browser</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>promptSearchBrowser</span> <span class='hs-varid'>config</span> <span class='hs-varid'>browser</span> <span class='hs-varid'>engine</span>
<a name="line-366"></a>
<a name="line-367"></a><a name="selectSearchBrowser"></a><span class='hs-comment'>-- | Like 'search', but for use with the X selection; it grabs the selection,</span>
<a name="line-368"></a><span class='hs-comment'>--   passes it to a given searchEngine and opens it in a given browser.</span>
<a name="line-369"></a><span class='hs-definition'>selectSearchBrowser</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Browser</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SearchEngine</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-370"></a><span class='hs-definition'>selectSearchBrowser</span> <span class='hs-varid'>browser</span> <span class='hs-layout'>(</span><span class='hs-conid'>SearchEngine</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>site</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>search</span> <span class='hs-varid'>browser</span> <span class='hs-varid'>site</span> <span class='hs-varop'>=&lt;&lt;</span> <span class='hs-varid'>getSelection</span>
<a name="line-371"></a>
<a name="line-372"></a><a name="selectSearch"></a><span class='hs-comment'>{- | Like 'search', but for use with the X selection; it grabs the selection,
<a name="line-373"></a>   passes it to a given searchEngine and opens it in the default browser . Example:
<a name="line-374"></a>
<a name="line-375"></a>&gt; , ((modm .|. shiftMask, xK_g), selectSearch google)
<a name="line-376"></a>
<a name="line-377"></a>   This specializes "selectSearchBrowser" by supplying the browser argument as
<a name="line-378"></a>   supplied by 'getBrowser' from "XMonad.Prompt.Shell". -}</span>
<a name="line-379"></a><span class='hs-definition'>selectSearch</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SearchEngine</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-380"></a><span class='hs-definition'>selectSearch</span> <span class='hs-varid'>engine</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>liftIO</span> <span class='hs-varid'>getBrowser</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>browser</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>selectSearchBrowser</span> <span class='hs-varid'>browser</span> <span class='hs-varid'>engine</span>
</pre></body>
</html>