gpt4 book ai didi

haskell - 如何组织本地 haskell 包文件?

转载 作者:行者123 更新时间:2023-12-02 03:33:42 24 4
gpt4 key购买 nike

我有很多 haskell 包,我启用了一些标志以允许它们生成黑线鳕文档。现在这些文档位于 /usr/share/doc/{package-name}-{version}/html/ 等目录下。

是否有工具来组织它们?我想要类似 all packages by name 的东西黑客攻击页面,这样就可以在一个页面中找到所有这些已安装软件包的本地链接。

如果能告诉hoogle使用这些文件就更好了。现在我的hoogle搜索结果都指向hackage中对应的页面。

最佳答案

由于我的问题还没有得到解答,我写了一个快速而肮脏的程序来回答我的第一个问题:

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 运行程序应该生成一个包含文档链接的 Markdown 文件。之后只需将其通过管道传输到 pandoc 或其他一些 markdown2html 转换器,并在浏览器中使用生成的 HTML 文件来浏览包文档。

关于haskell - 如何组织本地 haskell 包文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25091562/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com