From dcdf36f4dd0ea60c958c2f4913cb1514242878d8 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Sat, 11 Mar 2023 16:51:23 +0100 Subject: [PATCH] Revamp: - Switch from `cabal2nix` and haskell overlay to `developPackage` - Restructure directories to have more descriptive names - Fix `nix run` --- flake.lock | 8 +- flake.nix | 75 +++++++++--------- nix/hakyll.patch | 0 nix/haskell-overlay.nix | 68 ---------------- nix/pure-css/default.nix | 55 ------------- nix/pure-css/npm-packages.nix | 30 ------- ssg/LICENSE | 29 ------- ssg/ssg.cabal => static-site-generator.cabal | 6 +- .../Formats/Gogen.hs | 0 .../Formats/Posts.hs | 0 {ssg/src => static-site-generator}/Main.hs | 12 +-- .../Preprocessing/Graphviz.hs | 0 .../Preprocessing/LogoLinks.hs | 0 .../Util/Hakyll/Context.hs | 0 .../Util/Hakyll/Routes.hs | 0 .../Util/Hash.hs | 0 {src => www}/2022-03-27-debug.md | 0 {src => www}/_config.yaml | 0 {src => www}/css/default.css | 0 {src => www}/css/styles.css | 0 {src => www}/gogen/are.md | 0 {src => www}/gogen/connectors/kara.md | 0 {src => www}/gogen/connectors/keredomo.md | 0 {src => www}/gogen/connectors/nara.md | 0 {src => www}/gogen/dake.md | 0 {src => www}/gogen/dame.md | 0 {src => www}/gogen/dore.md | 0 {src => www}/gogen/hodo.md | 0 {src => www}/gogen/hou.md | 0 {src => www}/gogen/imada.md | 0 {src => www}/gogen/ippai.md | 0 {src => www}/gogen/kichinto.md | 0 {src => www}/gogen/kore.md | 0 {src => www}/gogen/maji.md | 0 {src => www}/gogen/mama.md | 0 {src => www}/gogen/masa.md | 0 {src => www}/gogen/motto.md | 0 {src => www}/gogen/mou.md | 0 {src => www}/gogen/nado.md | 0 {src => www}/gogen/nanika.md | 0 {src => www}/gogen/osoraku.md | 0 {src => www}/gogen/particles/ga.md | 0 {src => www}/gogen/particles/to.md | 0 {src => www}/gogen/particles/toka.md | 0 {src => www}/gogen/particles/ya.md | 0 {src => www}/gogen/sara.md | 0 {src => www}/gogen/shibaraku.md | 0 {src => www}/gogen/shika.md | 0 {src => www}/gogen/sore.md | 0 {src => www}/gogen/sude.md | 0 {src => www}/gogen/sugoi.md | 0 {src => www}/gogen/takusan.md | 0 {src => www}/gogen/tokoro.md | 0 {src => www}/gogen/totemo.md | 0 {src => www}/gogen/tsune.md | 0 {src => www}/gogen/tsuto.md | 0 {src => www}/gogen/verb_forms/reba.md | 0 {src => www}/gogen/verb_forms/sareru.md | 0 {src => www}/gogen/verb_forms/saseru.md | 0 {src => www}/gogen/verb_forms/tara.md | 0 {src => www}/gogen/verb_forms/temiru.md | 0 {src => www}/gogen/verbs/ageru.md | 0 {src => www}/gogen/verbs/dasu.md | 0 {src => www}/gogen/verbs/itadaku.md | 0 {src => www}/gogen/verbs/kakaru.md | 0 {src => www}/gogen/verbs/kureru.md | 0 {src => www}/gogen/verbs/morau.md | 0 {src => www}/gogen/verbs/shitagau.md | 0 {src => www}/gogen/verbs/sugiru.md | 0 {src => www}/gogen/verbs/suru.md | 0 {src => www}/gogen/verbs/tsukeru.md | 0 {src => www}/gogen/verbs/tsumoru.md | 0 {src => www}/gogen/yahari.md | 0 {src => www}/gogen/yori.md | 0 {src => www}/gogen/you.md | 0 {src => www}/images/header-nani.svg | 0 .../images/index_header_background.jpg | Bin {src => www}/images/logos/dart.svg | 0 {src => www}/images/logos/gitea.svg | 0 {src => www}/images/logos/github.svg | 0 {src => www}/images/logos/gitlab.svg | 0 {src => www}/images/logos/haskell_orange.svg | 0 {src => www}/images/logos/haskell_purple.svg | 0 {src => www}/images/logos/nani.svg | 0 {src => www}/images/logos/nix_options.svg | 0 {src => www}/images/logos/nix_packages.svg | 0 {src => www}/images/logos/npm.svg | 0 {src => www}/images/logos/reddit.svg | 0 {src => www}/images/logos/rust.svg | 0 {src => www}/images/logos/stack_overflow.svg | 0 {src => www}/images/logos/wikipedia.svg | 0 www/images/nani.png | Bin 0 -> 26322 bytes {src => www}/images/nani.svg | 0 {src => www}/images/nix_banner.png | Bin {src => www}/index.html | 0 {src => www}/js/script.js | 0 {src => www}/js/ui.js | 0 .../posts/2022-10-16-tangling-org-files.md | 0 .../posts/2022-10-16-the-arrow-operator.md | 0 {src => www}/robots.txt | 0 {src => www}/templates/default.html | 0 {src => www}/templates/gogen.html | 0 {src => www}/templates/post.html | 0 {src => www}/templates/sitemap.xml | 0 104 files changed, 51 insertions(+), 232 deletions(-) delete mode 100644 nix/hakyll.patch delete mode 100644 nix/haskell-overlay.nix delete mode 100644 nix/pure-css/default.nix delete mode 100644 nix/pure-css/npm-packages.nix delete mode 100644 ssg/LICENSE rename ssg/ssg.cabal => static-site-generator.cabal (86%) rename {ssg/src => static-site-generator}/Formats/Gogen.hs (100%) rename {ssg/src => static-site-generator}/Formats/Posts.hs (100%) rename {ssg/src => static-site-generator}/Main.hs (97%) rename {ssg/src => static-site-generator}/Preprocessing/Graphviz.hs (100%) rename {ssg/src => static-site-generator}/Preprocessing/LogoLinks.hs (100%) rename {ssg/src => static-site-generator}/Util/Hakyll/Context.hs (100%) rename {ssg/src => static-site-generator}/Util/Hakyll/Routes.hs (100%) rename {ssg/src => static-site-generator}/Util/Hash.hs (100%) rename {src => www}/2022-03-27-debug.md (100%) rename {src => www}/_config.yaml (100%) rename {src => www}/css/default.css (100%) rename {src => www}/css/styles.css (100%) rename {src => www}/gogen/are.md (100%) rename {src => www}/gogen/connectors/kara.md (100%) rename {src => www}/gogen/connectors/keredomo.md (100%) rename {src => www}/gogen/connectors/nara.md (100%) rename {src => www}/gogen/dake.md (100%) rename {src => www}/gogen/dame.md (100%) rename {src => www}/gogen/dore.md (100%) rename {src => www}/gogen/hodo.md (100%) rename {src => www}/gogen/hou.md (100%) rename {src => www}/gogen/imada.md (100%) rename {src => www}/gogen/ippai.md (100%) rename {src => www}/gogen/kichinto.md (100%) rename {src => www}/gogen/kore.md (100%) rename {src => www}/gogen/maji.md (100%) rename {src => www}/gogen/mama.md (100%) rename {src => www}/gogen/masa.md (100%) rename {src => www}/gogen/motto.md (100%) rename {src => www}/gogen/mou.md (100%) rename {src => www}/gogen/nado.md (100%) rename {src => www}/gogen/nanika.md (100%) rename {src => www}/gogen/osoraku.md (100%) rename {src => www}/gogen/particles/ga.md (100%) rename {src => www}/gogen/particles/to.md (100%) rename {src => www}/gogen/particles/toka.md (100%) rename {src => www}/gogen/particles/ya.md (100%) rename {src => www}/gogen/sara.md (100%) rename {src => www}/gogen/shibaraku.md (100%) rename {src => www}/gogen/shika.md (100%) rename {src => www}/gogen/sore.md (100%) rename {src => www}/gogen/sude.md (100%) rename {src => www}/gogen/sugoi.md (100%) rename {src => www}/gogen/takusan.md (100%) rename {src => www}/gogen/tokoro.md (100%) rename {src => www}/gogen/totemo.md (100%) rename {src => www}/gogen/tsune.md (100%) rename {src => www}/gogen/tsuto.md (100%) rename {src => www}/gogen/verb_forms/reba.md (100%) rename {src => www}/gogen/verb_forms/sareru.md (100%) rename {src => www}/gogen/verb_forms/saseru.md (100%) rename {src => www}/gogen/verb_forms/tara.md (100%) rename {src => www}/gogen/verb_forms/temiru.md (100%) rename {src => www}/gogen/verbs/ageru.md (100%) rename {src => www}/gogen/verbs/dasu.md (100%) rename {src => www}/gogen/verbs/itadaku.md (100%) rename {src => www}/gogen/verbs/kakaru.md (100%) rename {src => www}/gogen/verbs/kureru.md (100%) rename {src => www}/gogen/verbs/morau.md (100%) rename {src => www}/gogen/verbs/shitagau.md (100%) rename {src => www}/gogen/verbs/sugiru.md (100%) rename {src => www}/gogen/verbs/suru.md (100%) rename {src => www}/gogen/verbs/tsukeru.md (100%) rename {src => www}/gogen/verbs/tsumoru.md (100%) rename {src => www}/gogen/yahari.md (100%) rename {src => www}/gogen/yori.md (100%) rename {src => www}/gogen/you.md (100%) rename {src => www}/images/header-nani.svg (100%) rename {src => www}/images/index_header_background.jpg (100%) rename {src => www}/images/logos/dart.svg (100%) rename {src => www}/images/logos/gitea.svg (100%) rename {src => www}/images/logos/github.svg (100%) rename {src => www}/images/logos/gitlab.svg (100%) rename {src => www}/images/logos/haskell_orange.svg (100%) rename {src => www}/images/logos/haskell_purple.svg (100%) rename {src => www}/images/logos/nani.svg (100%) rename {src => www}/images/logos/nix_options.svg (100%) rename {src => www}/images/logos/nix_packages.svg (100%) rename {src => www}/images/logos/npm.svg (100%) rename {src => www}/images/logos/reddit.svg (100%) rename {src => www}/images/logos/rust.svg (100%) rename {src => www}/images/logos/stack_overflow.svg (100%) rename {src => www}/images/logos/wikipedia.svg (100%) create mode 100644 www/images/nani.png rename {src => www}/images/nani.svg (100%) rename {src => www}/images/nix_banner.png (100%) rename {src => www}/index.html (100%) rename {src => www}/js/script.js (100%) rename {src => www}/js/ui.js (100%) rename {src => www}/posts/2022-10-16-tangling-org-files.md (100%) rename {src => www}/posts/2022-10-16-the-arrow-operator.md (100%) rename {src => www}/robots.txt (100%) rename {src => www}/templates/default.html (100%) rename {src => www}/templates/gogen.html (100%) rename {src => www}/templates/post.html (100%) rename {src => www}/templates/sitemap.xml (100%) diff --git a/flake.lock b/flake.lock index 2d614d3..690f8ca 100644 --- a/flake.lock +++ b/flake.lock @@ -2,16 +2,16 @@ "nodes": { "nixpkgs": { "locked": { - "lastModified": 1667254466, - "narHash": "sha256-YrMQzDVOo+uz5gg1REj2q/uVhJE3WcpkqGiMzh3Da3o=", + "lastModified": 1678426640, + "narHash": "sha256-3Q4KN0XAXQT7YE3A8n3LzLtRNUCo0U++W3gl+5NhKHs=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "1b4722674c315de0e191d0d79790b4eac51570a1", + "rev": "824f886682fc893e6dbf27114e5001ebf2770ea1", "type": "github" }, "original": { "id": "nixpkgs", - "ref": "nixos-22.05", + "ref": "nixos-22.11", "type": "indirect" } }, diff --git a/flake.nix b/flake.nix index 4b409da..a797e42 100644 --- a/flake.nix +++ b/flake.nix @@ -1,54 +1,55 @@ { - description = "hakyll-nix-template"; + inputs.nixpkgs.url = "nixpkgs/nixos-22.11"; - nixConfig.bash-prompt = "[nix]λ "; - - inputs.nixpkgs.url = "nixpkgs/nixos-22.05"; - - outputs = { nixpkgs, self }: let + outputs = { self, nixpkgs }: let system = "x86_64-linux"; - overlays = [ (import ./nix/haskell-overlay.nix) ]; - pkgs = import nixpkgs { inherit overlays system; }; + pkgs = nixpkgs.legacyPackages.${system}; in { - overlays = { - haskell-overlay = import ./nix/haskell-overlay.nix; - default = self.overlays.haskell-overlay; - }; + packages.${system} = { + static-site-generator = pkgs.haskellPackages.developPackage { + name = "static-site-generator"; + root = ./.; + }; - packages.${system} = with pkgs.myHaskellPackages; { - inherit ssg website; - default = website; + default = self.packages.${system}.website; + website = pkgs.stdenvNoCC.mkDerivation { + name = "website"; + buildInputs = with pkgs; [ + self.packages.${system}.static-site-generator + graphviz + ]; + + src = pkgs.nix-gitignore.gitignoreSourcePure [ + ".gitignore" + ".git" + ".github" + ] ./.; + + buildPhase = '' + hakyll-site build --verbose + ''; + + installPhase = '' + cp -r dist "$out" + ''; + }; }; apps.${system} = { - hakyll-site = let - drv = self.packages.${system}.ssg; - exePath = "/bin/hakyll-site"; + default = self.apps.${system}.watch-hakyll-site; + watch-hakyll-site = let + ssg = self.packages.${system}.static-site-generator; + drv = pkgs.writeScriptBin "watch-hakyll-site" '' + ${ssg}/bin/static-site-generator watch + ''; in { type = "app"; - program = "${drv}${exePath}"; + program = "${drv}/bin/watch-hakyll-site"; }; - default = self.apps.${system}.hakyll-site; - }; - - devShells.${system}.default = pkgs.myHaskellPackages.shellFor { - packages = p: [ p.ssg ]; - - buildInputs = with pkgs.myHaskellPackages; [ - # ssg - - # Helpful tools for `nix develop` shells - ghcid # https://github.com/ndmitchell/ghcid - haskell-language-server # https://github.com/haskell/haskell-language-server - hlint # https://github.com/ndmitchell/hlint - ormolu # https://github.com/tweag/ormolu - ]; - - withHoogle = true; }; hydraJobs = { - ssg.${system} = self.packages.${system}.ssg; + static-site-generator.${system} = self.packages.${system}.static-site-generator; website.${system} = self.packages.${system}.website; }; }; diff --git a/nix/hakyll.patch b/nix/hakyll.patch deleted file mode 100644 index e69de29..0000000 diff --git a/nix/haskell-overlay.nix b/nix/haskell-overlay.nix deleted file mode 100644 index 9825691..0000000 --- a/nix/haskell-overlay.nix +++ /dev/null @@ -1,68 +0,0 @@ -final: prev: - let - inherit (prev.stdenv) mkDerivation; - inherit (prev.lib.trivial) flip pipe; - inherit (prev.haskell.lib) - appendPatch - appendConfigureFlags - dontCheck - doJailbreak; - - withPatch = flip appendPatch; - withFlags = flip appendConfigureFlags; - - haskellCompiler = "ghc884"; - in { - myHaskellPackages = prev.haskell.packages.${haskellCompiler}.override { - overrides = hpFinal: hpPrev: - rec { - hakyll = pipe hpPrev.hakyll [ - doJailbreak - dontCheck - # (withPatch ./hakyll.patch) - (withFlags [ "-f" "watch" ]) - ]; - - pandoc = pipe hpPrev.pandoc [ - doJailbreak - dontCheck - ]; - - slugger = hpPrev.slugger; - - ssg = hpPrev.callCabal2nix "ssg" ../ssg {}; - - website = prev.stdenv.mkDerivation { - #__contentAddressed = true; # uncomment if using cas: https://www.tweag.io/blog/2020-09-10-nix-cas/ - name = "website"; - buildInputs = [ - ssg - final.graphviz - ]; - src = prev.nix-gitignore.gitignoreSourcePure [ - ../.gitignore - "../.git" - "../.github" - ] ../.; - - # LANG and LOCALE_ARCHIVE are fixes pulled from the community: - # https://github.com/jaspervdj/hakyll/issues/614#issuecomment-411520691 - # https://github.com/NixOS/nix/issues/318#issuecomment-52986702 - # https://github.com/MaxDaten/brutal-recipes/blob/source/default.nix#L24 - LANG = "en_US.UTF-8"; - LOCALE_ARCHIVE = prev.lib.optionalString - (prev.buildPlatform.libc == "glibc") - "${prev.glibcLocales}/lib/locale/locale-archive"; - - buildPhase = '' - hakyll-site build --verbose - ''; - - installPhase = '' - mkdir -p "$out" - cp -r dist/* "$out" - ''; - }; - }; - }; -} diff --git a/nix/pure-css/default.nix b/nix/pure-css/default.nix deleted file mode 100644 index faa8f8a..0000000 --- a/nix/pure-css/default.nix +++ /dev/null @@ -1,55 +0,0 @@ -{ pkgs ? import {} }: - -with pkgs.stdenv.lib; - -let - - name = "pure-css"; - version = "v2.0.6"; - - # pull in the code for building npm packages - nodePackages = import ./npm-packages.nix { - inherit pkgs; - inherit (pkgs) stdenv nodejs fetchurl fetchgit; - neededNatives = [ pkgs.python ] ++ pkgs.lib.optional -pkgs.stdenv.isLinux pkgs.utillinux; - self = nodePackages; - }; - - buildModules = [ - nodePackages."bower" - nodePackages."grunt" - nodePackages."grunt-cli" - nodePackages."grunt-contrib-cssmin" - nodePackages."grunt-contrib-clean" - nodePackages."grunt-contrib-copy" - nodePackages."grunt-contrib-concat" - nodePackages."grunt-contrib-compress" - nodePackages."grunt-contrib-csslint" - nodePackages."grunt-contrib-watch" - nodePackages."grunt-css-selectors" - nodePackages."grunt-pure-grids" - nodePackages."grunt-stripmq" - ]; - -in pkgs.stdenv.mkDerivation { - - name = "${name}-${version}"; - - src = pkgs.fetchgit { - url = https://github.com/pure-css/pure; - rev = "refs/tags/v2.0.6"; - sha256 = -"049ac2ef812771852978d11cd5aecac2dd561e97bb16ad89c79eb1e10aa57672"; - }; - - buildInputs = buildModules; - - buildCommand = '' - cp -r $src src - chmod +w src - cd src - grunt - ''; - -} diff --git a/nix/pure-css/npm-packages.nix b/nix/pure-css/npm-packages.nix deleted file mode 100644 index 70d93a5..0000000 --- a/nix/pure-css/npm-packages.nix +++ /dev/null @@ -1,30 +0,0 @@ -{ pkgs, stdenv, nodejs, fetchurl, fetchgit, neededNatives, self }: - -rec { - - nativeDeps = {}; - - buildNodePackage = import -"${pkgs.path}/pkgs/development/web/nodejs/build-node-package.nix" { - inherit stdenv nodejs neededNatives; - inherit (pkgs) runCommand; - }; - - patchSource = fn: srcAttrs: - let src = fn srcAttrs; in pkgs.runCommand src.name {} '' - mkdir unpack - cd unpack - unpackFile ${src} - chmod -R +w */ - mv */ package 2>/dev/null || true - sed -i -e "s/:\s*\"latest\"/: \"*\"/" -e -"s/:\s*\"\(https\?\|git\(\+\(ssh\|http\|https\)\)\?\):\/\/[^\"]*\"/: -\"*\"/" package/package.json - mv */ $out - ''; - - # Backwards compat - patchLatest = patchSource fetchurl; - -} // import ./purecss-npm-generated.nix { inherit self fetchurl fetchgit; -inherit (pkgs) lib; } diff --git a/ssg/LICENSE b/ssg/LICENSE deleted file mode 100644 index 1009f96..0000000 --- a/ssg/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2020, Robert Pearce -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. 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. - -3. Neither the name of the copyright holder nor the names of its - 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 HOLDER 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. diff --git a/ssg/ssg.cabal b/static-site-generator.cabal similarity index 86% rename from ssg/ssg.cabal rename to static-site-generator.cabal index ff7daf9..f623332 100644 --- a/ssg/ssg.cabal +++ b/static-site-generator.cabal @@ -1,14 +1,14 @@ cabal-version: 2.4 -name: ssg +name: static-site-generator version: 0.1.0.0 build-type: Simple license: BSD-3-Clause license-file: LICENSE -executable hakyll-site +executable static-site-generator main-is: Main.hs - hs-source-dirs: src + hs-source-dirs: static-site-generator build-depends: base >= 4.8 , hakyll >= 4.15 , pandoc >= 2.14 diff --git a/ssg/src/Formats/Gogen.hs b/static-site-generator/Formats/Gogen.hs similarity index 100% rename from ssg/src/Formats/Gogen.hs rename to static-site-generator/Formats/Gogen.hs diff --git a/ssg/src/Formats/Posts.hs b/static-site-generator/Formats/Posts.hs similarity index 100% rename from ssg/src/Formats/Posts.hs rename to static-site-generator/Formats/Posts.hs diff --git a/ssg/src/Main.hs b/static-site-generator/Main.hs similarity index 97% rename from ssg/src/Main.hs rename to static-site-generator/Main.hs index 8970b2f..f792cf3 100644 --- a/ssg/src/Main.hs +++ b/static-site-generator/Main.hs @@ -38,7 +38,7 @@ root = siteName :: String siteName = - "Nani~" + "Nani" config :: Configuration config = @@ -47,9 +47,9 @@ config = , ignoreFile = const False , previewHost = "127.0.0.1" , previewPort = 8000 - , providerDirectory = "src" - , storeDirectory = "ssg/_cache" - , tmpDirectory = "ssg/_tmp" + , providerDirectory = "www" + , storeDirectory = "/tmp/nani-wtf-hakyll/store" + , tmpDirectory = "/tmp/nani-wtf-hakyll/tmp" } -------------------------------------------------------------------------------- @@ -57,7 +57,7 @@ config = main :: IO () main = hakyllWith config $ do - fileHashes <- preprocess (mapKeys (fromFilePath . drop 4 . toFilePath) <$> mkFileHashes "src/posts") + fileHashes <- preprocess (mapKeys (fromFilePath . drop 4 . toFilePath) <$> mkFileHashes "www/posts") forM_ [ "CNAME" @@ -279,4 +279,4 @@ feedConfiguration = , feedAuthorName = "h7x4" , feedAuthorEmail = "h7x4@protonmail.com" , feedRoot = root - } \ No newline at end of file + } diff --git a/ssg/src/Preprocessing/Graphviz.hs b/static-site-generator/Preprocessing/Graphviz.hs similarity index 100% rename from ssg/src/Preprocessing/Graphviz.hs rename to static-site-generator/Preprocessing/Graphviz.hs diff --git a/ssg/src/Preprocessing/LogoLinks.hs b/static-site-generator/Preprocessing/LogoLinks.hs similarity index 100% rename from ssg/src/Preprocessing/LogoLinks.hs rename to static-site-generator/Preprocessing/LogoLinks.hs diff --git a/ssg/src/Util/Hakyll/Context.hs b/static-site-generator/Util/Hakyll/Context.hs similarity index 100% rename from ssg/src/Util/Hakyll/Context.hs rename to static-site-generator/Util/Hakyll/Context.hs diff --git a/ssg/src/Util/Hakyll/Routes.hs b/static-site-generator/Util/Hakyll/Routes.hs similarity index 100% rename from ssg/src/Util/Hakyll/Routes.hs rename to static-site-generator/Util/Hakyll/Routes.hs diff --git a/ssg/src/Util/Hash.hs b/static-site-generator/Util/Hash.hs similarity index 100% rename from ssg/src/Util/Hash.hs rename to static-site-generator/Util/Hash.hs diff --git a/src/2022-03-27-debug.md b/www/2022-03-27-debug.md similarity index 100% rename from src/2022-03-27-debug.md rename to www/2022-03-27-debug.md diff --git a/src/_config.yaml b/www/_config.yaml similarity index 100% rename from src/_config.yaml rename to www/_config.yaml diff --git a/src/css/default.css b/www/css/default.css similarity index 100% rename from src/css/default.css rename to www/css/default.css diff --git a/src/css/styles.css b/www/css/styles.css similarity index 100% rename from src/css/styles.css rename to www/css/styles.css diff --git a/src/gogen/are.md b/www/gogen/are.md similarity index 100% rename from src/gogen/are.md rename to www/gogen/are.md diff --git a/src/gogen/connectors/kara.md b/www/gogen/connectors/kara.md similarity index 100% rename from src/gogen/connectors/kara.md rename to www/gogen/connectors/kara.md diff --git a/src/gogen/connectors/keredomo.md b/www/gogen/connectors/keredomo.md similarity index 100% rename from src/gogen/connectors/keredomo.md rename to www/gogen/connectors/keredomo.md diff --git a/src/gogen/connectors/nara.md b/www/gogen/connectors/nara.md similarity index 100% rename from src/gogen/connectors/nara.md rename to www/gogen/connectors/nara.md diff --git a/src/gogen/dake.md b/www/gogen/dake.md similarity index 100% rename from src/gogen/dake.md rename to www/gogen/dake.md diff --git a/src/gogen/dame.md b/www/gogen/dame.md similarity index 100% rename from src/gogen/dame.md rename to www/gogen/dame.md diff --git a/src/gogen/dore.md b/www/gogen/dore.md similarity index 100% rename from src/gogen/dore.md rename to www/gogen/dore.md diff --git a/src/gogen/hodo.md b/www/gogen/hodo.md similarity index 100% rename from src/gogen/hodo.md rename to www/gogen/hodo.md diff --git a/src/gogen/hou.md b/www/gogen/hou.md similarity index 100% rename from src/gogen/hou.md rename to www/gogen/hou.md diff --git a/src/gogen/imada.md b/www/gogen/imada.md similarity index 100% rename from src/gogen/imada.md rename to www/gogen/imada.md diff --git a/src/gogen/ippai.md b/www/gogen/ippai.md similarity index 100% rename from src/gogen/ippai.md rename to www/gogen/ippai.md diff --git a/src/gogen/kichinto.md b/www/gogen/kichinto.md similarity index 100% rename from src/gogen/kichinto.md rename to www/gogen/kichinto.md diff --git a/src/gogen/kore.md b/www/gogen/kore.md similarity index 100% rename from src/gogen/kore.md rename to www/gogen/kore.md diff --git a/src/gogen/maji.md b/www/gogen/maji.md similarity index 100% rename from src/gogen/maji.md rename to www/gogen/maji.md diff --git a/src/gogen/mama.md b/www/gogen/mama.md similarity index 100% rename from src/gogen/mama.md rename to www/gogen/mama.md diff --git a/src/gogen/masa.md b/www/gogen/masa.md similarity index 100% rename from src/gogen/masa.md rename to www/gogen/masa.md diff --git a/src/gogen/motto.md b/www/gogen/motto.md similarity index 100% rename from src/gogen/motto.md rename to www/gogen/motto.md diff --git a/src/gogen/mou.md b/www/gogen/mou.md similarity index 100% rename from src/gogen/mou.md rename to www/gogen/mou.md diff --git a/src/gogen/nado.md b/www/gogen/nado.md similarity index 100% rename from src/gogen/nado.md rename to www/gogen/nado.md diff --git a/src/gogen/nanika.md b/www/gogen/nanika.md similarity index 100% rename from src/gogen/nanika.md rename to www/gogen/nanika.md diff --git a/src/gogen/osoraku.md b/www/gogen/osoraku.md similarity index 100% rename from src/gogen/osoraku.md rename to www/gogen/osoraku.md diff --git a/src/gogen/particles/ga.md b/www/gogen/particles/ga.md similarity index 100% rename from src/gogen/particles/ga.md rename to www/gogen/particles/ga.md diff --git a/src/gogen/particles/to.md b/www/gogen/particles/to.md similarity index 100% rename from src/gogen/particles/to.md rename to www/gogen/particles/to.md diff --git a/src/gogen/particles/toka.md b/www/gogen/particles/toka.md similarity index 100% rename from src/gogen/particles/toka.md rename to www/gogen/particles/toka.md diff --git a/src/gogen/particles/ya.md b/www/gogen/particles/ya.md similarity index 100% rename from src/gogen/particles/ya.md rename to www/gogen/particles/ya.md diff --git a/src/gogen/sara.md b/www/gogen/sara.md similarity index 100% rename from src/gogen/sara.md rename to www/gogen/sara.md diff --git a/src/gogen/shibaraku.md b/www/gogen/shibaraku.md similarity index 100% rename from src/gogen/shibaraku.md rename to www/gogen/shibaraku.md diff --git a/src/gogen/shika.md b/www/gogen/shika.md similarity index 100% rename from src/gogen/shika.md rename to www/gogen/shika.md diff --git a/src/gogen/sore.md b/www/gogen/sore.md similarity index 100% rename from src/gogen/sore.md rename to www/gogen/sore.md diff --git a/src/gogen/sude.md b/www/gogen/sude.md similarity index 100% rename from src/gogen/sude.md rename to www/gogen/sude.md diff --git a/src/gogen/sugoi.md b/www/gogen/sugoi.md similarity index 100% rename from src/gogen/sugoi.md rename to www/gogen/sugoi.md diff --git a/src/gogen/takusan.md b/www/gogen/takusan.md similarity index 100% rename from src/gogen/takusan.md rename to www/gogen/takusan.md diff --git a/src/gogen/tokoro.md b/www/gogen/tokoro.md similarity index 100% rename from src/gogen/tokoro.md rename to www/gogen/tokoro.md diff --git a/src/gogen/totemo.md b/www/gogen/totemo.md similarity index 100% rename from src/gogen/totemo.md rename to www/gogen/totemo.md diff --git a/src/gogen/tsune.md b/www/gogen/tsune.md similarity index 100% rename from src/gogen/tsune.md rename to www/gogen/tsune.md diff --git a/src/gogen/tsuto.md b/www/gogen/tsuto.md similarity index 100% rename from src/gogen/tsuto.md rename to www/gogen/tsuto.md diff --git a/src/gogen/verb_forms/reba.md b/www/gogen/verb_forms/reba.md similarity index 100% rename from src/gogen/verb_forms/reba.md rename to www/gogen/verb_forms/reba.md diff --git a/src/gogen/verb_forms/sareru.md b/www/gogen/verb_forms/sareru.md similarity index 100% rename from src/gogen/verb_forms/sareru.md rename to www/gogen/verb_forms/sareru.md diff --git a/src/gogen/verb_forms/saseru.md b/www/gogen/verb_forms/saseru.md similarity index 100% rename from src/gogen/verb_forms/saseru.md rename to www/gogen/verb_forms/saseru.md diff --git a/src/gogen/verb_forms/tara.md b/www/gogen/verb_forms/tara.md similarity index 100% rename from src/gogen/verb_forms/tara.md rename to www/gogen/verb_forms/tara.md diff --git a/src/gogen/verb_forms/temiru.md b/www/gogen/verb_forms/temiru.md similarity index 100% rename from src/gogen/verb_forms/temiru.md rename to www/gogen/verb_forms/temiru.md diff --git a/src/gogen/verbs/ageru.md b/www/gogen/verbs/ageru.md similarity index 100% rename from src/gogen/verbs/ageru.md rename to www/gogen/verbs/ageru.md diff --git a/src/gogen/verbs/dasu.md b/www/gogen/verbs/dasu.md similarity index 100% rename from src/gogen/verbs/dasu.md rename to www/gogen/verbs/dasu.md diff --git a/src/gogen/verbs/itadaku.md b/www/gogen/verbs/itadaku.md similarity index 100% rename from src/gogen/verbs/itadaku.md rename to www/gogen/verbs/itadaku.md diff --git a/src/gogen/verbs/kakaru.md b/www/gogen/verbs/kakaru.md similarity index 100% rename from src/gogen/verbs/kakaru.md rename to www/gogen/verbs/kakaru.md diff --git a/src/gogen/verbs/kureru.md b/www/gogen/verbs/kureru.md similarity index 100% rename from src/gogen/verbs/kureru.md rename to www/gogen/verbs/kureru.md diff --git a/src/gogen/verbs/morau.md b/www/gogen/verbs/morau.md similarity index 100% rename from src/gogen/verbs/morau.md rename to www/gogen/verbs/morau.md diff --git a/src/gogen/verbs/shitagau.md b/www/gogen/verbs/shitagau.md similarity index 100% rename from src/gogen/verbs/shitagau.md rename to www/gogen/verbs/shitagau.md diff --git a/src/gogen/verbs/sugiru.md b/www/gogen/verbs/sugiru.md similarity index 100% rename from src/gogen/verbs/sugiru.md rename to www/gogen/verbs/sugiru.md diff --git a/src/gogen/verbs/suru.md b/www/gogen/verbs/suru.md similarity index 100% rename from src/gogen/verbs/suru.md rename to www/gogen/verbs/suru.md diff --git a/src/gogen/verbs/tsukeru.md b/www/gogen/verbs/tsukeru.md similarity index 100% rename from src/gogen/verbs/tsukeru.md rename to www/gogen/verbs/tsukeru.md diff --git a/src/gogen/verbs/tsumoru.md b/www/gogen/verbs/tsumoru.md similarity index 100% rename from src/gogen/verbs/tsumoru.md rename to www/gogen/verbs/tsumoru.md diff --git a/src/gogen/yahari.md b/www/gogen/yahari.md similarity index 100% rename from src/gogen/yahari.md rename to www/gogen/yahari.md diff --git a/src/gogen/yori.md b/www/gogen/yori.md similarity index 100% rename from src/gogen/yori.md rename to www/gogen/yori.md diff --git a/src/gogen/you.md b/www/gogen/you.md similarity index 100% rename from src/gogen/you.md rename to www/gogen/you.md diff --git a/src/images/header-nani.svg b/www/images/header-nani.svg similarity index 100% rename from src/images/header-nani.svg rename to www/images/header-nani.svg diff --git a/src/images/index_header_background.jpg b/www/images/index_header_background.jpg similarity index 100% rename from src/images/index_header_background.jpg rename to www/images/index_header_background.jpg diff --git a/src/images/logos/dart.svg b/www/images/logos/dart.svg similarity index 100% rename from src/images/logos/dart.svg rename to www/images/logos/dart.svg diff --git a/src/images/logos/gitea.svg b/www/images/logos/gitea.svg similarity index 100% rename from src/images/logos/gitea.svg rename to www/images/logos/gitea.svg diff --git a/src/images/logos/github.svg b/www/images/logos/github.svg similarity index 100% rename from src/images/logos/github.svg rename to www/images/logos/github.svg diff --git a/src/images/logos/gitlab.svg b/www/images/logos/gitlab.svg similarity index 100% rename from src/images/logos/gitlab.svg rename to www/images/logos/gitlab.svg diff --git a/src/images/logos/haskell_orange.svg b/www/images/logos/haskell_orange.svg similarity index 100% rename from src/images/logos/haskell_orange.svg rename to www/images/logos/haskell_orange.svg diff --git a/src/images/logos/haskell_purple.svg b/www/images/logos/haskell_purple.svg similarity index 100% rename from src/images/logos/haskell_purple.svg rename to www/images/logos/haskell_purple.svg diff --git a/src/images/logos/nani.svg b/www/images/logos/nani.svg similarity index 100% rename from src/images/logos/nani.svg rename to www/images/logos/nani.svg diff --git a/src/images/logos/nix_options.svg b/www/images/logos/nix_options.svg similarity index 100% rename from src/images/logos/nix_options.svg rename to www/images/logos/nix_options.svg diff --git a/src/images/logos/nix_packages.svg b/www/images/logos/nix_packages.svg similarity index 100% rename from src/images/logos/nix_packages.svg rename to www/images/logos/nix_packages.svg diff --git a/src/images/logos/npm.svg b/www/images/logos/npm.svg similarity index 100% rename from src/images/logos/npm.svg rename to www/images/logos/npm.svg diff --git a/src/images/logos/reddit.svg b/www/images/logos/reddit.svg similarity index 100% rename from src/images/logos/reddit.svg rename to www/images/logos/reddit.svg diff --git a/src/images/logos/rust.svg b/www/images/logos/rust.svg similarity index 100% rename from src/images/logos/rust.svg rename to www/images/logos/rust.svg diff --git a/src/images/logos/stack_overflow.svg b/www/images/logos/stack_overflow.svg similarity index 100% rename from src/images/logos/stack_overflow.svg rename to www/images/logos/stack_overflow.svg diff --git a/src/images/logos/wikipedia.svg b/www/images/logos/wikipedia.svg similarity index 100% rename from src/images/logos/wikipedia.svg rename to www/images/logos/wikipedia.svg diff --git a/www/images/nani.png b/www/images/nani.png new file mode 100644 index 0000000000000000000000000000000000000000..a3f4c1c70b7b0539536a272ee01fa87d6a304409 GIT binary patch literal 26322 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 literal 0 HcmV?d00001 diff --git a/src/images/nani.svg b/www/images/nani.svg similarity index 100% rename from src/images/nani.svg rename to www/images/nani.svg diff --git a/src/images/nix_banner.png b/www/images/nix_banner.png similarity index 100% rename from src/images/nix_banner.png rename to www/images/nix_banner.png diff --git a/src/index.html b/www/index.html similarity index 100% rename from src/index.html rename to www/index.html diff --git a/src/js/script.js b/www/js/script.js similarity index 100% rename from src/js/script.js rename to www/js/script.js diff --git a/src/js/ui.js b/www/js/ui.js similarity index 100% rename from src/js/ui.js rename to www/js/ui.js diff --git a/src/posts/2022-10-16-tangling-org-files.md b/www/posts/2022-10-16-tangling-org-files.md similarity index 100% rename from src/posts/2022-10-16-tangling-org-files.md rename to www/posts/2022-10-16-tangling-org-files.md diff --git a/src/posts/2022-10-16-the-arrow-operator.md b/www/posts/2022-10-16-the-arrow-operator.md similarity index 100% rename from src/posts/2022-10-16-the-arrow-operator.md rename to www/posts/2022-10-16-the-arrow-operator.md diff --git a/src/robots.txt b/www/robots.txt similarity index 100% rename from src/robots.txt rename to www/robots.txt diff --git a/src/templates/default.html b/www/templates/default.html similarity index 100% rename from src/templates/default.html rename to www/templates/default.html diff --git a/src/templates/gogen.html b/www/templates/gogen.html similarity index 100% rename from src/templates/gogen.html rename to www/templates/gogen.html diff --git a/src/templates/post.html b/www/templates/post.html similarity index 100% rename from src/templates/post.html rename to www/templates/post.html diff --git a/src/templates/sitemap.xml b/www/templates/sitemap.xml similarity index 100% rename from src/templates/sitemap.xml rename to www/templates/sitemap.xml