Nocterra 0.99.6 extends the APIs and extension points available to add-ons, allowing more of Nocterra’s existing infrastructure to be reused by independently released functionality.
The release expands access to caching, content handling, metadata, configuration and routing-related functionality, and includes related improvements throughout the blog, RDFa, layout and image handling code. These changes provide a broader foundation for add-ons such as the Event add-on while remaining generally available to other extensions.
Nocterra 0.99.6 makes more existing CMS functionality available for reuse outside the code in which it was originally implemented. This continues the work towards allowing separately released add-ons to make use of Nocterra's own infrastructure instead of implementing parallel mechanisms.
One example is stringToUrl(), which has moved from the blog code to the common layout API so it is available to other parts of Nocterra and to add-ons. Other changes in this release similarly separate generally useful functionality from the feature that first required it. This work is also part of the preparation for add-ons such as the Event add-on, which require access to more of Nocterra's routing, caching, content and structured-data facilities than the existing page and hook integration alone provides.
The blog gains per-author and per-category urlScheme configuration. Articles can use an URL scheme associated with their category or author, with configurable priority when both are available, and fall back to the general article URL schemes. The routing code has been reorganized around these schemes so the same configuration is used for URL generation, article lookup, canonical URLs and alternate URLs.
URL schemes also support the expanded case-prefix syntax used elsewhere in the blog, including first-letter and full-string case conversion. Article placeholders and definitions have corresponding capitalization options, and article text parsing can now return author, category and tag names without generating links when the surrounding output already supplies the link.
Links for year, author, category and tag configuration can now consistently use absolute URLs as well as local paths. Their configuration and normalization have been brought into the same model, making the same URL handling available across these definitions.
The structured-data output has been reviewed as part of the continuing work to make semantics less dependent on the code path that happens to generate a page. In particular, the automatically generated year table of contents no longer declares a fixed Blog/BlogPosting relationship. Individual entries can instead use the RDFa setting and configured type associated with their category.
This work is preparatory to moving more structured-data handling into common Nocterra facilities and providing APIs for adding structured data. At present this responsibility is distributed between several parts of the core, including layout-generated data such as breadcrumbs and OpenGraph output, and structured data generated by the blog. Bringing these facilities together will allow pages, core components and independently released add-ons to contribute semantic information through the same infrastructure.
Article image handling now has a common API. blogGetArticleImage() first uses an image configured directly on the article and can then resolve an article image through the configured author and category, the general article configuration and finally the active site image. The author or category can be given priority independently of the URL-scheme priority.
The resolved image is used by article output and metadata generation and is also available through the article /images/logo_social.png placeholder. The API can preserve an existing ImageSet, replace it with another ImageSet, or return the underlying image without an ImageSet wrapper. ImageSet paths may also start with a slash in 0.99.6.
Menu items can now have an additional CSS class, allowing individual entries to be styled without changing the generated menu structure. Link processing has also been extended to more generated page content, including applicable prologues, epilogues and footer entries, so those areas can use the same Nocterra link handling as normal page content.
Footer configuration is more flexible as well: entries can obtain their displayed name from an existing menu path, contain plain text without a link, or act as separators.
The language selector now uses the correctly spelled separator class for the SPAN placed between language choices. Sites with CSS that explicitly refers to the previous seperator class should update that selector when moving to 0.99.6.
Page timestamping configuration now accepts a flat array of excluded paths in addition to the other supported forms, bringing its configuration normalization in line with similar Nocterra settings.
There are also small changes to generated HTML formatting. Leading and trailing empty lines are handled consistently, and the contents of PRE elements are no longer given the indentation that Nocterra adds to surrounding generated markup. This mainly keeps technical and preformatted source examples closer to their supplied formatting.
| 2026-09-22 | #892: | Blog: Add fallback image to article, category and author configuration |
| 2026-09-20 | #891: | Blog: Add function to get article image |
| 2026-09-20 | #88: | PRE element content should not be indented |
| 2026-09-20 | #890: | generateFromContent does not remove leading empty lines correctly |
| 2026-09-20 | #885: | Blog: Add support to definitions for case prefix syntax |
| 2026-09-19 | #127: | Ability to assign classes to menu items |
| 2026-09-19 | #850: | compileLanguages does not correctly support flat array timestamping page setting |
| 2026-09-19 | #889: | Move stringToUrl to layout.php |
| 2026-09-19 | #888: | Blog: Make RDFa generation type aware |
| 2026-09-18 | #887: | Blog: Should not override already defined menu items |
| 2026-09-18 | #884: | Blog: Add support to urlscheme for case prefix syntax |
| 2026-09-17 | #886: | Blog: Placeholder first letter uppercase without prefix overrides specified prefix |
| 2026-09-17 | #883: | Blog: Expand placeholder case prefix to include full lower and full upper case |
| 2026-09-15 | #881: | Blog: mismatch in handling absolute versus relative year, author, category and tag its value of link |
| 2026-09-15 | #882: | Blog: fatal error in blogParseDefText when configuring multiple urlschemes for a category or author |
| 2026-08-17 | #880: | Blog: Double slash possible in sitemap.xml |
| 2026-08-08 | #879: | imageSets cannot start with a slash |
| 2026-08-06 | #743: | Process links in some prologues and epilogues and footer string entries |
| 2026-08-06 | #851: | languageSelector uses incorrectly formed separator |
| 2026-08-06 | #878: | Footer check of item and link too strict for custom entry |
| 2026-07-31 | #875: | Blog: Support per author and per category urlScheme |
| 2026-07-31 | #877: | Blog: lookup_article_in_author_toc passed link directly as the author key |
| 2026-07-31 | #876: | Blog: wrong function name for blogGetArticleUrl |
| 2026-07-30 | #874: | Blog: article keys mix modified and updated |
| 2026-07-30 | #873: | Blog: Add parameter to blogParseArticleText to prevent links in links |
| 2026-07-30 | #871: | Blog: blogExtendMenuWithYear not called from blogGenerateYearContent |
| 2026-07-30 | #872: | Blog: toc and urlmap routing log messages that should be debug output |
| 2026-07-30 | #869: | Blog: Customizing TOC URL for a certain year/author/category/tag can result in a 404 not found |
| 2026-07-28 | #870: | Blog: urlScheme {date_ord} not parsed correctly |
| 2026-07-28 | #868: | Blog: urlScheme too greedy when the scheme includes dashes |
| 2026-07-28 | #835: | Blog: blogGetArtcleUrl {Day} and {day} use wrong capitalization flag |
| 2026-07-28 | #867: | Blog: Passing null to cacheAddDependency when articles are directly in the source directory |
| 2026-07-28 | #832: | Blog: Inconsistencies between year, author, category and tag settings and normalization |