all repos — nasg @ 85eb8324ed9d921f627380f5f6fcc324d9c3ad49

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
 123
 124
 125
 126
 127
 128
 129
 130
# 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.

### Run

Execute within the root folder:

`./run`

For more info, see: `./run -h`.

## 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