Jump to content
Main menu
Main menu
move to sidebar
hide
Navigation
Main page
Recent changes
Random page
Help about MediaWiki
BRUS Wikipedia
Search
Search
Appearance
Create account
Log in
Personal tools
Create account
Log in
Pages for logged out editors
learn more
Contributions
Talk
Editing
Module:Road data/strings/doc
(section)
Module
Discussion
English
Read
Edit source
View history
Tools
Tools
move to sidebar
hide
Actions
Read
Edit source
View history
General
What links here
Related changes
Special pages
Page information
Get shortened URL
Appearance
move to sidebar
hide
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
==Syntax== ===Hierarchy and fields=== At its most basic level, this module is a nested table of strings. At the top is the root table, named for the abbreviation of a country, state, or province. This table stores the type data for a particular place, which is named in the comment in the first line, and is returned at the end of the module. The table is composed of further tables, one per type. The basic syntax for a type table is: <syntaxhighlight lang="lua"> place.type = { shield = "", name = "", link = "", abbr = "" } </syntaxhighlight> The four main fields in a type table are <code>shield</code>, <code>name</code>, <code>link</code>, and <code>abbr</code>. Currently, these are the types used by all countries. By convention, they are always specified, using an empty string <code>"",</code> if there is no value. *<code>shield</code> determines the shield that is displayed, if any *<code>name</code> specifies the name of the route displayed by an infobox *<code>link</code> specifies the target of a link generated, if any *<code>abbr</code> determines the displayed abbreviation. Other common fields in road data tables *<code>shieldmain</code> is used when a different shield is desired at the top of an infobox, such as for county roads. <syntaxhighlight lang="lua"> USA.CR = { shield = "CR %route% jct.svg", shieldmain = "[county||%county% |]County %route%.svg", name = "County Road %route%", link = "", abbr = "CR %route%" } </syntaxhighlight> *<code>shieldlist</code> is used when a different shield is desired in lists that utilize the {{tl|Routelist row}} series of templates. *<code>base</code> can be used for aliasing different types that have a similar base structure, such as U.S. Highway special routes. *<code>banner</code> stores the name of the special route plate, such as <code>[[:File:Business plate.svg|Business plate.svg]]</code>. Can be omitted when unused. *<code>width</code> stores a code representing the width of the shield. It is most often helpful when used with <code>banner</code>. Can be omitted entirely when unused; common values are <code>square</code> and <code>expand</code>. *<code>section</code> stores the specific section number for those routes that are defined by law. *<code>translation</code> specifies the native language name of the route displayed by an infobox *<code>lang</code> is the [[List of ISO 639-2 codes|ISO 639-2]] code of the native language; this code is used by {{tl|Lang}} and [[Template:Lang#Language-specific templates|Lang-<i>xx</i> templates]]. <syntaxhighlight lang="lua"> PER.RN = { shield = "PE-%route% route sign.svg", name = "National Route %route%", link = "Peru Highway %route%", abbr = "PE-%route%", translation = "Ruta nacional %route%", lang = "es-pe" } </syntaxhighlight> Once a type is defined, it can be referenced later in the code. As seen here, it is common to define all parameters for main types like <code>US</code> and then to use aliases for subtypes such as <code>US-Alt</code>. <syntaxhighlight lang="lua"> MO.US = { shield = "US %route%.svg", base = "U.S. Route %route%", link = "U.S. Route %route% in Missouri", abbr = "US %route%", width = "expand" } MO["US-Alt"] = { shield = MO.US.shield, link = MO.US.base .. " Alternate ([dab||%dab%, |]Missouri)", abbr = MO.US.abbr .. " Alt.", banner = "Alternate plate.svg", width = "expand" } </syntaxhighlight> ===Parser arguments=== When the parser function of [[Module:Road data/parser]] is called, it is passed up to three parameters. The second one is the field to parse, and the last one is a rarely-used option designed for multiple-shield types. The first and most important parameter is a table of arguments collected by the calling module, which generally includes the state, country, or both; the type and number of the route; and a few miscellaneous arguments. This table of arguments forms the basis of the parser's format string syntax. The table accessible by the strings includes the following entries by default: * <code>state</code>: The state or province the route is located in. * <code>country</code>: The country the route is located in. If the country is not passed by the calling module, the parser will attempt to include it. The above entries are primarily used to find the string module itself, so they should not be a concern for module writers. * <code>type</code>: The type of the route. This determines the entry of the root table that is used by the parser. * <code>route</code>: The route "number". This is easily the most important argument for module writers. The following entries are used less often: * <code>county</code>: The county the route is located in. This is usually used for county routes in the United States. * <code>township</code>: This entry is similar in function and utility to the <code>county</code> entry. * <code>dab</code>: A tag used to disambiguate the link target. This is mostly used for bannered routes in the United States. * <code>denom</code>: This rare entry is used exclusively for West Virginia county routes. Parser hooks, which will be described later, can add entries to this table that may be used by strings. ===Basic string syntax=== The most basic value that can be used for most type table fields is a specially formatted string, which will be referred to in this documentation as a ''format string''. This is the string that will ultimately be parsed and returned by the parser. A format string is an ordinary string object. The power of these strings comes in the form of two special instructions that are recognized by the parser. The first is anything in <code>%argument%</code> form. The parser will replace such a statement with the value of the <code>argument</code> entry in the arguments table described earlier. This is what allows the route number to be spliced into a shield or link name. The second special string is in the form of <code>[arg|equals|then|else]</code>. This functions as a rudimentary if-then-else statement. The parser tests the value of <code>arg</code> to see if it is equal to the value specified in <code>equals</code>. <code>equals</code> may be empty, in which case the parser tests the existence of the <code>arg</code> argument. If the result of the test is true, the statement is replaced with the value of the <code>then</code> block. Otherwise, it is replaced with the value of the <code>else</code> block. The two statements may be combined. The parser will parse the if-then-else statement first, and then perform the argument inclusion. This combination is commonly used with bannered routes in the United States, where the <code>dab</code> argument is tested and the link disambiguation is adjusted accordingly, as follows: <syntaxhighlight lang="lua"> AL["US-Bus"] = { shield = "US %route%.svg", link = "U.S. Route %route% Business ([dab||%dab%, |]Alabama)", abbr = "US-%route% Bus.", banner = "Business plate.svg", width = "expand" } </syntaxhighlight> When parsing the <code>link</code> field, the parser first checks to see if the <code>dab</code> argument was provided. If so, it replaces the statement with <code>%dab%, </code>. If not, the statement is replaced with the empty string placed in the <code>else</code> block. Then, the parser replaces <code>%route%</code> with the route number and, if the <code>dab</code> argument was provided, <code>%dab%</code> with the value of that argument. ===Switching=== Some logic is too complicated to represent with only format strings. This framework provides several methods to express complex data. All of these involve storing a nested table as the value of a field. The most straightforward functionality provided by nested tables is switching. In its most basic form, the table consists of a series of key-value pairs, with the keys being route numbers and the values being the format strings used by those routes. Usually, the format string returned does not need parsing, but the option is there. A <code>default</code> entry should be provided to handle any route numbers not explicitly stated. The following is a representative example of route-based switching (from [[Module:Road data/strings/USA/AR]]): <syntaxhighlight lang="lua"> AR.AR = { shield = { default = "Arkansas %route%.svg", ["917"] = "Arkansas 917-1.svg", ["980"] = "Arkansas 980(Airport).svg" }, link = "Arkansas Highway %route% [dab||(%dab%)|]", abbr = "Hwy. %route%", width = "expand" } </syntaxhighlight> In this example, Highways 917 and 980 have non-standard shield names, which are explicitly provided. Other route numbers use the default format. Switching on other arguments is also allowed. The name of the argument to be used for switching is stated in the <code>arg</code> field of the table. Nesting switches on different arguments is also allowed. A good example that uses both forms of switching can be found in [[Module:Road data/strings/CAN/ON|Ontario]]: <syntaxhighlight lang="lua"> local regionalShields = { arg = "county", ["Essex"] = "Essex County Road %route%.png", ["York"] = "York Regional Road %route%.svg", ["Durham"] = "Durham Regional Road %route%.svg", ["Niagara"] = "Niagara Regional Road %route%.svg", ["Simcoe"] = { ["52"] = "Simcoe county road 52.png", default = "Simcoe County Road %route%.JPG" } } </syntaxhighlight> In this example, which is a shield table that is reused by several types in Ontario, the <code>county</code> argument is used for the primary switch. If the route is in Simcoe County, a second switch is performed, this time on the route number. ===Existence testing=== Another use for tables is existence testing. If a table has the <code>ifexists</code> field set to <code>true</code>, the parser will perform existence testing on the result of parsing the <code>default</code> field. If the test fails, the result of parsing the <code>otherwise</code> field is returned. Existence testing may be chained by using a second ifexists table as the value of the first table's <code>otherwise</code> field, and so on. Here's an example of nested existence testing (from [[Module:Road data/strings/GBR]]): <syntaxhighlight lang="lua"> GBR.B = { shield = { ifexists = true, default = "UK road B%route%.svg", otherwise = { ifexists = true, default = "UK road B%route%.png" } }, link = "", abbr = "B%route%" } </syntaxhighlight> ===Hooks=== Due to technical limitations, these string modules cannot contain functions. Rather than force functionality into the string framework, the parser can call functions in a separate hooks module. The functions in this module, [[Module:Road data/parser/hooks]], are more-or-less fully functional functions. The exact functionalities of these hooks are beyond the scope of this documentation. Descriptions of these hooks may be found on their documentation page. Generally speaking, a hook is called by setting the <code>hook</code> field in a table as equal to the name of a hook. Hooks receive two arguments, both tables: <code>parameters</code>, which is the table in the definition; and <code>args</code>, which is simply the table of arguments normally passed to the parser. The hook returns a string, which is then parsed as usual. A powerful feature of hooks is that they can add arbitrary values to the argument table, which may be referenced in the string returned by the hook. Generally, the format string returned by the hook is specified in some form by the <code>default</code> field of the table, though there are exceptions. Here is an example of a hook (from [[Module:Road data/strings/MEX]]): <syntaxhighlight lang="lua"> MEX.SH = { shield = { ifexists = true, arg = "state", SON = "HIGHWAYSON %route%.jpg", NLE = "Nuevo Leon State Highway %route%.PNG", default = "" }, link = { hook = "mask", mask = "Road data/masks/MEX", base = "state", masked = "fullstate", default = "%fullstate% State Highway %route%" }, abbr = "SH %route%" } </syntaxhighlight> In this example, the parser will process the link by calling the <code>mask</code> hook. In short, this hook takes the argument referenced in <code>base</code>, passes it through the mask module specified in <code>mask</code>, and stores it in the field in the arguments noted in <code>masked</code>. The hook returns the string given in <code>default</code>, which has access to the <code>fullstate</code> argument added by the hook. ===Other functionality=== Functionality exists to display multiple shields for one route, which is used to display tolled and free shields for routes where they differ. This is done by supplying a table with two values, which are listed without indices. The parser is called twice by the calling module, and it returns one shield per call. An example may be found in [[Module:Road data/strings/USA/TX|Texas]]: <syntaxhighlight lang="lua"> TX.Both = { shield = {"Texas %route%.svg", "Toll Texas %route% new.svg"}, link = "Texas State Highway %route%", abbr = "SH %route%", width = 40 } </syntaxhighlight>
Summary:
Please note that all contributions to BRUS Wikipedia may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see
BRUS Wikipedia:Copyrights
for details).
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Preview page with this template