WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Commit 7c839be

Browse files
committed
matlab-mark
1 parent fa9177c commit 7c839be

File tree

12 files changed

+210
-45
lines changed

12 files changed

+210
-45
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
/dist-newstyle
22
/test/dst
3+
/test/matlab-dst
34
/cabal.project.freeze

answers-script.cabal

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ library
5858
import: warnings
5959

6060
-- Modules exported by the library.
61-
exposed-modules: MyLib, MyGit, MyMark
61+
exposed-modules: MyLib, MyGit, MyMark, MatlabMark
6262

6363
-- Modules included in this library but not exported.
6464
-- other-modules: MyGit
@@ -85,7 +85,9 @@ library
8585
tagged,
8686
transformers,
8787
monad-loops,
88-
aeson
88+
aeson,
89+
attoparsec,
90+
cmark-lens
8991

9092
-- Directories containing source files.
9193
hs-source-dirs: src
@@ -151,4 +153,8 @@ test-suite answers-script-test
151153
QuickCheck,
152154
text,
153155
bytestring,
154-
lens
156+
lens,
157+
attoparsec,
158+
cmark,
159+
cmark-lens,
160+
directory

app/Main.hs

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
module Main where
22

33
import MyLib (someFunc)
4+
import MatlabMark qualified
45
import Options.Applicative
56

6-
data BuildAssetArgs = BuildAssetArgs
7+
data GenerateArgs = GenerateArgs
78
{ prefix :: String,
89
src :: String,
910
dst :: String
1011
}
1112

12-
buildAssetParser :: Parser BuildAssetArgs
13-
buildAssetParser =
14-
BuildAssetArgs
13+
generateParser :: Parser GenerateArgs
14+
generateParser =
15+
GenerateArgs
1516
<$> strOption
1617
( long "prefix"
1718
<> value ""
@@ -26,55 +27,55 @@ buildAssetParser =
2627
<> help "path to static directory"
2728
)
2829

29-
buildAssetCommand :: ParserInfo BuildAssetArgs
30-
buildAssetCommand =
30+
generateCommand :: ParserInfo GenerateArgs
31+
generateCommand =
3132
info
32-
(buildAssetParser <**> helper)
33+
(generateParser <**> helper)
3334
( fullDesc
3435
<> progDesc "Import answers-db into answers static asset"
3536
<> header "Import answers-db into answers static asset"
3637
)
3738

38-
data SplitMatlabMarkdownArgs = SplitMatlabMarkdownArgs FilePath FilePath
39+
data MatlabMarkdownArgs = MatlabMarkdownArgs FilePath FilePath
3940

40-
splitMatlabMarkdownParser :: Parser SplitMatlabMarkdownArgs
41-
splitMatlabMarkdownParser =
42-
SplitMatlabMarkdownArgs
41+
matlabMarkdownParser :: Parser MatlabMarkdownArgs
42+
matlabMarkdownParser =
43+
MatlabMarkdownArgs
4344
<$> strOption
4445
( long "src"
4546
<> help "path to the markdown file that is exported from MATLAB"
4647
)
4748
<*> strOption
4849
( long "dst"
49-
<> help "path to a directory"
50+
<> help "path to a directory in answers-db"
5051
)
5152

52-
splitMatlabMarkdownCommand :: ParserInfo SplitMatlabMarkdownArgs
53-
splitMatlabMarkdownCommand =
53+
matlabMarkdownCommand :: ParserInfo MatlabMarkdownArgs
54+
matlabMarkdownCommand =
5455
info
55-
(splitMatlabMarkdownParser <**> helper)
56+
(matlabMarkdownParser <**> helper)
5657
( fullDesc
5758
<> progDesc "Build assets from a markdown file exported from MATLAB"
5859
<> header "Build assets from a markdown file exported from MATLAB"
5960
)
6061

61-
data Args = BuildAssets BuildAssetArgs | SplitMatlabMarkdown SplitMatlabMarkdownArgs
62+
data Args = Generate GenerateArgs | MatlabMarkdown MatlabMarkdownArgs
6263

6364
-- data Args = Args { commandArgs :: CommandArgs }
6465

6566
argsParser :: Parser Args
6667
argsParser =
6768
hsubparser
68-
( command "build-assets" (BuildAssets <$> buildAssetCommand)
69-
<> command "split-matlab-markdown" (SplitMatlabMarkdown <$> splitMatlabMarkdownCommand)
69+
( command "generate" (Generate <$> generateCommand)
70+
<> command "matlab-markdown" (MatlabMarkdown <$> matlabMarkdownCommand)
7071
)
7172

7273
greet :: Args -> IO ()
73-
greet (BuildAssets (BuildAssetArgs prefix src dst)) = do
74+
greet (Generate (GenerateArgs prefix src dst)) = do
7475
_ <- someFunc prefix src dst
7576
return ()
76-
greet (SplitMatlabMarkdown (SplitMatlabMarkdownArgs src dst)) = do
77-
return ()
77+
greet (MatlabMarkdown (MatlabMarkdownArgs src dst)) = do
78+
MatlabMark.generateMatlabAnswersDB dst =<< MatlabMark.readMatlabMD src
7879

7980
main :: IO ()
8081
main =

cabal.project

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,9 @@ source-repository-package
1919
location: https://github.com/jwiegley/gitlib.git
2020
subdir: hlibgit2
2121
tag: bf256617179d853bdbc12e9283b3f570ebb9d9d7
22-
--sha256: 13k3aymqwzpcijnjjka820nv6rkgakzbvh13glw98p1c4yhqwcbf
22+
--sha256: 13k3aymqwzpcijnjjka820nv6rkgakzbvh13glw98p1c4yhqwcbf
23+
24+
source-repository-package
25+
type: git
26+
location: https://github.com/ingun37/cmark-lens.git
27+
tag: 4456f10deccb61419ce28811db448c266931190f

src/MatlabMark.hs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
{-# LANGUAGE OverloadedStrings #-}
2+
{-# LANGUAGE TemplateHaskell #-}
3+
4+
module MatlabMark (generateMatlabAnswersDB, readMatlabMD) where
5+
6+
import CMark
7+
import CMark.Lens
8+
import Control.Lens
9+
import Data.Attoparsec.Text qualified as A
10+
import Data.Text qualified as T
11+
import Data.Text.IO qualified as TIO
12+
import System.FilePath qualified as File
13+
14+
changeMatlabMarkdownDelimeters :: T.Text -> T.Text
15+
changeMatlabMarkdownDelimeters = T.replace "\n $$ " "\n```math\n" . T.replace " $$ \n" "\n``` \n" . T.replace "\n $" "\n $`" . T.replace "$\n" "`$\n"
16+
17+
theRecurse :: [Node] -> ([Node], [(String, [Node])])
18+
theRecurse [] = ([], [])
19+
theRecurse (x : xs) =
20+
let (nodes, pairs) = theRecurse xs
21+
problemNumber = A.parseOnly parseVersion (x ^. _nodesLens . ix 0 . _nodeType . _TEXT)
22+
in case problemNumber of
23+
Left _ -> (x : nodes, pairs)
24+
Right v -> ([], (v, nodes) : pairs)
25+
26+
groupByProblems :: Node -> ([Node], [(String, [Node])])
27+
groupByProblems (Node _ DOCUMENT nodes) = theRecurse nodes
28+
groupByProblems _ = undefined
29+
30+
parseVersion :: A.Parser String
31+
parseVersion = do
32+
major <- A.many1 A.digit
33+
_ <- A.char '.'
34+
minor <- A.many1 A.digit
35+
return $ major <> "." <> minor
36+
37+
generateMatlabAnswersDB :: FilePath -> Node -> IO ()
38+
generateMatlabAnswersDB outputDirPath node =
39+
let (intro, groups) = groupByProblems node
40+
toDoc = Node Nothing DOCUMENT
41+
writeMD name nodes = TIO.writeFile (outputDirPath File.</> (name <> ".md")) (CMark.nodeToCommonmark [] Nothing (toDoc nodes))
42+
in do
43+
writeMD "cover" intro
44+
mapM_ (uncurry writeMD) groups
45+
46+
readMatlabMD :: FilePath -> IO Node
47+
readMatlabMD mdFilePath = CMark.commonmarkToNode [] . changeMatlabMarkdownDelimeters <$> TIO.readFile mdFilePath

test/Main.hs

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,39 @@
1+
{-# LANGUAGE OverloadedStrings #-}
12
module Main (main) where
23

3-
import Control.Exception
4-
import Control.Exception (evaluate)
54
import Control.Monad
65
import Data.ByteString qualified as B
76
import Data.Either qualified as E
8-
import Data.Map
97
import Data.Text qualified as T
10-
import Data.Text.Encoding qualified as Encoding
118
import Data.Text.IO qualified as TIO
9+
import Data.Text.Encoding qualified as Encoding
1210
import MyLib qualified
11+
import MatlabMark qualified
1312
import System.Directory.Tree qualified as DT
13+
import System.Directory qualified as D
1414
import System.FilePath qualified as F
1515
import Test.Hspec
16-
import Test.QuickCheck
1716
import Control.Lens
17+
import CMark qualified
18+
import CMark.Lens
19+
import Data.Attoparsec.Text qualified as A
1820

1921
main :: IO ()
2022
main = hspec $ do
21-
describe "Prelude.head" $ do
22-
it "returns the first element of a list" $ do
23+
describe "changeMatlabMarkdownDelimeters" $ do
24+
it "matlab answers markdown test" $ do
25+
matlab
26+
describe "MyLib.someFunc" $ do
27+
it "asset build test" $ do
2328
testCase
2429

25-
src :: FilePath
26-
src = "test" F.</> "answers-db"
27-
28-
dst :: FilePath
29-
dst = "test" F.</> "dst"
30-
31-
expect :: FilePath
32-
expect = "test" F.</> "expect"
33-
34-
prefix :: String
35-
prefix = "prefix"
36-
30+
testCase :: IO ()
3731
testCase =
3832
do
39-
_ <- MyLib.someFunc prefix src dst
33+
let expect = "test" F.</> "expect"
34+
let dst = "test" F.</> "dst"
35+
let src = "test" F.</> "answers-db"
36+
_ <- MyLib.someFunc "prefix" src dst
4037
let reader x = do
4138
b <- B.readFile x
4239
return $ E.fromRight (T.pack $ F.takeBaseName x ++ ": " ++ show (B.length b)) $ Encoding.decodeUtf8' b
@@ -46,4 +43,19 @@ testCase =
4643
b <- DT.readDirectoryWith reader expect
4744
let b' = b ^.DT._dirTree
4845
let b'' = DT.flattenDir (set DT._name "" b')
46+
zipWithM_ shouldBe a'' b''
47+
48+
matlab :: IO ()
49+
matlab =
50+
do
51+
node <- MatlabMark.readMatlabMD $ "test" F.</> "matlab-short.md"
52+
let dst = "test" F.</> "matlab-dst"
53+
D.createDirectoryIfMissing True dst
54+
MatlabMark.generateMatlabAnswersDB dst node
55+
a <- DT.readDirectoryWith TIO.readFile dst
56+
let a' = a ^.DT._dirTree
57+
let a'' = DT.flattenDir (set DT._name "" a')
58+
b <- DT.readDirectoryWith TIO.readFile ("test" F.</> "matlab-expect")
59+
let b' = b ^.DT._dirTree
60+
let b'' = DT.flattenDir (set DT._name "" b')
4961
zipWithM_ shouldBe a'' b''

test/matlab-expect/11.1.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
``` matlab
2+
code
3+
```
4+
5+
``` matlabTextOutput
6+
out
7+
```

test/matlab-expect/11.27.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
``` matlab
2+
code
3+
```
4+
5+
solution =
6+
7+
``` math
8+
\displaystyle \left(\begin{array}{c} -\frac{\sqrt{7}\,\sqrt{156250}}{312500\,\sqrt{\pi }}\newline \frac{\sqrt{7}\,\sqrt{156250}}{312500\,\sqrt{\pi }} \end{array}\right)
9+
```

test/matlab-expect/11.31.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
``` matlab
2+
code
3+
```
4+
5+
in\_pascal =
6+
$`\displaystyle 205000000`$

test/matlab-expect/11.9.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
``` matlab
2+
code
3+
```
4+
5+
(a)
6+
7+
``` matlab
8+
code
9+
```
10+
11+
``` matlabTextOutput
12+
out
13+
```

0 commit comments

Comments
 (0)