I'm happy to announce the release of version 1.0-beta3 of Lambdoc, a library providing support for semantically rich documents in web applications. Lambdoc was designed with Ocsigen/Eliom integration in mind, though you may of course use it with other frameworks (it does not actually depend on the Ocsigen server or Eliom). In fact, you may find it useful outside the web application domain altogether.

An overview of Lambdoc's features may be found in the post I wrote announcing the first beta of Lambdoc. The good news is that in the intervening months, some of the most pressing issues with the library have been fixed, and it is now much closer to completion. The bad news is that backward-incompatible changes were required. For most uses these amount to no more than a module renaming fixable by search-and-replace. The extension mechanism suffered a complete overhaul, however (more on that below), and is manifestly incompatible with the first beta. My apologies if anyone was inconvenience by this, and the caveat emptor regarding beta software remains.

Lambdoc 1.0-beta3 should hit the OPAM repos any moment now.

Salient changes since beta 1

  • The module structure was reorganised, with the module packs being ditched in favour of flatter structure reliant on module aliases.
  • OASIS is now used for the build system.
  • Completely revamped extension mechanism. Extensions are now easily composable, and output raw AST values instead of Lambdoc_core values, allowing for greater flexibility. Within the examples directory are some illustrations of the power offered by the extension mechanism:

What to expect before a 1.0 release

Though Lambdoc is perfectly useful right now, there are still some issues to resolve before I'm willing to tag a final 1.0 release. The Markdown support, in particular, is still far from complete. Other prominent issues include #24, #28, #29, #31, #32, and #33. Fortunately, though some of these issues may require backward incompatible changes, these are pretty minor.

Acknowledgements

Massive kudos to Gabriel "Drup" Radanne and Edwin Török for their feedback and code contributions.