summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wells <chris@mathematicaster.org>2026-01-20 17:00:40 -0600
committerChris Wells <chris@mathematicaster.org>2026-01-20 17:00:40 -0600
commit5d83e36ef8210d1514259c89ff97a25c4d19600c (patch)
treebb15b5d2f15e671b6963b1088a501e0dee758f2e
parent8424579b0c79038510c3e763b1154cb6aea5cdfe (diff)
downloadmain-5d83e36ef8210d1514259c89ff97a25c4d19600c.tar
main-5d83e36ef8210d1514259c89ff97a25c4d19600c.tar.gz
main-5d83e36ef8210d1514259c89ff97a25c4d19600c.tar.bz2
main-5d83e36ef8210d1514259c89ff97a25c4d19600c.tar.lz
main-5d83e36ef8210d1514259c89ff97a25c4d19600c.tar.xz
main-5d83e36ef8210d1514259c89ff97a25c4d19600c.tar.zst
main-5d83e36ef8210d1514259c89ff97a25c4d19600c.zip
Technically working, but I need a cleaner way to pass personA and
journalA into a list context...
-rw-r--r--.gitignore2
-rw-r--r--app/Main.hs17
-rw-r--r--data/papers.bib328
-rw-r--r--data/people.yaml2
-rw-r--r--flake.lock56
-rw-r--r--flake.nix119
-rw-r--r--package.yaml2
-rw-r--r--src/Data/Abbr.hs2
-rw-r--r--src/Data/Alias.hs4
-rw-r--r--src/Data/Linked.hs2
-rw-r--r--src/Data/Name.hs2
-rw-r--r--src/Data/Paper.hs24
-rw-r--r--src/Data/Person.hs2
-rw-r--r--src/Hakyll/Alias.hs8
-rw-r--r--src/Hakyll/Paper.hs47
-rw-r--r--src/Hakyll/TeX/BibTeX.hs3
-rw-r--r--src/Prolog.hs8
-rw-r--r--templates/default.html14
-rw-r--r--www-main.cabal9
-rw-r--r--www/code/index.html30
-rw-r--r--www/credits/index.html40
-rw-r--r--www/credits/index.md19
-rw-r--r--www/index.html20
-rw-r--r--www/research/index.html57
-rw-r--r--www/research/invturan/index.md5
-rw-r--r--www/research/poramsey/index.md4
-rw-r--r--www/teaching/index.md78
27 files changed, 771 insertions, 133 deletions
diff --git a/.gitignore b/.gitignore
index a2a2bdc..ba2a521 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,5 @@ dist-newstyle/*
result
.direnv
.cache/*
+tags
+output/
diff --git a/app/Main.hs b/app/Main.hs
index 6e00f0a..9c375a1 100644
--- a/app/Main.hs
+++ b/app/Main.hs
@@ -2,17 +2,20 @@ module Main where
import Prolog
import Hakyll
+import Data.List qualified as L
import Hakyll.Alias
import Hakyll.Util
import Data.Alias (AliasMap)
-import Data.Name (Name_)
+import Data.Name (Name (..), Name_)
import Data.Person (Person_)
import Data.Journal (Journal_)
import Data.License (License_)
+import Data.Paper (Paper (..))
import Hakyll.Aeson (yamlCompiler)
+import Hakyll.Paper (papersCompiler, mkPaperContext, FieldContext (..))
import Hakyll.TeX.BibTeX (bibtexCompiler)
-import WWW.Base (baseHakyll, domain)
+import WWW.Base (baseHakyll, domain, myHakyllWriterOptions, myHakyllReaderOptions)
import WWW.Templates (myContext, defaultTemplate)
@@ -43,18 +46,22 @@ main = baseHakyll domain $ do
route $ dropParentRoute 1
compile $ do
papers <- loadBody @[Paper String] "data/papers.bib"
- let fixedPapers = sort $ papers <&> \p -> p
+ let fixedPapers = L.reverse $ L.sort $ papers <&> \p -> p
{ authors = (`filter` authors p) $ flip notElem
[ Name "Cox" "Christopher" Nothing
, Name "Wells" "Chris" Nothing
] -- Remove me from the author list
}
- undefined >>= applyTemplate defaultTemplate baseCtxt >>= applyAsTemplate (mkPaperContext fixedPapers)
+ getResourceBody >>= applyAsTemplate (mkPaperContext (FieldContext (personCtxt "data/people.yaml") (journalCtxt "data/journals.yaml")) fixedPapers) >>= applyTemplate defaultTemplate baseCtxt
match "www/teaching/index.md" $ do
route $ dropParentRoute 1 `composeRoutes` setExtension ".html"
- compile $ myPandocCompiler >>= applyTemplate defaultTemplate baseCtxt
+ -- compile $ myPandocCompiler >>= applyAsTemplate baseCtxt >>= applyTemplate defaultTemplate baseCtxt
+ compile $ getResourceBody >>= applyAsTemplate baseCtxt >>= myRenderPandoc >>= applyTemplate defaultTemplate baseCtxt
pure ()
myPandocCompiler :: Compiler (Item String)
myPandocCompiler = pandocCompilerWith myHakyllReaderOptions myHakyllWriterOptions
+
+myRenderPandoc :: Item String -> Compiler (Item String)
+myRenderPandoc = renderPandocWith myHakyllReaderOptions myHakyllWriterOptions
diff --git a/data/papers.bib b/data/papers.bib
index e69de29..fa1037a 100644
--- a/data/papers.bib
+++ b/data/papers.bib
@@ -0,0 +1,328 @@
+@unpublished{briggs_frogs,
+ title = {Frogs, hats and common subsequences},
+ author = {Briggs, Joseph and Parker, Alex and Schwieder, Coy},
+ month = {apr},
+ year = {2024},
+ eprint = {2404.07285},
+ eprinttype = {arXiv},
+ eprintclass = {math.CO},
+ keywords = {submitted},
+}
+
+@unpublished{briggs_phases,
+ author = {Briggs, Joseph},
+ title = {Phase transitions in isoperimetric problems on the integers},
+ year = {2024},
+ month = {feb},
+ eprint = {2402.14087},
+ eprintclass = {math.CO},
+ eprinttype = {arxiv},
+ keywords = {accepted},
+ journal = {Discrete Mathematics}
+}
+
+@article{briggs_vietoris,
+ author = {Briggs, Joseph and Feng, Ziqin},
+ doi = {10.1080/10586458.2025.2474034},
+ journal = {Experimental Mathematics},
+ month = {mar},
+ pages = {1--9},
+ publisher = {Informa UK Limited},
+ title = {Facets in the {V}ietoris\textendash{}{R}ips Complexes of Hypercubes},
+ year = {2025},
+ keywords = {published},
+ eprint = {2408.01288},
+ eprinttype = {arXiv},
+ eprintclass = {math.AT},
+}
+
+@article{heath_oddcycles,
+ author = {Heath, Emily and Martin, Ryan R.},
+ doi = {10.1002/jgt.23197},
+ journal = {Journal of Graph Theory},
+ month = {apr},
+ pages = {745--780},
+ publisher = {Wiley},
+ title = {The maximum number of odd cycles in a planar graph},
+ volume = {108},
+ year = {2025},
+ keywords = {published},
+ eprint = {2307.00116},
+ eprintclass = {math.CO},
+ eprinttype = {arxiv},
+ % issue = {4},
+}
+
+@article{sipp,
+ author = {Brennan, Zach and Curtis, Bryan and Gomez-Leos, Enrique and Hadaway, Kimberly and Hogben, Leslie and Thompson, Conor},
+ title = {Orthogonal realizations of random sign patterns and other applications of the SIPP},
+ journal = {Electronic Journal of Linear Algebra},
+ volume = {39},
+ pages = {434--459},
+ year = {2023},
+ month = {aug},
+ doi = {10.13001/ela.2023.7579},
+ eprint = {2212.05207},
+ eprintclass = {math.CO},
+ eprinttype = {arxiv},
+ keywords = {published},
+ author+an = {1=earlygrad; 3=earlygrad; 4=earlygrad; 6=earlygrad},
+ abstract = {A sign pattern is an array with entries in $\{+,-,0\}$. A matrix $Q$ is row orthogonal if $QQ^T = I$. The Strong Inner Product Property (SIPP), introduced in [B.A.~Curtis and B.L.~Shader, Sign patterns of orthogonal matrices and the strong inner product property, Linear Algebra Appl. 592: 228--259, 2020], is an important tool when determining whether a sign pattern allows row orthogonality because it guarantees there is a nearby matrix with the same property, allowing zero entries to be perturbed to nonzero entries, while preserving the sign of every nonzero entry. This paper uses the SIPP to initiate the study of conditions under which random sign patterns allow row orthogonality with high probability. Building on prior work, $5\times n$ nowhere zero sign patterns that minimally allow orthogonality are determined. Conditions on zero entries in a sign pattern are established that guarantee any row orthogonal matrix with such a sign pattern has the SIPP.}
+}
+
+@article{cox_planarcycles,
+ author = {Martin, Ryan R.},
+ title = {The maximum number of 10- and 12-cycles in a planar graph},
+ year = {2023},
+ month = {feb},
+ eprint = {2106.02966},
+ eprinttype = {arxiv},
+ eprintclass = {math.CO},
+ journal = {Discrete Mathematics},
+ volume = {346},
+ number = {2},
+ pages = {113245},
+ doi = {10.1016/j.disc.2022.113245},
+ keywords = {published},
+}
+
+@article{cox_planarpaths,
+ author = {Martin, Ryan R.},
+ title = {Counting paths, cycles and blow-ups in planar graphs},
+ journal = {Journal of Graph Theory},
+ volume = {101},
+ number = {3},
+ pages = {521-558},
+ year = {2022},
+ month = {apr},
+ doi = {10.1002/jgt.22838},
+ eprint = {2101.05911},
+ eprinttype = {arxiv},
+ eprintclass = {math.CO},
+ keywords = {published},
+}
+
+@article{lcsfrogs,
+ author = {Bukh, Boris},
+ title = {Periodic words, common subsequences and frogs},
+ year = {2022},
+ month = {apr},
+ journal = {Annals of Applied Probability},
+ volume = {32},
+ number = {2},
+ pages = {1295--1332},
+ doi = {10.1214/21-AAP1709},
+ eprint = {1912.03510},
+ eprintclass = {math.PR},
+ eprinttype = {arxiv},
+ extra = {Code},
+ keywords = {published},
+}
+
+@article{cox_editdistance,
+ author = {Martin, Ryan R. and McGinnis, Daniel},
+ title = {Accumulation points of the edit distance function},
+ year = {2022},
+ month = {jul},
+ journal = {Discrete Mathematics},
+ volume = {345},
+ number = {7},
+ pages = {112857},
+ eprint = {2107.06706},
+ eprinttype = {arxiv},
+ eprintclass = {math.CO},
+ doi = {10.1016/j.disc.2022.112857},
+ keywords = {published},
+ author+an = {2=earlygrad},
+}
+
+
+@article{onlineramsey,
+ author = {Briggs, Joseph},
+ title = {Restricted online Ramsey numbers of matchings and trees},
+ journal = {Electronic Journal of Combinatorics},
+ year = {2020},
+ month = {sep},
+ eprint = {1904.00246},
+ eprintclass = {math.CO},
+ eprinttype = {arxiv},
+ doi = {10.37236/8649},
+ keywords = {published},
+ abstract = {Consider a two-player game between players Builder and Painter. Painter begins the game by picking a coloring of the edges of $K_n$, which is hidden from Builder.
+ In each round, Builder points to an edge and Painter reveals its color.
+ Builder's goal is to locate a particular monochromatic structure in Painter's coloring by revealing the color of as few edges as possible.
+ The fewest number of turns required for Builder to win this game is known as the restricted online Ramsey number.
+ In this paper, we consider the situation where this ``particular monochromatic structure'' is a large matching or a large tree.
+ We show that in any $t$-coloring of $E(K_n)$, Builder can locate a monochromatic matching on at least ${n-t+1\over t+1}$ edges by revealing at most $O(n\log t)$ edges.
+ We show also that in any $3$-coloring of $E(K_n)$, Builder can locate a monochromatic tree on at least $n/2$ vertices by revealing at most $5n$ edges.
+ }
+}
+
+@article{nearorth,
+ author = {Bukh, Boris},
+ title = {Nearly orthogonal vectors and small antipodal spherical codes},
+ journal = {Israel Journal of Mathematics},
+ volume = {238},
+ year = {2020},
+ MONTH = {jul},
+ number = {1},
+ pages = {359--388},
+ doi = {10.1007/s11856-020-2027-7},
+ eprint = {1803.02949},
+ eprinttype = {arxiv},
+ eprintclass = {math.CO},
+ keywords = {published},
+}
+
+@article{invturan,
+ author = {Briggs, Joseph},
+ title = {Inverting the Tur{\'a}n problem},
+ journal = {Discrete Mathematics},
+ publisher = {Elsevier BV},
+ year = {2019},
+ month = {jul},
+ number = {7},
+ volume = {342},
+ pages = {1865--1884},
+ doi = {10.1016/j.disc.2019.03.005},
+ eprint = {1711.02082},
+ eprinttype = {arxiv},
+ eprintclass = {math.CO},
+ keywords = {published},
+}
+
+@article{frachaemers,
+ author = {Bukh, Boris},
+ title = {On a fractional version of Haemers' bound},
+ journal = {IEEE Transactions on Information Theory},
+ publisher = {Institute of Electrical and Electronics Engineers (IEEE)},
+ year = {2019},
+ month = {jun},
+ number = {6},
+ volume = {65},
+ pages = {3340--3348},
+ doi = {10.1109/tit.2018.2889108},
+ eprint = {1802.00476},
+ eprinttype = {arxiv},
+ eprintclass = {cs.IT},
+ keywords = {published},
+}
+
+
+@article{poramsey,
+ author = {Stolee, Derrick},
+ title = {Ramsey numbers for partially-ordered sets},
+ journal = {Order},
+ publisher = {Springer Nature},
+ year = {2018},
+ month = {jan},
+ number = {3},
+ volume = {35},
+ pages = {557--579},
+ doi = {10.1007/s11083-017-9449-9},
+ eprint = {1512.05261},
+ eprinttype = {arxiv},
+ eprintclass = {math.CO},
+ keywords = {published},
+}
+
+
+@article{42choose,
+ author = {Berikkyzy, Zhanar and Dairyko, Michael and Hogenson, Kirsten and Kumbhat, Mohit and Lidick{\'y}, Bernard and Messerschmidt, Kacy and Moss, Kevin and Nowak, Kathleen and Palmowski, Kevin and Stolee, Derrick},
+ title = {(4,2)-choosability of planar graphs with forbidden structures},
+ journal = {Graphs and Combinatorics},
+ publisher = {Springer Nature},
+ year = {2017},
+ month = {jun},
+ number = {4},
+ volume = {33},
+ pages = {751--787},
+ doi = {10.1007/s00373-017-1812-5},
+ eprint = {1512.03787},
+ eprinttype = {arxiv},
+ eprintclass = {math.CO},
+ keywords = {published},
+ abstract = {All planar graphs are $4$-colorable and $5$-choosable, while some planar graphs are not $4$-choosable.
+ Determining which properties guarantee that a planar graph can be colored using lists of size four has received significant attention.
+ In terms of constraining the structure of the graph, for any $\ell\in\{3,4,5,6,7\}$, a planar graph is $4$-choosable if it is $\ell$-cycle-free.
+ In terms of constraining the list assignment, one refinement of $k$-choosability is choosability with separation.
+ A graph is $(k, s)$-choosable if the graph is colorable from lists of size $k$ where adjacent vertices have at most $s$ common colors in their lists.
+ Every planar graph is $(4, 1)$-choosable, but there exist planar graphs that are not $(4, 3)$-choosable.
+ It is an open question whether planar graphs are always $(4, 2)$-choosable.
+ A chorded $\ell$-cycle is an $\ell$-cycle with one additional edge.
+ We demonstrate for each $\ell\in\{5,6,7\}$ that a planar graph is $(4, 2)$-choosable if it does not contain chorded $\ell$-cycles.
+ }
+}
+
+
+@article{eulerrooks,
+ author = {Banaian, Esther and Butler, Steve and Davis, Jeffrey and Landgraf, Jacob and Ponce, Scarlitte},
+ title = {A generalization of Eulerian numbers via rook placements},
+ journal = {Involve, a Journal of Mathematics},
+ publisher = {Mathematical Sciences Publishers},
+ year = {2017},
+ month = {mar},
+ number = {4},
+ volume = {10},
+ pages = {691--705},
+ doi = {10.2140/involve.2017.10.691},
+ eprint = {1508.03673},
+ eprinttype = {arxiv},
+ eprintclass = {math.CO},
+ keywords = {published},
+ author+an = {1=undergrad; 3=undergrad; 4=undergrad; 5=undergrad},
+}
+
+@article{primejuggle,
+ author = {Banaian, Esther and Butler, Steve and Davis, Jeffrey and Landgraf, Jacob and Ponce, Scarlitte},
+ title = {Counting prime juggling patterns},
+ journal = {Graphs and Combinatorics},
+ publisher = {Springer Science and Business Media LLC},
+ year = {2016},
+ month = {may},
+ number = {5},
+ volume = {32},
+ pages = {1675--1688},
+ doi = {10.1007/s00373-016-1711-1},
+ eprint = {1508.05296},
+ eprinttype = {arxiv},
+ eprintclass = {math.CO},
+ keywords = {published},
+ author+an = {1=undergrad; 3=undergrad; 4=undergrad; 5=undergrad},
+}
+
+@article{loosepath,
+ author = {Stolee, Derrick},
+ title = {Ordered Ramsey numbers of loose paths and matchings},
+ journal = {Discrete Mathematics},
+ publisher = {Elsevier BV},
+ year = {2016},
+ month = {feb},
+ number = {2},
+ volume = {339},
+ pages = {499--505},
+ doi = {10.1016/j.disc.2015.09.026},
+ eprint = {1411.4058},
+ eprinttype = {arxiv},
+ eprintclass = {math.CO},
+ keywords = {published},
+ abstract = {For a $k$-uniform hypergraph $G$ with vertex set $\{1,\dots,n\}$, the ordered Ramsey number $\operatorname{OR}_t(G)$ is the least integer $N$ such that every $t$-coloring of the edges of the complete $k$-uniform graph on vertex set $\{1,\dots,N\}$ contains a monochromatic copy of $G$ whose vertices follow the prescribed order.
+ Due to this added order restriction, the ordered Ramsey numbers can be much larger than the usual graph Ramsey numbers.
+ We determine that the ordered Ramsey numbers of loose paths under a monotone order grows as a tower of height two less than the maximum degree in terms of the number of edges.
+ We also extend theorems of Conlon et al. (2015) on the ordered Ramsey numbers of $2$-uniform matchings to provide upper bounds on the ordered Ramsey number of $k$-uniform matchings under certain orderings.
+ }
+}
+
+@article{hanabi,
+ author = {De Silva, Jessica and DeOrsey, Philip and Kenter, Franklin and Retter, Troy and Tobin, Josh},
+ title = {How to make the perfect fireworks display: Two strategies for \emph{Hanabi}},
+ journal = {Mathematics Magazine},
+ publisher = {Informa UK Limited},
+ year = {2015},
+ month = {dec},
+ number = {5},
+ volume = {88},
+ pages = {323--336},
+ doi = {10.4169/math.mag.88.5.323},
+ keywords = {published},
+}
diff --git a/data/people.yaml b/data/people.yaml
index aa5d93a..1ac2c18 100644
--- a/data/people.yaml
+++ b/data/people.yaml
@@ -5,7 +5,7 @@
aliases:
- Zachary Brennan
-- name: Joe Briggs
+- name: Briggs, Joe
webpage: "https://josephguybriggs.wordpress.com/"
aliases:
- Joseph Briggs
diff --git a/flake.lock b/flake.lock
index 955c75e..ab80ea9 100644
--- a/flake.lock
+++ b/flake.lock
@@ -1,35 +1,35 @@
{
"nodes": {
- "flake-utils": {
+ "flake-parts": {
"inputs": {
- "systems": "systems"
+ "nixpkgs-lib": "nixpkgs-lib"
},
"locked": {
- "lastModified": 1731533236,
- "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
- "owner": "numtide",
- "repo": "flake-utils",
- "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
+ "lastModified": 1765835352,
+ "narHash": "sha256-XswHlK/Qtjasvhd1nOa1e8MgZ8GS//jBoTqWtrS1Giw=",
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
+ "rev": "a34fae9c08a15ad73f295041fec82323541400a9",
"type": "github"
},
"original": {
- "owner": "numtide",
- "repo": "flake-utils",
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
"type": "github"
}
},
- "nix-filter": {
+ "haskell-flake": {
"locked": {
- "lastModified": 1731533336,
- "narHash": "sha256-oRam5PS1vcrr5UPgALW0eo1m/5/pls27Z/pabHNy2Ms=",
- "owner": "numtide",
- "repo": "nix-filter",
- "rev": "f7653272fd234696ae94229839a99b73c9ab7de0",
+ "lastModified": 1767025773,
+ "narHash": "sha256-yiJDBXfcTQJGhENquQLD+U3IAXiplv7M5myXz7oBF6k=",
+ "owner": "srid",
+ "repo": "haskell-flake",
+ "rev": "396eb65d91bf5eed4a61da8bd0b025059591445e",
"type": "github"
},
"original": {
- "owner": "numtide",
- "repo": "nix-filter",
+ "owner": "srid",
+ "repo": "haskell-flake",
"type": "github"
}
},
@@ -48,11 +48,27 @@
"type": "github"
}
},
+ "nixpkgs-lib": {
+ "locked": {
+ "lastModified": 1765674936,
+ "narHash": "sha256-k00uTP4JNfmejrCLJOwdObYC9jHRrr/5M/a/8L2EIdo=",
+ "owner": "nix-community",
+ "repo": "nixpkgs.lib",
+ "rev": "2075416fcb47225d9b68ac469a5c4801a9c4dd85",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-community",
+ "repo": "nixpkgs.lib",
+ "type": "github"
+ }
+ },
"root": {
"inputs": {
- "flake-utils": "flake-utils",
- "nix-filter": "nix-filter",
- "nixpkgs": "nixpkgs"
+ "flake-parts": "flake-parts",
+ "haskell-flake": "haskell-flake",
+ "nixpkgs": "nixpkgs",
+ "systems": "systems"
}
},
"systems": {
diff --git a/flake.nix b/flake.nix
index 8133e51..05115eb 100644
--- a/flake.nix
+++ b/flake.nix
@@ -2,35 +2,110 @@
description = "Main library for my webpage";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs";
- flake-utils.url = "github:numtide/flake-utils";
- nix-filter.url = "github:numtide/nix-filter";
+ flake-parts.url = "github:hercules-ci/flake-parts";
+ systems.url = "github:nix-systems/default";
+ haskell-flake.url = "github:srid/haskell-flake";
+ # flake-utils.url = "github:numtide/flake-utils";
+ # nix-filter.url = "github:numtide/nix-filter";
};
- outputs = { self, nixpkgs, flake-utils, nix-filter, ... }: {
+ outputs = inputs@{self, flake-parts, nixpkgs, ... }: flake-parts.lib.mkFlake { inherit self inputs; } {
+ systems = import inputs.systems;
- overlays.default = import ./nix/overlay.nix { inherit nix-filter; };
+ imports = [
+ inputs.haskell-flake.flakeModule
+ ];
- } // flake-utils.lib.eachDefaultSystem (system: let
- pkgs = import nixpkgs {
+ flake.lib = {
+ rubberWith = { pkgs, texPath }: pkgs.symlinkJoin rec {
+ name = "rubber";
+ nativeBuildInputs = [
+ pkgs.makeWrapper
+ ];
+ paths = [
+ pkgs.rubber
+ ];
+ postBuild = ''
+ for x in $out/bin/*; do
+ wrapProgram "$x" --prefix PATH : ${pkgs.lib.makeBinPath paths}
+ done
+ '';
+ };
+
+ hakyllWith = { pkgs, site, paths ? [], texPath ? null }: pkgs.symlinkJoin {
+ inherit (site) name;
+ nativeBuildInputs = [
+ pkgs.makeWrapper
+ ];
+ paths = [
+ (pkgs.haskell.lib.compose.justStaticExecutables site)
+ pkgs.rsync
+ ] ++ paths ++ pkgs.lib.optional (texPath != null) (self.lib.rubberWith { inherit pkgs texPath; });
+ postBuild = ''
+ for x in $out/bin/*; do
+ wrapProgram "$x" --prefix PATH : ${pkgs.lib.makeBinPath paths}
+ done
+ '';
+ };
+ };
+
+ flake.overlays.default = final: prev: {
+ haskellPackages = prev.haskellPackages.extend (hfinal: _hprev: {
+ www-main = hfinal.callCabal2nix "www-main" ./. {};
+ });
+ };
+
+ perSystem = { self', config, pkgs, system, ... }: {
+ _module.args.pkgs = import nixpkgs {
inherit system;
overlays = [ self.overlays.default ];
};
- in {
- packages = {
- inherit (pkgs) www-main;
- default = pkgs.www-main;
- };
+ # haskellProjects.default = {
+ # projectRoot = ./.;
+ # };
- devShells.default = pkgs.haskellPackages.shellFor {
- packages = _: [];
- # packages = p: [ p.www-main ];
- withHoogle = true;
- buildInputs = with pkgs.haskellPackages; [
- cabal-install
- hpack
- pkgs.zlib
- pkgs.icu
- ];
+ packages = rec {
+ default = www-main-exe;
+ www-main-exe = self.lib.hakyllWith {
+ inherit pkgs;
+ # site = config.packages.www-main;
+ site = pkgs.haskellPackages.www-main;
+ texPath = [
+ pkgs.texlive.combined.scheme-full
+ ];
+ };
};
- });
+ };
+ };
+
+ # outputs = { self, nixpkgs, flake-utils, nix-filter, ... }: {
+ #
+ # overlays.default = import ./nix/overlay.nix { inherit nix-filter; };
+ #
+ # } // flake-utils.lib.eachDefaultSystem (system: let
+ # pkgs = import nixpkgs {
+ # inherit system;
+ # overlays = [ self.overlays.default ];
+ # };
+ # in {
+ # packages = {
+ # inherit (pkgs) www-main;
+ # default = pkgs.www-main;
+ # };
+ #
+ # devShells.default = pkgs.haskellPackages.shellFor {
+ # packages = _: [];
+ # # packages = p: [ p.www-main ];
+ # withHoogle = true;
+ # buildInputs = with pkgs.haskellPackages; [
+ # cabal-install
+ # hpack
+ # hlint
+ # fast-tags
+ # pkgs.haskell-language-server
+ # pkgs.zlib
+ # pkgs.icu
+ # ];
+ # };
+ # });
}
diff --git a/package.yaml b/package.yaml
index 595b307..7ff937b 100644
--- a/package.yaml
+++ b/package.yaml
@@ -25,6 +25,7 @@ default-extensions:
- DeriveGeneric
- DeriveLift
- DerivingStrategies
+ - DerivingVia
- DefaultSignatures
- FunctionalDependencies
- GADTs
@@ -32,6 +33,7 @@ default-extensions:
- MultiWayIf
- OverloadedStrings
- PatternSynonyms
+ - RecordWildCards
- TypeFamilies
- UndecidableInstances
- ViewPatterns
diff --git a/src/Data/Abbr.hs b/src/Data/Abbr.hs
index f42134f..8ee4bc0 100644
--- a/src/Data/Abbr.hs
+++ b/src/Data/Abbr.hs
@@ -27,7 +27,7 @@ type Abbr_ = Abbr StrictText
abbrHtml :: ToMarkup a => Abbr a -> Html
abbrHtml (Abbr n sn l) = linkedHtml $ Linked (fromMaybe n sn) l (n <$ sn)
-instance Ord a => ToAliases (Abbr a) where
+instance Ord a => ToAliases (Abbr a) a where
toAliases (Abbr t st _) = S.fromList $ t : toList st
instance FromAlias a (Abbr a) where
diff --git a/src/Data/Alias.hs b/src/Data/Alias.hs
index 357f901..9082c14 100644
--- a/src/Data/Alias.hs
+++ b/src/Data/Alias.hs
@@ -23,6 +23,7 @@ import Data.Aeson.KeyMap qualified as KM
import Data.Map.Strict qualified as M
import Data.Set qualified as S
import Data.Typeable
+import Hakyll qualified as H
data WithAliases a x = WithAliases (Set a) x
@@ -103,6 +104,9 @@ newtype AliasMap a x = AliasMap (Map a x)
deriving newtype (Binary, Foldable, Functor, Semigroup, Monoid)
deriving stock (Show, Traversable)
+instance H.Writable (AliasMap a x) where
+ write _ _ = pure ()
+
buildAliasMap :: (Foldable t, ToAliases x a) => t x -> AliasMap a x
buildAliasMap = fmap AliasMap $ foldMap $ (<$) <*> toMap . toAliases
{-# INLINE buildAliasMap #-}
diff --git a/src/Data/Linked.hs b/src/Data/Linked.hs
index 8e78f86..de1dc77 100644
--- a/src/Data/Linked.hs
+++ b/src/Data/Linked.hs
@@ -38,7 +38,7 @@ instance ToMaybe Maybe where
toMaybe = liftMaybe
instance ToMaybe Identity where
- toMaybe (Identity a) = pure a
+ toMaybe (Identity x) = pure x
instance ToMaybe Proxy where
toMaybe _ = empty
diff --git a/src/Data/Name.hs b/src/Data/Name.hs
index 647c285..faf8d8c 100644
--- a/src/Data/Name.hs
+++ b/src/Data/Name.hs
@@ -84,7 +84,7 @@ readNameFML t = T.map (\c -> if c == '~' then ' ' else c) <<$>>
[] -> empty
(f:xs) -> case unsnoc xs of
Nothing -> empty
- Just (m, l) -> pure $ Name f l $ case m of
+ Just (m, l) -> pure $ Name l f $ case m of
[] -> Nothing
_ -> Just $ T.unwords m
diff --git a/src/Data/Paper.hs b/src/Data/Paper.hs
index 25b6d98..0dedc46 100644
--- a/src/Data/Paper.hs
+++ b/src/Data/Paper.hs
@@ -1,11 +1,16 @@
{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE RecordWildCards #-}
module Data.Paper
( Paper (..)
, Status (..)
, ArXiv (..)
+ , ArXivType (..)
, DOI (..)
, Eprint (..)
, mkPaper
+ -- * helpers
+ , doiLink
+ , arXivLink
) where
import Prolog
@@ -15,9 +20,10 @@ import Data.Name
import Data.Time
import Network.URI
import Network.URI.Static
+import Hakyll qualified as H
import Text.BibTeX.Entry qualified as B
-import Text.BibTeX.Parse qualified as B
+import Text.BibTeX.Parse qualified as BP
data Paper a = Paper
@@ -32,6 +38,12 @@ data Paper a = Paper
instance Binary a => Binary (Paper a)
+instance H.Writable (Paper a) where
+ write _ _ = pure ()
+
+instance H.Writable (t (Paper a)) where
+ write _ _ = pure ()
+
-- instance (Binary a, Binary (Status f a), Binary (f (Person a))) => Binary (Paper f a)
data Status a
@@ -101,13 +113,13 @@ mkPaper bib = do
abstract = M.lookup "abstract" fields
-- extraLink = M.lookup "extralink" fields
title <- find' "title"
- authors <- find' "authors" >>= traverse (ffmap toSL . parseName . toSL) . B.splitAuthorList
+ authors <- find' "author" >>= traverse (ffmap toSL . parseName . toSL) . BP.splitAuthorList
status <- do
date <- getDate
traverse puri (M.lookup "doi" fields) >>= \case
Just u -> do
let doi = DOI u
- journal <- findit "journal"
+ journal <- findit "journal" fields
pure $ Published {..}
Nothing -> pure $ case M.lookup "journal" fields of
Just journal -> Accepted {..}
@@ -124,7 +136,7 @@ mkPaper bib = do
-- date <- getDate
-- pure $ Published {..}
extraLink <- traverse puri $ M.lookup "extralink" fields
- eprint <- case toLower <<$>> M.lookup "eprinttype" fields of
+ eprints <- case toLower <<$>> M.lookup "eprinttype" fields of
Just "arxiv" -> do
_identifier <- find' "eprint" >>= puri
_class <- find' "eprintclass"
@@ -138,10 +150,10 @@ mkPaper bib = do
where
fields = M.fromList $ B.fields bib
find' k = findit k fields
- getDate = mapM findit [ "month", "year" ] >>= parseTimeM True defaultTimeLocale "%b %Y" . unwords
+ getDate = mapM (`findit` fields) [ "month", "year" ] >>= parseTimeM True defaultTimeLocale "%b %Y" . unwords
puri :: MonadFail m => String -> m URI
-puri u = maybe (fail $ show u <> " cannot be understood as a uri") pure $ parseURI u
+puri u = maybe (fail $ show u <> " cannot be understood as a uri") pure $ parseRelativeReference u
findit :: (Show a, Ord a, MonadFail m) => a -> M.Map a x -> m x
findit k = maybe (fail $ "Field " <> show k <> " does not exist") pure . M.lookup k
diff --git a/src/Data/Person.hs b/src/Data/Person.hs
index 853408e..389d1ed 100644
--- a/src/Data/Person.hs
+++ b/src/Data/Person.hs
@@ -28,7 +28,7 @@ instance Binary a => Binary (Person a)
type Person_ = Person StrictText
personHtml :: (ToMarkup a) => Person a -> Html
-personHtml (Person n w) = linkedHtml $ Linked (renderNameFML $ toMarkup <$> n) w Nothing
+personHtml (Person n w) = linkedHtml $ Linked (contents $ renderNameFML $ contents . toMarkup <$> n) w Nothing
personFromName :: Name a -> Person a
personFromName n = Person n Nothing
diff --git a/src/Hakyll/Alias.hs b/src/Hakyll/Alias.hs
index 33ed5c1..73beb86 100644
--- a/src/Hakyll/Alias.hs
+++ b/src/Hakyll/Alias.hs
@@ -20,7 +20,7 @@ import Hakyll.Web.Template.Util (functionField1)
aliasCtxt :: (Ord a, FromAlias a x) => String -> (String -> Compiler a) -> (x -> Compiler String) -> AliasMap a x -> Context c
aliasCtxt name toa fromx amap = functionField1 name $ toa >=> flip resolveAlias amap >=> fromx
-aliasCtxtFrom :: (Ord a, FromAlias a x) => String -> (String -> Compiler a) -> (x -> Compiler String) -> Identifier -> Context c
+aliasCtxtFrom :: forall a x c . (Binary a, Binary x, Typeable a, Typeable x, Ord a, FromAlias a x) => String -> (String -> Compiler a) -> (x -> Compiler String) -> Identifier -> Context c
aliasCtxtFrom name toa fromx ident = functionField1 name $ \s -> do
amap <- loadBody ident
toa s >>= flip resolveAlias amap >>= fromx
@@ -28,15 +28,15 @@ aliasCtxtFrom name toa fromx ident = functionField1 name $ \s -> do
-- personCtxt :: (StringConv StrictText s, Ord (Name s), ToMarkup s) => AliasMap (Name s) (Person s) -> Context a
personCtxt :: Identifier -> Context a
-personCtxt = aliasCtxtFrom @StrictText "personA" (ffmap toSL . parseName . toSL) (pure . toSL . personHtml)
+personCtxt = aliasCtxtFrom @Name_ @Person_ "personA" (parseName . toSL) (pure . toSL . personHtml)
-- personCtxtFrom :: Identifier -> Context a
-- personCtxtFrom = functionField1
-- licenseCtxt :: (StringConv String s, Ord s, ToMarkup s) => AliasMap s (License s) -> Context a
licenseCtxt :: Identifier -> Context a
-licenseCtxt = aliasCtxtFrom @StrictText "licenseA" (pure . toSL) (pure . toSL . licenseHtml)
+licenseCtxt = aliasCtxtFrom @StrictText @License_ "licenseA" (pure . toSL) (pure . toSL . licenseHtml)
-- journalCtxt :: (StringConv String s, Ord s, ToMarkup s) => AliasMap s (Journal s) -> Context a
journalCtxt :: Identifier -> Context a
-journalCtxt = aliasCtxtFrom @StrictText "journalA" (pure . toSL) (pure . toSL . journalHtml)
+journalCtxt = aliasCtxtFrom @StrictText @Journal_ "journalA" (pure . toSL) (pure . toSL . journalHtml)
diff --git a/src/Hakyll/Paper.hs b/src/Hakyll/Paper.hs
index 0c997eb..609f74d 100644
--- a/src/Hakyll/Paper.hs
+++ b/src/Hakyll/Paper.hs
@@ -8,25 +8,36 @@ import Data.Time.Format
import Hakyll.Util (transformContext_)
import Hakyll.Core.Identifier.Pattorn
import System.FilePath
+import Witherable
+import Network.URI (parseRelativeReference)
+import Data.String.Slugger (toSlug)
+import Hakyll.TeX.BibTeX (compileBibtex)
+data FieldContext a = FieldContext
+ { _authorCtxt :: Context (Name a)
+ , _journalCtxt :: Context (Status a)
+ }
+
+
authorCtxt :: StringConv a String => Context (Name a)
authorCtxt = fold $
- [ field "name" $ pure . renderNameFML . fmap toSL . getItemBody
+ [ field "name" $ pure . renderNameFML . fmap toSL . itemBody
]
-paperCtxt :: StringConv a String => Context (Paper a)
-paperCtxt = fold $
- [ listFieldWith "authors" authorCtxt $ pure . authors . itemBody
+paperCtxt :: StringConv a String => FieldContext a -> Context (Paper a)
+paperCtxt fctxt = fold $
+ [ listFieldWith "authors" (_authorCtxt fctxt <> authorCtxt) $ pure . traverse authors
+ -- fmap pure . authors . itemBody
, field "abstract" $ liftMaybe . fmap toSL . abstract . itemBody
, field "title" $ pure . toSL . title . itemBody
, field "key" $ pure . sluggedKey . itemBody
- , status >$< statusCtxt
- , listFieldWith "eprints" eprintCtxt $ pure . eprints . itemBody
+ , status >$< (statusCtxt <> _journalCtxt fctxt)
+ , listFieldWith "eprints" eprintCtxt $ pure . traverse eprints
-- , eprint >$< maybeContext eprintCtxt
- , field "extra" $ \i -> case extraLink $ getItemBody i of
+ , field "extra" $ \i -> case extraLink $ itemBody i of
Just l -> pure $ show l
Nothing -> do
let k = sluggedKey $ itemBody i
@@ -36,19 +47,19 @@ paperCtxt = fold $
_ -> fail $ "No extra for " <> k
]
-mkPaperContext :: StringConv a String => [Paper a] -> Context b
-mkPaperContext papers = listField "papers" paperCtxt $ do
+mkPaperContext :: (StringConv a String, StringConv String a) => FieldContext a -> [Paper a] -> Context b
+mkPaperContext fctxt papers = listField "papers" (paperCtxt fctxt) $ do
fp <- getResourceFilePath
forM papers $ \p -> do
let itm = Item (fromFilePath $ replaceFileName fp (sluggedKey p)) p
e <- findLocal itm
- pure $ (\x -> x { eprint = eprint x <> e }) <$> itm
+ pure $ (\x -> x { eprints = eprints x <> e }) <$> itm
statusCtxt :: StringConv a String => Context (Status a)
statusCtxt = fold $
- [ field "date" $ formatTime defaultTimeLocale "%b %Y" . date . itemBody
+ [ field "date" $ pure . formatTime defaultTimeLocale "%b %Y" . date . itemBody
, field "journal" $ \i -> case itemBody i of
Published _ j _ -> pure $ toSL j
Accepted _ j -> pure $ toSL j
@@ -57,7 +68,7 @@ statusCtxt = fold $
Published _ _ d -> pure $ show (doiLink d)
_ -> fail "No DOI"
, boolField "published" $ \case
- Item _ (Published {..}) -> True
+ Item _ (Published {}) -> True
_ -> False
-- \i -> case itemBody i of
-- Published _ _ _ -> True
@@ -76,13 +87,13 @@ statusCtxt = fold $
eprintCtxt :: StringConv a String => Context (Eprint a)
eprintCtxt = fold $
[ field "eprint" $ \i -> pure $ case itemBody i of
- ArXivEprint a _ -> show $ arXivLink ArXivAbs a
- OtherEprint _ l -> show $ l
+ ArXivEprint a -> show $ arXivLink ArXivAbs a
+ OtherEprint _ l -> show l
, field "eprintName" $ \i -> pure $ case itemBody i of
- ArXivEprint _ c -> "arXiv[" <> toSL c <> "]"
- OtherEprint n _ -> show n
+ ArXivEprint (ArXiv _ c) -> "arXiv[" <> toSL c <> "]"
+ OtherEprint n _ -> toSL n
, field "arXivClass" $ \i -> case itemBody i of
- ArXivEprint _ c -> pure $ toSL c
+ ArXivEprint (ArXiv _ c) -> pure $ toSL c
_ -> fail "No arXiv"
, functionField "arXivLink" $ \args i -> case itemBody i of
ArXivEprint a ->
@@ -91,7 +102,7 @@ eprintCtxt = fold $
["pdf"] -> pure $ show $ arXivLink ArXivPdf a
["src"] -> pure $ show $ arXivLink ArXivSrc a
xs -> fail $ "Invalid argument to arXivLink: " <> show xs
- _ -> fail "No ArXiv"
+ _ -> fail "No ArXiv"
]
findLocal :: (StringConv a String, StringConv String a) => Item (Paper a) -> Compiler [Eprint a]
diff --git a/src/Hakyll/TeX/BibTeX.hs b/src/Hakyll/TeX/BibTeX.hs
index eb87c4e..a78f254 100644
--- a/src/Hakyll/TeX/BibTeX.hs
+++ b/src/Hakyll/TeX/BibTeX.hs
@@ -33,7 +33,8 @@ instance Writable [B.T] where
compileBibtex :: (StringConv s String) => Item s -> Compiler (Item BibTeX)
compileBibtex = fmap (B.lowerCaseFieldNames <<$>>) . compileParsec_ p . fmap toSL
where
- p = B.skippingLeadingSpace $ B.file <* P.space <* P.eof
+ p = B.skippingSpace B.file
+ -- p = B.skippingLeadingSpace $ B.file <* P.space <* P.eof
bibtexCompiler :: Compiler (Item BibTeX)
bibtexCompiler = getResourceBody >>= compileBibtex
diff --git a/src/Prolog.hs b/src/Prolog.hs
index 94a6eb6..f7e72eb 100644
--- a/src/Prolog.hs
+++ b/src/Prolog.hs
@@ -23,6 +23,7 @@ module Prolog
, Binary
, Generic
, Generic1
+ , Typeable
, Generically (..)
, MonadThrow (..)
, Exception (..)
@@ -89,6 +90,8 @@ import Data.String
import Data.String.Conv
import Data.Text qualified as T
import Data.Text.Lazy qualified as TL
+import Data.Time qualified as Time
+import Data.Typeable (Typeable)
import GHC.Generics
import Network.URI
@@ -186,7 +189,7 @@ rebaseWith :: (Applicative m, Comonad w) => (a -> b) -> w a -> m b
rebaseWith f = rebaseWithM $ pure . f
{-# INLINE rebaseWith #-}
-rebaseWithM :: (Applicative m, Comonad w) => (a -> m b) -> w a -> m b
+rebaseWithM :: (Comonad w) => (a -> m b) -> w a -> m b
rebaseWithM f = f . extract
{-# INLINE rebaseWithM #-}
@@ -311,3 +314,6 @@ instance MonadThrow H.Compiler where
-- | Huh, I guess I need a version bump for this guy?
instance A.FromJSON URI where
parseJSON = A.withText "URI" $ maybe (fail "Invalid URI") pure . parseURI . toSL
+
+deriving instance Generic Time.Day
+deriving newtype instance Binary Time.Day
diff --git a/templates/default.html b/templates/default.html
index dcb7da6..fde5f34 100644
--- a/templates/default.html
+++ b/templates/default.html
@@ -23,12 +23,12 @@
<!-- favicons -->
<link rel="shortcut icon" href="/favicon.ico">
<link rel="icon" sizes="16x16 32x32 64x64" href="/favicon.ico">
- <link rel="icon" type="image/png" sizes="196x196" href="/img/favicon/favicon-192.png">
- <link rel="icon" type="image/png" sizes="160x160" href="/img/favicon/favicon-160.png">
- <link rel="icon" type="image/png" sizes="96x96" href="/img/favicon/favicon-96.png">
- <link rel="icon" type="image/png" sizes="64x64" href="/img/favicon/favicon-64.png">
- <link rel="icon" type="image/png" sizes="32x32" href="/img/favicon/favicon-32.png">
- <link rel="icon" type="image/png" sizes="16x16" href="/img/favicon/favicon-16.png">
+ <link rel="icon" type="image/png" sizes="196x196" href="/favicon/favicon-192.png">
+ <link rel="icon" type="image/png" sizes="160x160" href="/favicon/favicon-160.png">
+ <link rel="icon" type="image/png" sizes="96x96" href="/favicon/favicon-96.png">
+ <link rel="icon" type="image/png" sizes="64x64" href="/favicon/favicon-64.png">
+ <link rel="icon" type="image/png" sizes="32x32" href="/favicon/favicon-32.png">
+ <link rel="icon" type="image/png" sizes="16x16" href="/favicon/favicon-16.png">
</head>
<body>
@@ -38,6 +38,8 @@
<span class="pull-right">
<a href="/research"><i class="fa fa-book"></i> Research</a>
<a href="/teaching"><i class="fa fa-chalkboard-teacher"></i> Teaching</a>
+ <a href="/links"><i class="fa fa-link"></i> Links</a>
+ <a href="/code"><i class="fa fa-code"></i> Code</a>
<a href="/contact.html"><i class="fa fa-address-book"></i> Contact</a>
<a href="/doc/cv.pdf"><i class="fa fa-file-alt"></i> CV</a>
</span>
diff --git a/www-main.cabal b/www-main.cabal
index 9de4d60..6014569 100644
--- a/www-main.cabal
+++ b/www-main.cabal
@@ -1,6 +1,6 @@
cabal-version: 1.12
--- This file has been generated from package.yaml by hpack version 0.36.1.
+-- This file has been generated from package.yaml by hpack version 0.38.2.
--
-- see: https://github.com/sol/hpack
@@ -14,6 +14,7 @@ build-type: Simple
library
exposed-modules:
+ Data.Abbr
Data.Alias
Data.Journal
Data.License
@@ -25,6 +26,7 @@ library
Hakyll.Alias
Hakyll.Core.Identifier.Pattorn
Hakyll.Error
+ Hakyll.Paper
Hakyll.Parsec
Hakyll.TeX.BibTeX
Hakyll.TeX.HaTeX
@@ -45,6 +47,7 @@ library
DeriveGeneric
DeriveLift
DerivingStrategies
+ DerivingVia
DefaultSignatures
FunctionalDependencies
GADTs
@@ -52,6 +55,7 @@ library
MultiWayIf
OverloadedStrings
PatternSynonyms
+ RecordWildCards
TypeFamilies
UndecidableInstances
ViewPatterns
@@ -82,6 +86,7 @@ library
, text
, time
, uri-encode
+ , witherable
, yaml
default-language: GHC2021
@@ -96,6 +101,7 @@ executable www-main
DeriveGeneric
DeriveLift
DerivingStrategies
+ DerivingVia
DefaultSignatures
FunctionalDependencies
GADTs
@@ -103,6 +109,7 @@ executable www-main
MultiWayIf
OverloadedStrings
PatternSynonyms
+ RecordWildCards
TypeFamilies
UndecidableInstances
ViewPatterns
diff --git a/www/code/index.html b/www/code/index.html
new file mode 100644
index 0000000..2ebfdc0
--- /dev/null
+++ b/www/code/index.html
@@ -0,0 +1,30 @@
+---
+title: Code
+short_title: Code
+---
+
+<p>
+ Below are links to various pieces of code that I've written.
+ I am far from a coder, so I don't claim to have anything much of interest here.
+</p>
+
+<div class="bare">
+ <table>
+ <tr>
+ <td><i class="fa-brands fa-git"></i></td>
+ <td><a href="https://git.mathematicaster.org/">Personal repos</a> (thanks to <a href="https://git.zx2c4.com/cgit/">cgit</a>)</td>
+ </tr>
+ <tr>
+ <td><i class="fa-brands fa-github"></i></td>
+ <td><a href="https://github.com/the-mathematicaster">GitHub</a></td>
+ </tr>
+ <tr>
+ <td><i class="fa-brands fa-gitlab"></i></td>
+ <td><a href="https://gitlab.com/mathematicaster">GitLab</a></td>
+ </tr>
+ <tr>
+ <td><i class="fa-brands fa-git-alt"></i></td>
+ <td><a href="https://codeberg.org/mathematicaster">CodeBerg</a></td>
+ </tr>
+ </table>
+</div>
diff --git a/www/credits/index.html b/www/credits/index.html
new file mode 100644
index 0000000..6e013d7
--- /dev/null
+++ b/www/credits/index.html
@@ -0,0 +1,40 @@
+---
+title: Credits
+title_short: Credits
+math: True
+---
+
+<h1>Credits</h1>
+
+<p>
+This website is possible thanks to some lovely projects:
+</p>
+
+<div class="bare">
+ <table>
+ <tr>
+ <td>Static site generator</td>
+ <td><a href="https://hackage.haskell.org/package/hakyll">hakyll</a></td>
+ </tr>
+ <tr>
+ <td>$$\LaTeX$$ typesetting</td>
+ <td><a href="https://katex.org/">$$\KaTeX$$</a></td>
+ </tr>
+ <tr>
+ <td>Color scheme</td>
+ <td><a href="https://github.com/morhetz/gruvbox">gruvbox</a></td>
+ </tr>
+ <tr>
+ <td>Fonts</td>
+ <td><a href="https://github.com/mozilla/Fira">FiraSans</a> and <a href="https://github.com/tonsky/FiraCode">FiraCode</a></td>
+ </tr>
+ <tr>
+ <td>Icons</td>
+ <td><a href="https://fontawesome.com/">Font Awesome</a></td>
+ </tr>
+ </table>
+</div>
+
+<p>
+I'm happy to share the code used to generate this webpage with anyone who's interested &mdash; simply send me an email.
+</p>
diff --git a/www/credits/index.md b/www/credits/index.md
deleted file mode 100644
index 6c7fb44..0000000
--- a/www/credits/index.md
+++ /dev/null
@@ -1,19 +0,0 @@
----
-title: Credits
-title_short: Credits
-math: True
----
-
-# Credits
-
-This website is possible thanks to some lovely projects:
-
-<ul>
- <li>Static site generator: <a href="https://hackage.haskell.org/package/hakyll">hakyll</a></li>
- <li>$$\LaTeX$$ typesetting: <a href="https://katex.org/">$$\KaTeX$$</a></li>
- <li>Color scheme: <a href="https://github.com/morhetz/gruvbox">gruvbox</a></li>
- <li>Fonts: <a href="https://github.com/mozilla/Fira">FiraSans</a> and <a href="https://github.com/tonsky/FiraCode">FiraCode</a></li>
- <li>Icons: <a href="https://fontawesome.com/">Font Awesome</a></li>
-</ul>
-
-I'm happy to share the code used to generate this webpage with anyone who's interested &mdash; simply send me an email.
diff --git a/www/index.html b/www/index.html
new file mode 100644
index 0000000..9e1a223
--- /dev/null
+++ b/www/index.html
@@ -0,0 +1,20 @@
+---
+title: Chris Wells
+short_title: Chris Wells
+---
+
+<h1>Chris Wells</h1>
+
+<p>(The mathematician formerly known as Chris Cox)</p>
+
+<p>
+ I'm currently a postdoc working with the discrete math group at <a href="https://math.auburn.edu">Auburn University</a>.
+ Previously, I completed an RTG postdoc at <a href="https://math.iastate.edu">Iowa State University</a>.
+ I obtained a PhD in Algorithms, Combinatorics and Optimization (ACO) from <a href="https://math.cmu.edu">Carnegie Mellon University</a> under the guidance of $personA("Boris Bukh")$.
+ My research focuses on the interplay between probabilistic, algebraic and geometric tools in extremal combinatorics, but I find all areas of math to be beautiful.
+ To anyone who wants to know more about what I do, I recommend watching <a href="https://www.youtube.com/watch?v=w0i_ZFlGTVY">this video</a>.
+</p>
+
+<p>
+ <b>mathematicaster (n):</b> A minor or incompetent mathematician.
+</p>
diff --git a/www/research/index.html b/www/research/index.html
index e52ab4b..1fcf99f 100644
--- a/www/research/index.html
+++ b/www/research/index.html
@@ -1,5 +1,60 @@
+---
+title: Publications
+short_title: Publications
+---
<h1>Publications</h1>
$for(papers)$
-$partial("templates/paper.html")$
+<div class="paper">
+ <div class="paper-title">
+ $if(doi)$
+ <a href="$doi$">$title$</a>
+ $else$
+ $title$
+ $endif$
+ </div>
+ <div class="paper-authors">
+ <ul>
+ $for(authors)$
+ <li>$personA(name)$</li>
+ $endfor$
+ </ul>
+ </div>
+ $if(abstract)$
+ <div class="paper-abstract">
+ <div id="$key$-abstract" style="display:none;">
+ $abstract$
+ </div>
+ </div>
+ $endif$
+ <div class="paper-foot">
+ <ul>
+ $for(eprints)$
+ <li><a href="$eprint$">$eprintName$</a></li>
+ $endfor$
+ $if(doi)$
+ <li><a href="$doi$">doi</a></li>
+ $endif$
+ $if(extra)$
+ <li><a href="$extra$">extra</a></li>
+ $endif$
+ $if(journal)$
+ <li>$journalA(journal)$</li>
+ $endif$
+ $if(accepted)$
+ <li>Accepted</li>
+ $endif$
+ $if(submitted)$
+ <li>Submitted</li>
+ $endif$
+ $if(unpublished)$
+ <li>Unpublished</li>
+ $endif$
+ <li>$date$</li>
+ $if(abstract)$
+ <button class="abstract-button" style="float:right" onclick="toggle('$key$-abstract');">Abstract</button>
+ $endif$
+ </ul>
+ </div>
+</div>
$endfor$
diff --git a/www/research/invturan/index.md b/www/research/invturan/index.md
index 7a42e33..0d1a685 100644
--- a/www/research/invturan/index.md
+++ b/www/research/invturan/index.md
@@ -1,6 +1,9 @@
+---
math: True
+title: Inverting the Turán problem
+short_title: Inverse Turán
---
-# Inverting the Turan problem
+# Inverting the Turán problem
[inverse-turan_omitted.pdf](./inverse-turn_omitted.pdf) contains the details of the classification of the extremal graphs for $\mathcal{E}_{P_3}(k)$ and $\mathcal{E}_{\{P_3,K_3\}}(k)$.
diff --git a/www/research/poramsey/index.md b/www/research/poramsey/index.md
index 5de48ab..5f851f7 100644
--- a/www/research/poramsey/index.md
+++ b/www/research/poramsey/index.md
@@ -1,3 +1,7 @@
+---
+title: Ramsey numbers for partially-ordered sets
+short_title: Poset Ramsey
+---
# Ramsey numbers for partially-ordered sets
[bramsey-smt2.sws](./bramsey-smt2.sws) is a $link(sage)$ worksheet that generates SMT2 files for the satisfiability problem concerning 2-color Boolean Ramsey numbers
diff --git a/www/teaching/index.md b/www/teaching/index.md
index 872b2fd..029d503 100644
--- a/www/teaching/index.md
+++ b/www/teaching/index.md
@@ -1,72 +1,104 @@
+---
+title: Teaching
+short_title: Teaching
+---
If a course listed here doesn't have a link, then the course was administered through Canvas.
## Auburn University (2023--Present)
+Spring 2026
+
+- **MATH 1120-130: Precalculus**
+
+Fall 2025
+
+- **MATH 2660-110: Topics in Linear Algebra**
+
Spring 2025
-* **[MATH 7750-120: Advanced Topics in Graph Theory (Probabilistic Methods)](/teaching/advgraphs2025)**
+
+- **[MATH 7750-120: Advanced Topics in Graph Theory (Probabilistic Methods)](/teaching/advgraphs2025)**
Fall 2024
-* **MATH 1150-080: Precalculus, Algebra and Trigonometry**
+
+- **MATH 1150-080: Precalculus, Algebra and Trigonometry**
Fall 2023
-* **MATH 1120-120: Precalculus**
+
+- **MATH 1120-120: Precalculus**
## Iowa State University (2020--2023)
Spring 2023
-* **Math 165: Calculus I**
+
+- **Math 165: Calculus I**
Fall 2022
-* **[Math 595: Longest Common Subsequences (graduate research seminar)](/teaching/lcs22)**
-* **Math 165: Calculus I**
+
+- **[Math 595: Longest Common Subsequences (graduate research seminar)](/teaching/lcs22)**
+- **Math 165: Calculus I**
Spring 2022
-* **[Math 595: Algebraic Methods in Combinatorics](/teaching/algmethods22)**
-* **[Math 314: Graph Theory](/teaching/graphs2022)**
+
+- **[Math 595: Algebraic Methods in Combinatorics](/teaching/algmethods22)**
+- **[Math 314: Graph Theory](/teaching/graphs2022)**
Fall 2021
-* **Math 267: Elementary Differential Equations and Laplace Transforms** (TA for $personA("Steve Butler")$)
+
+- **Math 267: Elementary Differential Equations and Laplace Transforms** (TA for $personA("Steve Butler")$)
Spring 2021
-* **[Math 165: Calculus I](/teaching/calcI21)**
+
+- **[Math 165: Calculus I](/teaching/calcI21)**
Fall 2020
-* **Math 595: Edit Distance in Graphs (early graduate research seminar)**
-* **Math 267: Elementary Differential Equations and Laplace Transforms** (TA for $personA("Steve Butler")$)
+
+- **Math 595: Edit Distance in Graphs (early graduate research seminar)**
+- **Math 267: Elementary Differential Equations and Laplace Transforms** (TA for $personA("Steve Butler")$)
## Carnegie Mellon University (2015--2020)
Spring 2020
-* **[21-228: Discrete Mathematics](/teaching/discrete20)** (TA for Tom Bohman)
+
+- **[21-228: Discrete Mathematics](/teaching/discrete20)** (TA for Tom Bohman)
Summer 2019
-* **[21-241: Matrices and Linear Transformations](/teaching/matrices2019)**
+
+- **[21-241: Matrices and Linear Transformations](/teaching/matrices2019)**
Fall 2018
-* **[21-237: Mathematical Studies Algebra I](http://www.borisbukh.org/MathStudiesAlgebra1819)** (TA for $personA("Boris Bukh")$)
+
+- **[21-237: Mathematical Studies Algebra I](http://www.borisbukh.org/MathStudiesAlgebra1819)** (TA for $personA("Boris Bukh")$)
Fall 2017
-* **21-242: Matrix Theory** (TA for $personA("Agoston Pisztora")$)
+
+- **21-242: Matrix Theory** (TA for $personA("Agoston Pisztora")$)
Summer 2017
-* **[21-127: Concepts of Mathematics](/teaching/concepts2017)**
+
+- **[21-127: Concepts of Mathematics](/teaching/concepts2017)**
Spring 2017
-* **[21-268: Multidimensional Calculus](http://www.math.cmu.edu/~ldietric/21-268)** (TA for $personA("Laurent Dietric")$)
+
+- **[21-268: Multidimensional Calculus](http://www.math.cmu.edu/~ldietric/21-268)** (TA for $personA("Laurent Dietric")$)
Summer 2016
-* **21-115: Calculus I** for [SAMS](https://www.cmu.edu/pre-college/academic-programs/sams.html)
+
+- **21-115: Calculus I** for [SAMS](https://www.cmu.edu/pre-college/academic-programs/sams.html)
Spring 2016
-* **[21-228: Discrete Mathematics](/teaching/discrete2016**) (TA for $personA("Tom Bohman")$)
+
+- **[21-228: Discrete Mathematics](/teaching/discrete2016**) (TA for $personA("Tom Bohman")$)
Fall 2015
-* **21-127: Concepts of Mathematics** (TA for $personA("Irina Gheorghiciuc")$)
+
+- **21-127: Concepts of Mathematics** (TA for $personA("Irina Gheorghiciuc")$)
## Iowa State University (2014--2015)
Spring 2015
-* **Math 267: Elementary Differential Equations and Laplace Transforms** (TA for $personA("Miriam Castillo-Gil")$)
+
+- **Math 267: Elementary Differential Equations and Laplace Transforms** (TA for $personA("Miriam Castillo-Gil")$)
Fall 2014
-* **Math 165: Calculus I** (TA for $personA("Heather Bolles")$)
+
+- **Math 165: Calculus I** (TA for $personA("Heather Bolles")$)