6 releases

0.1.0-alpha6 Oct 29, 2024
0.1.0-alpha4 Jan 1, 2023
0.1.0-alpha3 Dec 29, 2022
0.1.0-alpha2 Dec 28, 2022

#119 in Template engine

CC0 license

25KB
445 lines

TeensyCMS

A very small, very minimal CMS for allowing admins deploying your web applications to add custom pages and have them accessible from a nav bar.

A typical application using TeensyCMS dos so like this:

  • Check for a pages_dir variable in its config
  • Load the TeensyCMS from that path on the file system
  • Have nav bars in the site's template use the values returned from TeensyCMS
  • Mount a single route like /pages/{tail:.*} that renders TeensyCMS content

That's it.

A typical use case for this would be if you wanted a admin to be able to provide their own pages that may or maybe not include:

  • An About page
  • A Contact page
  • A Terms of Service page
  • A Code of Conduct page
  • Whatever else they want idk a list of their favorite cats

A full working example of a website implementing TeensyCMS can be found in the examples/ directory and run with cargo run, but for reference a simple app might look like this:

use teensy_cms::{TeensyCms, DefaultPage};

let my_config = MyConfig::from_env();
let cms = TeensyCms::<DefaultPage>::from_config_path(&my_config.pages_config_path).unwrap();
// finish initializing the web server

// imagine some fancy routing macro that wraps this
fn handle_page_request(req: Request) -> String {
    // something like "contact" or "about"
    let page = &req.path_args()["page"];
    req.data::<TeensyCms<DefaultPage>>().unwrap()
        .render(&format!("{page}.html")).unwrap()
}

Templates are loaded relative to where the config was loaded from. Configs look like this:

---
pages:
  - path: about.html
    url: /about
  - title: Submenu
    pages:
      - path: sub/page.html
        url:  sub/page

A page looks like the following:

---
title: My Page
cats: [Scruffles, Mx. Clawz]
---
<h1>{{ page.title }}</h1>
<ul>
  {% for cat in page.cats %}
    <li>{{ cat }}</li>
  {% endfor %}
</ul>

Intellectual property isn't real. There is no license. If you insist on having one, this is Creative Commons Zero (public domain).

Dependencies

~8–17MB
~238K SLoC