mirror of
https://github.com/commercialhaskell/stackage-server.git
synced 2026-02-07 16:47:27 +01:00
Update search results to link to stackage.org
This commit is contained in:
parent
fffdf9717e
commit
cb93e54729
@ -20,57 +20,74 @@ shouldRedirect = False
|
|||||||
|
|
||||||
getHaddockR :: SnapName -> [Text] -> Handler TypedContent
|
getHaddockR :: SnapName -> [Text] -> Handler TypedContent
|
||||||
getHaddockR slug rest
|
getHaddockR slug rest
|
||||||
| shouldRedirect = redirect $ makeURL slug rest
|
| shouldRedirect = do
|
||||||
| final:_ <- reverse rest, ".html" `isSuffixOf` final = track "Handler.Haddock.getHaddockR" $ do
|
result <- redirectWithVersion slug rest
|
||||||
|
case result of
|
||||||
|
Just route -> redirect route
|
||||||
|
Nothing -> redirect $ makeURL slug rest
|
||||||
|
| final:_ <- reverse rest, ".html" `isSuffixOf` final = do
|
||||||
render <- getUrlRender
|
render <- getUrlRender
|
||||||
|
result <- redirectWithVersion slug rest
|
||||||
let stylesheet = render' $ StaticR haddock_style_css
|
case result of
|
||||||
script = render' $ StaticR haddock_script_js
|
Just route -> redirect route
|
||||||
bootstrap = render' $ StaticR haddock_bootstrap_css
|
Nothing -> do
|
||||||
jquery = render' $ StaticR haddock_jquery_js
|
let stylesheet = render' $ StaticR haddock_style_css
|
||||||
render' = return . ContentText . render
|
script = render' $ StaticR haddock_script_js
|
||||||
|
bootstrap = render' $ StaticR haddock_bootstrap_css
|
||||||
addExtra t@(EventEndElement "head") =
|
jquery = render' $ StaticR haddock_jquery_js
|
||||||
[ EventBeginElement "link"
|
render' = return . ContentText . render
|
||||||
[ ("rel", [ContentText "stylesheet"])
|
addExtra t@(EventEndElement "head") =
|
||||||
, ("href", bootstrap)
|
[ EventBeginElement "link"
|
||||||
]
|
[ ("rel", [ContentText "stylesheet"])
|
||||||
, EventEndElement "link"
|
, ("href", bootstrap)
|
||||||
, EventBeginElement "link"
|
]
|
||||||
[ ("rel", [ContentText "stylesheet"])
|
, EventEndElement "link"
|
||||||
, ("href", [ContentText "https://fonts.googleapis.com/css?family=Open+Sans"])
|
, EventBeginElement "link"
|
||||||
]
|
[ ("rel", [ContentText "stylesheet"])
|
||||||
, EventEndElement "link"
|
, ("href", [ContentText "https://fonts.googleapis.com/css?family=Open+Sans"])
|
||||||
, EventBeginElement "link"
|
]
|
||||||
[ ("rel", [ContentText "stylesheet"])
|
, EventEndElement "link"
|
||||||
, ("href", stylesheet)
|
, EventBeginElement "link"
|
||||||
]
|
[ ("rel", [ContentText "stylesheet"])
|
||||||
, EventEndElement "link"
|
, ("href", stylesheet)
|
||||||
, EventBeginElement "script"
|
]
|
||||||
[ ("src", jquery)
|
, EventEndElement "link"
|
||||||
]
|
, EventBeginElement "script"
|
||||||
, EventEndElement "script"
|
[ ("src", jquery)
|
||||||
, EventBeginElement "script"
|
]
|
||||||
[ ("src", script)
|
, EventEndElement "script"
|
||||||
]
|
, EventBeginElement "script"
|
||||||
, EventEndElement "script"
|
[ ("src", script)
|
||||||
, t
|
]
|
||||||
]
|
, EventEndElement "script"
|
||||||
addExtra t@(EventBeginElement "body" _) = [t] ++ nav
|
, t
|
||||||
addExtra t = [t]
|
]
|
||||||
|
addExtra t@(EventBeginElement "body" _) = [t] ++ nav
|
||||||
req <- parseUrl $ unpack $ makeURL slug rest
|
addExtra t = [t]
|
||||||
(_, res) <- acquireResponse req >>= allocateAcquire
|
req <- parseUrl $ unpack $ makeURL slug rest
|
||||||
|
(_, res) <- acquireResponse req >>= allocateAcquire
|
||||||
doc <- responseBody res
|
doc <- responseBody res
|
||||||
$$ eventConduit
|
$$ eventConduit
|
||||||
=$ concatMapC addExtra
|
=$ concatMapC addExtra
|
||||||
=$ mapC (Nothing, )
|
=$ mapC (Nothing, )
|
||||||
=$ fromEvents
|
=$ fromEvents
|
||||||
|
sendResponse $ toHtml doc
|
||||||
sendResponse $ toHtml doc
|
|
||||||
| otherwise = redirect $ makeURL slug rest
|
| otherwise = redirect $ makeURL slug rest
|
||||||
|
|
||||||
|
redirectWithVersion
|
||||||
|
:: (GetStackageDatabase m,MonadHandler m,RedirectUrl (HandlerSite m) (Route App))
|
||||||
|
=> SnapName -> [Text] -> m (Maybe (Route App))
|
||||||
|
redirectWithVersion slug rest =
|
||||||
|
case rest of
|
||||||
|
[pkg,file] -> do
|
||||||
|
Entity sid _ <- lookupSnapshot slug >>= maybe notFound return
|
||||||
|
mversion <- getPackageVersionBySnapshot sid pkg
|
||||||
|
case mversion of
|
||||||
|
Nothing -> error "That package is not part of this snapshot."
|
||||||
|
Just version -> do
|
||||||
|
return (Just (HaddockR slug [pkg <> "-" <> version, file]))
|
||||||
|
_ -> return Nothing
|
||||||
|
|
||||||
nav :: [Event]
|
nav :: [Event]
|
||||||
nav =
|
nav =
|
||||||
el "nav"
|
el "nav"
|
||||||
@ -100,6 +117,6 @@ nav =
|
|||||||
close = [EventEndElement name]
|
close = [EventEndElement name]
|
||||||
|
|
||||||
getHaddockBackupR :: [Text] -> Handler ()
|
getHaddockBackupR :: [Text] -> Handler ()
|
||||||
getHaddockBackupR rest = track "Handler.Haddock.getHaddockBackupR" $ redirect $ concat
|
getHaddockBackupR rest = redirect $ concat
|
||||||
$ "https://s3.amazonaws.com/haddock.stackage.org"
|
$ "https://s3.amazonaws.com/haddock.stackage.org"
|
||||||
: map (cons '/') rest
|
: map (cons '/') rest
|
||||||
|
|||||||
@ -39,6 +39,7 @@ getHoogleR name = track "Handler.Hoogle.getHoogleR" $ do
|
|||||||
-- Avoid concurrent Hoogle queries, see
|
-- Avoid concurrent Hoogle queries, see
|
||||||
-- https://github.com/fpco/stackage-server/issues/172
|
-- https://github.com/fpco/stackage-server/issues/172
|
||||||
lock <- appHoogleLock <$> getYesod
|
lock <- appHoogleLock <$> getYesod
|
||||||
|
urlRender <- getUrlRender
|
||||||
HoogleQueryOutput results mtotalCount <-
|
HoogleQueryOutput results mtotalCount <-
|
||||||
case mquery of
|
case mquery of
|
||||||
Just query -> do
|
Just query -> do
|
||||||
@ -53,7 +54,7 @@ getHoogleR name = track "Handler.Hoogle.getHoogleR" $ do
|
|||||||
$ const
|
$ const
|
||||||
$ Hoogle.withDatabase dbPath
|
$ Hoogle.withDatabase dbPath
|
||||||
-- NB! I got a segfault when I didn't force with $!
|
-- NB! I got a segfault when I didn't force with $!
|
||||||
$ \db -> return $! runHoogleQuery db input
|
$ \db -> return $! runHoogleQuery urlRender name db input
|
||||||
Nothing -> return $ HoogleQueryOutput [] Nothing
|
Nothing -> return $ HoogleQueryOutput [] Nothing
|
||||||
let queryText = fromMaybe "" mquery
|
let queryText = fromMaybe "" mquery
|
||||||
pageLink p = (SnapshotR name HoogleR
|
pageLink p = (SnapshotR name HoogleR
|
||||||
@ -126,8 +127,12 @@ instance NFData HoogleResult where rnf = genericRnf
|
|||||||
instance NFData PackageLink where rnf = genericRnf
|
instance NFData PackageLink where rnf = genericRnf
|
||||||
instance NFData ModuleLink where rnf = genericRnf
|
instance NFData ModuleLink where rnf = genericRnf
|
||||||
|
|
||||||
runHoogleQuery :: Hoogle.Database -> HoogleQueryInput -> HoogleQueryOutput
|
runHoogleQuery :: (Route App -> Text)
|
||||||
runHoogleQuery hoogledb HoogleQueryInput {..} =
|
-> SnapName
|
||||||
|
-> Hoogle.Database
|
||||||
|
-> HoogleQueryInput
|
||||||
|
-> HoogleQueryOutput
|
||||||
|
runHoogleQuery renderUrl snapshot hoogledb HoogleQueryInput {..} =
|
||||||
HoogleQueryOutput targets mcount
|
HoogleQueryOutput targets mcount
|
||||||
where
|
where
|
||||||
allTargets = Hoogle.searchDatabase hoogledb query
|
allTargets = Hoogle.searchDatabase hoogledb query
|
||||||
@ -144,15 +149,30 @@ runHoogleQuery hoogledb HoogleQueryInput {..} =
|
|||||||
| otherwise = limitedLength (x + 1) rest
|
| otherwise = limitedLength (x + 1) rest
|
||||||
|
|
||||||
fixResult Hoogle.Target {..} = HoogleResult
|
fixResult Hoogle.Target {..} = HoogleResult
|
||||||
{ hrURL = targetURL
|
{ hrURL = case sources of
|
||||||
, hrSources = toList $ do
|
[(_,[ModuleLink _ m])] -> m ++ haddockAnchorFromUrl targetURL
|
||||||
(pname, purl) <- targetPackage
|
_ -> targetURL
|
||||||
(mname, murl) <- targetModule
|
, hrSources = sources
|
||||||
let p = PackageLink pname purl
|
|
||||||
m = ModuleLink mname murl
|
|
||||||
Just (p, [m])
|
|
||||||
, hrTitle = -- FIXME find out why these replaces are necessary
|
, hrTitle = -- FIXME find out why these replaces are necessary
|
||||||
unpack $ T.replace "<0>" "" $ T.replace "</0>" "" $ pack
|
unpack $ T.replace "<0>" "" $ T.replace "</0>" "" $ pack
|
||||||
targetItem
|
targetItem
|
||||||
, hrBody = targetDocs
|
, hrBody = targetDocs
|
||||||
}
|
}
|
||||||
|
where sources = toList $ do
|
||||||
|
(pname, _) <- targetPackage
|
||||||
|
(mname, _) <- targetModule
|
||||||
|
let p = PackageLink pname (makePackageLink pname)
|
||||||
|
m = ModuleLink
|
||||||
|
mname
|
||||||
|
(T.unpack
|
||||||
|
(renderUrl
|
||||||
|
(haddockUrl
|
||||||
|
snapshot
|
||||||
|
(T.pack pname)
|
||||||
|
(T.pack mname))))
|
||||||
|
Just (p, [m])
|
||||||
|
haddockAnchorFromUrl =
|
||||||
|
('#':) . reverse . takeWhile (/='#') . reverse
|
||||||
|
|
||||||
|
makePackageLink :: String -> String
|
||||||
|
makePackageLink pkg = "/package/" ++ pkg
|
||||||
|
|||||||
@ -15,6 +15,7 @@ module Stackage.Database
|
|||||||
, PackageListingInfo (..)
|
, PackageListingInfo (..)
|
||||||
, getAllPackages
|
, getAllPackages
|
||||||
, getPackages
|
, getPackages
|
||||||
|
, getPackageVersionBySnapshot
|
||||||
, createStackageDatabase
|
, createStackageDatabase
|
||||||
, openStackageDatabase
|
, openStackageDatabase
|
||||||
, ModuleListingInfo (..)
|
, ModuleListingInfo (..)
|
||||||
@ -526,6 +527,22 @@ getPackages sid = liftM (map toPLI) $ run $ do
|
|||||||
, pliIsCore = isCore
|
, pliIsCore = isCore
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getPackageVersionBySnapshot
|
||||||
|
:: GetStackageDatabase m
|
||||||
|
=> SnapshotId -> Text -> m (Maybe Text)
|
||||||
|
getPackageVersionBySnapshot sid name = liftM (listToMaybe . map toPLI) $ run $ do
|
||||||
|
E.select $ E.from $ \(p,sp) -> do
|
||||||
|
E.where_ $
|
||||||
|
(p E.^. PackageId E.==. sp E.^. SnapshotPackagePackage) E.&&.
|
||||||
|
(sp E.^. SnapshotPackageSnapshot E.==. E.val sid) E.&&.
|
||||||
|
(E.lower_ (p E.^. PackageName) E.==. E.lower_ (E.val name))
|
||||||
|
E.orderBy [E.asc $ E.lower_ $ p E.^. PackageName]
|
||||||
|
return
|
||||||
|
( sp E.^. SnapshotPackageVersion
|
||||||
|
)
|
||||||
|
where
|
||||||
|
toPLI (E.Value version) = version
|
||||||
|
|
||||||
data ModuleListingInfo = ModuleListingInfo
|
data ModuleListingInfo = ModuleListingInfo
|
||||||
{ mliName :: !Text
|
{ mliName :: !Text
|
||||||
, mliPackageVersion :: !Text
|
, mliPackageVersion :: !Text
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user