Как я могу организовать местные документы пакета haskell?
У меня много пакетов на haskell, и я включил флаг, чтобы они могли генерировать документы пикши. Теперь эти документы находятся в каталогах, как /usr/share/doc/{package-name}-{version}/html/
,
Есть ли инструмент для их организации? Я хочу что-то вроде всех пакетов по имени страницы в хаке, чтобы локальные ссылки на все эти установленные пакеты можно было найти на одной странице.
Было бы лучше, если бы Google попросил использовать эти документы. К настоящему времени все мои результаты поиска в Google указывают на соответствующие страницы в хакерских файлах.
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-файл в браузере для навигации по пакетным документам.