didillinois.win post
This commit is contained in:
167
content/post/20211218-didillinoiswin/index.md
Normal file
167
content/post/20211218-didillinoiswin/index.md
Normal file
@@ -0,0 +1,167 @@
|
|||||||
|
+++
|
||||||
|
title = "Design of https://didillinois.win"
|
||||||
|
date = 2021-12-18T00:00:00
|
||||||
|
lastmod = 2021-12-18T00:00:00
|
||||||
|
draft = false
|
||||||
|
|
||||||
|
# Authors. Comma separated list, e.g. `["Bob Smith", "David Jones"]`.
|
||||||
|
authors = ["Carl Pearson"]
|
||||||
|
|
||||||
|
tags = []
|
||||||
|
|
||||||
|
summary = "Design of a static site with GNU Makefiles and pandoc"
|
||||||
|
|
||||||
|
# Projects (optional).
|
||||||
|
# Associate this post with one or more of your projects.
|
||||||
|
# Simply enter your project's folder or file name without extension.
|
||||||
|
# E.g. `projects = ["deep-learning"]` references
|
||||||
|
# `content/project/deep-learning/index.md`.
|
||||||
|
# Otherwise, set `projects = []`.
|
||||||
|
projects = []
|
||||||
|
|
||||||
|
# Featured image
|
||||||
|
# To use, add an image named `featured.jpg/png` to your project's folder.
|
||||||
|
[image]
|
||||||
|
# Caption (optional)
|
||||||
|
caption = ""
|
||||||
|
|
||||||
|
# Focal point (optional)
|
||||||
|
# Options: Smart, Center, TopLeft, Top, TopRight, Left, Right, BottomLeft, Bottom, BottomRight
|
||||||
|
focal_point = "Center"
|
||||||
|
|
||||||
|
# Show image only in page previews?
|
||||||
|
preview_only = true
|
||||||
|
|
||||||
|
|
||||||
|
categories = []
|
||||||
|
|
||||||
|
# Set captions for image gallery.
|
||||||
|
|
||||||
|
|
||||||
|
+++
|
||||||
|
|
||||||
|
Introducing https://didillinois.win, a static site with some Illinois sports updates.
|
||||||
|
|
||||||
|
[Did Illinois Win](https://didillinois.win) is a static site that shows an overview of the current season for each of the University of Illinois sports that I follow.
|
||||||
|
The source for the website is available here
|
||||||
|
|
||||||
|
## Objectives
|
||||||
|
|
||||||
|
The content on the site changes infrequently and is relatively simple.
|
||||||
|
I settled on a static site, which also makes it much easier to
|
||||||
|
* load quickly
|
||||||
|
* display well on mobile and desktop
|
||||||
|
* not require any javascript (I've never written any javascript before)
|
||||||
|
|
||||||
|
## Implementation (on [github](https://github.com/cwpearson/didillinoiswin))
|
||||||
|
|
||||||
|
Each table is defined in a separate markdown file that looks something like this:
|
||||||
|
|
||||||
|
```md
|
||||||
|
---
|
||||||
|
title: "2021 Football"
|
||||||
|
result: "yes"
|
||||||
|
---
|
||||||
|
|
||||||
|
| Date | Opponent | Result |
|
||||||
|
|-|-|-|
|
||||||
|
| 11/27/2021 | vs Northwestern | [W 47-14](https://www.espn.com/college-football/game/_/gameId/401282722) |
|
||||||
|
| 11/20/2021 | at Iowa | [L 23-33](https://www.espn.com/college-football/game/_/gameId/401282721) |
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
The first part of the file is the "frontmatter", which defines the title and the result that are floating above the table.
|
||||||
|
The rest is just a markdown table with a column for the game date, the opponent, and the result.
|
||||||
|
These files are updated manually by the site administrator (me) and then converted to HTML using [Pandoc](http://pandoc.org) ("a universal document converter").
|
||||||
|
|
||||||
|
```
|
||||||
|
pandoc --template static/template.html input.md -o output.html
|
||||||
|
```
|
||||||
|
* `--template static/template.html`: this argument specifies the template file (more on that below)
|
||||||
|
* `input.md`: this positional argument specifies the markdown file to convert
|
||||||
|
* `-o`: this specifies the output HTML file.
|
||||||
|
|
||||||
|
The template file looks likes this:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<h1 class="sport">$title$</h1>
|
||||||
|
<h1 class="$result$">$result$</h1>
|
||||||
|
|
||||||
|
<!-- put the table in a div so we can center with CSS -->
|
||||||
|
<div align="center">
|
||||||
|
$body$
|
||||||
|
</div>
|
||||||
|
```
|
||||||
|
* `$title$` and `$result$`: the text from the markdown frontmatter is subsituted in these fields.
|
||||||
|
* `$body$`: the rest of the markdown content is substituted here after being transformed.
|
||||||
|
|
||||||
|
This produces a fragment (not a complete webpage) of HTML for each of the sports.
|
||||||
|
These fragments are combined with an HTML header fragment...
|
||||||
|
|
||||||
|
```html
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="description" content="Find out if Illinois NCAA athletics won">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title>Did Illinois Win?</title>
|
||||||
|
<link rel="stylesheet" href="style.css">
|
||||||
|
|
||||||
|
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||||
|
<script async src="https://www.googletagmanager.com/gtag/js?id=G-WQY4PM3M68"></script>
|
||||||
|
<script>
|
||||||
|
window.dataLayer = window.dataLayer || [];
|
||||||
|
function gtag() { dataLayer.push(arguments); }
|
||||||
|
gtag('js', new Date());
|
||||||
|
|
||||||
|
gtag('config', 'G-WQY4PM3M68');
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
```
|
||||||
|
|
||||||
|
...and stitched into a webpage using bash:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cat header.html > index.html
|
||||||
|
echo "<div class="row">" >> index.html
|
||||||
|
echo "<div class="column">" >> index.html
|
||||||
|
cat basketball.html >> index.html
|
||||||
|
echo "</div>" >> index.html
|
||||||
|
echo "<div class="column">" >> index.html
|
||||||
|
cat football.html >> index.html
|
||||||
|
echo "</div>" >> index.html
|
||||||
|
echo "</div>" >> index.html
|
||||||
|
echo "<div class="row">" >> index.html
|
||||||
|
echo "<div class="column">" >> index.html
|
||||||
|
cat volleyball.html >> index.html
|
||||||
|
echo "</div>" >> index.html
|
||||||
|
echo "</div>" >> index.html
|
||||||
|
```
|
||||||
|
|
||||||
|
The combind result is that each sport's HTML fragment is put into its own div, which are organized hierarchically into a table of `row` and `column`.
|
||||||
|
A bit of CSS is used to handle the responsive layout of those divs.
|
||||||
|
|
||||||
|
## Hosting
|
||||||
|
|
||||||
|
I chose to host on Netlify.
|
||||||
|
Netlify can run some automated steps every time there is a push to a github repository.
|
||||||
|
I automated the generation of the website from the markdown files using GNU Make.
|
||||||
|
Then, on Netlify under "Site Settings" > "Build and Deploy", I specified `make` as the build command.
|
||||||
|
|
||||||
|
As of this writing, Netlify provides 100GB bandwidth and 300 build minutes, which is more than sufficient for a 0-traffic small static website.
|
||||||
|
Netlify [provides instructions](https://docs.netlify.com/domains-https/custom-domains/configure-external-dns/) for how to configure the external DNS (more on that below).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## DNS
|
||||||
|
|
||||||
|
I purchased the `didillinois.win` domain from Google.
|
||||||
|
I then had to aim the domain at where the site was hosted on Netlify:
|
||||||
|
|
||||||
|
| Host Name | Type | TTL | Data |
|
||||||
|
|-|-|-|-|
|
||||||
|
| didillinois.win | A | 1 hour | 104.198.14.52 |
|
||||||
|
| www.didillinois.win |CNAME | 1 hour | didillinoiswin.netlify.app. |
|
Reference in New Issue
Block a user