1
0
Fork
You've already forked soupault
0
Static website generator based on HTML element tree rewriting
OCaml 98.4%
Standard ML 0.7%
Shell 0.6%
HTML 0.3%
2025年02月22日 11:12:00 +00:00
.github/workflows Upgrade the upload artifact GH action to 4 2024年03月20日 13:13:17 +00:00
examples Improve the example plugin a bit. 2020年07月13日 23:43:51 +07:00
sample-site [sample site] Rename the sample site config to soupault.toml 2023年05月14日 22:49:24 +01:00
scripts Add a release automation script 2022年05月30日 15:42:46 +03:00
src [Plugin API] Add HTML.is_text 2025年02月01日 16:08:22 +00:00
.gitignore Clean up the .gitignore a bit 2021年12月31日 17:45:06 +07:00
CHANGELOG.md 4.11.0 release 2024年09月06日 12:57:45 +01:00
dune Add a dune profile for static builds 2024年01月15日 15:20:22 +00:00
dune-project Update the version for new dependencies. 2019年12月13日 03:00:16 +07:00
LICENSE 4.8.0 release 2024年01月15日 15:19:21 +00:00
README.md The first codeberg contribution (reworded README) 2025年02月22日 11:12:00 +00:00
soupault.opam Add x-maintenance-intent field to the OPAM file ( #78 ) 2025年02月18日 10:48:09 +00:00

soupault

Build GitHub all releases

Soupault is an HTML manipulation tool. It can be:

  • a static site generator,
  • an HTML processor,
  • a metadata extractor,

or all of the above.

Soupault works with the HTML element tree of the page, so it can do many things that traditionally could be done with client-side JS: inject new HTML into existing complete pages, create a table of contents that preserves the id elements of HTML headings and more.

It also doesn't use front matter and extracts metadata from HTML instead, using a CSS3 selector to metadata field mapping, so even hand-written static pages can be indexed rather than treated as assets. For example:

[index.fields.title]
 # Try to find <h1 id="post-title"> if it exists,
 # else use the first <h1> 
 selector = ["h1#post-title", "h1"]
[index.fields.excerpt]
 selector = ["p#post-excerpt", "p"]
[index.fields.date]
 selector = ["time#post-date", "time"]
 extract_attribute = "datetime"
 fallback_to_content = true

Extracted metadata can then be rendered and injected into pages:

[index.views.blog]
 # Insert rendered data into the element that matches "#blog-index" CSS selector.
 index_selector = "#blog-index"
 index_item_template = """
 <h2><a href="{{url}}">{{title}}</a></h2>
 <p><strong>Last update:</strong> {{date}}.</p>
 <p>{{excerpt}}</p>
 <a href="{{url}}">Read more</a>
 """

Soupault is...

  • Durable and easy to upgrade or roll back: it's available as a statically-linked binary with no dependencies.
  • Extensible: you can bring your own page preprocessors (e.g. Markdown to HTML convertors), pipe HTML elements through external programs, and load Lua plugins.
  • Flexible: most options are configurable, most built-in features can be reimplemented as Lua plugins, and there are page processing hooks.

Soupault is named after the French dadaist and surrealist writer Philippe Soupault because it's based on the lambdasoup library.

Visit soupault.app for details.

For support and discussion, write a message to the mailing list.

Installation

Pre-built binaries are available for Linux, Windows, and macOS. You can download them from https://files.baturin.org/software/soupault and from Github releases (https://github.com/PataphysicalSociety/soupault/releases).

You can verify release archive integrity using this signify/minisign key: RWRfW+gkhk/+iA7dOUtTio6G6KeJCiAEp4Zfozw7eqv2shN90+5z20Cy.

You can also install stable release versions from OPAM:

opam install soupault

Finally, you can build the latest development version with:

opam pin add git+https://github.com/PataphysicalSociety/soupault

To build static binaries, you need to install OCaml with musl runtime, then use the static Dune profile:

# For OCaml 4.12.2, adjust for your desired version
opam switch create 4.14.2-musl ocaml-variants.4.14.2+options ocaml-option-musl ocaml-option-static
opam switch 4.14.2-musl
# Build static binaries
dune build --profile=static

Contributing

Bug reports and patches are always welcome. Feature requests and new features are also welcome, but please consider discussing them with the maintainer first.

You can contribute either through GitHub or through Codeberg.