{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeApplications #-}
module Network.Gitit.Layout ( defaultPageLayout
, defaultRenderPage
, formattedPage
, filledPageTemplate
, uploadsAllowed
)
where
import Network.Gitit.Server
import Network.Gitit.Framework
import Network.Gitit.State
import Network.Gitit.Types
import Network.HTTP (urlEncodeVars)
import qualified Text.StringTemplate as T
import Data.Maybe (isNothing)
import Text.Blaze.Html5 hiding (s, article, map)
import Text.Blaze.Html5.Attributes hiding (id)
import Data.String (IsString(fromString))
import Text.Blaze.Html.Renderer.String (renderHtml)
defaultPageLayout :: PageLayout
defaultPageLayout :: PageLayout
defaultPageLayout = PageLayout
{ pgPageName :: [Char]
pgPageName = [Char]
""
, pgRevision :: Maybe [Char]
pgRevision = Maybe [Char]
forall a. Maybe a
Nothing
, pgPrintable :: Bool
pgPrintable = Bool
False
, pgMessages :: [[Char]]
pgMessages = []
, pgTitle :: [Char]
pgTitle = [Char]
""
, pgScripts :: [[Char]]
pgScripts = []
, pgShowPageTools :: Bool
pgShowPageTools = Bool
True
, pgShowSiteNav :: Bool
pgShowSiteNav = Bool
True
, pgMarkupHelp :: Maybe Text
pgMarkupHelp = Maybe Text
forall a. Maybe a
Nothing
, pgTabs :: [Tab]
pgTabs = [Tab
ViewTab, Tab
EditTab, Tab
HistoryTab, Tab
DiscussTab]
, pgSelectedTab :: Tab
pgSelectedTab = Tab
ViewTab
, pgLinkToFeed :: Bool
pgLinkToFeed = Bool
False
}
formattedPage :: PageLayout -> Html -> Handler
formattedPage :: PageLayout -> Html -> Handler
formattedPage PageLayout
layout Html
htmlContents = do
renderer <- (GititState -> PageLayout -> Html -> Handler)
-> ServerPartT
(ReaderT WikiState IO) (PageLayout -> Html -> Handler)
forall (m :: * -> *) a. MonadIO m => (GititState -> a) -> m a
queryGititState GititState -> PageLayout -> Html -> Handler
renderPage
renderer layout htmlContents
defaultRenderPage :: T.StringTemplate String -> PageLayout -> Html -> Handler
defaultRenderPage :: StringTemplate [Char] -> PageLayout -> Html -> Handler
defaultRenderPage StringTemplate [Char]
templ PageLayout
layout Html
htmlContents = do
cfg <- GititServerPart Config
getConfig
base' <- getWikiBase
ok . setContentType "text/html; charset=utf-8" . toResponse . T.render .
filledPageTemplate base' cfg layout htmlContents $ templ
filledPageTemplate :: String -> Config -> PageLayout -> Html ->
T.StringTemplate String -> T.StringTemplate String
filledPageTemplate :: [Char]
-> Config
-> PageLayout
-> Html
-> StringTemplate [Char]
-> StringTemplate [Char]
filledPageTemplate [Char]
base' Config
cfg PageLayout
layout Html
htmlContents StringTemplate [Char]
templ =
let rev :: Maybe [Char]
rev = PageLayout -> Maybe [Char]
pgRevision PageLayout
layout
page :: [Char]
page = PageLayout -> [Char]
pgPageName PageLayout
layout
prefixedScript :: [Char] -> [Char]
prefixedScript [Char]
x = case [Char]
x of
Char
'h':Char
't':Char
't':Char
'p':[Char]
_ -> [Char]
x
[Char]
_ -> [Char]
base' [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"/js/" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
x
scripts :: [[Char]]
scripts = [[Char]
"jquery.min.js", [Char]
"jquery-ui.min.js", [Char]
"footnotes.js"] [[Char]] -> [[Char]] -> [[Char]]
forall a. [a] -> [a] -> [a]
++ PageLayout -> [[Char]]
pgScripts PageLayout
layout
scriptLink :: [Char] -> Html
scriptLink [Char]
x = Html -> Html
script (Html -> Html) -> Attribute -> Html -> Html
forall h. Attributable h => h -> Attribute -> h
! AttributeValue -> Attribute
src ([Char] -> AttributeValue
forall a. IsString a => [Char] -> a
fromString ([Char] -> AttributeValue) -> [Char] -> AttributeValue
forall a b. (a -> b) -> a -> b
$ [Char] -> [Char]
prefixedScript [Char]
x) (Html -> Html) -> Attribute -> Html -> Html
forall h. Attributable h => h -> Attribute -> h
!
AttributeValue -> Attribute
type_ AttributeValue
"text/javascript" (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ Html
forall a. Monoid a => a
mempty
javascriptlinks :: [Char]
javascriptlinks = Html -> [Char]
renderHtml (Html -> [Char]) -> Html -> [Char]
forall a b. (a -> b) -> a -> b
$ [Html] -> Html
forall a. Monoid a => [a] -> a
mconcat ([Html] -> Html) -> [Html] -> Html
forall a b. (a -> b) -> a -> b
$ ([Char] -> Html) -> [[Char]] -> [Html]
forall a b. (a -> b) -> [a] -> [b]
map [Char] -> Html
scriptLink [[Char]]
scripts
article :: [Char]
article = if [Char] -> Bool
isDiscussPage [Char]
page then Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
1 [Char]
page else [Char]
page
discussion :: [Char]
discussion = Char
'@'Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
:[Char]
article
tabli :: Tab -> Html -> Html
tabli Tab
tab = if Tab
tab Tab -> Tab -> Bool
forall a. Eq a => a -> a -> Bool
== PageLayout -> Tab
pgSelectedTab PageLayout
layout
then Html -> Html
li (Html -> Html) -> Attribute -> Html -> Html
forall h. Attributable h => h -> Attribute -> h
! AttributeValue -> Attribute
class_ AttributeValue
"selected"
else Html -> Html
li
tabs' :: [Tab]
tabs' = [Tab
x | Tab
x <- PageLayout -> [Tab]
pgTabs PageLayout
layout,
Bool -> Bool
not (Tab
x Tab -> Tab -> Bool
forall a. Eq a => a -> a -> Bool
== Tab
EditTab Bool -> Bool -> Bool
&& [Char]
page [Char] -> [[Char]] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` Config -> [[Char]]
noEdit Config
cfg)]
tabs :: Html
tabs = (Html -> Html
ul (Html -> Html) -> Attribute -> Html -> Html
forall h. Attributable h => h -> Attribute -> h
! AttributeValue -> Attribute
class_ AttributeValue
"tabs") (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ (Tab -> Html) -> [Tab] -> Html
forall m a. Monoid m => (a -> m) -> [a] -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap ((Tab -> Html -> Html)
-> [Char] -> [Char] -> Maybe [Char] -> Tab -> Html
linkForTab Tab -> Html -> Html
tabli [Char]
base' [Char]
page Maybe [Char]
rev) [Tab]
tabs'
setStrAttr :: [Char] -> [Char] -> StringTemplate b -> StringTemplate b
setStrAttr [Char]
attr = [Char] -> [Char] -> StringTemplate b -> StringTemplate b
forall a b.
(ToSElem a, Stringable b) =>
[Char] -> a -> StringTemplate b -> StringTemplate b
T.setAttribute [Char]
attr ([Char] -> StringTemplate b -> StringTemplate b)
-> ([Char] -> [Char])
-> [Char]
-> StringTemplate b
-> StringTemplate b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Html -> [Char]
renderHtml (Html -> [Char]) -> ([Char] -> Html) -> [Char] -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. IsString a => [Char] -> a
fromString @Html
setBoolAttr :: [Char] -> Bool -> StringTemplate b -> StringTemplate b
setBoolAttr [Char]
attr Bool
test = if Bool
test then [Char] -> [Char] -> StringTemplate b -> StringTemplate b
forall a b.
(ToSElem a, Stringable b) =>
[Char] -> a -> StringTemplate b -> StringTemplate b
T.setAttribute [Char]
attr ([Char]
"true"::[Char]) else StringTemplate b -> StringTemplate b
forall a. a -> a
id
in [Char] -> [Char] -> StringTemplate [Char] -> StringTemplate [Char]
forall a b.
(ToSElem a, Stringable b) =>
[Char] -> a -> StringTemplate b -> StringTemplate b
T.setAttribute [Char]
"base" [Char]
base' (StringTemplate [Char] -> StringTemplate [Char])
-> (StringTemplate [Char] -> StringTemplate [Char])
-> StringTemplate [Char]
-> StringTemplate [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
[Char] -> Bool -> StringTemplate [Char] -> StringTemplate [Char]
forall a b.
(ToSElem a, Stringable b) =>
[Char] -> a -> StringTemplate b -> StringTemplate b
T.setAttribute [Char]
"feed" (PageLayout -> Bool
pgLinkToFeed PageLayout
layout) (StringTemplate [Char] -> StringTemplate [Char])
-> (StringTemplate [Char] -> StringTemplate [Char])
-> StringTemplate [Char]
-> StringTemplate [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
[Char] -> [Char] -> StringTemplate [Char] -> StringTemplate [Char]
forall {b}.
Stringable b =>
[Char] -> [Char] -> StringTemplate b -> StringTemplate b
setStrAttr [Char]
"wikititle" (Config -> [Char]
wikiTitle Config
cfg) (StringTemplate [Char] -> StringTemplate [Char])
-> (StringTemplate [Char] -> StringTemplate [Char])
-> StringTemplate [Char]
-> StringTemplate [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
[Char] -> [Char] -> StringTemplate [Char] -> StringTemplate [Char]
forall {b}.
Stringable b =>
[Char] -> [Char] -> StringTemplate b -> StringTemplate b
setStrAttr [Char]
"pagetitle" (PageLayout -> [Char]
pgTitle PageLayout
layout) (StringTemplate [Char] -> StringTemplate [Char])
-> (StringTemplate [Char] -> StringTemplate [Char])
-> StringTemplate [Char]
-> StringTemplate [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
[Char] -> [Char] -> StringTemplate [Char] -> StringTemplate [Char]
forall a b.
(ToSElem a, Stringable b) =>
[Char] -> a -> StringTemplate b -> StringTemplate b
T.setAttribute [Char]
"javascripts" [Char]
javascriptlinks (StringTemplate [Char] -> StringTemplate [Char])
-> (StringTemplate [Char] -> StringTemplate [Char])
-> StringTemplate [Char]
-> StringTemplate [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
[Char] -> [Char] -> StringTemplate [Char] -> StringTemplate [Char]
forall {b}.
Stringable b =>
[Char] -> [Char] -> StringTemplate b -> StringTemplate b
setStrAttr [Char]
"pagename" [Char]
page (StringTemplate [Char] -> StringTemplate [Char])
-> (StringTemplate [Char] -> StringTemplate [Char])
-> StringTemplate [Char]
-> StringTemplate [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
[Char] -> [Char] -> StringTemplate [Char] -> StringTemplate [Char]
forall {b}.
Stringable b =>
[Char] -> [Char] -> StringTemplate b -> StringTemplate b
setStrAttr [Char]
"articlename" [Char]
article (StringTemplate [Char] -> StringTemplate [Char])
-> (StringTemplate [Char] -> StringTemplate [Char])
-> StringTemplate [Char]
-> StringTemplate [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
[Char] -> [Char] -> StringTemplate [Char] -> StringTemplate [Char]
forall {b}.
Stringable b =>
[Char] -> [Char] -> StringTemplate b -> StringTemplate b
setStrAttr [Char]
"discussionname" [Char]
discussion (StringTemplate [Char] -> StringTemplate [Char])
-> (StringTemplate [Char] -> StringTemplate [Char])
-> StringTemplate [Char]
-> StringTemplate [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
[Char] -> [Char] -> StringTemplate [Char] -> StringTemplate [Char]
forall {b}.
Stringable b =>
[Char] -> [Char] -> StringTemplate b -> StringTemplate b
setStrAttr [Char]
"pageUrl" ([Char] -> [Char]
urlForPage [Char]
page) (StringTemplate [Char] -> StringTemplate [Char])
-> (StringTemplate [Char] -> StringTemplate [Char])
-> StringTemplate [Char]
-> StringTemplate [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
[Char] -> [Char] -> StringTemplate [Char] -> StringTemplate [Char]
forall {b}.
Stringable b =>
[Char] -> [Char] -> StringTemplate b -> StringTemplate b
setStrAttr [Char]
"articleUrl" ([Char] -> [Char]
urlForPage [Char]
article) (StringTemplate [Char] -> StringTemplate [Char])
-> (StringTemplate [Char] -> StringTemplate [Char])
-> StringTemplate [Char]
-> StringTemplate [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
[Char] -> [Char] -> StringTemplate [Char] -> StringTemplate [Char]
forall {b}.
Stringable b =>
[Char] -> [Char] -> StringTemplate b -> StringTemplate b
setStrAttr [Char]
"discussionUrl" ([Char] -> [Char]
urlForPage [Char]
discussion) (StringTemplate [Char] -> StringTemplate [Char])
-> (StringTemplate [Char] -> StringTemplate [Char])
-> StringTemplate [Char]
-> StringTemplate [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
[Char] -> Bool -> StringTemplate [Char] -> StringTemplate [Char]
forall {b}.
Stringable b =>
[Char] -> Bool -> StringTemplate b -> StringTemplate b
setBoolAttr [Char]
"ispage" ([Char] -> Bool
isPage [Char]
page) (StringTemplate [Char] -> StringTemplate [Char])
-> (StringTemplate [Char] -> StringTemplate [Char])
-> StringTemplate [Char]
-> StringTemplate [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
[Char] -> Bool -> StringTemplate [Char] -> StringTemplate [Char]
forall {b}.
Stringable b =>
[Char] -> Bool -> StringTemplate b -> StringTemplate b
setBoolAttr [Char]
"isarticlepage" ([Char] -> Bool
isPage [Char]
page Bool -> Bool -> Bool
&& Bool -> Bool
not ([Char] -> Bool
isDiscussPage [Char]
page)) (StringTemplate [Char] -> StringTemplate [Char])
-> (StringTemplate [Char] -> StringTemplate [Char])
-> StringTemplate [Char]
-> StringTemplate [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
[Char] -> Bool -> StringTemplate [Char] -> StringTemplate [Char]
forall {b}.
Stringable b =>
[Char] -> Bool -> StringTemplate b -> StringTemplate b
setBoolAttr [Char]
"isdiscusspage" ([Char] -> Bool
isDiscussPage [Char]
page) (StringTemplate [Char] -> StringTemplate [Char])
-> (StringTemplate [Char] -> StringTemplate [Char])
-> StringTemplate [Char]
-> StringTemplate [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
[Char] -> Bool -> StringTemplate [Char] -> StringTemplate [Char]
forall {b}.
Stringable b =>
[Char] -> Bool -> StringTemplate b -> StringTemplate b
setBoolAttr [Char]
"pagetools" (PageLayout -> Bool
pgShowPageTools PageLayout
layout) (StringTemplate [Char] -> StringTemplate [Char])
-> (StringTemplate [Char] -> StringTemplate [Char])
-> StringTemplate [Char]
-> StringTemplate [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
[Char] -> Bool -> StringTemplate [Char] -> StringTemplate [Char]
forall {b}.
Stringable b =>
[Char] -> Bool -> StringTemplate b -> StringTemplate b
setBoolAttr [Char]
"sitenav" (PageLayout -> Bool
pgShowSiteNav PageLayout
layout) (StringTemplate [Char] -> StringTemplate [Char])
-> (StringTemplate [Char] -> StringTemplate [Char])
-> StringTemplate [Char]
-> StringTemplate [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
(StringTemplate [Char] -> StringTemplate [Char])
-> (Text -> StringTemplate [Char] -> StringTemplate [Char])
-> Maybe Text
-> StringTemplate [Char]
-> StringTemplate [Char]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe StringTemplate [Char] -> StringTemplate [Char]
forall a. a -> a
id ([Char] -> Text -> StringTemplate [Char] -> StringTemplate [Char]
forall a b.
(ToSElem a, Stringable b) =>
[Char] -> a -> StringTemplate b -> StringTemplate b
T.setAttribute [Char]
"markuphelp") (PageLayout -> Maybe Text
pgMarkupHelp PageLayout
layout) (StringTemplate [Char] -> StringTemplate [Char])
-> (StringTemplate [Char] -> StringTemplate [Char])
-> StringTemplate [Char]
-> StringTemplate [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
[Char] -> Bool -> StringTemplate [Char] -> StringTemplate [Char]
forall {b}.
Stringable b =>
[Char] -> Bool -> StringTemplate b -> StringTemplate b
setBoolAttr [Char]
"printable" (PageLayout -> Bool
pgPrintable PageLayout
layout) (StringTemplate [Char] -> StringTemplate [Char])
-> (StringTemplate [Char] -> StringTemplate [Char])
-> StringTemplate [Char]
-> StringTemplate [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
(StringTemplate [Char] -> StringTemplate [Char])
-> ([Char] -> StringTemplate [Char] -> StringTemplate [Char])
-> Maybe [Char]
-> StringTemplate [Char]
-> StringTemplate [Char]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe StringTemplate [Char] -> StringTemplate [Char]
forall a. a -> a
id ([Char] -> [Char] -> StringTemplate [Char] -> StringTemplate [Char]
forall a b.
(ToSElem a, Stringable b) =>
[Char] -> a -> StringTemplate b -> StringTemplate b
T.setAttribute [Char]
"revision") Maybe [Char]
rev (StringTemplate [Char] -> StringTemplate [Char])
-> (StringTemplate [Char] -> StringTemplate [Char])
-> StringTemplate [Char]
-> StringTemplate [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
(if [Tab] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (PageLayout -> [Tab]
pgTabs PageLayout
layout) then StringTemplate [Char] -> StringTemplate [Char]
forall a. a -> a
id else [Char] -> [Char] -> StringTemplate [Char] -> StringTemplate [Char]
forall a b.
(ToSElem a, Stringable b) =>
[Char] -> a -> StringTemplate b -> StringTemplate b
T.setAttribute [Char]
"tabs"
(Html -> [Char]
renderHtml Html
tabs)) (StringTemplate [Char] -> StringTemplate [Char])
-> (StringTemplate [Char] -> StringTemplate [Char])
-> StringTemplate [Char]
-> StringTemplate [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
(\[[Char]] -> StringTemplate [Char] -> StringTemplate [Char]
f StringTemplate [Char] -> StringTemplate [Char]
x [[Char]]
xs -> if [[Char]] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [[Char]]
xs then StringTemplate [Char] -> StringTemplate [Char]
x else [[Char]] -> StringTemplate [Char] -> StringTemplate [Char]
f [[Char]]
xs) ([Char]
-> [[Char]] -> StringTemplate [Char] -> StringTemplate [Char]
forall a b.
(ToSElem a, Stringable b) =>
[Char] -> a -> StringTemplate b -> StringTemplate b
T.setAttribute [Char]
"messages") StringTemplate [Char] -> StringTemplate [Char]
forall a. a -> a
id (PageLayout -> [[Char]]
pgMessages PageLayout
layout) (StringTemplate [Char] -> StringTemplate [Char])
-> (StringTemplate [Char] -> StringTemplate [Char])
-> StringTemplate [Char]
-> StringTemplate [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
[Char] -> Bool -> StringTemplate [Char] -> StringTemplate [Char]
forall a b.
(ToSElem a, Stringable b) =>
[Char] -> a -> StringTemplate b -> StringTemplate b
T.setAttribute [Char]
"usecache" (Config -> Bool
useCache Config
cfg) (StringTemplate [Char] -> StringTemplate [Char])
-> (StringTemplate [Char] -> StringTemplate [Char])
-> StringTemplate [Char]
-> StringTemplate [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
[Char] -> [Char] -> StringTemplate [Char] -> StringTemplate [Char]
forall a b.
(ToSElem a, Stringable b) =>
[Char] -> a -> StringTemplate b -> StringTemplate b
T.setAttribute [Char]
"content" (Html -> [Char]
renderHtml Html
htmlContents) (StringTemplate [Char] -> StringTemplate [Char])
-> (StringTemplate [Char] -> StringTemplate [Char])
-> StringTemplate [Char]
-> StringTemplate [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
[Char] -> Bool -> StringTemplate [Char] -> StringTemplate [Char]
forall {b}.
Stringable b =>
[Char] -> Bool -> StringTemplate b -> StringTemplate b
setBoolAttr [Char]
"wikiupload" ( Config -> Bool
uploadsAllowed Config
cfg) (StringTemplate [Char] -> StringTemplate [Char])
-> StringTemplate [Char] -> StringTemplate [Char]
forall a b. (a -> b) -> a -> b
$
StringTemplate [Char]
templ
linkForTab :: (Tab -> Html -> Html) -> String -> String -> Maybe String -> Tab -> Html
linkForTab :: (Tab -> Html -> Html)
-> [Char] -> [Char] -> Maybe [Char] -> Tab -> Html
linkForTab Tab -> Html -> Html
tabli [Char]
base' [Char]
page Maybe [Char]
_ Tab
HistoryTab =
Tab -> Html -> Html
tabli Tab
HistoryTab (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ Html -> Html
a (Html -> Html) -> Attribute -> Html -> Html
forall h. Attributable h => h -> Attribute -> h
! AttributeValue -> Attribute
href ([Char] -> AttributeValue
forall a. IsString a => [Char] -> a
fromString ([Char] -> AttributeValue) -> [Char] -> AttributeValue
forall a b. (a -> b) -> a -> b
$ [Char]
base' [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"/_history" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char] -> [Char]
urlForPage [Char]
page) (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ Html
"history"
linkForTab Tab -> Html -> Html
tabli [Char]
_ [Char]
_ Maybe [Char]
_ Tab
DiffTab =
Tab -> Html -> Html
tabli Tab
DiffTab (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ Html -> Html
a (Html -> Html) -> Attribute -> Html -> Html
forall h. Attributable h => h -> Attribute -> h
! AttributeValue -> Attribute
href AttributeValue
"" (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ Html
"diff"
linkForTab Tab -> Html -> Html
tabli [Char]
base' [Char]
page Maybe [Char]
rev Tab
ViewTab =
let origPage :: [Char] -> [Char]
origPage [Char]
s = if [Char] -> Bool
isDiscussPage [Char]
s
then Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
1 [Char]
s
else [Char]
s
in if [Char] -> Bool
isDiscussPage [Char]
page
then Tab -> Html -> Html
tabli Tab
DiscussTab (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ Html -> Html
a (Html -> Html) -> Attribute -> Html -> Html
forall h. Attributable h => h -> Attribute -> h
!
AttributeValue -> Attribute
href ([Char] -> AttributeValue
forall a. IsString a => [Char] -> a
fromString ([Char] -> AttributeValue) -> [Char] -> AttributeValue
forall a b. (a -> b) -> a -> b
$ [Char]
base' [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char] -> [Char]
urlForPage ([Char] -> [Char]
origPage [Char]
page)) (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ Html
"page"
else Tab -> Html -> Html
tabli Tab
ViewTab (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ Html -> Html
a (Html -> Html) -> Attribute -> Html -> Html
forall h. Attributable h => h -> Attribute -> h
!
AttributeValue -> Attribute
href ([Char] -> AttributeValue
forall a. IsString a => [Char] -> a
fromString ([Char] -> AttributeValue) -> [Char] -> AttributeValue
forall a b. (a -> b) -> a -> b
$ [Char]
base' [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char] -> [Char]
urlForPage [Char]
page [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
case Maybe [Char]
rev of
Just [Char]
r -> [Char]
"?revision=" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
r
Maybe [Char]
Nothing -> [Char]
"") (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ Html
"view"
linkForTab Tab -> Html -> Html
tabli [Char]
base' [Char]
page Maybe [Char]
_ Tab
DiscussTab =
Tab -> Html -> Html
tabli (if [Char] -> Bool
isDiscussPage [Char]
page then Tab
ViewTab else Tab
DiscussTab) (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$
Html -> Html
a (Html -> Html) -> Attribute -> Html -> Html
forall h. Attributable h => h -> Attribute -> h
! AttributeValue -> Attribute
href ([Char] -> AttributeValue
forall a. IsString a => [Char] -> a
fromString ([Char] -> AttributeValue) -> [Char] -> AttributeValue
forall a b. (a -> b) -> a -> b
$ [Char]
base' [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ if [Char] -> Bool
isDiscussPage [Char]
page then [Char]
"" else [Char]
"/_discuss" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
[Char] -> [Char]
urlForPage [Char]
page) (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ Html
"discuss"
linkForTab Tab -> Html -> Html
tabli [Char]
base' [Char]
page Maybe [Char]
rev Tab
EditTab =
Tab -> Html -> Html
tabli Tab
EditTab (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ Html -> Html
a (Html -> Html) -> Attribute -> Html -> Html
forall h. Attributable h => h -> Attribute -> h
!
AttributeValue -> Attribute
href ([Char] -> AttributeValue
forall a. IsString a => [Char] -> a
fromString ([Char] -> AttributeValue) -> [Char] -> AttributeValue
forall a b. (a -> b) -> a -> b
$ [Char]
base' [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"/_edit" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char] -> [Char]
urlForPage [Char]
page [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
case Maybe [Char]
rev of
Just [Char]
r -> [Char]
"?revision=" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
r [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"&" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
[([Char], [Char])] -> [Char]
urlEncodeVars [([Char]
"logMsg", [Char]
"Revert to " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
r)]
Maybe [Char]
Nothing -> [Char]
"") (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ if Maybe [Char] -> Bool
forall a. Maybe a -> Bool
isNothing Maybe [Char]
rev
then Html
"edit"
else Html
"revert"
uploadsAllowed :: Config -> Bool
uploadsAllowed :: Config -> Bool
uploadsAllowed = (Integer
0 Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
<) (Integer -> Bool) -> (Config -> Integer) -> Config -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Config -> Integer
maxUploadSize