Skip to content
This repository was archived by the owner on Aug 3, 2024. It is now read-only.

Commit ab53ccf

Browse files
authored
Fix hyperlinks to external items and modules (#1482)
Fixes #1481. There were two bugs in this: * We were assuming that we were always getting a relative path to the module in question, while Nix gives us file:// URLs sometimes. This change checks for those and stops prepending `..` to them. * We were not linking to the file under the module. This seems to have been a regression introduced by #977. That is, the URLs were going to something like file:///nix/store/3bwbsy0llxxn1pixx3ll02alln56ivxy-ghc-9.0.2-doc/share/doc/ghc/html/libraries/base-4.15.1.0/src which does not have the appropriate HTML file or fragment for the item in question at the end. There is a remaining instance of the latter bug, but not in the hyperlinker: the source links to items reexported from other modules are also not including the correct file name. e.g. the reexport of Entity in esqueleto, from persistent. NOTE: This needs to get tested with relative-path located modules. It seems correct for Nix based on my testing. Testing strategy: ``` nix-shell '<nixpkgs>' --pure -A haskell.packages.ghc922.aeson mkdir /tmp/aesonbuild && cd /tmp/aesonbuild export out=/tmp/aesonbuild/out genericBuild ln -sf $HOME/co/haddock/haddock-api/resources . ./Setup haddock --with-haddock=$HOME/path/to/haddock/exec --hyperlink-source ```
1 parent 09b8abe commit ab53ccf

File tree

1 file changed

+13
-4
lines changed
  • haddock-api/src/Haddock/Backends/Hyperlinker

1 file changed

+13
-4
lines changed

haddock-api/src/Haddock/Backends/Hyperlinker/Renderer.hs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import System.FilePath.Posix ((</>))
2323

2424
import qualified Data.Map as Map
2525
import qualified Data.Set as Set
26+
import qualified Data.List as List
2627

2728
import Text.XHtml (Html, HtmlAttr, (!))
2829
import qualified Text.XHtml as Html
@@ -248,14 +249,20 @@ hyperlink (srcs, srcs') ident = case ident of
248249
Left name -> externalModHyperlink name
249250

250251
where
252+
-- In a Nix environment, we have file:// URLs with absolute paths
253+
makeHyperlinkUrl url | List.isPrefixOf "file://" url = url
254+
makeHyperlinkUrl url = ".." </> url
255+
251256
internalHyperlink name content =
252257
Html.anchor content ! [ Html.href $ "#" ++ internalAnchorIdent name ]
253258

254259
externalNameHyperlink name content = case Map.lookup mdl srcs of
255260
Just SrcLocal -> Html.anchor content !
256261
[ Html.href $ hypSrcModuleNameUrl mdl name ]
257-
Just (SrcExternal path) -> Html.anchor content !
258-
[ Html.href $ spliceURL Nothing (Just mdl) (Just name) Nothing (".." </> path) ]
262+
Just (SrcExternal path) ->
263+
let hyperlinkUrl = makeHyperlinkUrl path </> hypSrcModuleNameUrl mdl name
264+
in Html.anchor content !
265+
[ Html.href $ spliceURL Nothing (Just mdl) (Just name) Nothing hyperlinkUrl ]
259266
Nothing -> content
260267
where
261268
mdl = nameModule name
@@ -264,8 +271,10 @@ hyperlink (srcs, srcs') ident = case ident of
264271
case Map.lookup moduleName srcs' of
265272
Just SrcLocal -> Html.anchor content !
266273
[ Html.href $ hypSrcModuleUrl' moduleName ]
267-
Just (SrcExternal path) -> Html.anchor content !
268-
[ Html.href $ spliceURL' Nothing (Just moduleName) Nothing Nothing (".." </> path) ]
274+
Just (SrcExternal path) ->
275+
let hyperlinkUrl = makeHyperlinkUrl path </> hypSrcModuleUrl' moduleName
276+
in Html.anchor content !
277+
[ Html.href $ spliceURL' Nothing (Just moduleName) Nothing Nothing hyperlinkUrl ]
269278
Nothing -> content
270279

271280

0 commit comments

Comments
 (0)