{-# LANGUAGE RecordWildCards #-}

-- | Generate a markdown that summarizes the builtin hints.
module Test.Summary (genBuiltinSummaryMd) where

import qualified Data.Map as Map
import Config.Type
import Test.Util

genBuiltinSummaryMd :: BuiltinSummary -> String
genBuiltinSummaryMd :: BuiltinSummary -> String
genBuiltinSummaryMd builtins :: BuiltinSummary
builtins = [String] -> String
unlines ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$
  [ "# Built-in Hints"
  , ""
  , "This page is auto-generated from `cabal run hlint test -- --generate-summary`"
  , "or `stack run hlint test -- --generate-summary`."
  , ""
  ]
  [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ BuiltinSummary -> [String]
table BuiltinSummary
builtins

table :: BuiltinSummary -> [String]
table :: BuiltinSummary -> [String]
table builtins :: BuiltinSummary
builtins =
  ["<table>"]
  [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String] -> [String]
row ["<th>Hint</th>", "<th>Severity</th>", "<th>Support Refactoring?</th>"]
  [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ ((String, Severity, Bool) -> BuiltinEx -> [String])
-> BuiltinSummary -> [String]
forall m k a. Monoid m => (k -> a -> m) -> Map k a -> m
Map.foldMapWithKey (String, Severity, Bool) -> BuiltinEx -> [String]
showHint BuiltinSummary
builtins
  [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ ["</table>"]

row :: [String] -> [String]
row :: [String] -> [String]
row xs :: [String]
xs = ["<tr>"] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String]
xs [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ ["</tr>"]

-- | Render using <code> if it is single-line, otherwise using <pre>.
haskell :: String -> [String]
haskell :: String -> [String]
haskell s :: String
s
  | '\n' Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` String
s = ["<pre>", String
s, "</pre>"]
  | Bool
otherwise = ["<code>", String
s, "</code>", "<br>"]

showHint :: (String, Severity, Bool) -> BuiltinEx -> [String]
showHint :: (String, Severity, Bool) -> BuiltinEx -> [String]
showHint (hint :: String
hint, sev :: Severity
sev, refact :: Bool
refact) BuiltinEx{..} = [String]
row1 [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String]
row2
  where
    row1 :: [String]
row1 = [String] -> [String]
row
      [ "<td rowspan=2>" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
hint String -> String -> String
forall a. [a] -> [a] -> [a]
++ "</td>"
      , "<td>" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Severity -> String
forall a. Show a => a -> String
show Severity
sev String -> String -> String
forall a. [a] -> [a] -> [a]
++ "</td>"
      , "<td>" String -> String -> String
forall a. [a] -> [a] -> [a]
++ if Bool
refact then "Yes" else "No" String -> String -> String
forall a. [a] -> [a] -> [a]
++ "</td>"
      ]
    row2 :: [String]
row2 = [String] -> [String]
row [String]
example
    example :: [String]
example =
      [ "<td colspan=2>"
      , "Example:"
      ]
      [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ String -> [String]
haskell String
builtinInp
      [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ ["Found:"]
      [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ String -> [String]
haskell String
builtinFrom
      [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ ["Suggestion:"]
      [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ String -> [String]
haskell String
to
      [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ ["</td>"]
    to :: String
to = case Maybe String
builtinTo of
      Nothing -> ""
      Just "" -> "Perhaps you should remove it."
      Just s :: String
s -> String
s