hoogle 4.2.7 → 4.2.8
raw patch · 8 files changed
+78/−25 lines, 8 filesdep ~case-insensitivedep ~cmdargsPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: case-insensitive, cmdargs
API changes (from Hackage documentation)
- Paths_hoogle: getBinDir, getLibexecDir, getDataDir, getLibDir :: IO FilePath
- Paths_hoogle: getDataFileName :: FilePath -> IO FilePath
- Paths_hoogle: version :: Version
Files
- datadir/resources/hoogle.js +11/−2
- datadir/resources/search.xml +21/−0
- hoogle.cabal +5/−3
- src/CmdLine/All.hs +4/−2
- src/General/Base.hs +14/−0
- src/General/System.hs +1/−1
- src/General/Web.hs +7/−1
- src/Web/Server.hs +15/−16
datadir/resources/hoogle.js view
@@ -199,16 +199,25 @@ ///////////////////////////////////////////////////////////////////// // SEARCH PLUGIN +var prefixUrl = document.location.protocol + "//" + document.location.hostname + document.location.pathname;+ $(function(){ if (embed) return;+ if (prefixUrl != "http://haskell.org/hoogle/")+ {+ $("link[rel=search]").attr("href", function(){+ return this.href + "?domain=" + escape(prefixUrl);+ });+ } if (window.external && ("AddSearchProvider" in window.external)) $("#plugin").css("display",""); }); function searchPlugin() {- var l = document.location;- var url = l.protocol + "//" + l.hostname + l.pathname + $("link[rel=search]").attr("href");+ var url = $("link[rel=search]").attr("href");+ if (url.substring(0, prefixUrl.length) != prefixUrl)+ url = prefixUrl + url; window.external.AddSearchProvider(url); }
+ datadir/resources/search.xml view
@@ -0,0 +1,21 @@+<?xml version="1.0" encoding="UTF-8"?>+<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">+ <ShortName>Hoogle</ShortName>+ <LongName>Hoogle - Haskell API Search</LongName>+ <Description>+ Hoogle is a Haskell API search engine, which allows you to+ search many standard Haskell libraries by either function name,+ or by approximate type signature.+ </Description>+ <Tags>haskell</Tags>+ <Url type="text/html" template="http://haskell.org/hoogle/?hoogle={searchTerms}"/>+ <Url type="application/x-suggestions+json" template="http://haskell.org/hoogle/?hoogle={searchTerms}&mode=suggest"/>++ <Image height="16" width="16" type="image/png">http://haskell.org/hoogle/datadir/resources/favicon.png</Image>+ <Image height="64" width="64" type="image/png">http://haskell.org/hoogle/datadir/resources/favicon64.png</Image>+ <Developer>Neil Mitchell</Developer>+ <AdultContent>false</AdultContent>+ <Language>en-us</Language>+ <OutputEncoding>UTF-8</OutputEncoding>+ <InputEncoding>UTF-8</InputEncoding>+</OpenSearchDescription>
hoogle.cabal view
@@ -1,7 +1,7 @@ cabal-version: >= 1.6 build-type: Simple name: hoogle-version: 4.2.7+version: 4.2.8 license: GPL license-file: docs/LICENSE category: Development@@ -28,6 +28,7 @@ -- Cabal doesn't find files with . in them, Cabal bug #794 resources/jquery-1.4.2.js resources/jquery.cookie.js+ resources/search.xml source-repository head type: darcs@@ -100,6 +101,7 @@ Hoogle.Store.ReadBuffer Hoogle.Store.Type Hoogle.Store.WriteBuffer+ Paths_hoogle executable hoogle main-is: Main.hs@@ -107,12 +109,12 @@ build-depends: time, old-time, old-locale,- cmdargs >= 0.7 && < 0.9,+ cmdargs >= 0.7 && < 0.10, tagsoup >= 0.11 && < 0.13, enumerator == 0.4.*, blaze-builder >= 0.2 && < 0.4, http-types == 0.6.*,- case-insensitive >= 0.2 && < 0.4,+ case-insensitive >= 0.2 && < 0.5, wai == 0.4.*, warp == 0.4.*, Cabal >= 1.8 && < 1.13
src/CmdLine/All.hs view
@@ -70,9 +70,11 @@ guessLocal = do ghc <- findExecutable "ghc"+ home <- getHomeDirectory lib <- getLibDir- let xs = [takeDirectory (takeDirectory lib) </> "doc"] ++- [takeDirectory (takeDirectory ghc) </> "doc/html/libraries" | Just ghc <- [ghc]]+ let xs = [takeDirectory (takeDirectory lib) </> "doc" {- Windows, installed with Cabal -} ] +++ [takeDirectory (takeDirectory ghc) </> "doc/html/libraries" | Just ghc <- [ghc] {- Windows, installed by GHC -} ] +++ [home </> ".cabal/share/doc" {- Linux -} ] filterM doesDirectoryExist xs
src/General/Base.hs view
@@ -32,6 +32,20 @@ bsUnpack = BS.unpack +bsReplace :: BString -> BString -> BString -> BString+bsReplace find rep = BS.concat . f+ where+ nfind = BS.length find++ f x | BS.null b = [a]+ | otherwise = a : rep : f (BS.drop nfind b) + where (a,b) = BS.breakSubstring find x++lbsReplace :: LBString -> LBString -> LBString -> LBString+lbsReplace find rep x = LBS.fromChunks [bsReplace (f find) (f rep) (f x)]+ where f = BS.concat . LBS.toChunks++ -- | A URL, or internet address. These addresses will usually start with either -- @http:\/\/@ or @file:\/\/@. type URL = String
src/General/System.hs view
@@ -42,8 +42,8 @@ withModeGlobalRead :: IO () -> IO () withModeGlobalRead act = E.bracket (setFileCreationMask 0o022)- (const act) (\x -> setFileCreationMask x >> return ())+ (const act) -- FIXME: This could use a lot more bracket calls!
src/General/Web.hs view
@@ -6,7 +6,7 @@ module General.Web( responseOK, responseNotFound,- responseFlatten, responseEvaluate,+ responseFlatten, responseEvaluate, responseRewrite, URL, filePathToURL, combineURL, escapeURL, (++%), unescapeURL, escapeHTML, (++&), htmlTag, Args, cgiArgs, cgiResponse, parseHttpQueryArgs@@ -40,6 +40,12 @@ responseEvaluate :: Response -> IO () responseEvaluate (ResponseBuilder _ _ x) = LBS.length (toLazyByteString x) `seq` return () responseEvaluate _ = return ()+++responseRewrite :: (LBString -> LBString) -> Response -> IO Response+responseRewrite f r = do+ (a,b,c) <- responseFlatten r+ return $ responseLBS a b $ f c ---------------------------------------------------------------------
src/Web/Server.hs view
@@ -18,8 +18,6 @@ import Network.Wai import Network.Wai.Handler.Warp-import qualified Data.ByteString.Lazy.Char8 as LBS-import qualified Data.ByteString.Char8 as BS server :: CmdLine -> IO ()@@ -82,19 +80,30 @@ -- FIXME: Avoid all the conversions to/from LBS talk :: IO ResponseArgs -> CmdLine -> Request -> IO Response-talk resp Server{..} Request{rawPathInfo=path_, rawQueryString=query_}+talk resp Server{..} r@Request{rawPathInfo=path_, rawQueryString=query_} | path `elem` ["/","/hoogle"] = do let args = parseHttpQueryArgs $ drop 1 query cmd <- cmdLineWeb args resp <- resp r <- response resp cmd{databases=databases} if local_ then rewriteFileLinks r else return r+ | path == "/res/search.xml" = serveSearch resources (fmap bsUnpack $ join $ lookup (fromString "domain") $ queryString r) | takeDirectory path == "/res" = serveFile True $ resources </> takeFileName path- | local_ && "/file/" `isPrefixOf` path = serveFile False $ drop 6 path+ | local_, Just path <- stripPrefix "/file/" path =+ let hasDrive = "/" `isPrefixOf` path && ":" `isPrefixOf` (drop 2 path)+ in serveFile False $ if hasDrive then drop 1 path else path | otherwise = return $ responseNotFound $ show path where (path,query) = (bsUnpack path_, bsUnpack query_) +serveSearch :: FilePath -> Maybe String -> IO Response+serveSearch resources domain = do+ r <- serveFile True $ resources </> "search.xml"+ case domain of+ Nothing -> return r+ Just x -> responseRewrite (lbsReplace (fromString "http://haskell.org/hoogle/") (fromString x)) r++ serveFile :: Bool -> FilePath -> IO Response serveFile cache file = do b <- doesFileExist file@@ -106,18 +115,7 @@ rewriteFileLinks :: Response -> IO Response-rewriteFileLinks r = do- (a,b,c) <- responseFlatten r- let res = LBS.fromChunks $ f $ BS.concat $ LBS.toChunks c- return $ responseLBS a b res- where- f x | BS.null b = [a]- | otherwise = a : rep : f (BS.drop nfind b) - where (a,b) = BS.breakSubstring find x-- find = fromString "href='file://"- rep = fromString "href='/file/"- nfind = BS.length find+rewriteFileLinks = responseRewrite $ lbsReplace (fromString "href='file://") (fromString "href='/file/") contentExt ".png" = "image/png"@@ -125,4 +123,5 @@ contentExt ".js" = "text/javascript" contentExt ".html" = "text/html" contentExt ".htm" = "text/html"+contentExt ".xml" = "application/opensearchdescription+xml" contentExt _ = "text/plain"