|
|
- {-# LANGUAGE OverloadedStrings #-}
- module Main where
-
- import qualified Data.HashMap.Strict as HashMap
- import Data.HashMap.Strict (HashMap)
- import qualified Data.Text as T
- import Data.Text (Text)
- import Data.Maybe
- import Data.List
-
- import System.Environment
- import System.Exit
-
- import Text.Pandoc.Definition
- import Text.HTML.TagSoup
- import Text.Pandoc.Walk
- import Text.Pandoc.JSON
-
-
- main :: IO ()
- main = toJSONFilter linkDocument
-
- linkDocument :: Pandoc -> Pandoc
- linkDocument (Pandoc meta blocks) =
- let hm = parseSymbolRefs blocks
- in Pandoc meta (walk (link hm) blocks)
-
- link :: HashMap Text Text -> Inline -> Inline
- link hm (Code attrs xs)
- | Just sp <- HashMap.lookup xs hm = RawInline (Format "html") sp
- link _ x = x
-
- parseSymbolRefs :: [Block] -> HashMap Text Text
- parseSymbolRefs = go mempty . concat . mapMaybe getHTML where
- getHTML (RawBlock (Format x) xs)
- | x == "html" = Just (parseTags (T.unpack xs))
- getHTML _ = Nothing
-
- go map (TagOpen "a" meta:TagText t:TagClose "a":xs)
- | Just id <- lookup "id" meta, Just cls <- lookup "class" meta
- = go (HashMap.insert (T.pack t) (T.pack (renderTags tags)) map) xs
- | otherwise = go map xs
- where
- tags = [ TagOpen "span" [("class", "Agda")], TagOpen "a" meta', TagText t, TagClose "a", TagClose "span" ]
- meta' = filter ((/= "id") . fst) meta
- go map (_:xs) = go map xs
- go map [] = map
|