A Wiki is a web site that can be edited directly by people browsing it. That way, they can add new content, correct errors or inaccuracies, and add their own comments, among other things. Since the debut of the original Wiki Wiki Web, many publicly available, usually open source, Wiki implementations have appeared, enabling webmasters to set up their own Wikis on their sites. These Wiki implementations vary in their features, ease of installation, syntax, and semantics.
The purpose of this article is to give an overview of several popular Wiki implementations and see how they fare. It is not trivial to switch from one Wiki implementation to the other, because this will usually require translating all of the pages from the old syntax to the new one. Thus, choosing a Wiki engine requires some care, taking possible future developments into account. This article will hopefully help you make that choice if the need arises.
Common Features Offered by Wiki Implementations
For their pages, Wiki implementations offer a markup language, usually very different than HTML. The alternate syntax helps to prevent HTML injection attacks and also allows easier editing. Some Wikis support a subset of HTML, but this is uncommon.
Most implementations identify Wiki pages in the markup by using an identifier, usually formed from capitalized words (for example, ThisIsAWikiPage). Wiki users refer to this form of capitalization as CamelCase. Any such identifiers in the page create links to other internal pages in the Wiki. Following a link to a non-existing page often gives the opportunity to edit the page's contents, thus creating a new page.
There are other common rich-text paradigms. Some allow users to designate portions of text as external links to URLs. One embeds images based on the URLs. It's usually possible to highlight text with bold, underline, or italics, add numbered (<ol>s) and bulleted lists (<ul>s), blocks of monospace text (representing program code or output), and so forth.
Some Wikis have page attachments: binary files associated with the page to which it can refer. This is useful for putting images or directly downloadable files in the Wiki. Another common feature is version control. Version control allows users to save and recall previous version of the edited pages, in order to reverse damage, either accidental or malicious. Most Wiki implementations also have a search feature for searching their pages.
In addition to the above, several Wiki engines offer extra features such as user management and permissions, extendability, and an extended markup that supports various operations such as meta-syntax.
For simplicity's sake, I'll assume that you want to install a Wiki on a UNIX machine (Linux, in my case). Should you want to set up a Wiki on Microsoft Windows, you may encounter other or different problems. I'll also concentrate on Wikis written in Perl, Python, and PHP because they are familiar languages, widely available, and well studied.
The criteria for evaluating the Wiki implementations are:
- Installation requirements and ease of installation--how easy is it to perform the installation as an under-privileged user?
- Does the installation require an SQL database? If so, can the Wiki implementation use a pre-defined prefix for all of its tables? (This is useful in shared-hosting situations where you cannot create your own unique databases.)
- Is the Wiki version-controlled? Does it require an external version-control system?
- How usable is the Wiki markup syntax? How rich is it? Does it allow inclusion of some HTML tags? Are there any useful meta-tags or macros?
- Is there support for attachments?
- Is there support for user management, permissions, page locking, and other authentication and authorization features?
- What third-party installable extensions are available?
- What support does the Wiki implementation have for internationalization and localization? Can page titles contain non-ASCII characters? Can it serve pages with UTF-8 encoding?
- What features does the Wiki offer that most other Wiki implementations do not?