How can I organize local documents of the haskell package?

I have a lot of haskell packages and I have enabled some flag to allow them to create pix documents. Now these documents are in type directories /usr/share/doc/{package-name}-{version}/html/

.

Is there a tool to organize them? I want something like all packages by name in a hack so that local links to all those installed packages can be found on one page.

It will be better if hoogle can be told to use these documents. So far, all hoogle searches point to relevant pages in the hack.

+3


source to share


1 answer


Since my question hasn't been answered yet, I wrote a quick and dirty program to answer my first question:

import System.Directory
import System.IO
import System.Environment
import System.Exit
import System.Path
import System.FilePath.Posix

import Control.Applicative
import Control.Monad
import Data.Maybe
import Data.List
import Text.Printf

-- | make markdown table row
makeTableRow :: String -> FilePath -> String
makeTableRow dirName htmlPath = intercalate "|" [ dirName
                                                , link "frames"
                                                , link "index"
                                                , link "doc-index"]
    where
        link s = printf "[%s](%s)" s $ htmlPath </> s ++ ".html"

scanAndMakeTable :: String -> IO [String]
scanAndMakeTable relDocPath = do
    (Just docPath) <- absNormPath' <$> getCurrentDirectory <*> pure relDocPath
    dirs <- getDirectoryContents docPath
    items <- liftM catMaybes
           . mapM (asHaskellPackage docPath)
           . sort $ dirs
    return $ headers1:headers2:map (uncurry makeTableRow) items
    where
        headers1 = "| " ++  intercalate " | " (words "Package Frames Contents Index") ++ " |"
        headers2 = intercalate " --- " $ replicate 5 "|"
        absNormPath' a p = addMissingRoot  <$> absNormPath a p
        -- sometimes the leading '/' is missing in absNormPath results
        addMissingRoot s@('/':_) = s
        addMissingRoot s = '/' : s
        asHaskellPackage :: String -> String -> IO (Maybe (String,FilePath))
        asHaskellPackage docPath dirName = do
            -- a valid haskell package has a "haddock dir"
            -- in which we can at least find a file with ".haddock" as extension name
            b1 <- doesDirectoryExist haddockFileDir
            if b1
               then do
                   b2 <- any ((== ".haddock") . takeExtension)
                             <$> getDirectoryContents haddockFileDir
                   return $ if b2 then Just (dirName,haddockFileDir) else Nothing
               else return Nothing
            where
                -- guess haddock dir
                haddockFileDir = docPath </> dirName </> "html"

main :: IO ()
main = do
    args <- getArgs
    case args of
      [docPath'] -> scanAndMakeTable docPath' >>= putStrLn . unlines
      _ -> help
    where
        help = hPutStrLn stderr "Usage: <program> <path-to-packages>"
            >> exitFailure

      

By observing the structure of these haddock directories, I get to know the haddock directories by testing:



  • if there is a subdirectory named html

    .
  • if html

    there is a file in the subdirectory with .haddock

    the extension name.

Running the program with runghc <source-file> /usr/share/doc/ >document-nav.md

should generate a markdown file containing links to documents. After that, just connect it to pandoc or another markdown2html converter and use the resulting HTML file in your browser to navigate the package documents.

+1


source







All Articles