@@ -6,64 +6,87 @@ module FormatHeuristic
66 )
77where
88
9+import Data.ByteString.Lazy (ByteString)
910import Data.Char (toLower)
11+import Data.Functor
12+import qualified Data.Map as M
13+import Data.Text (Text)
14+import qualified Data.Text.Lazy as TL
15+import qualified Data.Text.Lazy.Encoding as TL
16+import qualified OpenAPI.Checker.Report.Html.Template as Html
1017import System.FilePath (takeExtension)
18+import Text.DocTemplates.Internal
1119import Text.Pandoc
1220
13−formatFromFilePath :: PandocMonad m => FilePath -> Maybe (Writer m)
21+formatFromFilePath :: forall m. PandocMonad m => FilePath -> Maybe (Pandoc -> m ByteString)
1422formatFromFilePath x =
1523 case takeExtension (map toLower x) of
16− ".adoc" -> f "asciidoc"
17− ".asciidoc" -> f "asciidoc"
18− ".context" -> f "context"
19− ".ctx" -> f "context"
20− ".db" -> f "docbook"
21− ".doc" -> f "doc" -- so we get an "unknown reader" error
22− ".docx" -> f "docx"
23− ".dokuwiki" -> f "dokuwiki"
24− ".epub" -> f "epub"
25− ".fb2" -> f "fb2"
26− ".htm" -> f "html"
27− ".html" -> f "html"
28− ".icml" -> f "icml"
29− ".json" -> f "json"
30− ".latex" -> f "latex"
31− ".lhs" -> f "markdown+lhs"
32− ".ltx" -> f "latex"
33− ".markdown" -> f "markdown"
34− ".mkdn" -> f "markdown"
35− ".mkd" -> f "markdown"
36− ".mdwn" -> f "markdown"
37− ".mdown" -> f "markdown"
38− ".Rmd" -> f "markdown"
39− ".md" -> f "markdown"
40− ".ms" -> f "ms"
41− ".muse" -> f "muse"
42− ".native" -> f "native"
43− ".odt" -> f "odt"
44− ".opml" -> f "opml"
45− ".org" -> f "org"
46− ".pdf" -> f "pdf" -- so we get an "unknown reader" error
47− ".pptx" -> f "pptx"
48− ".roff" -> f "ms"
49− ".rst" -> f "rst"
50− ".rtf" -> f "rtf"
51− ".s5" -> f "s5"
52− ".t2t" -> f "t2t"
53− ".tei" -> f "tei"
54− ".tei.xml" -> f "tei"
55− ".tex" -> f "latex"
56− ".texi" -> f "texinfo"
57− ".texinfo" -> f "texinfo"
58− ".text" -> f "markdown"
59− ".textile" -> f "textile"
60− ".txt" -> f "markdown"
61− ".wiki" -> f "mediawiki"
62− ".xhtml" -> f "html"
63− ".ipynb" -> f "ipynb"
64− ".csv" -> f "csv"
65− ".bib" -> f "biblatex"
66− ['.', y] | y `elem` ['1' .. '9'] -> f "man"
24+ ".adoc" -> f "asciidoc" def
25+ ".asciidoc" -> f "asciidoc" def
26+ ".context" -> f "context" def
27+ ".ctx" -> f "context" def
28+ ".db" -> f "docbook" def
29+ ".doc" -> f "doc" def -- so we get an "unknown reader" error
30+ ".docx" -> f "docx" def
31+ ".dokuwiki" -> f "dokuwiki" def
32+ ".epub" -> f "epub" def
33+ ".fb2" -> f "fb2" def
34+ ".htm" -> html
35+ ".html" -> html
36+ ".icml" -> f "icml" def
37+ ".json" -> f "json" def
38+ ".latex" -> f "latex" def
39+ ".lhs" -> f "markdown+lhs" def
40+ ".ltx" -> f "latex" def
41+ ".markdown" -> markdown
42+ ".mkdn" -> markdown
43+ ".mkd" -> markdown
44+ ".mdwn" -> markdown
45+ ".mdown" -> markdown
46+ ".Rmd" -> markdown
47+ ".md" -> markdown
48+ ".ms" -> f "ms" def
49+ ".muse" -> f "muse" def
50+ ".native" -> f "native" def
51+ ".odt" -> f "odt" def
52+ ".opml" -> f "opml" def
53+ ".org" -> f "org" def
54+ -- so we get an "unknown reader" error
55+ ".pdf" -> f "pdf" def
56+ ".pptx" -> f "pptx" def
57+ ".roff" -> f "ms" def
58+ ".rst" -> f "rst" def
59+ ".rtf" -> f "rtf" def
60+ ".s5" -> f "s5" def
61+ ".t2t" -> f "t2t" def
62+ ".tei" -> f "tei" def
63+ ".tei.xml" -> f "tei" def
64+ ".tex" -> f "latex" def
65+ ".texi" -> f "texinfo" def
66+ ".texinfo" -> f "texinfo" def
67+ ".text" -> markdown
68+ ".textile" -> f "textile" def
69+ ".txt" -> markdown
70+ ".wiki" -> f "mediawiki" def
71+ ".xhtml" -> f "html" def
72+ ".ipynb" -> f "ipynb" def
73+ ".csv" -> f "csv" def
74+ ".bib" -> f "biblatex" def
75+ ['.', y] | y `elem` ['1' .. '9'] -> f "man" def
6776 _ -> Nothing
6877 where
69− f k = lookup k writers
78+ markdown, html :: Maybe (Pandoc -> m ByteString)
79+ markdown = f "markdown" markdownOpt
80+ html =
81+ f
82+ "html"
83+ def
84+ { writerTemplate = Just Html.template
85+ , -- Not actually used. Needed to silence warning.
86+ writerVariables = Context $ M.fromList [("pagetitle", toVal ("OpenApi Diff" :: Text))]
87+ }
88+ markdownOpt = def {writerExtensions = githubMarkdownExtensions}
89+ f k opt =
90+ lookup k writers <&> \case
91+ TextWriter g -> fmap (TL.encodeUtf8 . TL.fromStrict) . g opt
92+ ByteStringWriter g -> g opt