3

多くの haskell パッケージがあり、haddock ドキュメントを生成できるようにいくつかのフラグを有効にしました。現在、これらのドキュメントは のようなディレクトリの下にあり/usr/share/doc/{package-name}-{version}/html/ます。

それらを整理するツールはありますか?これらのインストールされたすべてのパッケージへのローカルリンクが1つのページで見つかるように、hackageの名前ページによるすべてのパッケージのようなものが欲しいです。

hoogle にこれらのドキュメントを使用するように指示できるとよいでしょう。今では、私のフーグル検索結果はすべて、ハックの対応するページを指しています。

4

1 に答える 1

1

私の質問はまだ回答されていないので、最初の質問に回答するために手早く汚いプログラムを書きました。

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

これらのハドック ディレクトリの構造を観察することで、次のテストでハドック ディレクトリを認識できます。

  • というサブディレクトリがある場合html
  • サブディレクトリに の場合、拡張子名htmlのファイルがあります。.haddock

プログラムを実行するとrunghc <source-file> /usr/share/doc/ >document-nav.md、ドキュメントへのリンクを含むマークダウン ファイルが生成されます。その後、それを pandoc または他の markdown2html コンバーターにパイプし、結果の HTML ファイルをブラウザーで使用して、パッケージ ドキュメントをナビゲートします。

于 2014-08-02T17:00:13.287 に答える