Skip to main content

A Python tool for generating static websites based on JOSN models

Project description

webstaterator

A jinja2 powered static website generator that generates pages based on a JSON data models.

Why?

I wanted to convert my PHP websites to static sites to save money but could not find a python based tool that allowed me to use a data model to do so.

Why the stupid name?

I needed a name to create the repo, a friend suggested webstaterator. Good work Sasha!

Install

pip install webstaterator

Running

Webstaterator is available via the CLI using webstaterator. Help can be found using webstaterator -h

Modes

Action Info Arguments Example
Verify Check that a website setup is correct -w, --website - website.json webstaterator verify -w website.json
Build Build a website -w, --website - website json. -o, --output - output directory webstaterator -w website.json -o build/
Template Generate a template for a website -o, --output - output directory webstaterator template -o website/

Website json

The website description JSON powers webstaterator. It can be used to describe two types of page, a standard page and a list page.

  • A standard page simply takes a jinja2 template, a file name, and an option data model and outputs a page.
  • A list page on top of the standard page attributes, specifies a target element within the data model. This will result in a page for every child element targeted in the list page.

Format

{
  "name":"my example website",
  "model":"model.json",
  "template":"templates/",
  "assets": ["images"],
  "pages": [
    {
      "name":"index",
      "template":"main.html",
      "filename":"index.html"
    }
  ]
}
  • name: The name of the website
  • model [optional]: The path to a json object
  • template: The path to a directory containing a set of jinja2 template files
  • assets [optional]: One or more directories to be copied into the build folder. This can be things like images, CSS, or JavaScript
  • pages: An array of pages see below for more details

Basic Pages

  • name: Name of the page, can be used to access the URL on other pages or check which page is currently being rendered
  • template: The jinja2 template file (found in the provided template directory)
  • filename: The name of the output file. This is the file name use on the live site

List Pages

  • name: Name of the page, can be used to access the URL on other pages or check which page is currently being rendered
  • template: The jinja2 template file (found in the provided template directory)
  • filename: The name of the output file. This is the file name use on the live site. Unlike a basic page a list filename must include {} so that a unique filename can be created for every item in the list
  • list: The dot delimited path to the target array or dictionary within the provided data model.
  • id [optional]: If the target of list is an array use id to specify the child attribute to use as an id.

List example targeting a dictionary

Given the following data model

{
  "example": {
    "people": {
      "Chris": {
        "height": 6.1,
        "age": 34,
        "face": "ugly"
      },
      "Steve":{
        "height": 5.11,
        "age": 40,
        "face": "round"
      },
      "Karen":{
        "height": 5.2,
        "age": 38,
        "face": "trapazoid"
      }
    }
  }
}

and the page

"pages": [
  {
    "name":"people",
    "template":"people.html",
    "filename":"person-{}.html",
    "list":"example.people"
  }
]

the output would be

  • person-Chris.html
  • person-Steve.html
  • person-Karen.html

when generating each page the value in the dictionary will be made available via the target variable. So when rendering person-Chris.html the following will be available to the template people.html :-

{
  "height": 6.1,
  "age": 34,
  "face": "ugly"
}

List example targeting an array

The same example would look like this if we used an array instead of a dictionary

{
  "example": {
    "people": [
       {
        "name":"Chris",
        "height": 6.1,
        "age": 34,
        "face": "ugly"
      },
      {
        "name":"Steve",
        "height": 5.11,
        "age": 40,
        "face": "round"
      },
      {
        "name":"Karen",
        "height": 5.2,
        "age": 38,
        "face": "trapazoid"
      }
    ]
  }
}

and the page

"pages": [
  {
    "name":"people",
    "template":"people.html",
    "filename":"person-{}.html",
    "list":"example.people",
    "id":"name"
  }
]

Notice this time we need to include an id to specify which attribute to use as an id.

the output for the above would be

  • person-Chris.html
  • person-Steve.html
  • person-Karen.html

Templates

Each jinja2 template will have access to the following variables :-

  • links - A dict of links with page name as key and an array of URLs as the value
  • page_link - The URL for the current page
  • model - The JSON file loaded described in the website JSON if provided

If the page is a list page the template will also have access to :-

  • target - The child data element found in model that is linked to this list page.

Custom formatters

jinja2 supports custom filters. The following custom filters are available in webstaterator.

filter purpose arguments defaults example
date_fmt Formats date objects and strings date_format, date_in_format %d %b %y, %Y-%m-%d {{ event["start"]|date_fmt("%b %Y") }}
markdown_fmt Converts markdown string to HTML5 none none {{ event["blurb"]|markdown_fmt }}

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

webstaterator-0.4.2.tar.gz (17.4 kB view details)

Uploaded Source

Built Distribution

webstaterator-0.4.2-py3-none-any.whl (18.6 kB view details)

Uploaded Python 3

File details

Details for the file webstaterator-0.4.2.tar.gz.

File metadata

  • Download URL: webstaterator-0.4.2.tar.gz
  • Upload date:
  • Size: 17.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.8.6

File hashes

Hashes for webstaterator-0.4.2.tar.gz
Algorithm Hash digest
SHA256 24124c62237f8c4f77fa9f73c357d3f2df6b8259c72a033984457d5d2b5b341d
MD5 adc8ad388a6583d7e31c140b7eff22f0
BLAKE2b-256 1edfe1416569ae8fe6d72555656ac3b70dfe6b2048137244157ff8f01fdb95ab

See more details on using hashes here.

File details

Details for the file webstaterator-0.4.2-py3-none-any.whl.

File metadata

File hashes

Hashes for webstaterator-0.4.2-py3-none-any.whl
Algorithm Hash digest
SHA256 c3cd47999ce6fca3b8a7e335029fb5cc9b13316064cc99dda78bf49a70087fd0
MD5 3942f1253f353c74e375b29f4fc1bf06
BLAKE2b-256 12f583f80979bc1e2d1bb4b444cb174be32f98574630a0418b66ee93124084d7

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page