{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ViewPatterns #-} module Main where import Text.Pandoc.JSON import Text.Pandoc.Definition () import Data.String (fromString, IsString) import Data.Maybe (fromMaybe) import Data.Text (Text) import qualified Data.Text as T import Debug.Trace(trace) import Token.Haskell import GHC.SyntaxHighlighter import Filter import FindColumns main :: IO () main = toJSONFilter blockFormatter -- | Select the desired format output then process it. blockFormatter :: Maybe Format -> Block -> Block blockFormatter format (CodeBlock attrs content) = codeFormatter (fromMaybe (Format "text") format) attrs content -- Do not touch other blocks than 'CodeBlock' blockFormatter _ x = x -- | Run tokenizer, analysis, and formatter. -- Fallback to original input, if failed to tokenize. codeFormatter :: Format -- ^ Output format, defaults to "text" if not found -> Attr -- ^ Code block attributes -> Text -- ^ Code block content -> Block codeFormatter format attrs content = case fmap findColumns $ aTokenizer content of Just processed -> render format attrs processed Nothing -> CodeBlock attrs content -- fallback where aTokenizer | isHaskell attrs = Token.Haskell.tokenizer | otherwise = \_ -> Nothing -- | Check if the code block is tagged as Haskell. isHaskell :: (Foldable t, Eq a1, IsString a1) => (a2, t a1, c) -> Bool isHaskell (_, classes, _) = "haskell" `elem` classes