all repos — nasg @ 4df852d229d21de98768e6d2a438eee240eda603

README.md (view raw)

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
# NASG - not another static generator...

Nearly 20 years ago I did my very first website with a thing called Microsoft FrontPage. I loved it. Times changed, and I wrote a CMS in PHP, first with flat files, then with MySQL, then moved on to WordPress.

Now I'm back on a static generator. I love it.

**WARNING: this is a personal project, scratching my itches. No warranties. If you want to deploy it on your own, feel free to, but not all the things are documented.**

## What does it do

- content is structured in folders
- content files are YAML frontmatter + Multimarkdown
- EXIF from images are read via [exiftool](https://www.sno.phy.queensu.ca/~phil/exiftool/) _this is an external dependency_
- Markdown is converted with [pandoc](https://pandoc.org/) _this is an external dependency_

How it works

- pulls in webmentions from https://webmention.io and stores them in .md files next to the index.md of a post (see later) as: `[unix epoch]-[slugified source url].md`
- pulls in micropub from the queue received by the micropub receiver PHP (see later)
- finds 'redirect' files:
    - anything with a `.url` extension
    - content is the URL to redirect to
    - filename without extension is the slug to redirect from
    - for `HTTP 302`
- finds 'gone' files:

    - anything with a `.del` extension
    - filename without extension is the slug deleted
    - for `HTTP 410`
- finds content:

    - all `index.md` files
    - corresponding comment `.md` file next to it
    - the parent directory name is the post slug
    - finds all images in the same directory (`.jpg`, `.png`, `.gif`)
        - reads EXIF data into a hidden, `.[filename].json` file next to the original file
        - generates downsized and watermarked images into the `build/post slug` directory
        - if a `.jpg` if found with the same slug as the parent dir, the post will be a special photo post
    - anything else in the same directory will be copies to `build/post slug`
- send webmentions via https://telegraph.p3k.io/

```
/
├── about.html -> will be copied
├── category-1
│   ├── article-1 -> slug
│   │   └── index.md -> content file
│   │   └── extra-file.mp4 -> will be copied
│   │   └── 1509233601-domaincomentrytitle.md -> comment
│   ├── fancy-photo -> slug of photo post
│   │   └── index.md -> content
│   │   └── fancy-photo.jpg -> to downsize, watermark, get EXIF
```

## Special features

- complete `microformats2` and schema.org markup in templates
- has light/dark theme, dark by default, but supports experimental prefers-color-scheme media query
- generates 3 special PHP files:
    - search - uses and SQLite DB which is populated by Python on build
    - fallback - 404 handler to do redirects/gones, gets populated with an array of both
    - micropub - a micropub endpoint that accepts micropub content and puts the incoming payload into a json file, nothing else

## Deploy

### Requirements

For Debian based distributions, install the packages:
* python3
* python3-pip
* pandoc

`sudo apt install python3 python3-pip pandoc`

Install pipenv via pip:

`sudo pip3 install pipenv`

Install the pip dependency packages by using the Pipfile by running:

`pipenv install`

### Prepare

Create a local base directory where your contents will be put into. Eg:

`~/MyWebsite`

Create the following directories within your base directory directory: `www`, `nasg/templates`, `content/home`.

Copy the templates from the `templates` directory to the `~/MyWebsite/nasg/templates` directory.

Create a new file within the root directory called `keys.py` with the following content:

```python
webmentionio = {
    'domain': 'yourdomain.com',
    'token': 'token',
    'secret': 'secret'
}

telegraph = {
    'token': 'token'
}

zapier = {
    'zapier': 'secret'
}
```

Add an `index.md` file to the `~/MyWebsite/content/home` directory.

Finally, change the [settings.py](settings.py) file, like the `base` path and `syncserver` etc. to your needs.

## Functionalities based on file extensions/names

- **entry_name/index.md**: main entry (YAML + Multimarkdown)
- **entry_name/entry_name.jpg**: photo of photo posts, only for photo posts
- **entry_name/slufigiedtargeturl.ping**: outgoing webmentions
- **entry_name/slugifiedsourceurl.md**: comments and incoming webmentions
- **some_slug.del**: deleted slug, shall return 410
- **another_slug.url**: redirection, contains redirect URL, shall return 301 or 302