Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement an html documentation generator similar to haddock (#1413) #1416

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/Commands/Html.hs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
module Commands.Html where

import Juvix.Prelude hiding (Doc)
import Juvix.Syntax.Concrete.Scoped.Pretty.Html
import Juvix.Syntax.Concrete.Scoped.Pretty.Html hiding (HtmlOptions)
import Options.Applicative

data HtmlOptions = HtmlOptions
Expand Down
11 changes: 11 additions & 0 deletions app/Commands/Internal.hs
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@ module Commands.Internal
module Commands.Internal.MicroJuvix,
module Commands.Internal.Parse,
module Commands.Internal.Scope,
module Commands.Internal.Doc,
module Commands.Internal.Termination,
)
where

import Commands.Internal.Doc
import Commands.Internal.MicroJuvix
import Commands.Internal.Parse
import Commands.Internal.Scope
Expand All @@ -24,6 +26,7 @@ data InternalCommand
| Parse ParseOptions
| Scope ScopeOptions
| Termination TerminationCommand
| Doc DocOptions

parseInternalCommand :: Parser InternalCommand
parseInternalCommand =
Expand All @@ -35,12 +38,20 @@ parseInternalCommand =
commandMiniHaskell,
commandMonoJuvix,
commandParse,
commandDoc,
commandScope,
commandShowRoot,
commandTermination
]
)

commandDoc :: Mod CommandFields InternalCommand
commandDoc =
command "doc" $
info
(Doc <$> parseDoc)
(progDesc "Generate documentation")

commandHighlight :: Mod CommandFields InternalCommand
commandHighlight =
command "highlight" $
Expand Down
30 changes: 30 additions & 0 deletions app/Commands/Internal/Doc.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
module Commands.Internal.Doc where

import Juvix.Prelude hiding (Doc)
import Options.Applicative

data DocOptions = DocOptions
{ _docOutputDir :: FilePath,
_docOpen :: Bool
}

makeLenses ''DocOptions

parseDoc :: Parser DocOptions
parseDoc = do
_docOutputDir <-
option
str
( long "output-dir"
<> metavar "DIR"
<> value "doc"
<> showDefault
<> help "html output directory"
<> action "directory"
)
_docOpen <-
switch
( long "open"
<> help "open the documentation after generating it"
)
pure DocOptions {..}
14 changes: 12 additions & 2 deletions app/Main.hs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import Data.HashMap.Strict qualified as HashMap
import Juvix.Analysis.Scoping.Scoper qualified as Scoper
import Juvix.Analysis.Termination qualified as Termination
import Juvix.Analysis.TypeChecking qualified as MicroTyped
import Juvix.Documentation.Compiler qualified as Doc
import Juvix.Parsing.Parser qualified as Parser
import Juvix.Pipeline
import Juvix.Prelude hiding (Doc)
Expand All @@ -19,7 +20,7 @@ import Juvix.Syntax.Abstract.Pretty qualified as Abstract
import Juvix.Syntax.Concrete.Scoped.Highlight qualified as Highlight
import Juvix.Syntax.Concrete.Scoped.InfoTable qualified as Scoper
import Juvix.Syntax.Concrete.Scoped.Pretty qualified as Scoper
import Juvix.Syntax.Concrete.Scoped.Pretty.Html
import Juvix.Syntax.Concrete.Scoped.Pretty.Html qualified as Html
import Juvix.Syntax.MicroJuvix.MicroJuvixArityResult qualified as MicroArity
import Juvix.Syntax.MicroJuvix.Pretty qualified as Micro
import Juvix.Syntax.MiniHaskell.Pretty qualified as MiniHaskell
Expand All @@ -32,6 +33,7 @@ import Juvix.Translation.ScopedToAbstract qualified as Abstract
import Juvix.Utils.Version (runDisplayVersion)
import Options.Applicative
import System.Environment (getProgName)
import System.Process qualified as Process
import Text.Show.Pretty hiding (Html)

juvixYamlFile :: FilePath
Expand Down Expand Up @@ -106,7 +108,7 @@ runCommand cmdWithOpts = do
Html HtmlOptions {..} -> do
res <- runPipeline (upToScoping entryPoint)
let m = head (res ^. Scoper.resultModules)
embed (genHtml Scoper.defaultOptions _htmlRecursive _htmlTheme _htmlOutputDir _htmlPrintMetadata m)
embed (Html.genHtml Scoper.defaultOptions _htmlRecursive _htmlTheme _htmlOutputDir _htmlPrintMetadata m)
(Internal cmd') -> case cmd' of
Highlight -> do
res <- runPipelineEither (upToScoping entryPoint)
Expand Down Expand Up @@ -137,6 +139,14 @@ runCommand cmdWithOpts = do
(upToScoping entryPoint)
forM_ l $ \s -> do
renderStdOut (Scoper.ppOut (mkScopePrettyOptions globalOpts localOpts) s)
Doc localOpts -> do
l <-
(^. Scoper.mainModule)
<$> runPipeline
(upToScoping entryPoint)
let docDir = localOpts ^. docOutputDir
Doc.compileModuleHtmlText docDir "proj" l
embed (when (localOpts ^. docOpen) (Process.callProcess "xdg-open" [docDir </> Doc.indexFileName]))
MicroJuvix Pretty -> do
micro <-
head . (^. Micro.resultModules)
Expand Down
Loading