From 65f1dfa5c4651b12dbcc181155afa2b5612a1466 Mon Sep 17 00:00:00 2001 From: Sridhar Ratnakumar Date: Thu, 20 Jun 2019 19:16:03 -0400 Subject: [PATCH] Obelisk -> static site generator (#3) * Drop obelisk files * Add example of Slick * Add articles to Slick's layout * remove chris * develop instructions --- .gitignore | 3 + .obelisk/impl/default.nix | 7 - .obelisk/impl/github.json | 7 - README.md | 14 +- Setup.hs | 2 + app/Main.hs | 131 ++++ backend/backend.cabal | 49 -- backend/frontend.jsexe | 1 - backend/frontendJs/frontend.jsexe | 1 - backend/src-bin/main.hs | 6 - backend/src/Backend.hs | 34 -- backend/src/Backend/Markdown.hs | 108 ---- backend/static | 1 - cabal.project | 2 - common/common.cabal | 17 - common/src/Common/Api.hs | 4 - common/src/Common/Route.hs | 54 -- config/common/route | 1 - config/readme.md | 9 - default.nix | 37 +- dep/hspec-megaparsec/default.nix | 7 - dep/hspec-megaparsec/github.json | 7 - dep/megaparsec/default.nix | 7 - dep/megaparsec/github.json | 7 - dep/mmark/default.nix | 7 - dep/mmark/github.json | 7 - dep/modern-uri/default.nix | 7 - dep/modern-uri/github.json | 7 - dep/neat-interpolation/default.nix | 7 - dep/neat-interpolation/github.json | 7 - frontend/frontend.cabal | 32 - frontend/src-bin/main.hs | 10 - frontend/src/Frontend.hs | 74 --- package.yaml | 42 ++ site/css/style.css | 568 ++++++++++++++++++ site/css/syntax.css | 32 + {articles => site/drafts}/LensAndFriends.md | 0 .../drafts}/MonadTransformers.md | 0 {articles => site/drafts}/PersonalNixCache.md | 0 {articles => site/drafts}/StringTypes.md | 0 site/images/battleship.jpg | Bin 0 -> 74808 bytes site/js/.gitkeep | 0 {articles => site/posts}/NixTutorial.md | 9 +- site/templates/footer.html | 8 + site/templates/header.html | 18 + site/templates/index.html | 23 + site/templates/meta-data.html | 5 + site/templates/post-list.html | 7 + site/templates/post.html | 46 ++ static/obelisk.jpg | Bin 17351 -> 0 bytes 50 files changed, 906 insertions(+), 526 deletions(-) delete mode 100644 .obelisk/impl/default.nix delete mode 100644 .obelisk/impl/github.json create mode 100644 Setup.hs create mode 100644 app/Main.hs delete mode 100644 backend/backend.cabal delete mode 120000 backend/frontend.jsexe delete mode 120000 backend/frontendJs/frontend.jsexe delete mode 100644 backend/src-bin/main.hs delete mode 100644 backend/src/Backend.hs delete mode 100644 backend/src/Backend/Markdown.hs delete mode 120000 backend/static delete mode 100644 cabal.project delete mode 100644 common/common.cabal delete mode 100644 common/src/Common/Api.hs delete mode 100644 common/src/Common/Route.hs delete mode 100644 config/common/route delete mode 100644 config/readme.md delete mode 100644 dep/hspec-megaparsec/default.nix delete mode 100644 dep/hspec-megaparsec/github.json delete mode 100644 dep/megaparsec/default.nix delete mode 100644 dep/megaparsec/github.json delete mode 100644 dep/mmark/default.nix delete mode 100644 dep/mmark/github.json delete mode 100644 dep/modern-uri/default.nix delete mode 100644 dep/modern-uri/github.json delete mode 100644 dep/neat-interpolation/default.nix delete mode 100644 dep/neat-interpolation/github.json delete mode 100644 frontend/frontend.cabal delete mode 100644 frontend/src-bin/main.hs delete mode 100644 frontend/src/Frontend.hs create mode 100644 package.yaml create mode 100644 site/css/style.css create mode 100644 site/css/syntax.css rename {articles => site/drafts}/LensAndFriends.md (100%) rename {articles => site/drafts}/MonadTransformers.md (100%) rename {articles => site/drafts}/PersonalNixCache.md (100%) rename {articles => site/drafts}/StringTypes.md (100%) create mode 100644 site/images/battleship.jpg create mode 100644 site/js/.gitkeep rename {articles => site/posts}/NixTutorial.md (94%) create mode 100644 site/templates/footer.html create mode 100644 site/templates/header.html create mode 100644 site/templates/index.html create mode 100644 site/templates/meta-data.html create mode 100644 site/templates/post-list.html create mode 100644 site/templates/post.html delete mode 100644 static/obelisk.jpg diff --git a/.gitignore b/.gitignore index fef9c20..19856d5 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,6 @@ result-ios result-exe .attr-cache ghcid-output.txt + +.shake +dist diff --git a/.obelisk/impl/default.nix b/.obelisk/impl/default.nix deleted file mode 100644 index 7a04778..0000000 --- a/.obelisk/impl/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -# DO NOT HAND-EDIT THIS FILE -import ((import {}).fetchFromGitHub ( - let json = builtins.fromJSON (builtins.readFile ./github.json); - in { inherit (json) owner repo rev sha256; - private = json.private or false; - } -)) diff --git a/.obelisk/impl/github.json b/.obelisk/impl/github.json deleted file mode 100644 index a1de3fa..0000000 --- a/.obelisk/impl/github.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "owner": "obsidiansystems", - "repo": "obelisk", - "branch": "develop", - "rev": "86a9584c6d7648bd5324ef57d62421fed1bf1978", - "sha256": "1lbii87j5530ncm6brfbzkd3wg16mgxazsf3l56zzv4c8cydilmh" -} diff --git a/README.md b/README.md index 0657ddd..44bbe2a 100644 --- a/README.md +++ b/README.md @@ -8,15 +8,21 @@ would explain the various Haskell concepts that I have come to understand since - [x] Think of first article to write - [ ] DOING: Write it -- [ ] DOING: Develop backend & frontend to serve an article +- [ ] DOING: Static site generation (Slick) - [ ] Deploy to production - [ ] Share and get feedback on first article -- [ ] Upgrade mmark (thus megaparsec, etc.) - ## Article Ideas -See articles/ for existing stubs. In addition, consider these ideas: +See site/drafts/ for existing stubs. In addition, consider these ideas: - Github CI for OSS haskell projects - + +## Running + +``` +nix-build +./result/bin/ExplainingHaskell-exe site +nix-shell -p nodePackages.serve --run 'serve dist' +``` 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..3a96070 --- /dev/null +++ b/app/Main.hs @@ -0,0 +1,131 @@ +{-# LANGUAGE DeriveGeneric #-} +{-# LANGUAGE DuplicateRecordFields #-} +{-# LANGUAGE GeneralizedNewtypeDeriving #-} +{-# LANGUAGE NamedFieldPuns #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE RecordWildCards #-} + +module Main where + +import Control.Lens +import Data.Aeson as A +import Data.Aeson.Lens +import Data.Function (on) +import Data.List (sortBy) +import Data.Map as M +import Data.Monoid +import Data.Set as S +import qualified Data.Text as T +import Data.Text.Lens +import Data.Time +import GHC.Generics (Generic) + +import Development.Shake +import Development.Shake.Classes +import Development.Shake.FilePath +import Slick + +main :: IO () +main = + shakeArgs shakeOptions {shakeVerbosity = Chatty} $ + -- Set up caches + do + postCache <- jsonCache' loadPost + -- Require all the things we need to build the whole site + "site" ~> need ["static", "posts", "dist/index.html"] + -- Require all static assets + "static" ~> do + staticFiles <- + getDirectoryFiles "." ["site/css//*", "site/js//*", "site/images//*"] + need (("dist" ) . dropDirectory1 <$> staticFiles) + -- Rule for handling static assets, just copy them from source to dest + ["dist/css//*", "dist/js//*", "dist/images//*"] |%> \out -> do + copyFileChanged ("site" dropDirectory1 out) out + -- Find and require every post to be built + "posts" ~> requirePosts + -- build the main table of contents + "dist/index.html" %> buildIndex postCache + -- rule for actually building posts + "dist/posts//*.html" %> buildPost postCache + +-- | Represents the template dependencies of the index page +data IndexInfo = IndexInfo + { posts :: [Post] + } deriving (Generic, Show) + +instance FromJSON IndexInfo + +instance ToJSON IndexInfo + +-- | A JSON serializable representation of a post's metadata +data Post = Post + { title :: String + , author :: String + , content :: String + , url :: String + , date :: String + , image :: Maybe String + } deriving (Generic, Eq, Ord, Show) + +instance FromJSON Post + +instance ToJSON Post + + +-- A simple wrapper data-type which implements 'ShakeValue'; +-- Used as a Shake Cache key to build a cache of post objects. +newtype PostFilePath = + PostFilePath String + deriving (Show, Eq, Hashable, Binary, NFData) + +-- | Discover all available post source files +postNames :: Action [FilePath] +postNames = getDirectoryFiles "." ["site/posts//*.md"] + +-- | convert 'build' filepaths into source file filepaths +destToSrc :: FilePath -> FilePath +destToSrc p = "site" dropDirectory1 p + +-- | convert source filepaths into build filepaths +srcToDest :: FilePath -> FilePath +srcToDest p = "dist" dropDirectory1 p + +-- | convert a source file path into a URL +srcToURL :: FilePath -> String +srcToURL = ("/" ++) . dropDirectory1 . (-<.> ".html") + +-- | Given a post source-file's file path as a cache key, load the Post object +-- for it. This is used with 'jsonCache' to provide post caching. +loadPost :: PostFilePath -> Action Post +loadPost (PostFilePath postPath) = do + let srcPath = destToSrc postPath -<.> "md" + postData <- readFile' srcPath >>= markdownToHTML . T.pack + let postURL = T.pack . srcToURL $ postPath + withURL = _Object . at "url" ?~ String postURL + withSrc = _Object . at "srcPath" ?~ String (T.pack srcPath) + convert . withSrc . withURL $ postData + +-- | given a cache of posts this will build a table of contents +buildIndex :: (PostFilePath -> Action Post) -> FilePath -> Action () +buildIndex postCache out = do + posts <- postNames >>= traverse (postCache . PostFilePath) + indexT <- compileTemplate' "site/templates/index.html" + let indexInfo = IndexInfo {posts} + indexHTML = T.unpack $ substitute indexT (toJSON indexInfo) + writeFile' out indexHTML + +-- | Find all post source files and tell shake to build the corresponding html +-- pages. +requirePosts :: Action () +requirePosts = do + pNames <- postNames + need ((\p -> srcToDest p -<.> "html") <$> pNames) + +-- Build an html file for a given post given a cache of posts. +buildPost :: (PostFilePath -> Action Post) -> FilePath -> Action () +buildPost postCache out = do + let srcPath = destToSrc out -<.> "md" + postURL = srcToURL srcPath + post <- postCache (PostFilePath srcPath) + template <- compileTemplate' "site/templates/post.html" + writeFile' out . T.unpack $ substitute template (toJSON post) diff --git a/backend/backend.cabal b/backend/backend.cabal deleted file mode 100644 index 563aba7..0000000 --- a/backend/backend.cabal +++ /dev/null @@ -1,49 +0,0 @@ -name: backend -version: 0.1 -cabal-version: >= 1.8 -build-type: Simple - -library - hs-source-dirs: src - if impl(ghcjs) - buildable: False - build-depends: base - , common - , frontend - , obelisk-backend - , obelisk-route - , text - , mmark - , modern-uri - , yaml - , reflex-dom-core - , aeson - , foldl - , profunctors - , snap - , megaparsec - exposed-modules: - Backend - Backend.Markdown - ghc-options: -Wall - -executable backend - main-is: main.hs - hs-source-dirs: src-bin - if impl(ghcjs) - buildable: False - build-depends: base - , backend - , common - , frontend - , obelisk-backend - , text - , mmark - , modern-uri - , yaml - , reflex-dom-core - , aeson - , foldl - , profunctors - , snap - , megaparsec diff --git a/backend/frontend.jsexe b/backend/frontend.jsexe deleted file mode 120000 index 3a9cb6f..0000000 --- a/backend/frontend.jsexe +++ /dev/null @@ -1 +0,0 @@ -../frontend-js/bin/frontend.jsexe \ No newline at end of file diff --git a/backend/frontendJs/frontend.jsexe b/backend/frontendJs/frontend.jsexe deleted file mode 120000 index af9b8f4..0000000 --- a/backend/frontendJs/frontend.jsexe +++ /dev/null @@ -1 +0,0 @@ -../../frontend-js/bin/frontend.jsexe \ No newline at end of file diff --git a/backend/src-bin/main.hs b/backend/src-bin/main.hs deleted file mode 100644 index 00f1994..0000000 --- a/backend/src-bin/main.hs +++ /dev/null @@ -1,6 +0,0 @@ -import Backend -import Frontend -import Obelisk.Backend - -main :: IO () -main = runBackend backend frontend diff --git a/backend/src/Backend.hs b/backend/src/Backend.hs deleted file mode 100644 index 5d1bb11..0000000 --- a/backend/src/Backend.hs +++ /dev/null @@ -1,34 +0,0 @@ -{-# LANGUAGE EmptyCase #-} -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE LambdaCase #-} -{-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE RankNTypes #-} -{-# LANGUAGE TypeFamilies #-} -module Backend where - -import qualified Data.Aeson as Aeson -import Control.Monad.IO.Class (liftIO) -import qualified Data.Text as T -import qualified Data.Text.IO as T -import qualified Data.Text.Encoding as T - -import Obelisk.Backend -import Obelisk.Route -import Snap -import Reflex.Dom.Core - -import Common.Route -import Backend.Markdown - -backend :: Backend BackendRoute FrontendRoute -backend = Backend - { _backend_run = \serve -> serve $ \case - BackendRoute_Missing :/ () -> - pure () - BackendRoute_GetArticle :/ articleName -> do - let articlePath = "articles/" <> articleName <> ".md" - c <- liftIO (T.readFile $ T.unpack articlePath) - (_, bs) <- liftIO $ renderStatic $ elMarkdown c - writeLBS $ Aeson.encode $ T.decodeUtf8 bs - , _backend_routeEncoder = backendRouteEncoder - } diff --git a/backend/src/Backend/Markdown.hs b/backend/src/Backend/Markdown.hs deleted file mode 100644 index a5c8272..0000000 --- a/backend/src/Backend/Markdown.hs +++ /dev/null @@ -1,108 +0,0 @@ -{-# LANGUAGE DataKinds #-} -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MultiParamTypeClasses #-} -{-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE ScopedTypeVariables #-} -{-# LANGUAGE StandaloneDeriving #-} -{-# LANGUAGE TypeApplications #-} - -module Backend.Markdown where - -import Control.Foldl hiding (mapM_, mconcat) -import Control.Monad -import Control.Monad.IO.Class (MonadIO, liftIO) -import Data.Aeson -import Data.Bifunctor (first) -import qualified Data.List.NonEmpty as NE -import Data.Maybe -import Data.Text (Text) -import qualified Data.Text as T -import qualified Data.Text.IO as T -import qualified Data.Yaml as Yaml - -import Text.Megaparsec.Error (ParseErrorBundle, errorBundlePretty) -import Text.MMark (MMark, MMarkErr) -import qualified Text.MMark as MMark -import Text.MMark.Extension (Block (..), Inline (..)) -import qualified Text.URI as URI - -import Reflex.Dom.Core hiding (Link) - - -elMarkdown :: DomBuilder t m => Text -> m () -elMarkdown = markdownView . MMark.parse "" - --- | WIP: Render markdown content as reflex dom. -markdownView :: DomBuilder t m => Either (ParseErrorBundle Text MMarkErr) MMark -> m () -markdownView = \case - Left errs -> elClass "tt" "markdown-error" $ do - el "h2" $ text "Error parsing markdown:" - text $ T.pack $ errorBundlePretty errs - Right r -> - MMark.runScannerM r $ FoldM (const renderBlock) blank pure - where - renderBlocks = mapM_ renderBlock - renderBlock = \case - ThematicBreak -> el "tt" $ text "TODO: ThematicBreak" - Heading1 xs -> el "h1" $ renderInlines xs - Heading2 xs -> el "h2" $ renderInlines xs - Heading3 xs -> el "h3" $ renderInlines xs - Heading4 xs -> el "h4" $ renderInlines xs - Heading5 xs -> el "h5" $ renderInlines xs - Heading6 xs -> el "h6" $ renderInlines xs - CodeBlock info xs -> el "pre" $ elClass "code" (fromMaybe "" info) $ text xs - Naked xs -> do - -- text $ "TODO: Naked" - renderInlines xs - Paragraph xs -> el "p" $ renderInlines xs - Blockquote bs -> el "blockquote" $ renderBlocks bs - OrderedList _start bs -> el "ol" $ do - -- TODO: What to do with 'start'? - forM_ bs $ \b -> do - el "li" $ renderBlocks b - UnorderedList bs -> el "ul" $ do - forM_ bs $ \b -> do - el "li" $ renderBlocks b - Table _ _ -> el "tt" $ text "TODO: Table" - renderInlines = mapM_ renderInline . NE.toList - renderInline = \case - Plain s -> text s - LineBreak -> el "tt" $ text "TODO: LineBreak" - Emphasis xs -> el "em" $ renderInlines xs - Strong xs -> el "strong" $ renderInlines xs - Strikeout xs -> el "strike" $ renderInlines xs - Subscript xs -> el "sub" $ renderInlines xs - Superscript xs -> el "sup" $ renderInlines xs - CodeSpan s -> el "code" $ text s - Link xs dest title -> referringElement "a" "href" "title" dest title $ renderInlines xs - Image xs dest title -> referringElement "img" "src" "alt" dest title $ renderInlines xs - referringElement t refAttr titleAttr dest title = elAttr t attrs - where - attrs = mconcat $ catMaybes - [ Just $ refAttr =: URI.render dest - , (titleAttr =:) <$> title - ] - --- This code is unused now - -data Page = Page - { _page_title :: Text - , _page_content :: MMark.MMark - } - deriving Show - -parsePage :: MonadIO m => Text -> m (Either Text Page) -parsePage articleName = do - let articlePath = T.unpack $ "articles/" <> articleName <> ".md" - content <- liftIO $ T.readFile articlePath - case MMark.parse (T.unpack articleName) content of - Left err -> pure $ Left $ T.pack $ errorBundlePretty err - Right v -> case MMark.projectYaml v of - Nothing -> pure $ Left "No Yaml found" - Just doc -> do - let f = Yaml.withObject "metadata" $ \metadata -> do - title <- metadata .: "title" - pure $ Page title v - pure $ first T.pack $ Yaml.parseEither f doc diff --git a/backend/static b/backend/static deleted file mode 120000 index 4dab164..0000000 --- a/backend/static +++ /dev/null @@ -1 +0,0 @@ -../static \ No newline at end of file diff --git a/cabal.project b/cabal.project deleted file mode 100644 index 9a791c8..0000000 --- a/cabal.project +++ /dev/null @@ -1,2 +0,0 @@ -optional-packages: - * diff --git a/common/common.cabal b/common/common.cabal deleted file mode 100644 index 55031f2..0000000 --- a/common/common.cabal +++ /dev/null @@ -1,17 +0,0 @@ -name: common -version: 0.1 -cabal-version: >= 1.2 -build-type: Simple - -library - hs-source-dirs: src - build-depends: base - , obelisk-route - , mtl - , text - default-extensions: - TypeFamilies - PolyKinds - exposed-modules: - Common.Api - Common.Route diff --git a/common/src/Common/Api.hs b/common/src/Common/Api.hs deleted file mode 100644 index b19c7f6..0000000 --- a/common/src/Common/Api.hs +++ /dev/null @@ -1,4 +0,0 @@ -module Common.Api where - -commonStuff :: String -commonStuff = "Here is a string defined in code common to the frontend and backend." diff --git a/common/src/Common/Route.hs b/common/src/Common/Route.hs deleted file mode 100644 index f118a3a..0000000 --- a/common/src/Common/Route.hs +++ /dev/null @@ -1,54 +0,0 @@ -{-# LANGUAGE EmptyCase #-} -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} -{-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MultiParamTypeClasses #-} -{-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE RankNTypes #-} -{-# LANGUAGE TemplateHaskell #-} - -module Common.Route where - -{- -- You will probably want these imports for composing Encoders. -import Prelude hiding (id, (.)) -import Control.Category --} - -import Data.Functor.Identity -import Data.Functor.Sum -import Data.Text (Text) - -import Obelisk.Route -import Obelisk.Route.TH - -data BackendRoute :: * -> * where - -- | Used to handle unparseable routes. - BackendRoute_Missing :: BackendRoute () - -- You can define any routes that will be handled specially by the backend here. - -- i.e. These do not serve the frontend, but do something different, such as serving static files. - BackendRoute_GetArticle :: BackendRoute Text - -data FrontendRoute :: * -> * where - FrontendRoute_Main :: FrontendRoute () - FrontendRoute_Article :: FrontendRoute Text - -- This type is used to define frontend routes, i.e. ones for which the backend will serve the frontend. - -backendRouteEncoder - :: Encoder (Either Text) Identity (R (Sum BackendRoute (ObeliskRoute FrontendRoute))) PageName -backendRouteEncoder = handleEncoder (const (InL BackendRoute_Missing :/ ())) $ - pathComponentEncoder $ \case - InL backendRoute -> case backendRoute of - BackendRoute_Missing -> PathSegment "missing" $ unitEncoder mempty - BackendRoute_GetArticle -> PathSegment "get-article" singlePathSegmentEncoder - InR obeliskRoute -> obeliskRouteSegment obeliskRoute $ \case - -- The encoder given to PathEnd determines how to parse query parameters, - -- in this example, we have none, so we insist on it. - FrontendRoute_Main -> PathEnd $ unitEncoder mempty - FrontendRoute_Article -> PathSegment "article" singlePathSegmentEncoder - -concat <$> mapM deriveRouteComponent - [ ''BackendRoute - , ''FrontendRoute - ] diff --git a/config/common/route b/config/common/route deleted file mode 100644 index 99298a3..0000000 --- a/config/common/route +++ /dev/null @@ -1 +0,0 @@ -http://localhost:8000 \ No newline at end of file diff --git a/config/readme.md b/config/readme.md deleted file mode 100644 index 7ca5a54..0000000 --- a/config/readme.md +++ /dev/null @@ -1,9 +0,0 @@ -### Config - -Obelisk projects should contain a config folder with the following subfolders: common, frontend, and backend. - -Things that should never be transmitted to the frontend belong in backend/ (e.g., email credentials) - -Frontend-only configuration belongs in frontend/. - -Shared configuration files (e.g., the route config) belong in common/ diff --git a/default.nix b/default.nix index a8a1bf1..f103eb2 100644 --- a/default.nix +++ b/default.nix @@ -1,34 +1,3 @@ -{ obelisk ? import ./.obelisk/impl { - system = builtins.currentSystem; - iosSdkVersion = "10.2"; - # You must accept the Android Software Development Kit License Agreement at - # https://developer.android.com/studio/terms in order to build Android apps. - # Uncomment and set this to `true` to indicate your acceptance: - # config.android_sdk.accept_license = false; - } -}: -with obelisk; -project ./. ({ pkgs, hackGet, ... }: { - android.applicationId = "ca.srid.ExplainingHaskell"; - android.displayName = "Explaining Haskell"; - ios.bundleIdentifier = "ca.srid.ExplainingHaskell"; - ios.bundleName = "Explaining Haskell"; - - packages = { - # Newer mmark requires newer version of certain dependencies as well - mmark = hackGet ./dep/mmark; - megaparsec = hackGet ./dep/megaparsec; - hspec-megaparsec = hackGet ./dep/hspec-megaparsec; - modern-uri = hackGet ./dep/modern-uri; - - # Use a version of neat-interpolation that works with the megaparsec version - # used by mmark above. - neat-interpolation = hackGet ./dep/neat-interpolation; - }; - - overrides = self: super: with pkgs.haskell.lib; { - mmark = dontHaddock (dontCheck super.mmark); # Haddock fails on ghcjs - megaparsec = dontCheck super.megaparsec; - email-validate = dontCheck super.email-validate; - }; -}) +(import { }).haskellPackages.developPackage { + root = ./.; +} diff --git a/dep/hspec-megaparsec/default.nix b/dep/hspec-megaparsec/default.nix deleted file mode 100644 index 7a04778..0000000 --- a/dep/hspec-megaparsec/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -# DO NOT HAND-EDIT THIS FILE -import ((import {}).fetchFromGitHub ( - let json = builtins.fromJSON (builtins.readFile ./github.json); - in { inherit (json) owner repo rev sha256; - private = json.private or false; - } -)) diff --git a/dep/hspec-megaparsec/github.json b/dep/hspec-megaparsec/github.json deleted file mode 100644 index 16e4b4e..0000000 --- a/dep/hspec-megaparsec/github.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "owner": "mrkkrp", - "repo": "hspec-megaparsec", - "branch": "master", - "rev": "5a60b42441782c6c091c39ac62b2ebaa54d14f6d", - "sha256": "0lryy03wswi0a20g0hhwls7bsprcpich4jrpfr277wh38cirqcrg" -} diff --git a/dep/megaparsec/default.nix b/dep/megaparsec/default.nix deleted file mode 100644 index 7a04778..0000000 --- a/dep/megaparsec/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -# DO NOT HAND-EDIT THIS FILE -import ((import {}).fetchFromGitHub ( - let json = builtins.fromJSON (builtins.readFile ./github.json); - in { inherit (json) owner repo rev sha256; - private = json.private or false; - } -)) diff --git a/dep/megaparsec/github.json b/dep/megaparsec/github.json deleted file mode 100644 index f77784e..0000000 --- a/dep/megaparsec/github.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "owner": "srid", - "repo": "megaparsec", - "branch": "some-master", - "rev": "3472a39ec635d27195b20cbddce186ebdb6cf8af", - "sha256": "1ypcld9qx48c83nrsghzcjh05hcwyx2yr90lcxnlh73cpfmsflfp" -} diff --git a/dep/mmark/default.nix b/dep/mmark/default.nix deleted file mode 100644 index 7a04778..0000000 --- a/dep/mmark/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -# DO NOT HAND-EDIT THIS FILE -import ((import {}).fetchFromGitHub ( - let json = builtins.fromJSON (builtins.readFile ./github.json); - in { inherit (json) owner repo rev sha256; - private = json.private or false; - } -)) diff --git a/dep/mmark/github.json b/dep/mmark/github.json deleted file mode 100644 index beb27e7..0000000 --- a/dep/mmark/github.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "owner": "mmark-md", - "repo": "mmark", - "branch": "master", - "rev": "66510f3fe2ca2d320de8c58e815782f06099cfdd", - "sha256": "0y8y8wcfmc04j4jwf439g9y24i49naia5jg9jssi3hp0a1srpmnk" -} diff --git a/dep/modern-uri/default.nix b/dep/modern-uri/default.nix deleted file mode 100644 index 7a04778..0000000 --- a/dep/modern-uri/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -# DO NOT HAND-EDIT THIS FILE -import ((import {}).fetchFromGitHub ( - let json = builtins.fromJSON (builtins.readFile ./github.json); - in { inherit (json) owner repo rev sha256; - private = json.private or false; - } -)) diff --git a/dep/modern-uri/github.json b/dep/modern-uri/github.json deleted file mode 100644 index e113851..0000000 --- a/dep/modern-uri/github.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "owner": "mrkkrp", - "repo": "modern-uri", - "branch": "master", - "rev": "c237a242fe0eada9cc7cf6132e6ce7232203ebcd", - "sha256": "0jyx96nnq861i50jq3prlz6889w8gq5sivxqddld83l505xyirpi" -} diff --git a/dep/neat-interpolation/default.nix b/dep/neat-interpolation/default.nix deleted file mode 100644 index 7a04778..0000000 --- a/dep/neat-interpolation/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -# DO NOT HAND-EDIT THIS FILE -import ((import {}).fetchFromGitHub ( - let json = builtins.fromJSON (builtins.readFile ./github.json); - in { inherit (json) owner repo rev sha256; - private = json.private or false; - } -)) diff --git a/dep/neat-interpolation/github.json b/dep/neat-interpolation/github.json deleted file mode 100644 index 2376ee6..0000000 --- a/dep/neat-interpolation/github.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "owner": "nikita-volkov", - "repo": "neat-interpolation", - "branch": "master", - "rev": "95c009643e89dd5db67d715078a007f7de79de27", - "sha256": "0c7wqym619nq13xrf43w6bay0yl4jnxjaj4a0akmfw3srdcz07yf" -} diff --git a/frontend/frontend.cabal b/frontend/frontend.cabal deleted file mode 100644 index f7ecef5..0000000 --- a/frontend/frontend.cabal +++ /dev/null @@ -1,32 +0,0 @@ -name: frontend -version: 0.1 -cabal-version: >= 1.8 -build-type: Simple - -library - hs-source-dirs: src - build-depends: base - , common - , obelisk-frontend - , obelisk-route - , reflex-dom - , obelisk-generated-static - , text - exposed-modules: - Frontend - ghc-options: -Wall - -executable frontend - main-is: main.hs - hs-source-dirs: src-bin - build-depends: base - , common - , obelisk-frontend - , obelisk-route - , reflex-dom - , obelisk-generated-static - , frontend - --TODO: Make these ghc-options optional - ghc-options: -threaded - if os(darwin) - ghc-options: -dynamic diff --git a/frontend/src-bin/main.hs b/frontend/src-bin/main.hs deleted file mode 100644 index 2c2d429..0000000 --- a/frontend/src-bin/main.hs +++ /dev/null @@ -1,10 +0,0 @@ -import Frontend -import Common.Route -import Obelisk.Frontend -import Obelisk.Route.Frontend -import Reflex.Dom - -main :: IO () -main = do - let Right validFullEncoder = checkEncoder backendRouteEncoder - run $ runFrontend validFullEncoder frontend diff --git a/frontend/src/Frontend.hs b/frontend/src/Frontend.hs deleted file mode 100644 index 35e25e2..0000000 --- a/frontend/src/Frontend.hs +++ /dev/null @@ -1,74 +0,0 @@ -{-# LANGUAGE DataKinds #-} -{-# LANGUAGE LambdaCase #-} -{-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE ScopedTypeVariables #-} -{-# LANGUAGE TypeApplications #-} -{-# LANGUAGE TypeFamilies #-} -module Frontend where - -import Control.Monad -import Data.Functor.Identity -import Data.Functor.Sum -import Data.Text (Text) --- import qualified Data.Text as T - -import Obelisk.Frontend -import Obelisk.Route -import Obelisk.Route.Frontend -import Reflex.Dom.Core - -import Common.Route - -frontend :: Frontend (R FrontendRoute) -frontend = Frontend - { _frontend_head = do - el "title" $ text "Explaining Haskell" - elAttr "link" ("rel" =: "stylesheet" <> "href" =: semuiCdnUrl "semantic.min.css") blank - - , _frontend_body = divClass "ui container" $ do - subRoute_ $ \case - FrontendRoute_Main -> do - elClass "h1" "ui header" $ text "Explaining Haskell" - - elClass "h2" "ui header" $ do - text "Purpose of this site" - divClass "sub header" $ text "Else why do it?" - el "p" $ text "The purpose of this site is twofold:" - el "ol" $ do - el "li" $ text "Record everything I learn in regards to Haskell for future reference" - el "li" $ text "Attempt to teach what I understand to others in the hopes of strengthening my own understanding" - - elClass "h2" "ui header" $ do - text "Game plan" - divClass "sub header" $ text "How I plan to finish this" - el "p" $ text "See README.md" - - elClass "h2" "ui header" $ text "List of articles" - el "ul" $ - el "li" $ routeLink (FrontendRoute_Article :/ "NixTutorial") $ text "Nix Tutorial" - FrontendRoute_Article -> do - articleContent <- getArticle =<< askRoute - prerender_ (text "JavaScript is required to view this page") blank - widgetHold_ (el "div" $ text "Loading") $ ffor articleContent $ \case - Nothing -> text "nope" - Just s -> divClass "ui segment" $ do - prerender_ blank $ - void $ elDynHtml' "div" $ constDyn s - } - where - semuiVersion :: Text - semuiVersion = "2.4.2" - semuiCdnUrl :: Text -> Text - semuiCdnUrl file = "https://cdn.jsdelivr.net/npm/semantic-ui@" <> semuiVersion <> "/dist/" <> file - - -getArticle - :: (MonadHold t m, PostBuild t m, Prerender js t m) - => Dynamic t Text -> m (Event t (Maybe Text)) -getArticle articleName = - fmap switchDyn $ prerender (pure never) $ do - pb <- getPostBuild - getAndDecode $ ffor (tag (current articleName) pb) $ \an -> - renderBackendRoute enc (BackendRoute_GetArticle :/ an) - where - Right (enc :: Encoder Identity Identity (R (Sum BackendRoute (ObeliskRoute FrontendRoute))) PageName) = checkEncoder backendRouteEncoder diff --git a/package.yaml b/package.yaml new file mode 100644 index 0000000..e429e01 --- /dev/null +++ b/package.yaml @@ -0,0 +1,42 @@ +name: ExplainingHaskell +version: 0.1.0.0 +github: "srid/ExplainingHaskell" +license: BSD3 +author: "Sridhar Ratnakumar" +maintainer: "srid@srid.ca" +copyright: "2019 Sridhar Ratnakumar" + +extra-source-files: +- README.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 + +executables: + ExplainingHaskell-exe: + main: Main.hs + source-dirs: app + ghc-options: + - -threaded + - -rtsopts + - -with-rtsopts=-N + dependencies: + - shake + - slick + - base >= 4.7 && < 5 + - aeson + - lens-aeson + - lens + - pandoc + - text + - binary + - bytestring + - containers + - mustache + - time diff --git a/site/css/style.css b/site/css/style.css new file mode 100644 index 0000000..86070d2 --- /dev/null +++ b/site/css/style.css @@ -0,0 +1,568 @@ +/* CSS Reset */ +html, body, div, span, object, h1, h2, h3, h4, h5, h6, p, a, abbr, acronym, em, img, ol, ul, li { + border: 0; + font-weight: inherit; + font-style: inherit; + font-size: 100%; + font-family: inherit; + vertical-align: baseline; + margin: 0; + padding: 0; } + +html { + box-sizing: border-box; } + +*, *:before, *:after { + box-sizing: inherit; } + +/* Variables */ +html { + font-family: georgia, serif; + color: #333; + background: #FFFFFC; + background: -webkit-linear-gradient(top, #EEE 0%, #FFF 10%, #FFF 90%, #EEE 100%); + background: linear-gradient(to bottom, #EEE 0%, #FFF 10%, #FFF 90%, #EEE 100%); + background-attachment: fixed; + height: 100%; + width: 100%; + z-index: -10; } + html.dark { + background: #333; + background: -webkit-linear-gradient(top, #2a2a2a 0%, #333 10%, #333 90%, #2a2a2a 100%); + background: linear-gradient(to bottom, #2a2a2a 0%, #333 10%, #333 90%, #2a2a2a 100%); + background-attachment: fixed; + width: 100%; + height: 100%; + color: #DDD; } + +body { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-flow: column nowrap; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; } + +h2 { + font-family: inherit; + font-size: 1.25em; + font-variant: small-caps; + text-align: center; + width: 80%; + margin: 0 auto 0; + border-top: 1px solid #777; + margin-top: 1em; + padding: 1em 0 0 0; } + +h3 { + font-size: 1.4em; + margin: 0.5em 0; + text-align: center; } + +blockquote { + width: 90%; + margin: 0.7em auto; + text-align: center; + padding-left: 0.5em; + font-size: 1.1em; + font-style: italic; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-flow: row nowrap; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; } + blockquote > p { + padding-left: 7px; + border-left: 5px solid rgba(76, 76, 76, 0.9); + margin: auto; } + +ul, ol { + list-style-position: inside; + margin: 1em 0 1em 2em; } + +li { + margin-bottom: 0.7em; +} + + + +em { + font-weight: bold; + font-style: italic; } + +img { + margin: auto; } + +a, a:visited, a:hover { + color: #EB005B; + text-decoration: none; + -webkit-transition: color 0.1s; + transition: color 0.1s; } + a:hover, a:visited:hover, a:hover:hover { + color: #EB0978; + text-decoration: underline; } + +header { + position: fixed; + /*color: $night-white;*/ + top: 0; + height: 4em; + width: 100%; } + +footer { + font-size: 0.8em; + min-height: 200px; + padding: 1em; + color: #888; + text-align: center; + clear: both; } + +.photo { + border-radius: 25px; + border: 1px solid black; } + +.blog { + display: table; + width: 100%; + height: 100%; + margin: auto; } + +.title { + font-family: "Quicksand", helvetica, sans-serif; + font-weight: 400; + font-size: 3em; + text-transform: capitalize; } + +.byline { + font-family: helvetica, sans-serif; + font-style: italic; + font-weight: 100; + font-size: 1em; } + +.wrapper { + width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-flow: column nowrap; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; } + +.masthead { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-flow: column nowrap; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: space-around; + -webkit-align-items: space-around; + -ms-flex-align: space-around; + align-items: space-around; + width: 100%; + min-height: 400px; + padding: 2em 10px; + text-align: center; + margin: auto; } + +.post-image { + height: auto; + width: 400px; + max-width: 400px; } + +.metadata { + text-align: center; } + +.date { + color: rgba(128, 128, 128, 0.5); + font-size: 0.9em; + font-style: italic; + line-height: 2em; + font-family: helvetica, sans-serif; } + +.categories, .tags { + color: rgba(128, 128, 128, 0.5); + font-size: 0.9em; + font-style: italic; + line-height: 2em; + font-family: helvetica, sans-serif; + width: 100%; + max-width: 500px; + display: block; + margin: auto; } + +a.tag, a.category { + padding: 0px 8px; + margin: 2px 1px; + border-radius: 4px; + display: inline-block; + color: #333; + border: 1px solid rgba(76, 76, 76, 0.9); + -webkit-transition: 0.3s; + transition: 0.3s; } + a.tag:hover, a.category:hover { + background: #333; + color: #FFFFFC; + text-decoration: none; } + .dark a.tag, .dark a.category { + color: #DDD; } + .dark a.tag:hover, .dark a.category:hover { + background: #DDD; + color: #333; + text-decoration: none; } + +.post { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-flow: column nowrap; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + width: auto; + min-width: 100px; + max-width: 720px; + /*min-height: 100%;*/ + padding: 0px 20px; + margin: 3em auto; + -webkit-transition: color 2s; + transition: color 2s; + font-size: 1.1em; } + .post p { + line-height: 1.6em; + letter-spacing: 0.02em; + margin: 0.5em 0 0 0; + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + word-break: break-word; } + .post p + p { + margin-top: 1em; } + .post > p:first-of-type:first-letter { + font-size: 8em; + line-height: 0.1em; + padding-right: 0.06em; } + .post ul { + list-style-type: disc; + text-indent: -1em; } + .post ul li { + line-height: 1.3em; + letter-spacing: 0.05em; + margin: 0.5em 0 0 0; + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + word-break: break-word; } + +.post img { + max-width: 100%; + margin: auto; + display: block; +} + +.table-of-contents { + clear: both; + width: 100%; } + .table-of-contents h1 { + font-size: 3em; + text-align: center; + font-family: "Quicksand", helvetica, sans-serif; } + .table-of-contents ul { + margin: 3em 0; + list-style: none; } + .table-of-contents li { + width: 100%; } + .table-of-contents li a { + color: #333; + font-weight: normal; + box-sizing: border-box; + border-top: 1px solid #444; + display: block; + width: 50%; + min-width: 300px; + margin: 0 auto; + padding: 1em 0.5em 1em 0; + -webkit-transition: color 0.7s, background 0.7s, padding 0.5s; + transition: color 0.7s, background 0.7s, padding 0.5s; } + .table-of-contents li a .date { + float: right; + margin-top: -0.25em; + color: rgba(128, 128, 128, 0.8); } + .table-of-contents li a:hover { + background: #333; + color: #FFFFFC; + text-decoration: none; + padding-left: 2em; } + .dark .table-of-contents ul a { + color: #DDD; } + .dark .table-of-contents ul a:hover { + background: #DDD; + color: #333; + padding-left: 2em; } + +.arrow { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-flow: column nowrap; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + font-size: 1.5em; + width: 1.5em; + height: 1.5em; + background: #DDD; + /*display: table-cell;*/ + /*vertical-align: middle;*/ + text-align: center; + /*padding-top: 0.14em;*/ + box-sizing: border-box; + border-radius: 0.75em; + opacity: 0.7; + -webkit-transition: background 0.5s, opacity 0.5s, width 0.5s; + transition: background 0.5s, opacity 0.5s, width 0.5s; + cursor: pointer; } + .arrow:hover { + box-sizing: border-box; + width: 2em; + color: #EB005B; + border: 1px solid #EB005B; + opacity: 0.9; + background: #FFFFFC; + -webkit-transition: background 0.5s, opacity 0.5s, width 0.5s; + transition: background 0.5s, opacity 0.5s, width 0.5s; + text-decoration: none; } + .dark .arrow { + background: #222; } + .dark .arrow:hover { + color: #C00762; + border-color: #C00762; } + +.social-buttons { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-flow: row nowrap; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + margin: 1em 0; } + .social-buttons > div { + /*margin: 0 1em;*/ } + .social-buttons .twitter-share-button { + max-width: 90px; + margin-right: 5px; } + +.center { + text-align: center; + margin: auto; } + +.monochrome { + color: #333; } + .dark .monochrome { + color: #DDD; } + +.gem-info { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-flow: column nowrap; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + margin: auto; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; } + .gem-info table { + border: 1px solid #333; + border-collapse: collapse; } + .gem-info table td { + border: 1px solid #333; + padding: 0.4em 1em; } + .dark .gem-info table { + border: 1px solid #DDD; } + .dark .gem-info table td { + border: 1px solid #DDD; } + +.pager-title { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-flow: column nowrap; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; } + .pager-title span { + text-align: center; } + +.pager article { + margin-top: 2em; } + +.dark #disqus_thread { + color: #DDD; } + +#page { + margin: 4em 0; } + +#theme-button { + text-transform: uppercase; + font-family: "Quicksand", helvetica, sans-serif; + font-size: 1.5em; + font-weight: bold; + text-align: right; + cursor: pointer; + -webkit-transition: opacity 0.5s, color 2s; + transition: opacity 0.5s, color 2s; + opacity: 0.6; } + #theme-button:hover { + opacity: 1; } + .dark #theme-button { + color: #DDD; } + +#beacon { + font-family: "Oswald", helvetica, sans-serif; + font-size: 4em; + height: 1.5em; + width: 1.5em; + text-align: center; + margin: 0.1em; + position: absolute; + border-radius: 0.1em; + opacity: 0.4; + -webkit-transition: opacity 0.5s; + transition: opacity 0.5s; + color: inherit; } + #beacon path { + fill: currentColor; } + #beacon .logo { + width: 100%; + height: 100%; } + #beacon:hover { + opacity: 1; + text-decoration: none; } + +#home-text { + font-size: 0.8em; +} + +#leftarrow { + position: fixed; + left: 5px; + top: calc(50% - 15px); + text-decoration: none; } + +#rightarrow { + position: fixed; + right: 10px; + top: calc(50% - 15px); + text-decoration: none; } + +@media only screen and (max-width: 750px) { + header { + color: #FFFFFC; + height: 3em; + background: rgba(76, 76, 76, 0.9); } + + #beacon { + color: #FFFFFC; + font-size: 2em; + margin: 0; } + + #theme-button { + color: #FFFFFC; + font-size: 1.5em; + top: 0.5em; + right: 0.2em; + opacity: 0.5; } } +@media only screen and (min-device-width: 320px) and (max-device-width: 480px) { + /* Styles */ + h2 { + border-top: 3px solid #777; } + + .page { + min-width: none; + max-width: none; + width: auto; + padding: 0 1em; + margin: 0; + box-sizing: border-box; } + + .page p { + padding-bottom: 1em; + font-size: 1em; + line-height: 1.8em; } + + .post-image { + height: auto; + width: auto; + max-width: 280px; } + + .page > p:first-of-type:first-letter { + font-size: 4em; + line-height: 0.1em; } } +@media only screen and (max-height: 450px) { + .masthead { + min-height: 350px; } } + +.ext-link img { + width: 32px; + height: 32px; +} + +.right-sidebar { + position: absolute; + top: 0.75em; + right: 0.7em; + display: flex; +} + +.right-sidebar > * { + margin-left: 12px; +} + +/*# sourceMappingURL=style.css.map */ diff --git a/site/css/syntax.css b/site/css/syntax.css new file mode 100644 index 0000000..7191997 --- /dev/null +++ b/site/css/syntax.css @@ -0,0 +1,32 @@ +pre { + background-color: #F5FCFF; +} + +code { + background-color: #F5FCFF; + color: #268BD2; +} + +/* KeyWordTok */ +.sourceCode .kw { color: #600095; } +/* DataTypeTok */ +.sourceCode .dt { color: #268BD2; } + +/* DecValTok (decimal value), BaseNTok, FloatTok */ +.sourceCode .dv, .sourceCode .bn, .sourceCode .fl { color: #AE81FF; } +/* CharTok */ +.sourceCode .ch { color: #37ad2d; } +/* StringTok */ +.sourceCode .st { color: #37ad2d; } +/* CommentTok */ +.sourceCode .co { color: #7E8E91; } +/* OtherTok */ +.sourceCode .ot { color: #EB005B; } +/* AlertTok */ +.sourceCode .al { color: #A6E22E; font-weight: bold; } +/* FunctionTok */ +.sourceCode .fu { color: #333; } +/* RegionMarkerTok */ +.sourceCode .re { } +/* ErrorTok */ +.sourceCode .er { color: #E6DB74; font-weight: bold; } diff --git a/articles/LensAndFriends.md b/site/drafts/LensAndFriends.md similarity index 100% rename from articles/LensAndFriends.md rename to site/drafts/LensAndFriends.md diff --git a/articles/MonadTransformers.md b/site/drafts/MonadTransformers.md similarity index 100% rename from articles/MonadTransformers.md rename to site/drafts/MonadTransformers.md diff --git a/articles/PersonalNixCache.md b/site/drafts/PersonalNixCache.md similarity index 100% rename from articles/PersonalNixCache.md rename to site/drafts/PersonalNixCache.md diff --git a/articles/StringTypes.md b/site/drafts/StringTypes.md similarity index 100% rename from articles/StringTypes.md rename to site/drafts/StringTypes.md diff --git a/site/images/battleship.jpg b/site/images/battleship.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9497f0b55db485a7c1af96347d2ae75205c05b91 GIT binary patch literal 74808 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 literal 0 HcmV?d00001 diff --git a/site/js/.gitkeep b/site/js/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/articles/NixTutorial.md b/site/posts/NixTutorial.md similarity index 94% rename from articles/NixTutorial.md rename to site/posts/NixTutorial.md index 722b196..ca9536b 100644 --- a/articles/NixTutorial.md +++ b/site/posts/NixTutorial.md @@ -1,4 +1,11 @@ -# Nix tutorial for Haskellers +--- +title: "Nix tutorial for Haskellers" +author: Sridhar Ratnakumar +date: Jul 19, 2019 +tags: [nix] +description: How to develop Haskell projects using Nix +image: battleship.jpg +--- The goal of this article is to get you comfortable managing simple Haskell programs and projects using the **Nix** package manager. diff --git a/site/templates/footer.html b/site/templates/footer.html new file mode 100644 index 0000000..7b980bd --- /dev/null +++ b/site/templates/footer.html @@ -0,0 +1,8 @@ +
+ Built with Haskell ❤️ +
+ + + + + diff --git a/site/templates/header.html b/site/templates/header.html new file mode 100644 index 0000000..5c269a3 --- /dev/null +++ b/site/templates/header.html @@ -0,0 +1,18 @@ +
+ + + +
diff --git a/site/templates/index.html b/site/templates/index.html new file mode 100644 index 0000000..caa27bd --- /dev/null +++ b/site/templates/index.html @@ -0,0 +1,23 @@ + + + + + + + + Explaining Haskell + + + + + {{>site/templates/header.html}} +
+
+

All Posts

+ + {{>site/templates/post-list.html}} +
+
+ +{{>site/templates/footer.html}} diff --git a/site/templates/meta-data.html b/site/templates/meta-data.html new file mode 100644 index 0000000..82e3afa --- /dev/null +++ b/site/templates/meta-data.html @@ -0,0 +1,5 @@ + + + + + diff --git a/site/templates/post-list.html b/site/templates/post-list.html new file mode 100644 index 0000000..759f961 --- /dev/null +++ b/site/templates/post-list.html @@ -0,0 +1,7 @@ + diff --git a/site/templates/post.html b/site/templates/post.html new file mode 100644 index 0000000..91c117f --- /dev/null +++ b/site/templates/post.html @@ -0,0 +1,46 @@ + + + + + + + + {{>site/templates/meta-data.html}} + {{title}} + + + + + {{>site/templates/header.html}} + +
+
+
+ + {{title}} + +
+ + {{#image}} + + {{/image}} +
+ {{#author}} + + {{/author}} +
+ {{date}} +
+ +
+
+
+ {{{content}}} +
+
+
+ +
+ +{{>site/templates/footer.html}} diff --git a/static/obelisk.jpg b/static/obelisk.jpg deleted file mode 100644 index 68c8682d0809b5265fef807bdb8d46c9829e55ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17351 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 K$0+X8(*FmmD03(P