mirror of
https://github.com/anoma/juvix.git
synced 2024-12-14 08:27:03 +03:00
bd16d3ef2a
This PR adds an initial support for Literate Juvix Markdown files, files with the extension `.juvix.md`. Here is a small example of such a file: `Test.juvix.md`. <pre> # This is a heading Lorem ... ```juvix module Test; type A := a; fun : A -> A | _ := a; ``` Other text </pre> This initial support enables users to execute common commands such as typechecking, compilation, and HTML generation. Additionally, a new command called `markdown` has been introduced. This command replaces code blocks marked with the juvix attribute with their respective HTML output, much like the output we obtain when running `juvix html`. In this version, comments are ignored in the output, including judoc blocks. - We intend to use this new feature in combination with this Python plugin (https://github.com/anoma/juvix-mkdocs) to enhance our documentation site. https://github.com/anoma/juvix/assets/1428088/a0c17f36-3d76-42cc-a571-91f885866874 ## Future work Open as issues once this PR is merged, we can work on the following: - Support imports of Juvix Markdown modules (update the path resolver to support imports of Literate Markdown files) - Support (Judoc) comments in md Juvix blocks - Support Markdown in Judoc blocks - Update Text editor support, vscode extension and emacs mode (the highlighting info is a few characters off in the current state) - Closes #1839 - Closes #1719
88 lines
2.6 KiB
Haskell
88 lines
2.6 KiB
Haskell
module Markdown where
|
|
|
|
import Base
|
|
import Juvix.Compiler.Backend.Markdown.Translation.FromTyped.Source
|
|
import Juvix.Compiler.Concrete qualified as Concrete
|
|
import Juvix.Compiler.Concrete.Translation.FromParsed.Analysis.Scoping qualified as Scoper
|
|
import Juvix.Compiler.Concrete.Translation.FromSource qualified as Parser
|
|
import Juvix.Compiler.Pipeline.Setup
|
|
|
|
data PosTest = PosTest
|
|
{ _name :: String,
|
|
_dir :: Path Abs Dir,
|
|
_file :: Path Abs File,
|
|
_expectedFile :: Path Abs File,
|
|
_UrlPrefix :: Text,
|
|
_IdPrefix :: Text,
|
|
_NoPath :: Bool
|
|
}
|
|
|
|
makeLenses ''PosTest
|
|
|
|
root :: Path Abs Dir
|
|
root = relToProject $(mkRelDir "tests/positive/Markdown")
|
|
|
|
posTest :: String -> Path Rel Dir -> Path Rel File -> Path Rel File -> Text -> Text -> Bool -> PosTest
|
|
posTest _name rdir rfile efile _UrlPrefix _IdPrefix _NoPath =
|
|
let _dir = root <//> rdir
|
|
_file = _dir <//> rfile
|
|
_expectedFile = _dir <//> efile
|
|
in PosTest {..}
|
|
|
|
testDescr :: PosTest -> TestDescr
|
|
testDescr PosTest {..} =
|
|
TestDescr
|
|
{ _testName = _name,
|
|
_testRoot = _dir,
|
|
_testAssertion = Steps $ \step -> do
|
|
entryPoint <- defaultEntryPointCwdIO _file
|
|
step "Parsing"
|
|
p :: Parser.ParserResult <- snd <$> runIO' entryPoint upToParsing
|
|
step "Scoping"
|
|
s :: Scoper.ScoperResult <-
|
|
snd
|
|
<$> runIO'
|
|
entryPoint
|
|
( do
|
|
void (entrySetup defaultDependenciesConfig)
|
|
Concrete.fromParsed p
|
|
)
|
|
let m = head (s ^. Scoper.resultModules)
|
|
let opts =
|
|
ProcessJuvixBlocksArgs
|
|
{ _processJuvixBlocksArgsConcreteOpts = Concrete.defaultOptions,
|
|
_processJuvixBlocksArgsUrlPrefix = _UrlPrefix,
|
|
_processJuvixBlocksArgsIdPrefix = _IdPrefix,
|
|
_processJuvixBlocksArgsNoPath = _NoPath,
|
|
_processJuvixBlocksArgsComments =
|
|
s ^. Scoper.comments,
|
|
_processJuvixBlocksArgsModule = m,
|
|
_processJuvixBlocksArgsOutputDir =
|
|
root <//> $(mkRelDir "markdown")
|
|
}
|
|
|
|
let md :: Text = fromJuvixMarkdown' opts
|
|
|
|
step "Checking against expected output file"
|
|
expFile :: Text <- readFile (toFilePath _expectedFile)
|
|
assertEqDiffText "Compare to expected output" md expFile
|
|
}
|
|
|
|
allTests :: TestTree
|
|
allTests =
|
|
testGroup
|
|
"Format positive tests"
|
|
(map (mkTest . testDescr) tests)
|
|
|
|
tests :: [PosTest]
|
|
tests =
|
|
[ posTest
|
|
"Test Markdown"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "Test.juvix.md")
|
|
$(mkRelFile "markdown/Test.md")
|
|
"X"
|
|
"Y"
|
|
True
|
|
]
|