A shiny replacement for http://freenode.net.
You'll need our node.js dependencies:
$ sudo npm install -g [email protected] svgo uglify-js
$ npm installThen, assuming a Python 3.4 (or later) installation:
$ python3 -m venv env
$ . env/bin/activate
$ pip install -r requirements.txt
$ cms7If everything went well, you should see a lot of log output, and out/ will
have the website in it.
Because we generate the site statically, you'll need to re-run cms7 each
time you change something. If your editor likes compile commands that can run
from any directory, you can also use cms7 -c /path/to/config.yml.
Please comply with the contribution guidelines
Helpful tip for those merging PRs: you can browse the tree a merge would
result in by navigating to
https://github.com/freenode/web-7.0/tree/pull/XYZ/merge, where XYZ is the
pull request number.
You can also go to https://freenode.net/web-7.0/BRANCHNAME/ to see a
build of any particular branch. This also works for internal pull requests
(they are named pull-X).
The site is generated from
Markdown sources and
Jinja2 templates, found in content/ and
templates/ respectively. The Travis build deploys to GitHub Pages
automatically on every push.
Various modules convert the sources to a useful output structure. Eventually cms7 will document this process, but for now:
content/pages/ contains plain pages which are rendered in out/ using
page.html.
content/news/ contains blog/news posts which are rendered in out/news/
using article.html.
content/kb/ contains KB categories: each directory content/kb/X/
has the entries for category X. These are rendered in out/kb/answers/
with kb.html.
Indexes of these entries are rendered in out/kb/ with kb_index.html,
according to a list in config/kb.yml.
cms7 uses the markdown metadata extension, and recognises some special keys:
title sets the page titleslug overrides the target URL: pages/hello with slug: banana would
become out/banana.htmltemplate overrides the template with which to render this Markdown fileBlog-specific:
authordateenclosure sets the podcast URL of an articleEverything that ends up in the final output has a name that identifies it to the rest of the website. If a file is derived directly from an input file, generally its name is derived from the name of the input.
content/pages/hello.md are named their own name
relative to the content directory, minus their extension: pages/hello.static/img/cat.jpg are named their own name
relative to the repository root: static/img/cat.jpg.kb/index/X, where X is the name of the index in
config/kb.yml.cms7 can generate a relative URL to anything with a name from any page. This should always be preferred over manually writing links. To generate a relative link from a Markdown document, just link to a name:
[A page about frogs](pages/frog)To do the same from a template, call url_for:
<a href="{{ url_for('pages/frog') }}">A page about frogs</a>