Module:Convert/text: Difference between revisions

From TEPwiki, Urth's Encyclopedia
Jump to navigation Jump to search
Content added Content deleted
("invalid option" is better than "unknown option" as it can be more than "unknown"; rework links in eng_scales)
m (1 revision imported)
 
(41 intermediate revisions by 6 users not shown)
Line 1: Line 1:
--[[ Text used by Module:Convert.
-- Text used by Module:Convert for enwiki.
-- This is a separate module to simplify translation for use on another wiki.
-- See [[:en:Template:Convert/Transwiki guide]] if copying to another wiki.


-- Some units accept an SI prefix before the unit code, such as "kg" for kilogram.
This is a separate module to simplify translation if used on another wiki.
local SIprefixes = {
Module:Convert responds to text parameters, and can display text.
-- The prefix field is what the prefix should be, if different from the prefix used.
Nearly all that text is defined in:
['Y'] = { exponent = 24, name = 'yotta', },
* Module:Convert/data (unit definitions)
['Z'] = { exponent = 21, name = 'zetta', },
* Module:Convert/text (parameter and message definitions)
['E'] = { exponent = 18, name = 'exa' , },

['P'] = { exponent = 15, name = 'peta' , },
In addition to the parameters defined here, Module:Convert accepts built-in
['T'] = { exponent = 12, name = 'tera' , },
parameters shown in the following examples:
['G'] = { exponent = 9, name = 'giga' , },
debug=yes Can be used with sortable=on.
['M'] = { exponent = 6, name = 'mega' , },
precision=3 Not needed because "3" means "precision=3".
['k'] = { exponent = 3, name = 'kilo' , },
sigfig=3 To set number of output significant figures.
['h'] = { exponent = 2, name = 'hecto', },
]]
['da']= { exponent = 1, name = 'deca' , name_us = 'deka' },
['d'] = { exponent = -1, name = 'deci' , },
['c'] = { exponent = -2, name = 'centi', },
['m'] = { exponent = -3, name = 'milli', },
['μ'] = { exponent = -6, name = 'micro', }, -- key = 'GREEK SMALL LETTER MU' (U+03BC) utf-8 CE BC
['µ'] = { exponent = -6, name = 'micro', prefix = 'μ' }, -- key = 'MICRO SIGN' (U+00B5) utf-8 C2 B5
['u'] = { exponent = -6, name = 'micro', prefix = 'μ' }, -- not an SI prefix, but allow for people typing this
['n'] = { exponent = -9, name = 'nano' , },
['p'] = { exponent =-12, name = 'pico' , },
['f'] = { exponent =-15, name = 'femto', },
['a'] = { exponent =-18, name = 'atto' , },
['z'] = { exponent =-21, name = 'zepto', },
['y'] = { exponent =-24, name = 'yocto', },
}


-- Some units can be qualified with one of the following prefixes, when linked.
-- Some units can be qualified with one of the following prefixes, when linked.
local customary_units = {
local customary_units = {
{ "US", link = "United States customary units" },
{ "US", link = "United States customary units" },
{ "U.S.", link = "United States customary units" },
{ "U.S.", link = "United States customary units" },
{ "imperial", link = "Imperial unit" },
{ "imperial", link = "Imperial units" },
{ "imp", link = "Imperial unit" },
{ "imp", link = "Imperial units" },
}
}


-- Names when using engineering notation (a prefix of "eN" where N is a number).
-- Names when using engineering notation (a prefix of "eN" where N is a number; example "e6km").
-- key = { "name", link = "article title", exponent = key }
-- key = { "name", link = "article title", exponent = numeric_key_value }
-- If lk=on and link is defined, the name of the number will appear as a link.
-- If lk=on and link is defined, the name of the number will appear as a link.
local eng_scales = {
local eng_scales = {
["3"] = { "thousand", exponent = 3 },
["3"] = { "thousand", exponent = 3 },
["6"] = { "million", exponent = 6 },
["6"] = { "million", exponent = 6 },
["9"] = { "billion", link = "1000000000 (number)", exponent = 9 },
["9"] = { "billion", link = "1000000000 (number)", exponent = 9 },
["12"] = { "trillion", link = "1000000000000 (number)", exponent = 12 },
["12"] = { "trillion", link = "1000000000000 (number)", exponent = 12 },
["15"] = { "quadrillion", link = "1000000000000000 (number)", exponent = 15 },
["15"] = { "quadrillion", link = "1000000000000000 (number)", exponent = 15 },
}
}


-- When appropriate, the following categories can be included in the output.
local all_categories = {
local all_categories = {
general = "[[Category:Convert error]]",
unit = "[[Category:Convert errors]]",
mismatch = "[[Category:Convert dimension mismatch]]",
option = "[[Category:Convert errors]]",
option = "[[Category:Convert invalid option]]",
warning = '[[Category:Convert invalid options]]',
unknown = "[[Category:Convert unknown unit]]",
tracking = '[[Category:Convert tracking]]',
}
}


-- For some error messages, the following puts the wanted style around
-- Following puts wanted style around each unit code marked like '...%{ft%}...'.
-- each unit code marked like '...%{ft%}...'.
local unitcode_regex = '%%([{}])'
local unitcode_regex = '%%([{}])'
local unitcode_replace = { ['{'] = '<code style="background:transparent;">', ['}'] = '</code>' }
local unitcode_replace = { ['{'] = '"', ['}'] = '"' } -- no longer need the more elaborate substitute used before 2013-09-28


-- All messages that may be displayed if a problem occurs.
-- All messages that may be displayed if a problem occurs.
local all_messages = {
local all_messages = {
-- Message format string: $1=title, $2=text, $3=category, $4=anchor.
-- One of the following prefixes is inserted before each message.
-- Each displayed message starts with "Convert:" so can easily locate by searching article.
cvt_prefix_error = '<span style="color:black; background-color:orange;">[[Module talk:Convert|Conversion error]]:',
cvt_format = '<sup class="noprint Inline-Template" style="white-space:nowrap;">[<i>[[Help:Convert messages#$4|<span title="Convert: $1">convert: $2</span>]]</i>]</sup>$3<span class="error"></span>',
cvt_prefix_warning = '<span style="color:black; background-color:peachpuff;">[[Module talk:Convert|Conversion warning]]:',
cvt_format2 = '<sup class="noprint Inline-Template" style="white-space:nowrap;">[[Help:Convert messages#$4|<span title="Convert: $1">$2</span>]]</sup>$3<span class="error"></span>',
-- Each of following messages is a table:
cvt_format_preview = '<strong class="error">Error in convert: $1 [[Help:Convert messages#$4|(help)]]</strong>$3',
-- { [1] = 'error text',
-- Each of following messages is a table:
-- [2] = 'category key',
-- { [1] = 'title', -- mouseover title text
-- regex = gsub_regex,
-- [2] = 'text', -- link text displayed in article
-- replace = gsub_table,
-- warning = true, -- omitted for an error message
-- [3] = 'category key', -- key to lookup category in all_categories
-- [4] = 'anchor', -- anchor for link to relevant section on help page
-- }
-- regex = gsub_regex,
cvt_bad_default = { 'Unit "%s" has an invalid default', 'unknown' },
-- replace = gsub_table,
cvt_bad_num = { 'Value "%s" must be a number', 'general' },
-- } Mouseover title text Link text CatKey Anchor
cvt_bad_num2 = { 'Second value "%s" must be a number', 'general' },
cvt_bad_input = { 'input "$1" must be a number and unit' , 'invalid input' , 'option', 'invalid_input' },
cvt_bad_prec = { 'Parameter precision "%s" must be an integer', 'general' },
cvt_bad_num = { 'Value "$1" must be a number' , 'invalid number' , 'option', 'invalid_number' },
cvt_bad_sigfig = { 'Parameter sigfig "%s" must be an integer', 'general' },
cvt_big_prec = { 'Precision "$1" is too large' , 'precision too large' , 'option', 'precision_too_large' },
cvt_bad_unit = { 'Unit "%s" is invalid here', 'unknown' },
cvt_invalid_num = { 'Number has overflowed' , 'number overflow' , 'option', 'number_overflow' },
cvt_big_prec = { 'Precision "%s" is too large', 'general' },
cvt_no_num = { 'Needs the number to be converted' , 'needs a number' , 'option', 'needs_number' },
cvt_bug_convert = { 'Bug: Cannot convert between specified units', 'general' },
cvt_no_num2 = { 'Needs another number for a range' , 'needs another number', 'option', 'needs_another_number' },
cvt_empty_option = { 'Ignored empty option "%s"', 'option', warning = true },
cvt_bad_frac = { '"$1" needs an integer above 1' , 'invalid fraction' , 'option', 'invalid_fraction' },
cvt_invalid_num = { 'Number is too large or too small', 'general' },
cvt_bad_prec = { 'Precision "$1" must be an integer' , 'invalid precision' , 'option', 'invalid_precision' },
cvt_mismatch = { 'Cannot convert "%s" to "%s"', 'mismatch' },
cvt_bad_sigfig = { '"$1" needs a positive integer' , 'invalid sigfig' , 'option', 'invalid_sigfig' },
cvt_no_default = { 'Unit "%s" has no default output unit', 'unknown' },
cvt_empty_option = { 'Ignored empty option "$1"' , 'empty option' , 'option', 'empty_option' },
cvt_no_num = { 'Need value', 'general' },
cvt_deprecated = { 'Option "$1" is deprecated' , '*' , 'option', 'deprecated_option', format = 'cvt_format2', nowarn = true },
cvt_no_num2 = { 'Need second value', 'general' },
cvt_no_spell = { 'Spelling is not available' , 'bug, ask for help' , 'option', 'ask_for_help' },
cvt_no_unit = { 'Need name of unit', 'unknown' },
cvt_unknown_option = { 'Ignored invalid option "%s"', 'option', warning = true },
cvt_unknown_option = { 'Ignored invalid option "$1"' , 'invalid option' , 'option', 'invalid_option' },
cvt_wd_fail = { 'Unable to access Wikidata' , 'wikidata problem' , 'option', 'wikidata_problem' },
cvt_should_be = { '%s', 'general', regex = unitcode_regex, replace = unitcode_replace },
cvt_bad_default = { 'Unit "$1" has an invalid default' , 'bug, ask for help' , 'unit' , 'ask_for_help' },
cvt_sigfig_pos = { 'sigfig "%s" must be positive', 'general' },
cvt_unknown = { 'Unit "%s" is not known', 'unknown' },
cvt_bad_unit = { 'Unit "$1" is invalid here' , 'unit invalid here' , 'unit' , 'unit_invalid_here' },
cvt_no_default = { 'Unit "$1" has no default output unit' , 'bug, ask for help' , 'unit' , 'ask_for_help' },
cvt_no_unit = { 'Needs name of unit' , 'needs unit name' , 'unit' , 'needs_unit_name' },
cvt_unknown = { 'Unit name "$1" is not known' , 'unknown unit' , 'unit' , 'unknown_unit' },
cvt_should_be = { '$1' , 'ambiguous unit' , 'unit' , 'ambiguous_unit', regex = unitcode_regex, replace = unitcode_replace },
cvt_mismatch = { 'Cannot convert "$1" to "$2"' , 'unit mismatch' , 'unit' , 'unit_mismatch' },
cvt_bug_convert = { 'Bug: Cannot convert between specified units', 'bug, ask for help' , 'unit' , 'ask_for_help' },
cvt_lookup = { 'Unit "$1" is incorrectly defined' , 'bug, ask for help' , 'unit' , 'ask_for_help' },
}
}


-- Text to join input value/unit with output value/unit.
-- Text to join input value/unit with output value/unit.
local disp_joins = {
local disp_joins = {
-- [1]=before output, [2]=after output, [3]=between outputs in a combination; default "; "
["or"] = { " or " , "" },
-- [wantname] gives default abbr=off
["sqbr-sp"] = { " [" , "]" },
["sqbr-nbsp"] = { "&nbsp;[" , "]" },
["or"] = { " or " , "" , " or ", wantname = true },
["comma"] = { ", " , "" },
["sqbr-sp"] = { " [" , "]" },
["slash-sp"] = { " / " , "" },
["sqbr-nbsp"] = { "&nbsp;[" , "]" },
["slash-nbsp"] = { "&nbsp;/ ", "" },
["comma"] = { ", " , "" , ", " },
["slash-nosp"] = { "/" , "" },
["slash-sp"] = { " / " , "" , wantname = true },
["b"] = { " (" , ")" },
["slash-nbsp"] = { "&nbsp;/ ", "" , wantname = true },
["br"] = { "<br/>" , "" },
["slash-nosp"] = { "/" , "" , wantname = true },
["b"] = { " (" , ")" },
["(or)"] = { " (" , ")", " or " },
["br"] = { "<br />" , "" , wantname = true },
["br()"] = { "<br />(" , ")", wantname = true },
}
}


-- Text to separate values in a range.
-- Text to separate values in a range.
local range_types = {
local range_types = {
-- Specifying a table requires either:
["by"] = " by ",
["-"] = "–",
-- * "off" and "on" values (for "abbr=off" and "abbr=on"), or
-- * "input" and "output" values (for LHS and RHS);
["to about"] = " to about ",
-- other fields are optional.
["and"] = { ["off"] = " and ", ["on"] = " and ", exception = true },
-- When "adj=on|abbr=off" applies, spaces in range text are replaced with hyphens.
["or"] = { ["off"] = " or " , ["on"] = " or " , exception = true },
-- With "exception = true", that also occurs with "adj=on|abbr=on".
["to"] = { ["off"] = " to " , ["on"] = " to " , exception = true },
-- If "adj" is defined here, that text (unchanged) is used with "adj=on".
["xx"] = "&nbsp;×&nbsp;",
["to(-)"] = { ["off"] = "&nbsp;to ", ["on"] = "–" },
["+"] = " + ",
["+/-"] = { ["off"] = "&nbsp;±&nbsp;", ["on"] = "&nbsp;±&nbsp;", ["adj"] = "&nbsp;±&nbsp;" },
[","] = ",&nbsp;",
[", and"] = ", and ",
["x"] = { ["off"] = " by ", ["on"] = " ×&nbsp;", is_range_x = true },
[", or"] = ", or ",
["by"] = " by ",
["-"] = "–",
["to about"] = " to about ",
["and"] = { off = " and ", on = " and ", exception = true },
["and(-)"] = { input = " and ", output = "–" },
["or"] = { off = " or " , on = " or " , exception = true },
["to"] = { off = " to " , on = " to " , exception = true },
["to(-)"] = { input = "&nbsp;to ", output = "–" },
["+/-"] = { off = "&nbsp;±&nbsp;", on = "&nbsp;±&nbsp;", adj = "&nbsp;±&nbsp;", is_range_change = true },
["by(x)"] = { input = " by ", output = " ×&nbsp;", out_range_x = true },
["x"] = { off = " by ", on = " ×&nbsp;", abbr_range_x = true },
["xx"] = "&nbsp;×&nbsp;",
["*"] = "×",
["/"] = "&thinsp;/&thinsp;", -- for a table of high/low temperatures with {{convert|83|/|63|F|disp=br()|abbr=values}}
}
}


local range_aliases = {
local range_aliases = {
-- ["alternative name for a range"] = "standard range name"
["and(-)"] = "and",
["&"] = "and",
[""] = "-",
[""] = "-",
["&ndash;"] = "-",
["&ndash;"] = "-",
["×"] = "x",
["to-"] = "to(-)",
["&times;"] = "x",
["×"] = "x",
["±"] = "+/-",
["±"] = "+/-",
["&plusmn;"] = "+/-",
}

-- Convert accepts range text delimited with whitespace, for example, {{convert|1 to 2|ft}}.
-- In addition, the following "words" are accepted without spaces, for example, {{convert|1-2|ft}}.
-- Words must be in correct order for searching, for example, 'x' after 'xx'.
local range_words = { '-', '–', 'xx', 'x', '*' }

local ranges = {
types = range_types,
aliases = range_aliases,
words = range_words,
}
}


-- Valid option names.
-- Valid option names.
local local_option_name = {
local en_option_name = {
-- ["en name used in this module"] = "local text for option name"
-- ["local text for option name"] = "en name used in this module"
["abbr"] = "abbr",
["$"] = "$",
["adj"] = "adj",
["abbr"] = "abbr",
["disp"] = "disp",
["adj"] = "adj",
["lk"] = "lk",
["comma"] = "comma",
["sing"] = "sing",
["debug"] = "debug",
["sortable"] = "sortable",
["disp"] = "disp",
["sp"] = "sp",
["frac"] = "frac",
["input"] = "input",
["lang"] = "lang",
["lk"] = "lk",
["order"] = "order",
["qid"] = "qid",
["qual"] = "qual",
["qualifier"] = "qual",
["round"] = "round",
["sigfig"] = "sigfig",
["sing"] = "adj", -- "sing" is an old alias for "adj"
["sortable"] = "sortable",
["sp"] = "sp",
["spell"] = "spell",
["stylein"] = "stylein",
["styleout"] = "styleout",
["tracking"] = "tracking",
}
}


Line 130: Line 199:
-- Convention: parms.opt_xxx refers to an option that is set here
-- Convention: parms.opt_xxx refers to an option that is set here
-- (not intended to be set by the template which invokes this module).
-- (not intended to be set by the template which invokes this module).
-- Example: The option named "abbr" in this module can be assigned the value
-- Example: At enwiki, "abbr" includes:
-- ["comma"] = "opt_nocomma"
-- "comma" at en.wiki (abbr=comma). In that case, this script sets:
-- As a result, if the template uses abbr=comma, Module:Convert sets:
-- parms["opt_nocomma"] = true
-- parms["opt_nocomma"] = true
-- parms["abbr"] = nil
-- parms["abbr"] = nil
-- The result is that parms.abbr will be nil, or will have one of the
-- Therefore parms.abbr will be nil, or will have one of the listed values
-- listed values that do not start with "opt_".
-- that do not start with "opt_".
-- An option value of form "xxx?" is the same as "xxx" but shows the input as deprecated.
local en_option_value = {
local en_option_value = {
-- $=x is handled as a special case: x should be a currency symbol that will be used instead of "$"
["abbr"] = {
["abbr"] = {
-- ["local text for option value"] = "en value used in this module"
-- ["local text for option value"] = "en value used in this module"
["comma"] = "opt_nocomma", -- no numsep in input or output numbers
["in"] = "in", -- use symbol for LHS unit
["def"] = "", -- ignored (some wrapper templates call convert with "abbr=def" to mean "default abbreviation")
["mos"] = "mos", -- in range, repeat the input unit (no longer used)
["h"] = "on", -- abbr=on + use "h" for hand unit (default)
["none"] = "off", -- old name for "off"
["hh"] = "opt_hand_hh", -- abbr=on + use "hh" for hand unit
["off"] = "off", -- use name for all units
["in"] = "in", -- use symbol for LHS unit
["on"] = "on", -- use symbol for all units
["none"] = "off", -- old name for "off"
["out"] = "out", -- use symbol for RHS unit (default)
["off"] = "off", -- use name for all units
["values"] = "opt_values", -- show only input and output numbers, not units
["on"] = "on", -- use symbol for all units
["~"] = "opt_extra", -- show input unit symbol as well as name
["out"] = "out", -- use symbol for RHS unit (default)
["unit"] = "unit", -- abbr=on but abbreviate units only: e6km → million km (not ×10⁶ km)
},
["values"] = "opt_values", -- show only input and output numbers, not units
["adj"] = {
["~"] = "opt_also_symbol", -- show input unit symbol as well as name
["1"] = "opt_singular", -- unit name is singular when value satisfies: (-1 <= v and v < 0) or (0 < v and v <= 1)
},
["flip"] = "opt_flip", -- reverse order of input/output
["adj"] = {
["j"] = "opt_use_nbsp", -- "join": use "&nbsp;" instead of " " between value and unit name
["mid"] = "opt_adj_mid", -- adj=on with user-specified text before input unit
["mid"] = "opt_adjectival, opt_adj_mid", -- adj=on with user-specified text after input unit (between input and output)
["off"] = "", -- ignored (off is the default)
["nocomma"] = "opt_nocomma", -- no numsep in input or output numbers
["off"] = "", -- ignored (off is the default)
["on"] = "opt_adjectival", -- unit name is singular and hyphenated
["on"] = "opt_adjectival", -- unit name is singular and hyphenated
["pre"] = "opt_one_preunit", -- user-specified text before input unit
["pre"] = "opt_one_preunit", -- user-specified text before input unit
["ri0"] = "opt_ri=0", -- round input with precision = 0
["ri1"] = "ri1", -- round input with precision = 1
["ri1"] = "opt_ri=1", -- round input with precision = 1
["ri2"] = "ri2", -- round input with precision = 2
["ri2"] = "opt_ri=2", -- round input with precision = 2
["ri3"] = "ri3", -- round input with precision = 3
["ri3"] = "opt_ri=3", -- round input with precision = 3
},
},
["disp"] = {
["comma"] = {
["/"] = "slash", -- join: '/'
["5"] = "opt_comma5", -- only use numsep grouping if 5 or more digits
["gaps"] = "opt_gaps", -- use gaps, not numsep, to separate groups of digits
["2"] = "opt_output_only",
["gaps3"] = "opt_gaps, opt_gaps3", -- group only in threes rather than default of no gap before a single digit after decimal mark
["5"] = "opt_round5", -- round output value to nearest 5
["b"] = "b", -- join: '(...)'
["off"] = "opt_nocomma", -- no numsep in input or output numbers
},
["br"] = "br", -- join: '<br/>'
["debug"] = {
["comma"] = "comma", -- join: ','
["yes"] = "opt_sortable_debug", -- make the normally hidden sort key visible
["flip"] = "opt_flip", -- reverse order of input/output
},
["flip5"] = "special_flip5", -- combine disp=flip + disp=5
["disp"] = {
["nocomma"] = "opt_nocomma", -- no numsep in input or output numbers
["5"] = "opt_round=5?", -- round output value to nearest 5
["number"] = "opt_output_number_only",
["or"] = "or", -- join: 'or'
["b"] = "b", -- join: '(...)'
["(or)"] = "(or)", -- join: '(...)' with 'or' between outputs in a combination
["out"] = "opt_output_only",
["br"] = "br", -- join: '<br />'
["output number only"] = "opt_output_number_only",
["br()"] = "br()", -- join: '<br />(...)'
["output only"] = "opt_output_only",
["comma"] = "comma", -- join: ','
["preunit"] = "opt_two_preunits", -- user-specified text before input and output units
["s"] = "slash", -- join: '/'
["flip"] = "opt_flip", -- reverse order of input/output
["number"] = "opt_output_number_only", -- display output value (not input, and not output symbol/name)
["slash"] = "slash", -- join: '/'
["sqbr"] = "sqbr", -- join: '[...]'
["or"] = "or", -- join: 'or'
["out"] = "opt_output_only",
["table"] = "opt_table", -- output suitable for a table cell with align="right"
["output number only"] = "opt_output_number_only",
["tablecen"] = "opt_tablecen", -- output suitable for a table cell with align="center"
["u2"] = "opt_output_unit_only",
["output only"] = "opt_output_only",
["preunit"] = "opt_two_preunits", -- user-specified text before input and output units
["unit"] = "opt_input_unit_only",
["sqbr"] = "sqbr", -- join: '[...]'
["unit2"] = "opt_output_unit_only",
["x"] = "x", -- join: 'by...×'
["table"] = "opt_table", -- output is suitable for a table cell with align="right"
["tablecen"] = "opt_tablecen", -- output is suitable for a table cell with align="center"
},
["unit"] = "opt_input_unit_only", -- display input symbol/name (not output, and not input value)
["lk"] = {
["unit or text"] = "opt_input_unit_only, opt_ignore_error", -- display input symbol/name, or given unit code if not known
["in"] = "in", -- link LHS unit name or symbol
["unit2"] = "opt_output_unit_only",
["off"] = "", -- ignored (off is the default)
["on"] = "on", -- link all unit names or symbols
["x"] = "x", -- join: <first>...<second> (user-specified text)
},
["out"] = "out", -- link RHS unit name or symbol
-- frac=x is handled as a special case: x must be an integer (possibly in local language) = 2 or more
},
-- input=x is handled as a special case: x should be <value><space><unitcode> or <wikidata-property-id>
["sortable"] = {
["off"] = "", -- ignored (off is the default)
["lang"] = { -- language for output digits (both en and local digits are always accepted for input)
["on"] = "opt_sortable", -- output numeric hidden sort field for use in a sortable table
["en"] = "opt_lang_en", -- use en digits for numbers, regardless of local language
["local"] = "opt_lang_local", -- use local digits for numbers (default, although config can change default to en)
},
},
["sp"] = {
["lk"] = {
["us"] = "opt_sp_us", -- use U.S. spelling (like "meter" instead of default "metre")
["in"] = "in", -- link LHS unit name or symbol
},
["off"] = "off", -- do not link: same as default except for hand unit
["on"] = "on", -- link all unit names or symbols (but not twice for the same unit)
["out"] = "out", -- link RHS unit name or symbol
},
["order"] = {
["flip"] = "opt_flip", -- reverse order of input/output
["out"] = "opt_order_out", -- do not show input; instead, use order in output combination, with the first output shown as the input
},
-- qid=x is handled as a special case: x should be a Wikidata Q item identifier.
-- qual=x is handled as a special case: x should be a Wikidata Q item identifier.
["round"] = {
["0.5"] = "opt_round=0.5", -- round output value to nearest 0.5
["5"] = "opt_round=5", -- round output value to nearest 5
["10"] = "opt_round=10", -- round output value to nearest 10 (same as but clearer than "|-1")
["25"] = "opt_round=25", -- round output value to nearest 25
["50"] = "opt_round=50", -- round output value to nearest 50
["each"] = "opt_round_each", -- using default precision in a range, round each output separately (default uses highest precision of each item in range)
},
-- sigfig=x is handled as a special case: x must be an integer (possibly in local language) = 1 or more
["sortable"] = {
["off"] = "", -- ignored (off is the default)
["on"] = "opt_sortable_on", -- output sort key for use in a sortable table, based on value from converting to a standard base unit
},
["sp"] = {
["us"] = "opt_sp_us", -- use U.S. spelling (like "meter" instead of default "metre")
},
["spell"] = { -- only English spelling is supported; not scientific notation; only some fractions
["in"] = "opt_spell_in", -- spell input value in words
["In"] = "opt_spell_in, opt_spell_upper", -- spell input value in words with first letter uppercase
["on"] = "opt_spell_in, opt_spell_out", -- spell input and output values in words
["On"] = "opt_spell_in, opt_spell_out, opt_spell_upper", -- same, with first letter of first word in result uppercase
},
-- stylein=x is handled as a special case: x can be any text
-- styleout=x is handled as a special case: x can be any text
-- tracking=x is handled as a special case: x can be any text
}
}


return {
return {
SIprefixes = SIprefixes,
all_categories = all_categories,
all_categories = all_categories,
all_messages = all_messages,
all_messages = all_messages,
customary_units = customary_units,
currency = { ['$'] = true, ['£'] = true, ['€'] = true, ['₱'] = true, ['₽'] = true, ['¥'] = true },
disp_joins = disp_joins,
customary_units = customary_units,
en_option_value = en_option_value,
disp_joins = disp_joins,
eng_scales = eng_scales,
en_option_name = en_option_name,
local_option_name = local_option_name,
en_option_value = en_option_value,
range_aliases = range_aliases,
eng_scales = eng_scales,
range_types = range_types,
ranges = ranges,
}
}

Latest revision as of 08:21, 10 October 2019

Documentation for this module may be created at Module:Convert/text/doc

-- Text used by Module:Convert for enwiki.
-- This is a separate module to simplify translation for use on another wiki.
-- See [[:en:Template:Convert/Transwiki guide]] if copying to another wiki.

-- Some units accept an SI prefix before the unit code, such as "kg" for kilogram.
local SIprefixes = {
	-- The prefix field is what the prefix should be, if different from the prefix used.
	['Y'] = { exponent = 24, name = 'yotta',                  },
	['Z'] = { exponent = 21, name = 'zetta',                  },
	['E'] = { exponent = 18, name = 'exa'  ,                  },
	['P'] = { exponent = 15, name = 'peta' ,                  },
	['T'] = { exponent = 12, name = 'tera' ,                  },
	['G'] = { exponent =  9, name = 'giga' ,                  },
	['M'] = { exponent =  6, name = 'mega' ,                  },
	['k'] = { exponent =  3, name = 'kilo' ,                  },
	['h'] = { exponent =  2, name = 'hecto',                  },
	['da']= { exponent =  1, name = 'deca' , name_us = 'deka' },
	['d'] = { exponent = -1, name = 'deci' ,                  },
	['c'] = { exponent = -2, name = 'centi',                  },
	['m'] = { exponent = -3, name = 'milli',                  },
	['μ'] = { exponent = -6, name = 'micro',                  },  -- key = 'GREEK SMALL LETTER MU' (U+03BC) utf-8 CE BC
	['µ'] = { exponent = -6, name = 'micro', prefix = 'μ'     },  -- key = 'MICRO SIGN' (U+00B5) utf-8 C2 B5
	['u'] = { exponent = -6, name = 'micro', prefix = 'μ'     },  -- not an SI prefix, but allow for people typing this
	['n'] = { exponent = -9, name = 'nano' ,                  },
	['p'] = { exponent =-12, name = 'pico' ,                  },
	['f'] = { exponent =-15, name = 'femto',                  },
	['a'] = { exponent =-18, name = 'atto' ,                  },
	['z'] = { exponent =-21, name = 'zepto',                  },
	['y'] = { exponent =-24, name = 'yocto',                  },
}

-- Some units can be qualified with one of the following prefixes, when linked.
local customary_units = {
	{ "US", link = "United States customary units" },
	{ "U.S.", link = "United States customary units" },
	{ "imperial", link = "Imperial units" },
	{ "imp", link = "Imperial units" },
}

-- Names when using engineering notation (a prefix of "eN" where N is a number; example "e6km").
-- key = { "name", link = "article title", exponent = numeric_key_value }
-- If lk=on and link is defined, the name of the number will appear as a link.
local eng_scales = {
	["3"]  = { "thousand", exponent = 3 },
	["6"]  = { "million", exponent = 6 },
	["9"]  = { "billion", link = "1000000000 (number)", exponent = 9 },
	["12"] = { "trillion", link = "1000000000000 (number)", exponent = 12 },
	["15"] = { "quadrillion", link = "1000000000000000 (number)", exponent = 15 },
}

local all_categories = {
	unit = "[[Category:Convert errors]]",
	option = "[[Category:Convert errors]]",
	warning = '[[Category:Convert invalid options]]',
	tracking = '[[Category:Convert tracking]]',
}

-- For some error messages, the following puts the wanted style around
-- each unit code marked like '...%{ft%}...'.
local unitcode_regex = '%%([{}])'
local unitcode_replace = { ['{'] = '"', ['}'] = '"' }  -- no longer need the more elaborate substitute used before 2013-09-28

-- All messages that may be displayed if a problem occurs.
local all_messages = {
	-- Message format string: $1=title, $2=text, $3=category, $4=anchor.
	-- Each displayed message starts with "Convert:" so can easily locate by searching article.
	cvt_format = '<sup class="noprint Inline-Template" style="white-space:nowrap;">[<i>[[Help:Convert messages#$4|<span title="Convert: $1">convert: $2</span>]]</i>]</sup>$3<span class="error"></span>',
	cvt_format2 = '<sup class="noprint Inline-Template" style="white-space:nowrap;">[[Help:Convert messages#$4|<span title="Convert: $1">$2</span>]]</sup>$3<span class="error"></span>',
	cvt_format_preview = '<strong class="error">Error in convert: $1 [[Help:Convert messages#$4|(help)]]</strong>$3',
	-- Each of following messages is a table:
	-- { [1] = 'title',         -- mouseover title text
	--   [2] = 'text',          -- link text displayed in article
	--   [3] = 'category key',  -- key to lookup category in all_categories
	--   [4] = 'anchor',        -- anchor for link to relevant section on help page
	--   regex = gsub_regex,
	--   replace = gsub_table,
	-- }                    Mouseover title text                           Link text               CatKey     Anchor
	cvt_bad_input      = { 'input "$1" must be a number and unit'       , 'invalid input'       , 'option',  'invalid_input'        },
	cvt_bad_num        = { 'Value "$1" must be a number'                , 'invalid number'      , 'option',  'invalid_number'       },
	cvt_big_prec       = { 'Precision "$1" is too large'                , 'precision too large' , 'option',  'precision_too_large'  },
	cvt_invalid_num    = { 'Number has overflowed'                      , 'number overflow'     , 'option',  'number_overflow'      },
	cvt_no_num         = { 'Needs the number to be converted'           , 'needs a number'      , 'option',  'needs_number'         },
	cvt_no_num2        = { 'Needs another number for a range'           , 'needs another number', 'option',  'needs_another_number' },
	cvt_bad_frac       = { '"$1" needs an integer above 1'              , 'invalid fraction'    , 'option',  'invalid_fraction'     },
	cvt_bad_prec       = { 'Precision "$1" must be an integer'          , 'invalid precision'   , 'option',  'invalid_precision'    },
	cvt_bad_sigfig     = { '"$1" needs a positive integer'              , 'invalid sigfig'      , 'option',  'invalid_sigfig'       },
	cvt_empty_option   = { 'Ignored empty option "$1"'                  , 'empty option'        , 'option',  'empty_option'         },
	cvt_deprecated     = { 'Option "$1" is deprecated'                  , '*'                   , 'option',  'deprecated_option', format = 'cvt_format2', nowarn = true },
	cvt_no_spell       = { 'Spelling is not available'                  , 'bug, ask for help'   , 'option',  'ask_for_help'         },
	cvt_unknown_option = { 'Ignored invalid option "$1"'                , 'invalid option'      , 'option',  'invalid_option'       },
	cvt_wd_fail        = { 'Unable to access Wikidata'                  , 'wikidata problem'    , 'option',  'wikidata_problem'     },
	cvt_bad_default    = { 'Unit "$1" has an invalid default'           , 'bug, ask for help'   , 'unit'  ,  'ask_for_help'         },
	cvt_bad_unit       = { 'Unit "$1" is invalid here'                  , 'unit invalid here'   , 'unit'  ,  'unit_invalid_here'    },
	cvt_no_default     = { 'Unit "$1" has no default output unit'       , 'bug, ask for help'   , 'unit'  ,  'ask_for_help'         },
	cvt_no_unit        = { 'Needs name of unit'                         , 'needs unit name'     , 'unit'  ,  'needs_unit_name'      },
	cvt_unknown        = { 'Unit name "$1" is not known'                , 'unknown unit'        , 'unit'  ,  'unknown_unit'         },
	cvt_should_be      = { '$1'                                         , 'ambiguous unit'      , 'unit'  ,  'ambiguous_unit', regex = unitcode_regex, replace = unitcode_replace },
	cvt_mismatch       = { 'Cannot convert "$1" to "$2"'                , 'unit mismatch'       , 'unit'  ,  'unit_mismatch'        },
	cvt_bug_convert    = { 'Bug: Cannot convert between specified units', 'bug, ask for help'   , 'unit'  ,  'ask_for_help'         },
	cvt_lookup         = { 'Unit "$1" is incorrectly defined'           , 'bug, ask for help'   , 'unit'  ,  'ask_for_help'         },
}

-- Text to join input value/unit with output value/unit.
local disp_joins = {
	-- [1]=before output, [2]=after output, [3]=between outputs in a combination; default "; "
	-- [wantname] gives default abbr=off
	["or"]         = { " or "    , "" , " or ", wantname = true },
	["sqbr-sp"]    = { " ["      , "]" },
	["sqbr-nbsp"]  = { "&nbsp;[" , "]" },
	["comma"]      = { ", "      , "" , ", " },
	["slash-sp"]   = { " / "     , "" , wantname = true },
	["slash-nbsp"] = { "&nbsp;/ ", "" , wantname = true },
	["slash-nosp"] = { "/"       , "" , wantname = true },
	["b"]          = { " ("      , ")" },
	["(or)"]       = { " ("      , ")", " or " },
	["br"]         = { "<br />"  , "" , wantname = true },
	["br()"]       = { "<br />(" , ")", wantname = true },
}

-- Text to separate values in a range.
local range_types = {
	-- Specifying a table requires either:
	-- * "off" and "on" values (for "abbr=off" and "abbr=on"), or
	-- * "input" and "output" values (for LHS and RHS);
	-- other fields are optional.
	-- When "adj=on|abbr=off" applies, spaces in range text are replaced with hyphens.
	-- With "exception = true", that also occurs with "adj=on|abbr=on".
	-- If "adj" is defined here, that text (unchanged) is used with "adj=on".
	["+"]      = " + ",
	[","]      = ",&nbsp;",
	[", and"]  = ", and ",
	[", or"]   = ", or ",
	["by"]     = " by ",
	["-"]      = "–",
	["to about"] = " to about ",
	["and"]    = { off = " and ", on = " and ", exception = true },
	["and(-)"] = { input = " and ", output = "–" },
	["or"]     = { off = " or " , on = " or " , exception = true },
	["to"]     = { off = " to " , on = " to " , exception = true },
	["to(-)"]  = { input = "&nbsp;to ", output = "–" },
	["+/-"]    = { off = "&nbsp;±&nbsp;", on = "&nbsp;±&nbsp;", adj = "&nbsp;±&nbsp;", is_range_change = true },
	["by(x)"]  = { input = " by ", output = " ×&nbsp;", out_range_x = true },
	["x"]      = { off = " by ", on = " ×&nbsp;", abbr_range_x = true },
	["xx"]     = "&nbsp;×&nbsp;",
	["*"]      = "×",
	["/"]      = "&thinsp;/&thinsp;",  -- for a table of high/low temperatures with {{convert|83|/|63|F|disp=br()|abbr=values}}
}

local range_aliases = {
	-- ["alternative name for a range"] = "standard range name"
	["–"]        = "-",
	["&ndash;"]  = "-",
	["×"]        = "x",
	["&times;"]  = "x",
	["±"]        = "+/-",
	["&plusmn;"] = "+/-",
}

-- Convert accepts range text delimited with whitespace, for example, {{convert|1 to 2|ft}}.
-- In addition, the following "words" are accepted without spaces, for example, {{convert|1-2|ft}}.
-- Words must be in correct order for searching, for example, 'x' after 'xx'.
local range_words = { '-', '–', 'xx', 'x', '*' }

local ranges = {
	types = range_types,
	aliases = range_aliases,
	words = range_words,
}

-- Valid option names.
local en_option_name = {
	-- ["local text for option name"] = "en name used in this module"
	["$"] = "$",
	["abbr"] = "abbr",
	["adj"] = "adj",
	["comma"] = "comma",
	["debug"] = "debug",
	["disp"] = "disp",
	["frac"] = "frac",
	["input"] = "input",
	["lang"] = "lang",
	["lk"] = "lk",
	["order"] = "order",
	["qid"] = "qid",
	["qual"] = "qual",
	["qualifier"] = "qual",
	["round"] = "round",
	["sigfig"] = "sigfig",
	["sing"] = "adj",                   -- "sing" is an old alias for "adj"
	["sortable"] = "sortable",
	["sp"] = "sp",
	["spell"] = "spell",
	["stylein"] = "stylein",
	["styleout"] = "styleout",
	["tracking"] = "tracking",
}

-- Valid option values.
-- Convention: parms.opt_xxx refers to an option that is set here
-- (not intended to be set by the template which invokes this module).
-- Example: At enwiki, "abbr" includes:
--     ["comma"] = "opt_nocomma"
-- As a result, if the template uses abbr=comma, Module:Convert sets:
--     parms["opt_nocomma"] = true
--     parms["abbr"] = nil
-- Therefore parms.abbr will be nil, or will have one of the listed values
-- that do not start with "opt_".
-- An option value of form "xxx?" is the same as "xxx" but shows the input as deprecated.
local en_option_value = {
	-- $=x is handled as a special case: x should be a currency symbol that will be used instead of "$"
	["abbr"] = {
		-- ["local text for option value"] = "en value used in this module"
		["def"] = "",                   -- ignored (some wrapper templates call convert with "abbr=def" to mean "default abbreviation")
		["h"] = "on",                   -- abbr=on + use "h" for hand unit (default)
		["hh"] = "opt_hand_hh",         -- abbr=on + use "hh" for hand unit
		["in"] = "in",                  -- use symbol for LHS unit
		["none"] = "off",               -- old name for "off"
		["off"] = "off",                -- use name for all units
		["on"] = "on",                  -- use symbol for all units
		["out"] = "out",                -- use symbol for RHS unit (default)
		["unit"] = "unit",              -- abbr=on but abbreviate units only: e6km → million km (not ×10⁶ km)
		["values"] = "opt_values",      -- show only input and output numbers, not units
		["~"] = "opt_also_symbol",      -- show input unit symbol as well as name
	},
	["adj"] = {
		["mid"] = "opt_adjectival, opt_adj_mid",  -- adj=on with user-specified text after input unit (between input and output)
		["off"] = "",                   -- ignored (off is the default)
		["on"] = "opt_adjectival",      -- unit name is singular and hyphenated
		["pre"] = "opt_one_preunit",    -- user-specified text before input unit
		["ri0"] = "opt_ri=0",           -- round input with precision = 0
		["ri1"] = "opt_ri=1",           -- round input with precision = 1
		["ri2"] = "opt_ri=2",           -- round input with precision = 2
		["ri3"] = "opt_ri=3",           -- round input with precision = 3
	},
	["comma"] = {
		["5"] = "opt_comma5",           -- only use numsep grouping if 5 or more digits
		["gaps"] = "opt_gaps",          -- use gaps, not numsep, to separate groups of digits
		["gaps3"] = "opt_gaps, opt_gaps3",  -- group only in threes rather than default of no gap before a single digit after decimal mark
		["off"] = "opt_nocomma",        -- no numsep in input or output numbers
	},
	["debug"] = {
		["yes"] = "opt_sortable_debug", -- make the normally hidden sort key visible
	},
	["disp"] = {
		["5"] = "opt_round=5?",         -- round output value to nearest 5
		["b"] = "b",                    -- join: '(...)'
		["(or)"] = "(or)",              -- join: '(...)' with 'or' between outputs in a combination
		["br"] = "br",                  -- join: '<br />'
		["br()"] = "br()",              -- join: '<br />(...)'
		["comma"] = "comma",            -- join: ','
		["flip"] = "opt_flip",          -- reverse order of input/output
		["number"] = "opt_output_number_only",  -- display output value (not input, and not output symbol/name)
		["or"] = "or",                  -- join: 'or'
		["out"] = "opt_output_only",
		["output number only"] = "opt_output_number_only",
		["output only"] = "opt_output_only",
		["preunit"] = "opt_two_preunits",    -- user-specified text before input and output units
		["sqbr"] = "sqbr",              -- join: '[...]'
		["table"] = "opt_table",        -- output is suitable for a table cell with align="right"
		["tablecen"] = "opt_tablecen",  -- output is suitable for a table cell with align="center"
		["unit"] = "opt_input_unit_only", -- display input symbol/name (not output, and not input value)
		["unit or text"] = "opt_input_unit_only, opt_ignore_error", -- display input symbol/name, or given unit code if not known
		["unit2"] = "opt_output_unit_only",
		["x"] = "x",                    -- join: <first>...<second> (user-specified text)
	},
	-- frac=x is handled as a special case: x must be an integer (possibly in local language) = 2 or more
	-- input=x is handled as a special case: x should be <value><space><unitcode> or <wikidata-property-id>
	["lang"] = {                        -- language for output digits (both en and local digits are always accepted for input)
		["en"] = "opt_lang_en",         -- use en digits for numbers, regardless of local language
		["local"] = "opt_lang_local",   -- use local digits for numbers (default, although config can change default to en)
	},
	["lk"] = {
		["in"] = "in",                  -- link LHS unit name or symbol
		["off"] = "off",                -- do not link: same as default except for hand unit
		["on"] = "on",                  -- link all unit names or symbols (but not twice for the same unit)
		["out"] = "out",                -- link RHS unit name or symbol
	},
	["order"] = {
		["flip"] = "opt_flip",          -- reverse order of input/output
		["out"] = "opt_order_out",      -- do not show input; instead, use order in output combination, with the first output shown as the input
	},
	-- qid=x is handled as a special case: x should be a Wikidata Q item identifier.
	-- qual=x is handled as a special case: x should be a Wikidata Q item identifier.
	["round"] = {
		["0.5"] = "opt_round=0.5",      -- round output value to nearest 0.5
		["5"] = "opt_round=5",          -- round output value to nearest 5
		["10"] = "opt_round=10",        -- round output value to nearest 10 (same as but clearer than "|-1")
		["25"] = "opt_round=25",        -- round output value to nearest 25
		["50"] = "opt_round=50",        -- round output value to nearest 50
		["each"] = "opt_round_each",    -- using default precision in a range, round each output separately (default uses highest precision of each item in range)
	},
	-- sigfig=x is handled as a special case: x must be an integer (possibly in local language) = 1 or more
	["sortable"] = {
		["off"] = "",                   -- ignored (off is the default)
		["on"] = "opt_sortable_on",     -- output sort key for use in a sortable table, based on value from converting to a standard base unit
	},
	["sp"] = {
		["us"] = "opt_sp_us",           -- use U.S. spelling (like "meter" instead of default "metre")
	},
	["spell"] = {                       -- only English spelling is supported; not scientific notation; only some fractions
		["in"] = "opt_spell_in",        -- spell input value in words
		["In"] = "opt_spell_in, opt_spell_upper",                -- spell input value in words with first letter uppercase
		["on"] = "opt_spell_in, opt_spell_out",                  -- spell input and output values in words
		["On"] = "opt_spell_in, opt_spell_out, opt_spell_upper", -- same, with first letter of first word in result uppercase
	},
	-- stylein=x is handled as a special case: x can be any text
	-- styleout=x is handled as a special case: x can be any text
	-- tracking=x is handled as a special case: x can be any text
}

return {
	SIprefixes = SIprefixes,
	all_categories = all_categories,
	all_messages = all_messages,
	currency = { ['$'] = true, ['£'] = true, ['€'] = true, ['₱'] = true, ['₽'] = true, ['¥'] = true },
	customary_units = customary_units,
	disp_joins = disp_joins,
	en_option_name = en_option_name,
	en_option_value = en_option_value,
	eng_scales = eng_scales,
	ranges = ranges,
}