module Dixi.Pandoc.Wikilinks (wikilinks) where import Text.Pandoc import Text.Pandoc.Walk import Network.URI wikilinks :: String -> Pandoc -> IO Pandoc wikilinks s = return . wikilinks' s wikilinks' :: String -> Pandoc -> Pandoc wikilinks' s = walk (wikify s) wikify :: String -> Inline -> Inline wikify base (Link s ("",t)) = Link s (url, t) where url = base ++ "/" ++ inlinesToURL s wikify base (Link s (l,"wikilink")) = Link s (base ++ "/" ++ l, "wikilink") wikify _ x = x -- | Derives a URL from a list of Pandoc Inline elements. inlinesToURL :: [Inline] -> String inlinesToURL = escapeURIString isUnescapedInURI . inlinesToString -- | Convert a list of inlines into a string. inlinesToString :: [Inline] -> String inlinesToString = concatMap go where go x = case x of Str s -> s Emph xs -> concatMap go xs Strong xs -> concatMap go xs Strikeout xs -> concatMap go xs Superscript xs -> concatMap go xs Subscript xs -> concatMap go xs SmallCaps xs -> concatMap go xs Quoted DoubleQuote xs -> '"' : (concatMap go xs ++ "\"") Quoted SingleQuote xs -> '\'' : (concatMap go xs ++ "'") Cite _ xs -> concatMap go xs Code _ s -> s Space -> "_" LineBreak -> "_" Math DisplayMath s -> "$$" ++ s ++ "$$" Math InlineMath s -> "$" ++ s ++ "$" RawInline (Format "tex") s -> s RawInline _ _ -> "" Link xs _ -> concatMap go xs Image xs _ -> concatMap go xs Note _ -> "" Span _ xs -> concatMap go xs