all repos — eureka @ 1e232e2b9a7ce4dbe73773b7cd9123cc15d7e9ad

static site generator based on the 100r.co engine

README.md (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
# about

`eureka` is a simple static site generator based on the generator for [100r.co](https://100r.co).

`eureka` simply reads `.htm` files in `./inc/` and applies a template around them, giving them a `<header>`, `<nav>`, and `<footer>`. The `<nav>` content is also located in `inc/meta.nav.htm`, and, contrary to `100r.co`'s engine, special rules are applied when templating around it to render the landing page (`index.html`).

In addition, there is a thumbnailer that uses [ImageMagick](https://www.imagemagick.org) to create low-bandwidth thumbnails at 500px wide and 16 colors, and store them in a subdirectory alongside the full size images. `eureka` has a function to automatically replace the inline images within pages with the thumbnails, but leave the links they point to untouched.

Eureka also parses a [twtxt](https://twtxt.readthedocs.io/en/latest/) file at `SITEROOT/twtxt.txt` and displays the latest three entrires on the front page. It expects the file to be in descending order.

# usage

1. Run `./build.sh` to copy the default config header to `config.h` and create the `inc` directory (and `meta.nav.htm`) if it doesn't exist.
2. Edit your config; see below for details.
3. Create your CSS and other assets if necessary and put them in your `SITEROOT`.
4. Edit your `inc/meta.nav.htm` to create your `nav` structure (see the markup section below).
5. Create a new page, eg `inc/my_first_page.htm` (see the markup section below).
6. Edit your `inc/meta.nav.htm` again to reference your new page.
7. Run `./build.sh` again! You will be warned of any orphaned files.

If you run into issues with your markup crashing `eureka`, edit the `build.sh` file to uncomment the linux debug build line and comment the fast build; this will show you a stack trace of where you are running into buffer overflows, and give you a hint of where your markup is messed up. To see the individual file that has the error, also uncomment the line in `fpinject()` that prints the file names.

# markup

There is a markup language which makes writing long blog posts, memex entries, etc easier by reducing the need for typing out HTML tags:

```
// shorthand for crosslinking (assuming the file is inc/page_name.htm)
{page name}

// shorthand for transclusion (assuming the file is inc/page_name.htm)
{/page name}

// shorthand for arbitary link
{*destination url|text}

// shorthand for an image you can click to see the full sized version
{:anchor-id|image url|alt text}

// shorthand for an image with arbitrary link destination
{?anchor-id|destination url|image url|alt text}

// shorthand for an audio player
{_/path/to/media}

// shorthand for paragraphs, can embed other markup inside it
{&paragraph text {with a link} {@and some bold text}}

// shorthand for ordered lists, can embed other markup inside it
{#
  {-item one}
  {-item two}
  {-item three}
}

// shorthand for unordered lists, can embed other markup inside it
{,
  {-item one}
  {-item two}
  {-item three}
}

// shorthand for bold
{@bold text}

// shorthand for italic
{~italic text}

// shorthand for code
{`short code}

// shorthand for pre
{$longer code}

// shorthand for quote
{'short quote}

// shorthand for blockquote
{>longer quote}

// shorthand for strikethrough
{\crossed-out text}

// shorthand for level 3 heading 
{!heading text}

// shorthand for level 4 heading
{.heading text}

// shorthand for publish date (renders as <time class='publish-date'>)
{+2022-02-22}
```

# configuration

The following macros are available in `config.h` to customize to your liking.

  - **LEXICON_SIZE**: max size of the `Lexicon`, corresponds to the number of pages `eureka` can keep track of
  - **TAG\_BODY\_SIZE**: max size for an individual markup body (ie, a markup token as above, minus the curly brackets and the rune), in bytes
  - **NAME**: the title of the site
  - **DOMAIN**: currently unused
  - **LOGO**: currently unused
  - **ABOUT**: HTML content for the front page, placed between `<header>` and `<nav>`
  - **CONTACT**: the contact info line at the bottom of every page (except the front page, where it would typically already be in **@ABOUT**
  - **FOOTER**: arbitrary footer HTML
  - **LICENSE**: the license link at the bottom of every page
  - **SITEROOT**: the path where the rendered HTML is placed
  - **MAINCSS** and **FRONTCSS**: to differentiate styles used for the landing page and the rest of the site