Module:Adjacent stations/doc

This module implements Adjacent stations, Rail icon, Rail color box, Line link, Station link and Rail color. Please see those templates' pages for documentation on how to use those templates. (Instructions for the  function of this module are in the Adjacent stations documentation.)

The aforementioned templates rely on data stored in subpages for this module (list). For example, MTR generates using Module:Adjacent stations/MTR.

It is possible to create and edit data by following existing examples, but having some knowledge of Lua helps prevent mistakes. If you have programmed or used Lua before, you may like to skip the next subsection.

Terms

 * Lua has data types. The ones relevant here are boolean, string, number, and table.
 * A boolean is either  or.
 * A string is text, stored as a list of characters. While Lua has several ways of indicating strings within code, in the Lua examples here, strings are indicated by enclosing text in double quotes (e.g. ).
 * A number is a numerical value, like  or.
 * A table is a structure that can contain other objects, including other tables.
 * An empty table looks like  in the code.
 * Tables have keys and values, which are typically of the structure ; each key–value pair is separated by a comma. All keys used here are strings or numbers.
 * is equivalent to.
 * A variable can be defined using
 * Whitespace is any tab, line break or other space. Whitespace doesn't matter in Lua, but all examples here except for those inline with text are neatly indented for readability, with separate table keys on separate lines.
 * A return statement (e.g. ) causes a function to exit and reports the value of  . The "function" here is the code in the main module calling the subpage, and the   should be the data table.

Basic structure
Two modules are demonstrated below: The example module is Module:Adjacent stations/Kaohsiung Rapid Transit.
 * The two required table entries are "station format" and "lines". The former is a table with data to form links to station articles, and the latter is a table containing a table for each line.
 * "system title" is the text in the middle cell of the table header row.
 * "station format" defines the default name format for station articles and exceptions. The first variable ("%1 metro station") is the default. Exceptions are listed as key–value pairs (e.g. "Zuoying"–"Zuoying HSR station"), where the key is the input name. The module displays the input name and links to the article with the formatted name, replacing "%1" with the input. Alternatively, the full wikilink and be entered. This can be used to have the display be different from the input.
 * "lines" is where the lines are listed. The names here are used internally and not displayed, so choose a concise one.
 * "line title" is the text displayed in the middle of each row indicating the line; "left terminus" is the default station name for the left side terminus, and "right terminus" is the default station name for the right side terminus.
 * Each "color" entry is the colour of the line.

Below is Module:Adjacent stations/Taiwan High Speed Rail: undefined
 * x (defined in the first line) is a string used for formatting the station name. The variable x is used inside the "station format" table for the three articles where the title ends in "station" instead of "HSR station". This practice is optional but helpful when many articles fit a second pattern.
 * The module recognises a virtual line named . The title and colour of this line is used for all lines unless overridden. Parameters are used in the absence of a specified   in transclusion.

Hierarchy and list of parameters

 * 1) The first layer of the table is data for the entire system, as well as output options.
 * 2) Under the system table is the list of lines.
 * 3) The third layer is data for a given line.
 * 4) Each line can have 'types'. This can be either types of services or branches of the line.
 * 5) The fifth layer is data for a given type.

If not specified, all keys and values are strings.

Line table (3)
A virtual line named  can be added to set default values for all lines. Currently, this is available for three parameters.

Disambiguating stations
Station links are generated using the  part of the data module. Each data module defines a default case and then exceptions, if necessary. is an array, similar to a switch with cases. Take Module:Adjacent stations/Incheon Subway, shown below:

undefined

The default case is, listed first. The "%1" expands to whatever the passed name of the station is. "Bakchon" becomes Bakchon station. There are several exceptions. The two usual reasons for exceptions are disambiguation or presenting a name in a non-standard way. In this case, the Incheon Subway serves three stations whose names are disambiguated: Arts Center station (Incheon), Central Park station (Incheon), and Mansu station (Incheon). This is handled by specifying a key for each station and supplying a different format. Since all three are disambiguated the same way, you can define a local variable at the top of the module:

local incheon = "%1 station (Incheon)"

This can then be used with the exceptions:

["Arts Center"] = incheon,

Were it written out, it would look like this:

["Arts Center"] = "%1 station (Incheon)"

For developers
Suggestions are welcomed on the talk page.

To-do list

 * Convert more systems from S-line, rail line, J-rserv and J-route
 * Make an example module which contains all of the module's features, to avoid excessive examples in the documentation (maybe based on Rdt demo)
 * Allow direct replacement of Rail line?
 * Before translation: figure out how to handle grammatical gender and inflection in various languages with the i18n table (e.g. these phrases)
 * Allow inline sources to be added
 * Figure out Wikidata integration (require sources on Wikidata end) :
 * should be doable with P197, P5051, P1192 and P81. Bouzinac (talk) 09:17, 3 December 2021 (UTC)
 * Add a short list of changes from S-line, for the convenience of the many editors who have used it in the last 11 years
 * changes in function (new structure, data inside module, circular and branch functionality changed, replacement of manual cell merging…)
 * parameter name changes (-left and -right, mostly – search S-line for {{{, maybe with the TemplateData generator, to make a list)