2 | import Libraries.Utils.Path
3 | import public Libraries.Text.Literate
11 | data LiterateModes = Bird | Org | CMark
14 | styleBird : LiterateStyle
15 | styleBird = MkLitStyle Nil [">", "<"] [".lidr"]
18 | styleOrg : LiterateStyle
19 | styleOrg = MkLitStyle
20 | [ ("#+BEGIN_SRC idris","#+END_SRC")
21 | , ("#+begin_src idris","#+end_src")
22 | , ("#+BEGIN_COMMENT idris","#+END_COMMENT")
23 | , ("#+begin_comment idris","#+end_comment")]
28 | styleCMark : LiterateStyle
29 | styleCMark = MkLitStyle
30 | [("```idris", "```"), ("~~~idris", "~~~"), ("<!-- idris", "-->")]
32 | [".md", ".markdown", ".dj"]
35 | styleTeX : LiterateStyle
36 | styleTeX = MkLitStyle
37 | [("\\begin{code}", "\\end{code}"), ("\\begin{hidden}", "\\end{hidden}")]
42 | styleTypst : LiterateStyle
43 | styleTypst = MkLitStyle
44 | [("```idris", "```"), ("/* idris", "*/")]
49 | supportedStyles : List LiterateStyle
50 | supportedStyles = [styleBird, styleOrg, styleCMark, styleTeX, styleTypst]
54 | listOfExtensionsLiterate : List String
55 | listOfExtensionsLiterate
56 | = do let exts = concatMap file_extensions supportedStyles
57 | pfx <- [ "", ".idr", ".lidr"]
63 | hasLitFileExt : (fname : String) -> Maybe (String, String)
64 | hasLitFileExt fname =
65 | do let toExtension = concatMap ("." ++)
68 | let (bn, exts) = splitExtensions fname
69 | flip choiceMap listOfExtensionsLiterate $
\ candidate =>
73 | let ("" ::: chunks) = map pack $
split ('.' ==) (unpack candidate)
77 | (nm, exts) <- suffixOfBy (\ v, w => v <$ guard (v == w)) chunks exts
80 | pure (bn ++ toExtension nm, toExtension exts)
86 | $
idris_crash #"Internal error: all literate extensions should start with a ".""#
90 | isLitFile : String -> Maybe LiterateStyle
91 | isLitFile fname = choiceMap isStyle supportedStyles
94 | hasSuffix : String -> Bool
95 | hasSuffix ext = isSuffixOf ext fname
97 | isStyle : LiterateStyle -> Maybe LiterateStyle
99 | if any hasSuffix (file_extensions style)
105 | isLitLine : String -> (Maybe String, String)
107 | = fromMaybe (Nothing, str) walk
109 | try : LiterateStyle -> Maybe (Maybe String, String)
111 | = case isLiterateLine style str of
112 | (Just l, s) => Just (Just l, s)
115 | walk : Maybe (Maybe String, String)
116 | walk = choiceMap try supportedStyles
119 | unlit : Maybe LiterateStyle -> String -> Either LiterateError String
120 | unlit Nothing str = Right str
121 | unlit (Just s) str = unlit s str
124 | relit : Maybe String -> String -> String
125 | relit Nothing str = str
126 | relit (Just mark) str = unwords [mark, str]