4.10.0 (2024-04-21)

New features

Deleting only elements that do not have certain children

The delete_element widget has a new option: when_no_child.

For example, suppose you have footnotes container in your template that looks like this: <div id="footnotes"> <hr class="footnotes-separator"> </div>. If a page has footnotes, it would contain something like <p class="footnote">.... If not, it would only have the <hr> element in it.

Deleting it from pages that don't have any footnotes cannot be done with only_if_empty because the container has that auxilliary element in it.

However, with the new option you can make the widget delete the container only if nothing inside it matches the selector of actual footnotes.

[widgets.clean-up-footnote-containers]
  after = "footnotes"
  widget = "delete_element"
  selector = "div#footnotes"
  when_no_child = "p.footnote"

Bug fixes

4.9.0 (2024-03-19)

New features and improvements

New plugin API functions

New Digest module offers functions for calculating cryptographic hash sums of strings. All those functions return hex digests.

Other new functions:

4.8.0 (2024-01-12)

New features and improvements

New plugin API functions

Bug fixes

4.7.0 (2023-09-19)

New features and improvements

New plugin API functions

Bug fixes

Misc

New state record now holds both the settings record and the TOML config datastructure, plus the new global_data and soupault_pass variables, and can be easily extended to support global state new variables.

4.6.0 (2023-06-16)

New features and improvements

New plugin API functions

Bug fixes

4.5.0 (2023-03-27)

New features and improvements

Bug fixes

4.4.0 (2023-01-26)

New features and improvements

Bug fixes

4.3.1 (2022-11-16)

Bug fixes

4.3.0 (2022-10-24)

New features and improvements

New Lua plugin functions

Bug fixes

Compatibility

Soupault now requires OCaml 4.13 to build.

4.2.0 (2022-09-22)

New features and improvements

Bug fixes

4.1.0 (2022-08-19)

New features

Bug fixes

Internal changes

4.0.1 (2022-05-30)

Bug fixes

4.0.0 (2022-05-14)

Breaking changes

New features

New Lua plugin API functions and variables

New variables

New functions

Unicode string functions

Bug fixes

Behaviour changes

3.2.0 (2021-10-23)

New features

Bug fixes

3.1.0 (2021-08-16)

New features

3.0.0 (2021-07-19)

Breaking changes

New features

Misc

Soupault now uses OTOML instead of To.ml for TOML parsing and manipulation.

2.8.0 (2021-06-20)

New features

Bug fixes

2.7.0 (2021-05-12)

New features

2.6.0 (2021-04-15)

New features

Bug fixes

2.5.0 (2021-04-15)

New features

Bug fixes

Misc

2.4.0 (2021-01-17)

New features

New plugin functions

Bug fixes

2.3.0 (2020-12-18)

New features

New plugin functions

Bug fixes

2.2.0 (2020-11-29)

New features

Table helpers

Iterating through tables is a real weak point of the 2.5 era Lua implemented by Lua-ML. To make working with tables simpler, I’ve added a high level few helpers functions, including:

Bug fixes

Platform support

32-bit Windows is no longer supported, all future Windows builds will be for 64-bit Windows only.

2.1.0 (2020-10-28)

New features

Bug fixes

2.0.0 (2020-09-20)

Breaking changes

There is an online config convertor to simplify migration.

The reason for removing the built-in content model was that custom fields introduced in soupault ... were already more flexible than the old-built in fields: they had extract_attribute and default_value options. Old field configuration, however, were limited to just a selector and nothing else, since their syntax wasn't designed to be extensible: index_date_selector, index_author_selector, index_title_selector, and index_excerpt_selector.

That was a design mistake that was impossible to fix without completely changing the syntax. Removing the inflexible built-in fields in the process looked like a logical step.

New features

1.13.0 (2020-07-08)

New features

1.12.0 (2020-05-31)

1.11.0 (2020-04-27)

New features

1.10.0 (2020-03-25)

New features

Bug fixes

1.9.0 (2020-02-28)

New features

Bug fixes

1.8.0 (2020-01-17)

New features

New plugin functions

1.7.0 (2019-12-23)

New features

Build

Building soupault now requires OCaml 4.08 or later.

1.6.1 (2019-12-13)

Bug fixes

1.6.0 (2019-11-30)

New features

New plugin functions

Bug fixes and improvements

1.5.0 (2019-11-01)

New features

1.4.0 (2019-10-26)

New features

1.3.2 (2019-10-06)

Bug fixes

1.3.1 (2019-10-05)

Bug fixes

1.3.0 (2019-09-29)

Improvements

Bug fixes

Build

1.2.0 (2019-08-12)

New features

Bug fixes

1.1.0 (2019-08-01)

New features

Footnotes now include links back to the original location in the document for easier navigation. It's possible to disable this and make footnote links one way with back_links = false widget option.

[widgets.footnotes]
  widget = "footnotes"
  # No back links
  back_links = false
  # ...

Path regex options for widgets

It's now possible to limit widgets to page file paths matching a Perl-compatible regex.

[widgets.starts-with-foo]
  path_regex = "/foo(.*)"
  widget = "insert_html"
  selector = "body"
  html = '<p>This page name starts with foo!</p>'

Excluding pages from widgets

It's now possible to explicitly exclude pages from a widget using these options:

For example:

[widgets.toc]
  # No ToC on any page named "index"
  exclude_path_regex = '/index(\.*)'

Bug fixes

Platform support

Binaries for macOS are available.

1.0.1 (2019-07-20)

Behaviour changes

Only files with extensions .htm .html .md .rst are assumed to be pages now, all other files are copied to the build dir unchanged. This is to simplify switching for existing websites that store assets together with pages, and to comply with the principle of least astonishment.

You can change it with page_file_extensions option, for example:

[settings]
  page_file_extensions = ["htm", "html", "md", "rst", "txt"]

New features

JSON index data export

It is now possible to export the global website index to file:

[index]
  index = true
  dump_json = "path/to/file.json"

Custom index fields

Example:

[index.custom_fields]
  tags = {selector = ".tag", select_all = true}
  category = {selector = "#category" }

Lists of selectors

page and section options can now be either single selector or lists. This also applies to the selector option in title and footnotes widgets, with different semantics (select any that exists and select all respectively).

Bug fixes

1.0.0-beta1 (2019-07-15)

The first beta. It's stable enough to build my own website with a pretty interesting config, but may still have rough edges.