ikiwiki/ plugins/ contrib/ pageversion (third party plugin)

Plugin: pageversion
Author: Louis
Included in ikiwiki: no
Enabled by default: no
Included in goodstuff: no
Currently enabled: no

This plugin makes it possible to manage different versions of the same page, allowing to:

- make older/newer versions available;
- highlight the latest version.

# Rationale

On my personal website/blog, I publish articles which I sometimes update. Sometimes, I add a few lines of text with a `Updated on DATE.` message; other times, I rewrite the whole article. In this latter case, I want:

- the main version of the article to be the latest one;
- oldest versions still to be available;
- the main list of my articles to list only the latest version of each article.

# Example

For instance, on my personal website, article one has been updated to two.

- They both contain the directive `[[!versionof parent]]`, marking them as a version of the main article (which happens to be their parent page).
- On the old article, links to the other articles (only one here) are available.
- On the page listing my articles, only the latest article appears.
- The main page lists all versions of this article, and redirects to the latest one.

# List of directives and pagespecs

Pages are marked as versions as other pages using tags (subtags of `_pageversion/*`). Directive `[[!versionof ]]` simply add the appropriate tag to the current page (thus, one can ignore this directive, but it makes things easier).

Pages can be marked as versions of another page (e.g. `foo/version1` and `foo/version2` are versions of page `foo`), or versions of an arbitrary abstract page (called label later). There is no conflict between them (that is, pages marked as a version of page `foo` and as a version of label `foo` are not a version of the same page).

## Directive `versionof`

Marks current page as a version of another page. Its main forms are:

- `[[!versionof name=foo]]` Mark current page as a version of page `foo` (page `foo` is searched using the same linking rules as a WikiLink).
- `[[!versionof label=bar]]` Mark current page as a version of some abstract object labelled `bar`.

It may be convenient to refer to some particular page. Thus, those alternative forms are also available:

- `[[!versionof name]]` Mark current page as a version of itself.
- `[[!versionof parent]]` Mark current page as a version of its parent page.

## Template `otherversions`

To add a list to the other versions of a page (both older and newer), a template is provided. It is called with:

    [[!template  id=otherversions version=VERSION template=INLINETEMPLATE]]

Where:

- (Required) Pages that are a version of `VERSION` are listed (for instance `[[!template id=otherversions version=name=foo]]`).
- (Optional) Template `INLINETEMPLATE` is used (instead of the default `otherversionpage` template) in the inline directive listing the other pages.

## Pagespec `versionof`

A pagespec can match pages marked as a version of something using the pagespec `versionof`. It accepts the same arguments as the arguments as the `versionof` directive, that is:

- `versionof(name=foo)`: Match pages which are a version of page `foo`.
- `versionof(name)`: Match pages which are a version of the current page.
- `versionof(parent)`: Match pages which are a version of the parent page.
- `versionof(label=bar)`: Match pages which are a version of some abstract object labelled `bar`.

Moreover, it takes one additional argument:

- `versionof(any)`: Match pages which are a version of anything.

## Pagespec `latestversion`

An additional pagespec `latestversion` is provided. It accepts the same arguments as the `versionof` pagespec (that is: `latestversion(name=foo)`, `latestversion(name)`, `latestversion(parent)`, `latestversion(label=bar)`, `latestversion(any)`) but only the most recent page is matched.

## Pagespec `latest_tagged`

As a side effect, this plugin also provides the `latest_tagged(TAG)` pagespec. It matches one single page: the most recent page tagged with the given tag.

## Directive `redirect`

Directive `[[!redirect ]]` (from the redirect plugin) can be used together with this package. For instance, a page containing the directive `[[!redirect pages="versionof(page)"]]` will redirect to the most recent page marked as a version of the current page.

# Download and Install

Code and documentation can be found here : https://atelier.gresille.org/projects/gresille-ikiwiki/wiki/PageVersion.