{-# LANGUAGE FlexibleContexts #-}
{-
Copyright (C) 2009 John MacFarlane <jgm@berkeley.edu>

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-}

{- Functions and data structures for wiki page layout.
-}

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 Text.XHtml hiding ( (</>), dir, method, password, rev )
import Text.XHtml.Strict ( stringToHtmlString )
import Data.Maybe (isNothing)

defaultPageLayout :: PageLayout
defaultPageLayout :: PageLayout
defaultPageLayout = PageLayout :: String
-> Maybe String
-> Bool
-> [String]
-> String
-> [String]
-> Bool
-> Bool
-> Maybe Text
-> [Tab]
-> Tab
-> Bool
-> PageLayout
PageLayout
  { pgPageName :: String
pgPageName       = String
""
  , pgRevision :: Maybe String
pgRevision       = Maybe String
forall a. Maybe a
Nothing
  , pgPrintable :: Bool
pgPrintable      = Bool
False
  , pgMessages :: [String]
pgMessages       = []
  , pgTitle :: String
pgTitle          = String
""
  , pgScripts :: [String]
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
  }

-- | Returns formatted page
formattedPage :: PageLayout -> Html -> Handler
formattedPage :: PageLayout -> Html -> Handler
formattedPage PageLayout
layout Html
htmlContents = do
  PageLayout -> Html -> Handler
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
  PageLayout -> Html -> Handler
renderer PageLayout
layout Html
htmlContents

-- | Given a compiled string template, returns a page renderer.
defaultRenderPage :: T.StringTemplate String -> PageLayout -> Html -> Handler
defaultRenderPage :: StringTemplate String -> PageLayout -> Html -> Handler
defaultRenderPage StringTemplate String
templ PageLayout
layout Html
htmlContents = do
  Config
cfg <- GititServerPart Config
getConfig
  String
base' <- ServerPartT (ReaderT WikiState IO) String
forall (m :: * -> *). ServerMonad m => m String
getWikiBase
  Response -> Handler
forall (m :: * -> *) a. FilterMonad Response m => a -> m a
ok (Response -> Handler)
-> (StringTemplate String -> Response)
-> StringTemplate String
-> Handler
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Response -> Response
setContentType String
"text/html; charset=utf-8" (Response -> Response)
-> (StringTemplate String -> Response)
-> StringTemplate String
-> Response
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Response
forall a. ToMessage a => a -> Response
toResponse (String -> Response)
-> (StringTemplate String -> String)
-> StringTemplate String
-> Response
forall b c a. (b -> c) -> (a -> b) -> a -> c
. StringTemplate String -> String
forall a. Stringable a => StringTemplate a -> a
T.render (StringTemplate String -> String)
-> (StringTemplate String -> StringTemplate String)
-> StringTemplate String
-> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
       String
-> Config
-> PageLayout
-> Html
-> StringTemplate String
-> StringTemplate String
filledPageTemplate String
base' Config
cfg PageLayout
layout Html
htmlContents (StringTemplate String -> Handler)
-> StringTemplate String -> Handler
forall a b. (a -> b) -> a -> b
$ StringTemplate String
templ

-- | Returns a page template with gitit variables filled in.
filledPageTemplate :: String -> Config -> PageLayout -> Html ->
                      T.StringTemplate String -> T.StringTemplate String
filledPageTemplate :: String
-> Config
-> PageLayout
-> Html
-> StringTemplate String
-> StringTemplate String
filledPageTemplate String
base' Config
cfg PageLayout
layout Html
htmlContents StringTemplate String
templ =
  let rev :: Maybe String
rev  = PageLayout -> Maybe String
pgRevision PageLayout
layout
      page :: String
page = PageLayout -> String
pgPageName PageLayout
layout
      prefixedScript :: String -> String
prefixedScript String
x = case String
x of
                           Char
'h':Char
't':Char
't':Char
'p':String
_  -> String
x
                           String
_                  -> String
base' String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"/js/" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
x

      scripts :: [String]
scripts  = [String
"jquery-1.2.6.min.js", String
"jquery-ui-combined-1.6rc2.min.js", String
"footnotes.js"] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ PageLayout -> [String]
pgScripts PageLayout
layout
      scriptLink :: String -> Html
scriptLink String
x = Html -> Html
script (Html -> Html) -> [HtmlAttr] -> Html -> Html
forall a. ADDATTRS a => a -> [HtmlAttr] -> a
! [String -> HtmlAttr
src (String -> String
prefixedScript String
x),
        String -> HtmlAttr
thetype String
"text/javascript"] (Html -> Html) -> Html -> Html
forall a b. HTML a => (Html -> b) -> a -> b
<< Html
noHtml
      javascriptlinks :: String
javascriptlinks = Html -> String
forall html. HTML html => html -> String
renderHtmlFragment (Html -> String) -> Html -> String
forall a b. (a -> b) -> a -> b
$ [Html] -> Html
forall a. HTML a => [a] -> Html
concatHtml ([Html] -> Html) -> [Html] -> Html
forall a b. (a -> b) -> a -> b
$ (String -> Html) -> [String] -> [Html]
forall a b. (a -> b) -> [a] -> [b]
map String -> Html
scriptLink [String]
scripts
      article :: String
article = if String -> Bool
isDiscussPage String
page then Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
1 String
page else String
page
      discussion :: String
discussion = Char
'@'Char -> String -> String
forall a. a -> [a] -> [a]
:String
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) -> [HtmlAttr] -> Html -> Html
forall a. ADDATTRS a => a -> [HtmlAttr] -> a
! [String -> HtmlAttr
theclass String
"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
&& String
page String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` Config -> [String]
noEdit Config
cfg)]
      tabs :: Html
tabs = Html -> Html
ulist (Html -> Html) -> [HtmlAttr] -> Html -> Html
forall a. ADDATTRS a => a -> [HtmlAttr] -> a
! [String -> HtmlAttr
theclass String
"tabs"] (Html -> Html) -> [Html] -> Html
forall a b. HTML a => (Html -> b) -> a -> b
<< (Tab -> Html) -> [Tab] -> [Html]
forall a b. (a -> b) -> [a] -> [b]
map ((Tab -> Html -> Html)
-> String -> String -> Maybe String -> Tab -> Html
linkForTab Tab -> Html -> Html
tabli String
base' String
page Maybe String
rev) [Tab]
tabs'
      setStrAttr :: String -> String -> StringTemplate b -> StringTemplate b
setStrAttr  String
attr = String -> String -> StringTemplate b -> StringTemplate b
forall a b.
(ToSElem a, Stringable b) =>
String -> a -> StringTemplate b -> StringTemplate b
T.setAttribute String
attr (String -> StringTemplate b -> StringTemplate b)
-> (String -> String)
-> String
-> StringTemplate b
-> StringTemplate b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
stringToHtmlString
      setBoolAttr :: String -> Bool -> StringTemplate b -> StringTemplate b
setBoolAttr String
attr Bool
test = if Bool
test then String -> String -> StringTemplate b -> StringTemplate b
forall a b.
(ToSElem a, Stringable b) =>
String -> a -> StringTemplate b -> StringTemplate b
T.setAttribute String
attr String
"true" else StringTemplate b -> StringTemplate b
forall a. a -> a
id
  in               String -> String -> StringTemplate String -> StringTemplate String
forall a b.
(ToSElem a, Stringable b) =>
String -> a -> StringTemplate b -> StringTemplate b
T.setAttribute String
"base" String
base' (StringTemplate String -> StringTemplate String)
-> (StringTemplate String -> StringTemplate String)
-> StringTemplate String
-> StringTemplate String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                   String -> Bool -> StringTemplate String -> StringTemplate String
forall a b.
(ToSElem a, Stringable b) =>
String -> a -> StringTemplate b -> StringTemplate b
T.setAttribute String
"feed" (PageLayout -> Bool
pgLinkToFeed PageLayout
layout) (StringTemplate String -> StringTemplate String)
-> (StringTemplate String -> StringTemplate String)
-> StringTemplate String
-> StringTemplate String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                   String -> String -> StringTemplate String -> StringTemplate String
forall b.
Stringable b =>
String -> String -> StringTemplate b -> StringTemplate b
setStrAttr String
"wikititle" (Config -> String
wikiTitle Config
cfg) (StringTemplate String -> StringTemplate String)
-> (StringTemplate String -> StringTemplate String)
-> StringTemplate String
-> StringTemplate String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                   String -> String -> StringTemplate String -> StringTemplate String
forall b.
Stringable b =>
String -> String -> StringTemplate b -> StringTemplate b
setStrAttr String
"pagetitle" (PageLayout -> String
pgTitle PageLayout
layout) (StringTemplate String -> StringTemplate String)
-> (StringTemplate String -> StringTemplate String)
-> StringTemplate String
-> StringTemplate String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                   String -> String -> StringTemplate String -> StringTemplate String
forall a b.
(ToSElem a, Stringable b) =>
String -> a -> StringTemplate b -> StringTemplate b
T.setAttribute String
"javascripts" String
javascriptlinks (StringTemplate String -> StringTemplate String)
-> (StringTemplate String -> StringTemplate String)
-> StringTemplate String
-> StringTemplate String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                   String -> String -> StringTemplate String -> StringTemplate String
forall b.
Stringable b =>
String -> String -> StringTemplate b -> StringTemplate b
setStrAttr String
"pagename" String
page (StringTemplate String -> StringTemplate String)
-> (StringTemplate String -> StringTemplate String)
-> StringTemplate String
-> StringTemplate String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                   String -> String -> StringTemplate String -> StringTemplate String
forall b.
Stringable b =>
String -> String -> StringTemplate b -> StringTemplate b
setStrAttr String
"articlename" String
article (StringTemplate String -> StringTemplate String)
-> (StringTemplate String -> StringTemplate String)
-> StringTemplate String
-> StringTemplate String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                   String -> String -> StringTemplate String -> StringTemplate String
forall b.
Stringable b =>
String -> String -> StringTemplate b -> StringTemplate b
setStrAttr String
"discussionname" String
discussion (StringTemplate String -> StringTemplate String)
-> (StringTemplate String -> StringTemplate String)
-> StringTemplate String
-> StringTemplate String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                   String -> String -> StringTemplate String -> StringTemplate String
forall b.
Stringable b =>
String -> String -> StringTemplate b -> StringTemplate b
setStrAttr String
"pageUrl" (String -> String
urlForPage String
page) (StringTemplate String -> StringTemplate String)
-> (StringTemplate String -> StringTemplate String)
-> StringTemplate String
-> StringTemplate String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                   String -> String -> StringTemplate String -> StringTemplate String
forall b.
Stringable b =>
String -> String -> StringTemplate b -> StringTemplate b
setStrAttr String
"articleUrl" (String -> String
urlForPage String
article) (StringTemplate String -> StringTemplate String)
-> (StringTemplate String -> StringTemplate String)
-> StringTemplate String
-> StringTemplate String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                   String -> String -> StringTemplate String -> StringTemplate String
forall b.
Stringable b =>
String -> String -> StringTemplate b -> StringTemplate b
setStrAttr String
"discussionUrl" (String -> String
urlForPage String
discussion) (StringTemplate String -> StringTemplate String)
-> (StringTemplate String -> StringTemplate String)
-> StringTemplate String
-> StringTemplate String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                   String -> Bool -> StringTemplate String -> StringTemplate String
forall b.
Stringable b =>
String -> Bool -> StringTemplate b -> StringTemplate b
setBoolAttr String
"ispage" (String -> Bool
isPage String
page) (StringTemplate String -> StringTemplate String)
-> (StringTemplate String -> StringTemplate String)
-> StringTemplate String
-> StringTemplate String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                   String -> Bool -> StringTemplate String -> StringTemplate String
forall b.
Stringable b =>
String -> Bool -> StringTemplate b -> StringTemplate b
setBoolAttr String
"isarticlepage" (String -> Bool
isPage String
page Bool -> Bool -> Bool
&& Bool -> Bool
not (String -> Bool
isDiscussPage String
page)) (StringTemplate String -> StringTemplate String)
-> (StringTemplate String -> StringTemplate String)
-> StringTemplate String
-> StringTemplate String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                   String -> Bool -> StringTemplate String -> StringTemplate String
forall b.
Stringable b =>
String -> Bool -> StringTemplate b -> StringTemplate b
setBoolAttr String
"isdiscusspage" (String -> Bool
isDiscussPage String
page) (StringTemplate String -> StringTemplate String)
-> (StringTemplate String -> StringTemplate String)
-> StringTemplate String
-> StringTemplate String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                   String -> Bool -> StringTemplate String -> StringTemplate String
forall b.
Stringable b =>
String -> Bool -> StringTemplate b -> StringTemplate b
setBoolAttr String
"pagetools" (PageLayout -> Bool
pgShowPageTools PageLayout
layout) (StringTemplate String -> StringTemplate String)
-> (StringTemplate String -> StringTemplate String)
-> StringTemplate String
-> StringTemplate String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                   String -> Bool -> StringTemplate String -> StringTemplate String
forall b.
Stringable b =>
String -> Bool -> StringTemplate b -> StringTemplate b
setBoolAttr String
"sitenav" (PageLayout -> Bool
pgShowSiteNav PageLayout
layout) (StringTemplate String -> StringTemplate String)
-> (StringTemplate String -> StringTemplate String)
-> StringTemplate String
-> StringTemplate String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                   (StringTemplate String -> StringTemplate String)
-> (Text -> StringTemplate String -> StringTemplate String)
-> Maybe Text
-> StringTemplate String
-> StringTemplate String
forall b a. b -> (a -> b) -> Maybe a -> b
maybe StringTemplate String -> StringTemplate String
forall a. a -> a
id (String -> Text -> StringTemplate String -> StringTemplate String
forall a b.
(ToSElem a, Stringable b) =>
String -> a -> StringTemplate b -> StringTemplate b
T.setAttribute String
"markuphelp") (PageLayout -> Maybe Text
pgMarkupHelp PageLayout
layout) (StringTemplate String -> StringTemplate String)
-> (StringTemplate String -> StringTemplate String)
-> StringTemplate String
-> StringTemplate String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                   String -> Bool -> StringTemplate String -> StringTemplate String
forall b.
Stringable b =>
String -> Bool -> StringTemplate b -> StringTemplate b
setBoolAttr String
"printable" (PageLayout -> Bool
pgPrintable PageLayout
layout) (StringTemplate String -> StringTemplate String)
-> (StringTemplate String -> StringTemplate String)
-> StringTemplate String
-> StringTemplate String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                   (StringTemplate String -> StringTemplate String)
-> (String -> StringTemplate String -> StringTemplate String)
-> Maybe String
-> StringTemplate String
-> StringTemplate String
forall b a. b -> (a -> b) -> Maybe a -> b
maybe StringTemplate String -> StringTemplate String
forall a. a -> a
id (String -> String -> StringTemplate String -> StringTemplate String
forall a b.
(ToSElem a, Stringable b) =>
String -> a -> StringTemplate b -> StringTemplate b
T.setAttribute String
"revision") Maybe String
rev (StringTemplate String -> StringTemplate String)
-> (StringTemplate String -> StringTemplate String)
-> StringTemplate String
-> StringTemplate String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                   (if [Tab] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (PageLayout -> [Tab]
pgTabs PageLayout
layout) then StringTemplate String -> StringTemplate String
forall a. a -> a
id else String -> String -> StringTemplate String -> StringTemplate String
forall a b.
(ToSElem a, Stringable b) =>
String -> a -> StringTemplate b -> StringTemplate b
T.setAttribute String
"tabs"
                       (Html -> String
forall html. HTML html => html -> String
renderHtmlFragment Html
tabs)) (StringTemplate String -> StringTemplate String)
-> (StringTemplate String -> StringTemplate String)
-> StringTemplate String
-> StringTemplate String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                   (\[String] -> StringTemplate String -> StringTemplate String
f StringTemplate String -> StringTemplate String
x [String]
xs -> if [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
xs then StringTemplate String -> StringTemplate String
x else [String] -> StringTemplate String -> StringTemplate String
f [String]
xs) (String
-> [String] -> StringTemplate String -> StringTemplate String
forall a b.
(ToSElem a, Stringable b) =>
String -> a -> StringTemplate b -> StringTemplate b
T.setAttribute String
"messages") StringTemplate String -> StringTemplate String
forall a. a -> a
id (PageLayout -> [String]
pgMessages PageLayout
layout) (StringTemplate String -> StringTemplate String)
-> (StringTemplate String -> StringTemplate String)
-> StringTemplate String
-> StringTemplate String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                   String -> Bool -> StringTemplate String -> StringTemplate String
forall a b.
(ToSElem a, Stringable b) =>
String -> a -> StringTemplate b -> StringTemplate b
T.setAttribute String
"usecache" (Config -> Bool
useCache Config
cfg) (StringTemplate String -> StringTemplate String)
-> (StringTemplate String -> StringTemplate String)
-> StringTemplate String
-> StringTemplate String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                   String -> String -> StringTemplate String -> StringTemplate String
forall a b.
(ToSElem a, Stringable b) =>
String -> a -> StringTemplate b -> StringTemplate b
T.setAttribute String
"content" (Html -> String
forall html. HTML html => html -> String
renderHtmlFragment Html
htmlContents) (StringTemplate String -> StringTemplate String)
-> (StringTemplate String -> StringTemplate String)
-> StringTemplate String
-> StringTemplate String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                   String -> Bool -> StringTemplate String -> StringTemplate String
forall b.
Stringable b =>
String -> Bool -> StringTemplate b -> StringTemplate b
setBoolAttr String
"wikiupload" ( Config -> Bool
uploadsAllowed Config
cfg) (StringTemplate String -> StringTemplate String)
-> StringTemplate String -> StringTemplate String
forall a b. (a -> b) -> a -> b
$
                   StringTemplate String
templ


-- auxiliary functions:

linkForTab :: (Tab -> Html -> Html) -> String -> String -> Maybe String -> Tab -> Html
linkForTab :: (Tab -> Html -> Html)
-> String -> String -> Maybe String -> Tab -> Html
linkForTab Tab -> Html -> Html
tabli String
base' String
page Maybe String
_ Tab
HistoryTab =
  Tab -> Html -> Html
tabli Tab
HistoryTab (Html -> Html) -> Html -> Html
forall a b. HTML a => (Html -> b) -> a -> b
<< Html -> Html
anchor (Html -> Html) -> [HtmlAttr] -> Html -> Html
forall a. ADDATTRS a => a -> [HtmlAttr] -> a
! [String -> HtmlAttr
href (String -> HtmlAttr) -> String -> HtmlAttr
forall a b. (a -> b) -> a -> b
$ String
base' String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"/_history" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
urlForPage String
page] (Html -> Html) -> String -> Html
forall a b. HTML a => (Html -> b) -> a -> b
<< String
"history"
linkForTab Tab -> Html -> Html
tabli String
_ String
_ Maybe String
_ Tab
DiffTab =
  Tab -> Html -> Html
tabli Tab
DiffTab (Html -> Html) -> Html -> Html
forall a b. HTML a => (Html -> b) -> a -> b
<< Html -> Html
anchor (Html -> Html) -> [HtmlAttr] -> Html -> Html
forall a. ADDATTRS a => a -> [HtmlAttr] -> a
! [String -> HtmlAttr
href String
""] (Html -> Html) -> String -> Html
forall a b. HTML a => (Html -> b) -> a -> b
<< String
"diff"
linkForTab Tab -> Html -> Html
tabli String
base' String
page Maybe String
rev Tab
ViewTab =
  let origPage :: String -> String
origPage String
s = if String -> Bool
isDiscussPage String
s
                      then Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
1 String
s
                      else String
s
  in if String -> Bool
isDiscussPage String
page
        then Tab -> Html -> Html
tabli Tab
DiscussTab (Html -> Html) -> Html -> Html
forall a b. HTML a => (Html -> b) -> a -> b
<< Html -> Html
anchor (Html -> Html) -> [HtmlAttr] -> Html -> Html
forall a. ADDATTRS a => a -> [HtmlAttr] -> a
!
              [String -> HtmlAttr
href (String -> HtmlAttr) -> String -> HtmlAttr
forall a b. (a -> b) -> a -> b
$ String
base' String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
urlForPage (String -> String
origPage String
page)] (Html -> Html) -> String -> Html
forall a b. HTML a => (Html -> b) -> a -> b
<< String
"page"
        else Tab -> Html -> Html
tabli Tab
ViewTab (Html -> Html) -> Html -> Html
forall a b. HTML a => (Html -> b) -> a -> b
<< Html -> Html
anchor (Html -> Html) -> [HtmlAttr] -> Html -> Html
forall a. ADDATTRS a => a -> [HtmlAttr] -> a
!
              [String -> HtmlAttr
href (String -> HtmlAttr) -> String -> HtmlAttr
forall a b. (a -> b) -> a -> b
$ String
base' String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
urlForPage String
page String -> String -> String
forall a. [a] -> [a] -> [a]
++
                      case Maybe String
rev of
                           Just String
r  -> String
"?revision=" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
r
                           Maybe String
Nothing -> String
""] (Html -> Html) -> String -> Html
forall a b. HTML a => (Html -> b) -> a -> b
<< String
"view"
linkForTab Tab -> Html -> Html
tabli String
base' String
page Maybe String
_ Tab
DiscussTab =
  Tab -> Html -> Html
tabli (if String -> Bool
isDiscussPage String
page then Tab
ViewTab else Tab
DiscussTab) (Html -> Html) -> Html -> Html
forall a b. HTML a => (Html -> b) -> a -> b
<<
  Html -> Html
anchor (Html -> Html) -> [HtmlAttr] -> Html -> Html
forall a. ADDATTRS a => a -> [HtmlAttr] -> a
! [String -> HtmlAttr
href (String -> HtmlAttr) -> String -> HtmlAttr
forall a b. (a -> b) -> a -> b
$ String
base' String -> String -> String
forall a. [a] -> [a] -> [a]
++ if String -> Bool
isDiscussPage String
page then String
"" else String
"/_discuss" String -> String -> String
forall a. [a] -> [a] -> [a]
++
                   String -> String
urlForPage String
page] (Html -> Html) -> String -> Html
forall a b. HTML a => (Html -> b) -> a -> b
<< String
"discuss"
linkForTab Tab -> Html -> Html
tabli String
base' String
page Maybe String
rev Tab
EditTab =
  Tab -> Html -> Html
tabli Tab
EditTab (Html -> Html) -> Html -> Html
forall a b. HTML a => (Html -> b) -> a -> b
<< Html -> Html
anchor (Html -> Html) -> [HtmlAttr] -> Html -> Html
forall a. ADDATTRS a => a -> [HtmlAttr] -> a
!
    [String -> HtmlAttr
href (String -> HtmlAttr) -> String -> HtmlAttr
forall a b. (a -> b) -> a -> b
$ String
base' String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"/_edit" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
urlForPage String
page String -> String -> String
forall a. [a] -> [a] -> [a]
++
            case Maybe String
rev of
                  Just String
r   -> String
"?revision=" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
r String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"&" String -> String -> String
forall a. [a] -> [a] -> [a]
++
                               [(String, String)] -> String
urlEncodeVars [(String
"logMsg", String
"Revert to " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
r)]
                  Maybe String
Nothing  -> String
""] (Html -> Html) -> String -> Html
forall a b. HTML a => (Html -> b) -> a -> b
<< if Maybe String -> Bool
forall a. Maybe a -> Bool
isNothing Maybe String
rev
                                         then String
"edit"
                                         else String
"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