commit 4bb7d7b140c057169daa7678eb4dc0f99b51c785 Author: etienne Date: Wed Sep 21 18:02:50 2022 +0200 First commit Describes the base structure for the project, as well as some basic functions. TODO: everything really... diff --git a/.ghci b/.ghci new file mode 100644 index 0000000..9b901e7 --- /dev/null +++ b/.ghci @@ -0,0 +1,2 @@ +:set -XQuasiQuotes +:set -XOverloadedStrings diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9161039 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.stack-work/ +*~ +_*/ +photos/**.jpg diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..fe9cb29 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,11 @@ +# Changelog for `etienne-moqueur` + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to the +[Haskell Package Versioning Policy](https://pvp.haskell.org/). + +## Unreleased + +## 0.1.0.0 - 2022-09-12 diff --git a/README.md b/README.md new file mode 100644 index 0000000..faa304a --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +# My new attempt at a personal site + +It uses Hakyll, a Haskell static site compiler, along with other Haskell libs: + +* Shakespeare (Hamlet) to generate html +* Clay to preprocess css + +## Building + +Build using `stack`: +``` +stack build +``` +and then to compile the actual site: +``` +stack run build +``` + diff --git a/Setup.hs b/Setup.hs new file mode 100644 index 0000000..9a994af --- /dev/null +++ b/Setup.hs @@ -0,0 +1,2 @@ +import Distribution.Simple +main = defaultMain diff --git a/app/Main.hs b/app/Main.hs new file mode 100644 index 0000000..aad2f88 --- /dev/null +++ b/app/Main.hs @@ -0,0 +1,18 @@ +module Main + ( main + ) where + +import Hakyll + +import Core.Compilers +import Core.Routers + +main :: IO () +main = hakyll $ do + match "src/Kit/Pages/*.hs" $ do + route $ moveFromToWithExtension "src/Kit/Pages/" "" "html" + compile runGHC + + match "src/Css/*.hs" $ do + route $ moveFromToWithExtension "src/Css/" "css/" "css" + compile runGHC diff --git a/etienne-moqueur.cabal b/etienne-moqueur.cabal new file mode 100644 index 0000000..6000183 --- /dev/null +++ b/etienne-moqueur.cabal @@ -0,0 +1,80 @@ +cabal-version: 1.12 + +-- This file has been generated from package.yaml by hpack version 0.34.4. +-- +-- see: https://github.com/sol/hpack + +name: etienne-moqueur +version: 0.1.0.0 +author: etienne +maintainer: etienne@moqueur.chat +copyright: 2022 etienne +license: BSD3 +build-type: Simple +extra-source-files: + README.md + CHANGELOG.md + +library + exposed-modules: + Core.Compilers + Core.Render + Core.Routers + Css.Default + Kit.Atoms.Button + Kit.Pages.Index + Routes + other-modules: + Paths_etienne_moqueur + hs-source-dirs: + src + default-extensions: + OverloadedStrings QuasiQuotes + ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints + build-depends: + base >=4.7 && <5 + , blaze-html + , clay + , hakyll + , shakespeare + , text + default-language: Haskell2010 + +executable etienne-moqueur-exe + main-is: Main.hs + other-modules: + Paths_etienne_moqueur + hs-source-dirs: + app + default-extensions: + OverloadedStrings QuasiQuotes + ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N + build-depends: + base >=4.7 && <5 + , blaze-html + , clay + , etienne-moqueur + , hakyll + , shakespeare + , text + default-language: Haskell2010 + +test-suite etienne-moqueur-test + type: exitcode-stdio-1.0 + main-is: Spec.hs + other-modules: + Paths_etienne_moqueur + hs-source-dirs: + test + default-extensions: + OverloadedStrings QuasiQuotes + ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N + build-depends: + base >=4.7 && <5 + , blaze-html + , clay + , etienne-moqueur + , hakyll + , shakespeare + , text + default-language: Haskell2010 diff --git a/package.yaml b/package.yaml new file mode 100644 index 0000000..93e0a33 --- /dev/null +++ b/package.yaml @@ -0,0 +1,67 @@ +name: etienne-moqueur +version: 0.1.0.0 +license: BSD3 +author: "etienne" +maintainer: "etienne@moqueur.chat" +copyright: "2022 etienne" + +extra-source-files: +- README.md +- CHANGELOG.md + +# Metadata used when publishing your package +# synopsis: Short description of your package +# category: Web + +# To avoid duplicated efforts in documentation and dealing with the +# complications of embedding Haddock markup inside cabal files, it is +# common to point users to the README.md file. +# description: Please see the README on GitHub at + +dependencies: +- base >= 4.7 && < 5 +- hakyll +- shakespeare +- clay +- text +- blaze-html + +ghc-options: +- -Wall +- -Wcompat +- -Widentities +- -Wincomplete-record-updates +- -Wincomplete-uni-patterns +- -Wmissing-export-lists +- -Wmissing-home-modules +- -Wpartial-fields +- -Wredundant-constraints + +default-extensions: + OverloadedStrings + QuasiQuotes + +library: + source-dirs: src + +executables: + etienne-moqueur-exe: + main: Main.hs + source-dirs: app + ghc-options: + - -threaded + - -rtsopts + - -with-rtsopts=-N + dependencies: + - etienne-moqueur + +tests: + etienne-moqueur-test: + main: Spec.hs + source-dirs: test + ghc-options: + - -threaded + - -rtsopts + - -with-rtsopts=-N + dependencies: + - etienne-moqueur diff --git a/src/Core/Compilers.hs b/src/Core/Compilers.hs new file mode 100644 index 0000000..1bb23b6 --- /dev/null +++ b/src/Core/Compilers.hs @@ -0,0 +1,13 @@ +module Core.Compilers + ( runGHC + ) where + +import Hakyll + +-- Redundant... Those default extensions should be kept in sync with package.yaml, but `stack runghc` won't take those in account. +defaultExtensions :: [String] +defaultExtensions = ["--", "-XQuasiQuotes", "-XOverloadedStrings"] + +runGHC :: Compiler (Item String) +runGHC = getResourceString + >>= withItemBody (unixFilter "stack" $ "runghc" : defaultExtensions) diff --git a/src/Core/Render.hs b/src/Core/Render.hs new file mode 100644 index 0000000..5ff5107 --- /dev/null +++ b/src/Core/Render.hs @@ -0,0 +1,20 @@ +module Core.Render + ( renderHamlet + , renderClay + ) where + +import Clay ( Css + , compact + , renderWith + ) +import qualified Data.Text.Lazy.IO as T + ( putStr ) +import Routes +import Text.Blaze.Html.Renderer.String +import Text.Hamlet ( HtmlUrl ) + +renderHamlet :: HtmlUrl Routes -> IO () +renderHamlet ham = putStr . renderHtml $ ham render + +renderClay :: Css -> IO () +renderClay = T.putStr . renderWith compact [] diff --git a/src/Core/Routers.hs b/src/Core/Routers.hs new file mode 100644 index 0000000..0b47497 --- /dev/null +++ b/src/Core/Routers.hs @@ -0,0 +1,18 @@ +module Core.Routers + ( (>+) + , moveFromTo + , moveFromToWithExtension + ) where + +import Data.Char ( toLower ) +import Hakyll + +(>+) :: Routes -> Routes -> Routes +(>+) = composeRoutes + +moveFromTo :: FilePath -> FilePath -> Routes +moveFromTo from to = + gsubRoute from (const to) >+ customRoute (fmap toLower . toFilePath) + +moveFromToWithExtension :: FilePath -> FilePath -> String -> Routes +moveFromToWithExtension from to ext = moveFromTo from to >+ setExtension ext diff --git a/src/Css/Default.hs b/src/Css/Default.hs new file mode 100644 index 0000000..ee0084a --- /dev/null +++ b/src/Css/Default.hs @@ -0,0 +1,14 @@ +module Css.Default + ( main + ) where + +import Clay +import Core.Render ( renderClay ) +import Kit.Atoms.Button ( buttonCss ) + +defaultCss :: Css +defaultCss = do + buttonCss + +main :: IO () +main = renderClay defaultCss diff --git a/src/Kit/Atoms/Button.hs b/src/Kit/Atoms/Button.hs new file mode 100644 index 0000000..a0bfebe --- /dev/null +++ b/src/Kit/Atoms/Button.hs @@ -0,0 +1,17 @@ +module Kit.Atoms.Button (buttonWithText, buttonCss) where + +import Routes + +import Text.Hamlet +import Clay + +buttonWithText :: String -> HtmlUrl Routes +buttonWithText text = [hamlet| +