webpage (empty) → 0.0.1
raw patch · 6 files changed
+186/−0 lines, 6 filesdep +basedep +blaze-htmldep +lucidsetup-changed
Dependencies added: base, blaze-html, lucid, text
Files
- LICENSE +30/−0
- Setup.hs +2/−0
- src/Web/Page/Blaze.hs +30/−0
- src/Web/Page/Lucid.hs +39/−0
- src/Web/Page/Types.hs +28/−0
- webpage.cabal +57/−0
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright (c) 2014, Athan Clark++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++ * Redistributions in binary form must reproduce the above+ copyright notice, this list of conditions and the following+ disclaimer in the documentation and/or other materials provided+ with the distribution.++ * Neither the name of Athan Clark nor the names of other+ contributors may be used to endorse or promote products derived+ from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ src/Web/Page/Blaze.hs view
@@ -0,0 +1,30 @@+{-# LANGUAGE OverloadedStrings #-}++module Web.Page.Blaze+ ( module Web.Page.Types+ , template ) where++import Web.Page.Types++import qualified Text.Blaze.Html5 as H+import qualified Text.Blaze.Html5.Attributes as A++import qualified Data.Text as T++-- | You should really be using Lucid...+template :: WebPage H.Html T.Text+ -> H.Html+ -> H.Html+template page content = do+ H.docTypeHtml $ do+ (H.head $ do+ initScripts page+ (H.title $ H.toHtml $ pageTitle page)+ metaVars page+ H.link H.! (A.rel "icon") H.! (A.href $ H.toValue (favicon page))+ beforeStylesScripts page+ styles page+ afterStylesScripts page)+ H.body $ do+ content+ bodyScripts page
+ src/Web/Page/Lucid.hs view
@@ -0,0 +1,39 @@+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ExtendedDefaultRules #-}+{-# LANGUAGE BangPatterns #-}++module Web.Page.Lucid+ ( module Web.Page.Types+ , template ) where++import Web.Page.Types++import Lucid+import Lucid.Base++import qualified Data.Text as T++import Data.Monoid++-- | Generic page template implemented in Lucid.+template :: Monad m =>+ WebPage (HtmlT m ()) T.Text -- ^ Page information+ -> HtmlT m () -- ^ Content to insert in @\<body\>@+ -> HtmlT m () +template page content = doctypehtml_ $ mconcat $+ [ head_ [] $ mconcat $+ [ initScripts page+ , title_ $ toHtmlRaw $ pageTitle page+ , metaVars page+ , link_ [ rel_ "icon"+ , href_ $ favicon page+ ]+ , beforeStylesScripts page+ , styles page+ , afterStylesScripts page+ ]+ , body_ [] $ mconcat $+ [ content+ , bodyScripts page+ ]+ ]
+ src/Web/Page/Types.hs view
@@ -0,0 +1,28 @@+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ExtendedDefaultRules #-}+{-# LANGUAGE BangPatterns #-}++module Web.Page.Types where+++import Data.Monoid++-- | Generic layout for a web page. We keep the data type purely parametric to +-- allow for record-syntax overloading / reassignment, like this:+-- .+-- > page :: WebPage (Html ()) T.Text+-- >+-- > page' = page {pageTitle = "foo!"}+data WebPage markup attr = WebPage { pageTitle :: attr -- ^ Page title+ , favicon :: attr -- ^ Favicon url+ , metaVars :: markup -- ^ @\<meta\>@ tags+ , initScripts :: markup -- ^ JavaScript to include at the top of the page+ , beforeStylesScripts :: markup -- ^ JavaScript to include before @\<style\>@ tags+ , styles :: markup -- ^ Styles+ , afterStylesScripts :: markup -- ^ JavaScript to include after @\<style\>@ tags - ie: <http://modernizr.com Modernizr>+ , bodyScripts :: markup -- ^ JavaScript to include at the base of @\<body\>@+ }++instance (Monoid m, Monoid a) => Monoid (WebPage m a) where+ mempty = WebPage mempty mempty mempty mempty mempty mempty mempty mempty+ mappend x _ = x -- Some people just want to watch the world burn.
+ webpage.cabal view
@@ -0,0 +1,57 @@+Name: webpage+Version: 0.0.1+Author: Athan Clark <athan.clark@gmail.com>+Maintainer: Athan Clark <athan.clark@gmail.com>+License: MIT+License-File: LICENSE+Synopsis: Organized and simple web page scaffold for blaze and lucid+Description:+ This is a general organization scheme for web pages, implemented for Lucid, + and adapted for Blaze-html.+ .+ It's as easy as 1-2-3:+ .+ > import Web.Page.Lucid+ >+ > λ> renderText $ template mempty "some content"+ >+ > ↪ "<!DOCTYPE HTML><html><head><title></title><link href + > rel="icon"></head><body>some content</body></html>"+ .+ overload the particular areas with record syntax and stuff:+ .+ > λ> let page = WebPage+ > "foo"+ > mempty+ > mempty+ > mempty+ > mempty+ > mempty+ > mempty+ > (script_ [src_ "jquery.js"] "")+ >+ >+ > λ> template page "some content"+ >+ > ↪ "<!DOCTYPE HTML><html><head><title>foo</title><link href + > rel=\"icon\"></head><body>some content<script + > src=\"jquery.js\"></script></body></html>"+ .+Cabal-Version: >= 1.10+Build-Type: Simple++Library+ Default-Language: Haskell2010+ HS-Source-Dirs: src+ GHC-Options: -Wall+ Exposed-Modules: Web.Page.Types+ Web.Page.Lucid+ Web.Page.Blaze+ Build-Depends: base >= 4 && < 5+ , lucid >= 2.5+ , blaze-html+ , text++Source-Repository head+ Type: git+ Location: https://github.com/athanclark/webpage.git