Template planning

Per WJ-129: Rework templatesBacklog, the current templating system is not effective and should be improved. In this document we’ll describe Wikidot’s templating system, what we want the new templating system to achieve, and how we’ll go about implementing it.


The old system

A template is a framework that is applied to all pages in a given category. There are two kinds: the default, which results in a form consisting of fields title and content; and “data form”, which allows the template to be created with a “form” (both structure-wise and interface-wise) that defines what fields will be available. The template also defines what of those fields is shown on the page: for the default mode, this is simply the content of the page; and this can be customised for data form mode.


The new system

In the new system, the templates should not be arbitrarily divided into these two categories which are effectively the same. The default - and only - mode should be “data form” mode. The template page should define any number of fields which will determine what data the pages in a category can be created with. Additionally, on creation of a new category (including _default on the creation of a new wiki), a default template should be created that provides fields for title and content. This unifies the two modes into one.


Defining templates

Templates as a page

The old system uses a dedicated template page to store both the output (i.e. the placeholders that will compose the rendered page by substituting its data) and the input (i.e. the structure of the form and therefore the fields that make up the page). The following is a truncated version of the now-deleted Log of Unexplained Locations template by AJMansfield:

%%form_raw{redirect-b}%%%%name%%%%form_raw{redirect-e}%% ==== [[form]] fields: desc: label: "Location Description:" type: wiki hint: "Describe the anomalous item here." height: 6 date: label: "Date of Containment:" type: text default: "████-██-██" redirect-b: type: hidden value: '[[module Redirect destination="http://www.scp-wiki.net/log-of-unexplained-locations/p/999#' redirect-e: type: hidden value: '"]]' [[/form]]

Template pages were made of two sections, separated by ====, with the first being the content substitution and the second creating the data form.

Templates as a page are probably the easiest to implement as they don’t require any special rendering. It’s also convenient to have both the rendering section and the parsing section in the same place. The problem lies in the flexibility of plaintext entry: it’s very easy to fuck it up. Depending on how page content is stored internally, a syntax error could result in data being lost.

Templates as a form

Instead of being presented as a free text-entry interface, template creation could be presented as a form.

Meta-templates

Like how templated pages are edited via a form, editing templates via a form implies the existence of a meta-template that defines the fields for a given template.

For example, the following meta-template could produce the following-following template, which could produce the following-following-following page creation form:

fields: Field[] types: Field: fields: name: label: "Field name" type: text type: label: "Field type" type: select values: 0: "Short text entry" 1: "Long text entry" 3: "Array of..." # Really not sure how to finish this but hopefully you get the idea for now

Note that in order for that to be possible I’ve had to add both a types and array system to templates, both of which are vast increases in complexity that need to be discussed and make this a pretty poor example. Also note that while the intent of the meta-template is to allow for form-based templating instead of text-based, the meta-template is itself text-based. This is because adding another level of form templating requires a further level of form templating behind it, and so on - you must eventually end up at a text-based template.

It occurs to me that this extra layer is probably made null and void by the assumption that users who are fiddling with templates are likely powerusers who know exactly what they’re doing and are capable of reading documentation. In fact they’d probably prefer to disable the form-based interface altogether and just edit the configuration file that it’s wrapping directly.

Also, rendering templates as a form and therefore creating a meta-template introduces another level of implementation and documentation that we, the developers, need to make sure is consistent throughout the entire codebase and documentation, and that sounds like an entire ass.