40 lines
963 B
Haskell
40 lines
963 B
Haskell
import Lang
|
|
import Ebnf
|
|
import Spans
|
|
import Glosses
|
|
|
|
import Text.Pandoc.Definition
|
|
import Text.Pandoc.JSON
|
|
import Text.Pandoc.Walk
|
|
import qualified Data.Map as Map
|
|
|
|
|
|
main :: IO ()
|
|
main = toJSONFilter filter where
|
|
filter p@(Pandoc (Meta m) _) = do
|
|
lang' <- toLang $ Map.lookup "conlang" m
|
|
let ?lang = lang'
|
|
fmap (walk makeEbnf .
|
|
walk (concatMap makeBlocks) .
|
|
walk inlineLetterList) $
|
|
walkM spans =<<
|
|
walkM (fmap concat . traverse glosses) p
|
|
|
|
|
|
makeBlocks :: Block -> [Block]
|
|
makeBlocks (Div ("", [cls], []) blks)
|
|
| cls `elem` ["figure", "aside"] = [open] ++ blks ++ [close]
|
|
where
|
|
open = html $ "<" <> cls <> ">"
|
|
close = html $ "</" <> cls <> ">"
|
|
html = RawBlock (Format "html")
|
|
makeBlocks b = [b]
|
|
|
|
|
|
inlineLetterList :: Block -> Block
|
|
inlineLetterList (Div a@(_, cs, _) blks)
|
|
| "letter-list" `elem` cs = Div a (walk go blks)
|
|
where
|
|
go (Para xs) = Plain xs
|
|
go b = b
|
|
inlineLetterList b = b
|