The new, improved and, most importantly, simplified website for the 23/24 academic year. It's a static site generated with Zola, why not something more standard? I'd prefer not to deal with Ruby (or Go, when Rust is an option 🎆). Zola uses Tera as a template engine, which is very similar to Jinja or every other template engine. All the content is written in Markdown, and we have the option to write content using any old editor and Git or with Decap CMS (formerly Netlify CMS) at https://new.uwcs.co.uk/admin/ . We have a GitHub Action setup to automatically rebuild the site on any pushes to master
.
- Install Custom Zola:
nix profile install github:UWCS/stardust
- Follow steps for All Platforms
- Install my fork of Zola:
- Run script
install-linux.sh
,install-windows.ps1
orinstall-mac-m1.sh
to download and install prebuilt releases of (my fork of) Zola - If this doesn't work, install Rust (see rustup.rs) then run/follow
install-source.sh
- (script may change by OS, but clone then build should always work, even if release build may take a while)
- If you get errors about missing square root, you are running standard Zola, not this fork.
- Run script
- Follow steps for All Platforms
- Clone this repo (with submodules)
git clone --recurse-submodules
- Run Zola with
zola serve
in project root- This rebuilds the website on changes, and serves it at http://127.0.0.1:1111 (view in browser)
- This has occasionally caused problems, if it does replace it with:
python3 -m http.server --directory public -b 127.0.0.1 1111 > web.log &
- then run
zola build --base-url http://127.0.0.1:1111
on any changes
- Write some Markdown in
content/
!
Note, if you want to build the full site (including the archive), comment out "**/archive/*"
in ignored_content
in config.toml
, but DO NOT COMMIT THIS. Adding 3k pages does up the build time a fair bit.
Best way is to run a copy locally and use an editor like VS Code to edit content and push changes to GitHub. This should be relatively straight forward, as you all are CS students. Content is written in Markdown (with a few bonuses), and you can mix in HTML inline if you need to. You'll mostly be concerning yourself with content/news
and content/events
for news and events respectively (unsurprisingly). The other directories are for the other static info pages and their resources. _index.md
is the content for the directory's page, and all other markdown .md
files turn into a corresponding HTML page when rendered.
If you want to include images in the post, you can create a folder for it in content
- e.g. content/resources/git-good
and write the content in index.md
. Note index.md
denotes a page with some colocated assets (images in the markdown dir, not separated into /static
) whereas _index.md
denotes a section with child pages -- the difference is often kinda subtle, but worth noting (sections don't come up in page lists for instance).
Alternatively (e.g. if you are on mobile), try the only slightly janky CMS at https://uwcs.co.uk/admin/ . It should allow editing of the important bits of news and events, though deeper customisation is unavailable. You need to login to it with GitHub, and it will automatically make a commit for you when you save a change. Shortcode previews are in active developemtn, so may or may not work as expected, but they should render fine.
Note: Currently the CMS is broken for events because of the nested folders. Hopefully this is fixable at some point.
When commits are pushed to GitHub, the website will automatically fully re-render itself. Since rendering the archive pages take a while, the changes will first be available on https://draft.uwcs.co.uk, which also shows pages marked as draft. This should take around 20s from commit. Shortly after, the full main website will be rendered.
In future, Decap (the CMS) should support a release system, so we'd only make releases (on GitHub) update the main site. If you want to work on something without it on live, use a branch or a local fork.
Pages in Zola either have the date as a field in their frontmatter, or inferred from the start of the file name (in yyyy-mm-dd-title.md
format). News pages also have a list of categories under the [taxonomy]
header. The main body of the newsletter follows the frontmatter, where you can use normal Markdown features. A template news page is as follows:
+++
title="A News Article"
date="2024-01-01"
[taxonomies]
categories = ["Test", "Newsletter"]
+++
Any content above the more comment will be picked as the preview (otherwise it is the first 200 characters)
<!-- more -->
Some **more content** for the news article, this can be [markdown](https://commonmark.org/help/) you know
Events are organized into folders by term then by week. This means we can provide event dates in the form of Monday 7pm
or any of a range of options. These are all taken relative to the extra.base_date
of the week the event is in. The event end time/date is optional and will be parsed relative to the start date (so in two hours
would work). If the event is multi-day, specify the day here too, and I recommend setting the display_
properties for a better display of events. Location will be room searched (like with Apollo) to find a link. If no results are found or it's off campus, you can give a location_url
too.
The colour and icon of an event need to be given. icon
can be a Phosphor icon (e.g. ph-heart
), Bootstrap icon (e.g. bi-discord
), or a local image or svg (e.g. assets/su-logo.svg
). In general, prefer Phosphor over Bootstrap and a custom image last. colour
can be a CSS hex code (e.g. #FF4000
), normal colour (red
), or a UWCS set colour (gaming
or social
) (check themes/uwcs/templates/macros/colours.json
for the full list). These are the same names as in Figma.
The display properties are useful when we have a multi day event that the standard event system can't really handle (it assumes single day events). If you have a multi-day event, you should specify display_day
at a minimum so the events page knows what (custom) day to put it on -- can be things like Wed & Thurs
, Weekend
, All Week
, etc. display_date
can be used to set a custom date range string, so is probably less useful. display_time
is the time as written on both the event circle and event detail page, it can be useful to say e.g. from 7pm
. Unfortunately, for other events systems, we still need exact datetime set as well.
+++
title = "An important event"
date = "Thurs 7pm"
[taxonomies]
tags = ["Welcome Week", "Test"]
[extra]
end = "9pm" # Optional, end date of event, relative to start date
# Location will be room searched if on campus. Specify a URL if off campus or room search can't find
location = "CS Dept"
location_url = "https://some.web/url" # Optional, custom link to location
# Icon for the event, can be a Phosphor or Bootstrap icon or local image (hopefully a white svg)
# e.g. ph-code, bi-heart or assets/su-logo.svg (upload custom if necessary)
icon = "ph-code"
# Colour can be a UWCS colour or a normal CSS colour
colour = "gaming"
# Optional display properties for custom options for events list
# display_day could be Weekend or All Week, for example
display_day = "Wed & Thurs" # Optional, for day in events list view
display_date = "Wed 27 - Thurs 28 Sep" # Optional, for date in detail view
display_time = "from 7pm" # Optional, for time in both
+++
Some event content, can also be markdown
Shortcodes can be used in Markdown bodies, invoked in the form {% shortcode(...) %}
, and when a body is required:
{% note(type="info") %}
Some longer note text
{% end %}
icon
: An icon from Phosphor, Bootstrap or local,icon
param is formatted the same as for eventsnote
: Callout block with customizable icon and colouryoutube
: YT video and/or playlist link supportpdf
: PDF embeduwcs_dots
: The dots logo, idk about sizingblue
: The blue region with a oval top and bottom separator, like the frontpage
Detailed info on each shortcode can be found in templates/shortcodes
or themes/uwcs/templates/shortcodes
.
Most of the formatting is in the theme at uwcs/new-site-theme and uses Sass and Bootstrap. The SASS is compiled separately, as it adds significant time to each zola build
when it usually hasn't changed. Run theme/uwcs/uwcs-bootstrap/build.sh
to re compile the css. This will call sass
or grass
if existing, otherwise will download grass
for you (the Rust sass compiler that Zola uses).
The basic structure of the project is explained in Zola's docs. Referenced static files can be colocated (in same dir as markdown) or in the static folder separately. Kinda nice, but a bit limited if you want a page's images in a folder, but avoid making the page into a section.
- Page: a page of content, written in markdown, with a html template attached. Usually has a title and date.
- Section: A page with child pages. Represented as a directory with a
_index.md
file representing the parent. - Taxonomy: An index of the pages, e.g. categories of news
- Macros: Template only shorthands for content. Powerful, but kinda awkward and used by Tera
- Shortcodes: Markdown only shorthands, slightly less powerful, but can well just call macros.
- Macros and shortcodes can be linked with some boilerplate, but still the separation is annoying
- Not possible by default, but doable with a bit of boilerplate.
- Create the thing as a macro in the macros folder
- In the shortcode, import the relevnant macro file and call it
- See
shortcodes/uwcs_dots.html
for an example.
- This is janky.
- Very basic shortcodes are reasonably easy to support (100% trying to avoid remaking shortcode logic in JS)
- Decap requiring a lot of boilerplate and not being able to nest shortcode makes this messier too
- See
shortcodes/gen_component_top.html
- See
- The components are registered to Decap in
admin/_index.md
, and a new entry needs to be added for each shortcode - It uses the expanded shortcode as the preview, so it can't preview anything with even an
if
in - This is very jank, and we need to choose either to not support the CMS with shortcodes or to duplicate the shortcodes into JS.
- All exec lists should generate out of the content in
content/exec/
- current examples areexec/_index.md
andabout/exec/_index.md
- Also provides an RSS feed if you wanna automate elsewhere
- Relatively basic templates, archive is split per academic year for a little order
- Archive was messily converted off wagtail, so should be complete
- Please do fix or let me know about errors in the formatting as MD conversion was new
- Some of these guides have a lot of images, so are their own section for colocation, but this means they don't appear on the main subpage list
- So we are currently relying on the existing paragraph of waffle to link to places -- do make sure to keep this up
- Maybe fix sometime if I can make a suitable mixed template (cannot mix sections and pages (def not in pagination), but can list both at least)
- Note: also cannot have assets in a
./images
folder or something, Zola doesn't copy that -- might put in a PR to Zola for that at some point
-
Uses a slightly cursed double layer section - the parent lists each subsection in order and all subpages of the subsections
-
Cannot use transparent here, as we want grouping by the subsection, not mixed
-
This also gives us a per tier page -- neat!
-
Sponsor images also need to have a transparent bg so the white out effect can work properly (and looks ok on light and dark mode)
- Nowhere is safe from room lookup
- Will attempt to search for locations on the uni map for non-archived events
- Provide an
extra.location_url
for an event to set a custom one - Or disable entirely by setting
room_links
tofalse
inconfig.yml
- Must be done if build env doesn't have internet access
- Set alternate room names in
macros/custom-room-mapnames.json
- Not nearly as cursed as it was, now we've organized them by week, although the CMS doesn't really like the layout any more.
- Most of the actual event rendering is from macros in
macros/events.html
-- the circles and the week & term formats.- It also includes the layout script, but that should probably be moved to its own file now it is actually being repeated.
- One minor quirk is how the terms and weeks are reversed for the archive page