xref: /plugin/deletepageguard/README.md (revision 994617c99eb4de6734040e280e3cda0f9a974997)
1*994617c9SJohann Duscher# Delete Page Guard for DokuWiki
2e39ccd63SJonny Dee
3*994617c9SJohann DuscherThe **Delete Page Guard** plugin prevents accidental or intentional deletion of
4e39ccd63SJonny Deewikipages in your DokuWiki installation by blocking the “empty save”
5e39ccd63SJonny Deeoperation when certain pages are protected. A page is considered for
6e39ccd63SJonny Deeprotection when its ID or relative file path matches one or more
7e39ccd63SJonny Deeregular expressions configured via the DokuWiki Configuration Manager.
8e39ccd63SJonny Dee
9e39ccd63SJonny Dee## Features
10e39ccd63SJonny Dee
11e39ccd63SJonny Dee* Prevents deletion via “empty save” on protected pages.
12e39ccd63SJonny Dee* Supports any number of protection patterns using PCRE syntax.
13e39ccd63SJonny Dee* Choose whether to match against the colon‑separated page ID or the
14e39ccd63SJonny Dee  relative file system path.
15e39ccd63SJonny Dee* Allow administrators and optional additional groups to bypass the
16e39ccd63SJonny Dee  protection.
17e39ccd63SJonny Dee* Optionally treat whitespace‑only content as empty.
18e39ccd63SJonny Dee
19e39ccd63SJonny Dee## Installation
20e39ccd63SJonny Dee
21e39ccd63SJonny Dee1. Copy the contents of this plugin directory into
22*994617c9SJohann Duscher   `<dokuwiki>/lib/plugins/deletepageguard/`.
23e39ccd63SJonny Dee2. Ensure that the directory name matches the `base` value in
24*994617c9SJohann Duscher   `plugin.info.txt` (here: `deletepageguard`).
25e39ccd63SJonny Dee3. Visit the **Configuration Manager** in your DokuWiki and adjust the
26*994617c9SJohann Duscher   plugin settings under the “Delete Page Guard” section.
27e39ccd63SJonny Dee
28e39ccd63SJonny Dee## Configuration
29e39ccd63SJonny Dee
30e39ccd63SJonny DeeThe following options are available in the Configuration Manager:
31e39ccd63SJonny Dee
32e39ccd63SJonny Dee| Setting | Description |
33e39ccd63SJonny Dee|---|---|
34e39ccd63SJonny Dee| **Protected page patterns** | List of PCRE regular expressions. Each line defines a pattern. When a page matches any pattern, non‑admin users cannot delete it by empty save. |
35e39ccd63SJonny Dee| **Match against** | Choose whether the patterns should match against the page ID (e.g. `users:john:home`) or the relative file path (e.g. `users/john/home.txt`). |
36e39ccd63SJonny Dee| **Extra groups allowed to delete** | Comma separated list of user groups that are allowed to delete protected pages, in addition to administrators. Leave empty to restrict deletion to admins only. |
37e39ccd63SJonny Dee| **Treat whitespace‑only pages as empty** | If enabled, pages containing only whitespace will be treated as empty and deletion will be blocked on protected pages. |
38e39ccd63SJonny Dee
39e39ccd63SJonny Dee### Pattern examples
40e39ccd63SJonny Dee
41e39ccd63SJonny Dee* `^users:` – protect all pages in the `users` namespace.
42e39ccd63SJonny Dee* `^users:[^:]+:start$` – protect every user’s landing page named `start` under `users:<username>`. |
43e39ccd63SJonny Dee* `^projects:.*$` – protect everything in the `projects` namespace. |
44e39ccd63SJonny Dee* `^private/.*\.txt$` – when matching against file paths, protect any `.txt` file in the `private` directory. |
45e39ccd63SJonny Dee
46e39ccd63SJonny Dee## How it works
47e39ccd63SJonny Dee
48e39ccd63SJonny DeeWhen a page is saved, DokuWiki triggers the
49e39ccd63SJonny Dee`COMMON_WIKIPAGE_SAVE` event just before writing to disk. For normal
50e39ccd63SJonny Deeedits, the plugin does nothing. However, when the new content is
51e39ccd63SJonny Deeempty (after optional trimming) the plugin checks the configured
52e39ccd63SJonny Deepatterns against the chosen target (ID or file path). If a match
53e39ccd63SJonny Deeoccurs and the current user is not an administrator and not in one of
54e39ccd63SJonny Deethe exempt groups, the plugin prevents the deletion by calling
55e39ccd63SJonny Dee`$event->preventDefault()` and `$event->stopPropagation()` as
56e39ccd63SJonny Deedocumented in DokuWiki’s event system【147016890842581†L304-L335】. An error message is displayed to
57e39ccd63SJonny Deethe user informing them that deletion is not allowed.
58e39ccd63SJonny Dee
59e39ccd63SJonny Dee## Compatibility
60e39ccd63SJonny Dee
61e39ccd63SJonny DeeThis plugin hooks into the `COMMON_WIKIPAGE_SAVE` event, which was
62e39ccd63SJonny Deeintroduced in DokuWiki release **“Detritus” (2016‑02‑24)** and is
63e39ccd63SJonny Deemarked as preventable【699486104488352†L111-L139】. It has been tested for compatibility with
64e39ccd63SJonny Deecurrent releases such as **Kaos 2024‑02‑06b** and **Librarian 2025‑05‑14**.
65e39ccd63SJonny DeeThe plugin uses only public APIs and the documented event system,
66e39ccd63SJonny Deeso it should continue to work with future versions as long as these
67e39ccd63SJonny Deeevents remain available.
68e39ccd63SJonny Dee
69e39ccd63SJonny Dee## License
70e39ccd63SJonny Dee
71e39ccd63SJonny DeeThis plugin is released under the terms of the
72e39ccd63SJonny Dee[GNU General Public License v2](https://www.gnu.org/licenses/gpl-2.0.html).