Extension:NaturalLanguageList

Natural Language List allows for creation of simple lists in natural languages (e.g. 1, 2, 3, ... n-1 and n) at its core, but also several other sophisticated and useful list related functions.

Overview
Currently, the extension introduces two new parser functions;   and   . For most purposes, the former is the function you'll most be using, so let's look at that first.

This function takes an arbitrary number of arguments. Indeed, no arguments are technically required, and in such a case, it just returns nothing. Each argument that is not understood as an option will be assumed to be a field in the list. Remember that the special cases of #ignore: and #data: are not understood as options, but rather definitions for the coming state of input, including the parameter in which they appear.

This function is slightly different, this is designed to take a raw input of strings (perhaps returned by another template, parser functions or indeed something else). Since MediaWiki usually uses pipes (|) to separate data, MediaWiki understands that it cannot return that to templates/parser functions and much less parse it correctly. This parser function allows you to make up for just that. The first argument in this system is always the separation key, specifically what the data is separated by, everything that isn't understood as an option is assumed to be input data to parse.

Which would become 1, 2, 3, 4 and 5.

Why?
Ironically, many people whom I have shown this extension or indeed its concept have trouble grasping its purpose. In most cases, people say they cannot find an application for the need of automatic natural language lists. But for anyone who has a decent sized wiki, they will eventually come around a scenario, where a system that adds an 'and' between the last two elements would indeed be handy, but are forced to write excessively long wikicode to compensate for it.

Examples
Here are some templates around several wikis that could greatly benefit from this extension:


 * wiktionary:Template:also
 * wiktionary:Template:list helper

Code

 * Get it from the repository!

Live!
Since this extension is not implemented anywhere else than my place, you can currently see it in action here:


 * http://dev.sviip.dk/List_tests

Options
Each parameter containing data in the format of 'variable=value' will be considered an option, so for several options, separate them by a pipe. In addition, it is regardless of the position in the list of items where the options come. First, last or in the middle, the construct of 'variable=value' will be assumed to be an option, if it matches one of the following understood variables:


 * duplicates (boolean)
 * (Default: true) Whether the list should include duplicates, if true duplicates will be included, per default they won't.


 * blanks (boolean)
 * (Default: false) Whether the list should include blank elements, if true blank elements will be included, per default they won't.


 * separator (string)
 * outputseparator (string)
 * (Default: empty) The output's separation character(s), if not set, it will default to the 1, 2, 3, ... n-1 and n format.  If set, however, the ' and ' feature will not be available, and all elements will be separated the same way.  So if you set it to a comma, it will simply be the same but the two last elements separated by a comma rather than an ' and '.


 * lastseparator (string)
 * (Default: empty) Allows to set a specific separator for the last two elements, if not set, it will default to the language's setting for ' and '.


 * itemcover (string)
 * (Default: empty) Allows to create string surrounding each item. Must contain $1 to refer to the item.  When used with fieldsperitem, $2, $3, etc. may also appear.


 * fieldsperitem (integer)
 * itemsperitem (integer)
 * (Default: 1) Allows to create more inputs per a single field in the end result, combining several fields into one.  The amount it is set to is the size of the pairs of fields.  It requires itemcover to be set.  Though, it is not required for itemcover to contain more than $1.

#ignore:
This parameter indicates that this item and all items henceforth are to be ignored by the parser. Useful for automatic lists.

In which case the result would be 1, 3 and 5.

#data:
Basically the opposite of #ignore:, but can also be used to ignore the parser to read certain items that would otherwise be thought of as parameters, etc.