1 module Rakka.Wiki.Interpreter.Base
7 import qualified Data.Map as M
11 import Rakka.SystemConfig
13 import Rakka.Wiki.Interpreter
16 interpreters :: [Interpreter]
17 interpreters = [ lineBreakInterp
26 lineBreakInterp :: Interpreter
27 lineBreakInterp = InlineCommandInterpreter {
30 = \ _ (InlineCommand _ attrs _) -> return $ LineBreak attrs
34 spanInterp :: Interpreter
35 spanInterp = InlineCommandInterpreter {
38 = \ _ (InlineCommand _ attrs contents) -> return $ Span attrs contents
42 divInterp :: Interpreter
43 divInterp = BlockCommandInterpreter {
46 = \ _ (BlockCommand _ attrs contents)
47 -> return $ Div attrs (map Block contents)
51 pageNameInterp :: Interpreter
52 pageNameInterp = InlineCommandInterpreter {
55 = \ ctx _ -> return $ Text (ctxPageName ctx)
59 otherLangsInterp :: Interpreter
61 = BlockCommandInterpreter {
62 bciName = "inOtherLanguages"
65 case fmap pageOtherLang (ctxMainPage ctx) of
70 -> do Languages langTable <- getSysConf (ctxSysConf ctx)
71 let merged = mergeTables langTable (M.toList linkTable)
72 return $ mkLangList merged
75 mergeTables :: Map LanguageTag LanguageName
76 -> [(LanguageTag, PageName)]
77 -> [(LanguageName, PageName)]
79 mergeTables m (x:xs) = let (langTag, pageName) = x
80 langName = fromMaybe langTag (M.lookup langTag m)
82 (langName, pageName) : mergeTables m xs
84 mkLangList :: [(LanguageName, PageName)] -> BlockElement
85 mkLangList xs = List Bullet (map mkLangLink xs)
87 mkLangLink :: (LanguageName, PageName) -> ListItem
88 mkLangLink (langName, pageName)
89 = [Inline (PageLink (Just pageName) Nothing (Just langName))]
92 -- <input type="button"
94 -- onclick="Rakka.editPage(\"http://example.org/\", \"Foo\")"
95 -- class="editButton" />
96 editPageInterp :: Interpreter
98 = InlineCommandInterpreter {
101 = \ ctx (InlineCommand _ args _) ->
102 do BaseURI baseURI <- getSysConf (ctxSysConf ctx)
104 let pageName = fromMaybe (ctxPageName ctx) (lookup "page" args)
105 label = fromMaybe "Edit this page" (lookup "label" args)
106 uri = uriToString id baseURI ""
107 attrs = [ ("type" , "button")
109 , ("onclick", "Rakka.editPage(\"" ++ uri ++ "\", \"" ++ pageName ++ "\")")
110 , ("class" , "editButton")