Wikipedia
tetwiki
https://tet.wikipedia.org/wiki/P%C3%A1jina_Mahuluk
MediaWiki 1.47.0-wmf.9
first-letter
Media
Espesiál
Diskusaun
Uza-na'in
Diskusaun Uza-na'in
Wikipedia
Diskusaun Wikipedia
Imajen
Diskusaun Imajen
MediaWiki
Diskusaun MediaWiki
Template
Diskusaun Template
Ajuda
Diskusaun Ajuda
Kategoria
Diskusaun Kategoria
TimedText
TimedText talk
Módulo
Módulo Discussão
Evento
Evento Discussão
Template:SDcat
10
7210
73113
2024-02-17T03:58:17Z
en>Pppery
0
Changed protection settings for "[[Template:SDcat]]": Per [[Template:Short description]] ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
73113
wikitext
text/x-wiki
<includeonly>{{#invoke:SDcat |setCat}}</includeonly><noinclude>
{{documentation}}
</noinclude>
gejktck2ca8vfelabmrprhfecoxzlpi
73114
70397
2026-07-08T19:28:36Z
Robertsky
10424
1 versaun husi [[:en:Template:SDcat]]
70397
wikitext
text/x-wiki
<includeonly>{{#invoke:SDcat |setCat}}</includeonly><noinclude>
{{documentation}}
</noinclude>
gejktck2ca8vfelabmrprhfecoxzlpi
Módulo:SDcat
828
7212
73115
2024-02-17T03:57:52Z
en>Pppery
0
Changed protection settings for "[[Module:SDcat]]": Per main ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
73115
Scribunto
text/plain
--[[
SDcat
Module to check whether local short description matches that on Wikidata
--]]
local p = {}
-------------------------------------------------------------------------------
--[[
setCat has the qid of a Wikidata entity passed as |qid=
(it defaults to the associated qid of the current article if omitted)
and the local short description passed as |sd=
It returns a category if there is an associated Wikidata entity.
It returns one of the following tracking categories, as appropriate:
* Category:Short description matches Wikidata (case-insensitive)
* Category:Short description is different from Wikidata
* Category:Short description with empty Wikidata description
For testing purposes, a link prefix |lp= may be set to ":" to make the categories visible.
--]]
-- function exported for use in other modules
-- (local short description, Wikidata entity-ID, link prefix)
p._setCat = function(sdesc, itemID, lp)
if not mw.wikibase then return nil end
if itemID == "" then itemID = nil end
-- Wikidata description field
local wdesc = (mw.wikibase.getDescription(itemID) or ""):lower()
if wdesc == "" then
return "[[" .. lp .. "Category:Short description with empty Wikidata description]]"
elseif wdesc == sdesc then
return "[[" .. lp .. "Category:Short description matches Wikidata]]"
else
return "[[" .. lp .. "Category:Short description is different from Wikidata]]"
end
end
-- function exported for call from #invoke
p.setCat = function(frame)
local args
if frame.args.sd then
args = frame.args
else
args = frame:getParent().args
end
-- local short description
local sdesc = mw.text.trim(args.sd or ""):lower()
-- Wikidata entity-ID
local itemID = mw.text.trim(args.qid or "")
-- link prefix, strip quotes
local lp = mw.text.trim(args.lp or ""):gsub('"', '')
return p._setCat(sdesc, itemID, lp)
end
return p
cml06m2kvz7og9bi5f1xe6ylhi3d9a0
73116
70399
2026-07-08T19:28:36Z
Robertsky
10424
1 versaun husi [[:en:Module:SDcat]]
70399
Scribunto
text/plain
--[[
SDcat
Module to check whether local short description matches that on Wikidata
--]]
local p = {}
-------------------------------------------------------------------------------
--[[
setCat has the qid of a Wikidata entity passed as |qid=
(it defaults to the associated qid of the current article if omitted)
and the local short description passed as |sd=
It returns a category if there is an associated Wikidata entity.
It returns one of the following tracking categories, as appropriate:
* Category:Short description matches Wikidata (case-insensitive)
* Category:Short description is different from Wikidata
* Category:Short description with empty Wikidata description
For testing purposes, a link prefix |lp= may be set to ":" to make the categories visible.
--]]
-- function exported for use in other modules
-- (local short description, Wikidata entity-ID, link prefix)
p._setCat = function(sdesc, itemID, lp)
if not mw.wikibase then return nil end
if itemID == "" then itemID = nil end
-- Wikidata description field
local wdesc = (mw.wikibase.getDescription(itemID) or ""):lower()
if wdesc == "" then
return "[[" .. lp .. "Category:Short description with empty Wikidata description]]"
elseif wdesc == sdesc then
return "[[" .. lp .. "Category:Short description matches Wikidata]]"
else
return "[[" .. lp .. "Category:Short description is different from Wikidata]]"
end
end
-- function exported for call from #invoke
p.setCat = function(frame)
local args
if frame.args.sd then
args = frame.args
else
args = frame:getParent().args
end
-- local short description
local sdesc = mw.text.trim(args.sd or ""):lower()
-- Wikidata entity-ID
local itemID = mw.text.trim(args.qid or "")
-- link prefix, strip quotes
local lp = mw.text.trim(args.lp or ""):gsub('"', '')
return p._setCat(sdesc, itemID, lp)
end
return p
cml06m2kvz7og9bi5f1xe6ylhi3d9a0
Módulo:Pagetype/setindex
828
7216
73225
2024-02-17T03:50:28Z
en>Pppery
0
Changed protection settings for "[[Module:Pagetype/setindex]]": Per parent ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
73225
Scribunto
text/plain
-- This page contains a table of all set index templates and their
-- redirects. Templates names are capitalized, and the Template: prefix is
-- removed. Templates are grouped with the main template first, followed by
-- its redirects.
return {
["Set index article"] = true,
["Sia"] = true,
["Set index"] = true,
["SIA"] = true,
["Set-index"] = true,
["Setindex"] = true,
["Set-index article"] = true,
["Animal common name"] = true,
["Chemistry index"] = true,
["Chemdisambig"] = true,
["Chemistry disambiguation"] = true,
["Chemistry set index"] = true,
["Chemindex"] = true,
["Enzyme index"] = true,
["Fungus common name"] = true,
["Given name"] = true,
["First name"] = true,
["Forename"] = true,
["Greek myth index"] = true,
["Lake index"] = true,
["Lakeindex"] = true,
["Locomotive index"] = true,
["Media set index"] = true,
["Media index"] = true,
["Molecular formula index"] = true,
["MolFormDisambig"] = true,
["Molecular formula disambiguation"] = true,
["MolFormIndex"] = true,
["Mountain index"] = true,
["Mountainindex"] = true,
["Nickname"] = true,
["Painting index"] = true,
["Plant common name"] = true,
["River index"] = true,
["Road index"] = true,
["Roadindex"] = true,
["Ship index"] = true,
["Shipindex"] = true,
["Sport index"] = true,
["Sportindex"] = true,
["Storm index"] = true,
["Surname"] = true,
["Surnames"] = true,
["DisambigName"] = true,
["DisambigNm"] = true,
["DisambigN"] = true,
}
nn9l9r1pmrobxspg0rm1qgng5nzu19x
73226
70403
2026-07-08T19:28:41Z
Robertsky
10424
1 versaun husi [[:en:Module:Pagetype/setindex]]
70403
Scribunto
text/plain
-- This page contains a table of all set index templates and their
-- redirects. Templates names are capitalized, and the Template: prefix is
-- removed. Templates are grouped with the main template first, followed by
-- its redirects.
return {
["Set index article"] = true,
["Sia"] = true,
["Set index"] = true,
["SIA"] = true,
["Set-index"] = true,
["Setindex"] = true,
["Set-index article"] = true,
["Animal common name"] = true,
["Chemistry index"] = true,
["Chemdisambig"] = true,
["Chemistry disambiguation"] = true,
["Chemistry set index"] = true,
["Chemindex"] = true,
["Enzyme index"] = true,
["Fungus common name"] = true,
["Given name"] = true,
["First name"] = true,
["Forename"] = true,
["Greek myth index"] = true,
["Lake index"] = true,
["Lakeindex"] = true,
["Locomotive index"] = true,
["Media set index"] = true,
["Media index"] = true,
["Molecular formula index"] = true,
["MolFormDisambig"] = true,
["Molecular formula disambiguation"] = true,
["MolFormIndex"] = true,
["Mountain index"] = true,
["Mountainindex"] = true,
["Nickname"] = true,
["Painting index"] = true,
["Plant common name"] = true,
["River index"] = true,
["Road index"] = true,
["Roadindex"] = true,
["Ship index"] = true,
["Shipindex"] = true,
["Sport index"] = true,
["Sportindex"] = true,
["Storm index"] = true,
["Surname"] = true,
["Surnames"] = true,
["DisambigName"] = true,
["DisambigNm"] = true,
["DisambigN"] = true,
}
nn9l9r1pmrobxspg0rm1qgng5nzu19x
Módulo:Pagetype/disambiguation
828
7217
73223
2024-02-23T03:46:01Z
en>Pppery
0
Use built-in redirect syntax
73223
Scribunto
text/plain
return require [[Module:Disambiguation/templates]]
i5ooe2bqffrglszpd82v0i3pqyp187b
73224
70404
2026-07-08T19:28:40Z
Robertsky
10424
1 versaun husi [[:en:Module:Pagetype/disambiguation]]
70404
Scribunto
text/plain
-- This page contains a table of all disambiguation templates and their
-- redirects. Templates names are capitalized, and the Template: prefix is
-- removed. Templates are grouped with the main template first, followed by
-- its redirects.
return {
["Disambiguation"] = true,
["Begriffsklärung"] = true,
["DAB"] = true,
["Dab"] = true,
["Dab page"] = true,
["Dabpage"] = true,
["Dbig"] = true,
["Dis"] = true,
["Disam"] = true,
["Disamb"] = true,
["Disambig"] = true,
["Disambig misspelling"] = true,
["Disambig-plants"] = true,
["Disambiguation page"] = true,
["Manual of Style disambiguation"] = true,
["Meta disambig"] = true,
["MOS disambiguation"] = true,
["MoS disambiguation"] = true,
["Portal disambig"] = true,
["Portal disambiguation"] = true,
["Project disambiguation"] = true,
["Shortcut disambig"] = true,
["Wikipedia disambiguation"] = true,
["WP disambig"] = true,
["WP-disambig"] = true,
["Airport disambiguation"] = true,
["Airport disambig"] = true,
["Biology disambiguation"] = true,
["Call sign disambiguation"] = true,
["Callsigndis"] = true,
["Caselaw disambiguation"] = true,
["Case law disambiguation"] = true,
["Chinese title disambiguation"] = true,
["Chinese title disambig"] = true,
["CJKVdab"] = true,
["Disambig-Chinese-char-title"] = true,
["Disambiguation cleanup"] = true,
["Cleanup disambig"] = true,
["Cleanup disambiguation"] = true,
["CleanupDisambig"] = true,
["Dab cleanup"] = true,
["Dab-cleanup"] = true,
["Dabclean"] = true,
["Disamb-cleanup"] = true,
["Disambcleanup"] = true,
["Disambig cleanup"] = true,
["Disambig-cleanup"] = true,
["Disambig-CU"] = true,
["Disambig-cu"] = true,
["Disambigcleanup"] = true,
["Disambiguate-cleanup"] = true,
["Disambiguation-cleanup"] = true,
["Geodis-cleanup"] = true,
["Disambiguation with potential"] = true,
["Disambiguation with possibilties"] = true,
["Genus disambiguation"] = true,
["Genus disambig"] = true,
["Greek letter organization disambiguation"] = true,
["GLO disambiguation"] = true,
["Hangul title disambiguation"] = true,
["Hospital disambiguation"] = true,
["Hospitaldis"] = true,
["Human name disambiguation"] = true,
["Bio-dab"] = true,
["Hndab"] = true,
["HNDIS"] = true,
["HnDis"] = true,
["Hndis"] = true,
["Hndisambig"] = true,
["Human name dab"] = true,
["Name list"] = true,
["Personal name"] = true,
["Personal name disambiguation"] = true,
["Human name disambiguation cleanup"] = true,
["Hndis-cleanup"] = true,
["Personal name disambiguation cleanup"] = true,
["Hurricane season disambiguation"] = true,
["Letter–number combination disambiguation"] = true,
["Letter-Number Combination Disambiguation"] = true,
["Letter-Number combination disambiguation"] = true,
["Letter-number combination disambiguation"] = true,
["Letter-NumberCombDisambig"] = true,
["Letter-NumberCombdisambig"] = true,
["Letter-NumberCombinationDisambiguation"] = true,
["LNCD"] = true,
["Mathematical disambiguation"] = true,
["Math dab"] = true,
["Math disambiguation"] = true,
["Math-dab"] = true,
["Mathdab"] = true,
["Mathematics disambiguation"] = true,
["Maths disambiguation"] = true,
["Military unit disambiguation"] = true,
["Mil-unit-dis"] = true,
["Mil-unit-disambig"] = true,
["Music disambiguation"] = true,
["Music disambig"] = true,
["Number disambiguation"] = true,
["Numberdis"] = true,
["Numdab"] = true,
["Numdisambig"] = true,
["Opus number disambiguation"] = true,
["Phonetics disambiguation"] = true,
["Place name disambiguation"] = true,
["DisambigG"] = true,
["DisambigGeo"] = true,
["Disambiggeo"] = true,
["Geo-dis"] = true,
["Geodab"] = true,
["Geodis"] = true,
["Geodisambig"] = true,
["Geographic disambiguation"] = true,
["Geographical disambiguation"] = true,
["Pnd"] = true,
["Road disambiguation"] = true,
["Roaddis"] = true,
["School disambiguation"] = true,
["School disambig"] = true,
["Schooldab"] = true,
["Schooldis"] = true,
["Species Latin name abbreviation disambiguation"] = true,
["Species Latin name disambiguation"] = true,
["LatinNameDisambig"] = true,
["Species disambiguation"] = true,
["SpeciesLatinNameDisambig"] = true,
["Station disambiguation"] = true,
["Station dab"] = true,
["Synagogue disambiguation"] = true,
["Taxonomy disambiguation"] = true,
["Template disambiguation"] = true,
["Template ambiguous"] = true,
["Template dab"] = true,
["Template disambig"] = true,
["WoO number disambiguation"] = true,
}
120emfqmecg5jbyx2n1prgswwe275a0
Módulo:Lang/configuration
828
7632
73249
71614
2026-07-07T22:37:46Z
en>Pppery
0
Rename category per CFDS
73249
Scribunto
text/plain
--[[--------------------------< T E M P L A T E S _ T >--------------------------------------------------------
]]
local templates_t = {
lang = 'Lang',
langx = 'Langx',
langxx = 'Lang-xx',
transliteration = 'Transliteration',
}
--[[--------------------------< K N O W N _ P A R A M S >------------------------------------------------------
lists of all parameters known to {{lang}}, {{langx}}, {{lang-xx}} templates.
Exception: |fn= is known to {{lang}} but is not a 'lang' template; that parameter causes the module to call the
specified lang(), lang_xx_inherit(), or lang_xx_italic() function. These separate functions set |fn= to nill
and then do the known-param checking on the other template parameters
]]
local known_params_t = {
['common_params_all_t'] = { -- these parameters common to {{lang}}, {{langx}}, and {{lang-xx}}
['code'] = true,
['text'] = true,
['rtl'] = true,
['italic'] = true,
['italics'] = true,
['i'] = true,
['size'] = true,
['proto'] = true,
['nocat'] = true,
['cat'] = true,
['template'] = true, -- supplied by external templates to provide template name for error messaging ({{nihongo}}, etc)
},
['params_lang_t'] = { -- unique to {{lang}}
[1] = true, -- alias of |code=
[2] = true, -- alias of |text=
},
['params_x_t'] = { -- common to {{langx}} and {{lang-xx}}
['translit'] = true,
['translit-std'] = true,
['translit-script'] = true,
['translation'] = true,
['lit='] = true,
['label'] = true,
['link'] = true,
['links'] = true,
['lit'] = true,
['engvar'] = true,
},
['params_langx_t'] = { -- unique to {{langx}}
[1] = true, -- alias of |code=
[2] = true, -- alias of |text=
[3] = true, -- alias of |translit=
[4] = true, -- alias of |translation=
},
['params_lang_xx_t'] = { -- unique to {{lang-xx}}
[1] = true, -- alias of |text=
[2] = true, -- alias of |translit=
[3] = true, -- alias of |translation=
['script'] = true, -- these needed to override default params in {{lang-??}} templates
['region'] = true,
['variant'] = true,
},
}
--[[--------------------------< E N G _ V A R >----------------------------------------------------------------
Used at en.wiki so that spelling of 'romanized' (US, default) can be changed to 'romanised' to match the envar
specified by a {{Use xxx English}}. Not likely useful outside of en.wiki
This is accomplished by setting |engvar=gb; can, should be omitted in articles that use American English; no
need for the clutter.
]]
local engvar_sel_t = { -- select either UK English or US English
['au'] = 'gb_t', -- these match IANA region codes (except in lower case)
['ca'] = 'us_t',
['gb'] = 'gb_t',
['ie'] = 'gb_t',
['in'] = 'gb_t',
['nz'] = 'gb_t',
['us'] = 'us_t', -- default engvar
['za'] = 'gb_t'
};
local engvar_t = {
['gb_t'] = {
['romanisz_lc'] = 'romanisation', -- lower case
['romanisz_uc'] = 'Romanisation', -- upper case; unused can be deleted
['romanisz_pt'] = 'romanised', -- past tense
},
['us_t'] = { -- default engvar
['romanisz_lc'] = 'romanization', -- lower case
['romanisz_uc'] = 'Romanization', -- upper case; unused can be deleted
['romanisz_pt'] = 'romanized', -- past tense
}
}
local default_engvar = 'us_t';
--[[
=============================<< M E S S A G I N G T A B L E S >>=============================================
these tables are for internationalization. Messages or fragments thereof are mostly grouped by function name.
Some messages are shared by functions other than the function table that lists the message or fragment.
]]
--[[--------------------------< K E Y W O R D S _ T >----------------------------------------------------------
]]
local keywords_t = {
['affirmative'] = 'yes',
['negative'] = 'no',
['unset'] = 'unset',
['invert'] = 'invert',
['default'] = 'default',
}
--[[--------------------------< M I S C _ T E X T _ T >--------------------------------------------------------
]]
local misc_text_t = {
['error'] = 'Error', -- make_error_msg(), tag_from_name()
['language'] = 'language', -- make_translit(), lang_xx(), name_from_tag()
['help'] = 'help',
}
--[[--------------------------< M A K E _ E R R O R _ M S G _ T >----------------------------------------------
]]
local make_error_msg_t = {
['xlit_err_cat'] = 'Transliteration template errors',
['lang_err_cat'] = 'Lang and lang-xx template errors',
['undefined'] = 'undefined',
}
--[[--------------------------< V A L I D A T E _ I T A L I C _ T >--------------------------------------------
]]
local parameter_validate_t = {
['invalid_param'] = 'invalid parameter: |$1=', -- $1 is parameter name
}
--[[--------------------------< V A L I D A T E _ I T A L I C _ T >--------------------------------------------
]]
local validate_italic_t = {
['multi_italic'] = 'only one of |italic=, |italics=, or |i= can be specified',
}
--[[--------------------------< V A L I D A T E _ T E X T _ T >------------------------------------------------
]]
local validate_text_t = {
['no_text'] = 'no text',
['malformed_markup'] = 'text has malformed markup',
['italic_markup'] = 'text has italic markup',
}
--[[--------------------------< T E X T _ S C R I P T _ M A T C H _ T E S T _ T >------------------------------
]]
local text_script_match_test_t = {
['latn_txt_mismatch'] = 'Latn text/non-Latn script subtag mismatch',
['latn_scr_mismatch'] = 'Non-latn text (pos $1: $2)/Latn script subtag mismatch', -- $1 identifies offending character's position; $2 is the character
}
--[[--------------------------< L A N G _ T >------------------------------------------------------------------
]]
local lang_t = {
['conflict_n_param'] = 'conflicting: {{{$1}}} and |$2=', -- $1 is positional param number, $2 is named param; shared with _lang_xx()
['conflict_n_param_types'] = {
['code'] = 'code',
['text'] = 'text',
['translit'] = 'translit',
},
['invalid_proto'] = 'invalid |proto=: $1', -- _lang_xx also emits this message
}
--[[--------------------------< L A N G _ X X _ T >------------------------------------------------------------
]]
local lang_xx_t = {
['conflict_n_lit'] = 'conflicting: {{{$1}}} and |lit= or |translation=', -- $1 is positional parameter; can be either 3 ({{lang-??}}) or 4 ({{langx}})
['conflict_lit'] = 'conflicting: |lit= and |translation=',
['conflict_link'] = 'conflicting: |links= and |link=',
['invalid_xlit_std'] = 'invalid translit-std',
['romanization'] = 'Romanization of',
['translit_nonlatn'] = 'transliteration text not Latin script (pos $1: $2)', -- _xlit() also emits this message; $1 identifies offending character's position; $2 is the character
['xlit_of_latn'] = 'transliteration of latn script',
}
--[[--------------------------< T A G _ F R O M _ N A M E _ T >------------------------------------------------
]]
local tag_from_name_t = {
['lang_not_found'] = 'language: $1 not found', -- $1 is language name parameter value
['missing_lang_name'] = 'missing language name',
}
--[[--------------------------< T R A N S L _ T >--------------------------------------------------------------
]]
local transl_t = {
['unrecog_xlit_std'] = 'unrecognized transliteration standard: $1', -- $1 is |translit_std- parameter value
['no_text'] = 'no text',
['missing_lang_scr'] = 'missing language / script code',
['unrecog_lang_scr'] = 'unrecognized language / script code: $1', -- $1 is the language/script code
}
--[[--------------------------< G E T _ I E T F _ P A R T S _ T >----------------------------------------------
]]
local get_ietf_parts_t = {
['maint_promo_cat'] = 'Lang and lang-xx code promoted to ISO 639-1|$1', -- $1 is ISO 639-2/3 subtag
['maint_promo_msg'] = 'code: $1 promoted to code: $2', -- $1 is ISO 639-2/3 subtag, $2 is synonymous ISO 639-1 subtag
['missing_lang_tag'] = 'missing language tag', -- also used in _langx()
['redundant_scr'] = 'redundant script tag',
['redundant_reg'] = 'redundant region tag',
['redundant_var'] = 'redundant variant tag',
['unrecog_tag'] = 'unrecognized language tag: $1', -- $1 is the whole language tag
['unrecog_code'] = 'unrecognized language code: $1', -- $1 is code
['unrecog_reg_code'] = 'unrecognized region: $1 for code: $2', -- $1 is region, $2 is code
['unrecog_scr_code'] = 'unrecognized script: $1 for code: $2', -- $1 is script, $2 is code
['script_code'] = 'script: $1 not supported for code: $2', -- $1 is script, $2 is code
['unrecog_var'] = 'unrecognized variant: $1', -- $1 is variant
['unrecog_var_code'] = 'unrecognized variant: $1 for code: $2', -- $1 is variant, $2 is code
['unrecog_var_code_scr'] = 'unrecognized variant: $1 for code-script pair: $2-$3', -- $1 is variant, $2 is code, $3 is script
['unrecog_var_code_reg'] = 'unrecognized variant: $1 for code-region pair: $2-$3', -- $1 is variant, $2 is code, $3 is region
['unrecog_pri'] = 'unrecognized private tag: $1', -- $1 is private tag
}
--[[--------------------------< L A N G U A G E _ N A M E _ G E T _ T >----------------------------------------
]]
local language_name_get_t = {
['deprecated_cat'] = 'Lang and langx using deprecated ISO 639 codes|$1', -- $1 is deprecated ISO 639 subtag
['deprecated_msg'] = 'code: $1 is deprecated', -- $1 is deprecated ISO 639 subtag
}
--[[--------------------------< H T M L _ T I T L E _ T E X T _ T >--------------------------------------------
]]
local make_text_html_t = {
['zxx'] = 'text', -- for zxx no linguistic content
['collective'] = 'collective text', -- for collective languages
['individual'] = 'language text', -- for individual languages
}
--[[--------------------------< T R A N S L A T I O N _ M A K E _ T >------------------------------------------
]]
local translation_make_t = {
['lit_xlation'] = 'Literal translation', -- article title fragment and HTML title attribute
['lit_abbr'] = 'lit.',
}
--[[--------------------------< M A K E _ C A T E G O R Y _ T >------------------------------------------------
]]
local make_category_t = {
['collective_cat'] = 'Category:Articles with text in', -- for collective languages
['cat_prefix'] = 'Category:Articles containing', -- prefix for explicitly cited and individual languages
['explicit_cat'] = 'explicitly cited', -- for explicitly citing this wiki's language
['cat_postfix'] = 'language text', -- postfix for individual languages
}
--[[--------------------------< M A K E _ T R A N S L I T _ T >------------------------------------------------
]]
local make_translit_t = {
['script'] = 'script',
['transliteration'] = 'transliteration',
}
--[[--------------------------< E X P O R T S >----------------------------------------------------------------
]]
return {
known_params_t = known_params_t,
templates_t = templates_t,
default_engvar = default_engvar, -- engvar support not likely useful outside of en.wiki
engvar_t = engvar_t,
engvar_sel_t = engvar_sel_t,
get_ietf_parts_t = get_ietf_parts_t, -- messaging tables
keywords_t = keywords_t,
lang_t = lang_t,
lang_xx_t = lang_xx_t,
language_name_get_t = language_name_get_t,
make_category_t = make_category_t,
make_error_msg_t = make_error_msg_t,
make_text_html_t = make_text_html_t,
make_translit_t = make_translit_t,
misc_text_t = misc_text_t,
parameter_validate_t = parameter_validate_t,
tag_from_name_t = tag_from_name_t,
text_script_match_test_t = text_script_match_test_t,
transl_t = transl_t,
translation_make_t = translation_make_t,
validate_italic_t = validate_italic_t,
validate_text_t = validate_text_t,
}
0grapkhfltfc8vltv99ir6fmysp0gia
Módulo:Citation/CS1/Configuration
828
7642
73092
71640
2026-07-08T19:24:21Z
Robertsky
10424
translated
73092
Scribunto
text/plain
local lang_obj = mw.language.getContentLanguage(); -- make a language object for the local language; used here for languages and dates
--[[--------------------------< S E T T I N G S >--------------------------------------------------------------
boolean settings used to control various things. these setting located here to make them easy to find
]]
-- these settings local to this module only
local local_digits_from_mediawiki = true; -- for i18n; when true, module fills date_names['local_digits'] from MediaWiki; manual fill required else; always false at en.wiki
local local_date_names_from_mediawiki = true; -- for i18n; when true, module fills date_names['local']['long'] and date_names['local']['short'] from MediaWiki;
-- manual translation required else; ; always false at en.wiki
-- these settings exported to other modules
local use_identifier_redirects = true; -- when true use redirect name for identifier label links; always true at en.wiki
local local_lang_cat_enable = true; -- when true categorizes pages where |language=<local wiki's language>; always false at en.wiki
local date_name_auto_xlate_enable = true; -- when true translates English month-names to the local-wiki's language month names; always false at en.wiki
local date_digit_auto_xlate_enable = true; -- when true translates Western date digit to the local-wiki's language digits (date_names['local_digits']); always false at en.wiki
local enable_sort_keys = true; -- when true module adds namespace sort keys to error and maintenance category links
local suppress_archive_today_urls = true; -- when true module suppresses all parameters with an archive.today url and any deprendent parameters
--[[--------------------------< U N C A T E G O R I Z E D _ N A M E S P A C E S >------------------------------
List of namespaces identifiers for namespaces that will not be included in citation error categories.
Same as setting notracking = true by default.
For wikis that have a current version of Module:cs1 documentation support, this #invoke will return an unordered
list of namespace names and their associated identifiers:
{{#invoke:cs1 documentation support|uncategorized_namespace_lister|all=<anything>}}
]]
local uncategorized_namespaces_t = {[2]=true}; -- init with user namespace id
for k, _ in pairs (mw.site.talkNamespaces) do -- add all talk namespace ids
uncategorized_namespaces_t[k] = true;
end
local uncategorized_subpages = {'/[Ss]andbox', '/[Tt]estcases', '/[^/]*[Ll]og', '/[Aa]rchive'}; -- list of Lua patterns found in page names of pages we should not categorize
--[[
at en.wiki Greek characters are used as sort keys for certain items in a category so that those items are
placed at the end of a category page. See Wikipedia:Categorization#Sort_keys. That works well for en.wiki
because English is written using the Latn script. This may not work well for other languages. At en.wiki it
is desireable to place content from certain namespaces at the end of a category listing so the module adds sort
keys to error and maintenance category links when rendering a cs1|2 template on a page in that namespace.
i18n: if this does not work well for your language, set <enable_sort_keys> to false.
]]
local name_space_sort_keys = { -- sort keys to be used with these namespaces:
[4] = 'ω', -- wikipedia; omega
[10] = 'τ', -- template; tau
[118] = 'Δ', -- draft; delta
['other'] = 'ο', -- all other non-talk namespaces except main (article); omicron
}
--[[--------------------------< M E S S A G E S >--------------------------------------------------------------
Translation table
The following contains fixed text that may be output as part of a citation.
This is separated from the main body to aid in future translations of this
module.
]]
local messages = {
['agency'] = '$1 $2', -- $1 is sepc, $2 is agency
['archived-dead'] = 'Arkivadu hosi $1 iha $2.',
['archived-live'] = '$1 hosi orijinál iha $2',
['archived-unfit'] = 'Arkivadu hosi orijinál iha $1',
['archived'] = 'Arkivadu',
['by'] = 'Husi', -- contributions to authored works: introduction, foreword, afterword
['cartography'] = 'Kartografia husi $1',
['editor'] = 'ed.',
['editors'] = 'eds.',
['edition'] = '($1 ed.)',
['episode'] = 'Episode $1',
['et al'] = 'et al.',
['in'] = 'In', -- edited works
['inactive'] = ' (inativu $1)', -- $1 is date which the doi was found to be broken in
['inset'] = '$1 tau iha',
['interview'] = 'Entrevista husi by $1',
invisible_1 = '$1 $2', -- $1 stripmarker name; $2 is text from <invisible_chars[1]>
invisible_2 = '$1 karákter', -- $1 character name from <invisible_chars[1]>
['mismatch'] = '<code class="cs1-code">|$1=</code> / <code class="cs1-code">|$2=</code> la hanesan', -- $1 is year param name; $2 is date param name
['newsgroup'] = '[[:en:Usenet newsgroup|Grupu notísia]]: $1',
['notitle'] = 'Laiha títulu', -- for |title=(()) and (in the future) |title=none
['original'] = 'orijinál',
['origdate'] = ' [$1]',
['published'] = ' (publika husi $1)',
['retrieved'] = 'Rekupera iha $1',
['season'] = 'Tempu $1',
['section'] = '§ $1',
['sections'] = '§§ $1',
['series'] = '$1 $2', -- $1 is sepc, $2 is series
['seriesnum'] = 'Sere $1',
['translated'] = 'Tradús husi $1',
['type'] = ' ($1)', -- for titletype
wikidata = 'Wikidata', -- these used for interwikilinked author/editor/... names
wikipedia = 'Wikipédia',
wikisource = 'Wikisource',
['written'] = 'Hakerek iha $1',
['vol'] = '$1 Vol. $2', -- $1 is sepc; bold journal style volume is in presentation{}
['vol-no'] = '$1 Vol. $2, no. $3', -- sepc, volume, issue (alternatively insert $1 after $2, but then we'd also have to change capitalization)
['issue'] = '$1 No. $2', -- $1 is sepc
['art'] = '$1 Art. $2', -- $1 is sepc; for {{cite conference}} only
['vol-art'] = '$1 Vol. $2, art. $3', -- sepc, volume, article-number; for {{cite conference}} only
['j-vol'] = '$1 $2', -- sepc, volume; bold journal volume is in presentation{}
['j-issue'] = ' ($1)',
['j-article-num'] = ' $1', -- TODO: any punctuation here? static text?
['nopp'] = '$1 $2'; -- page(s) without prefix; $1 is sepc
['p-prefix'] = "$1 p. $2", -- $1 is sepc
['pp-prefix'] = "$1 pp. $2", -- $1 is sepc
['j-page(s)'] = ': $1', -- same for page and pages
['sheet'] = '$1 Sheet $2', -- $1 is sepc
['sheets'] = '$1 Sheets $2', -- $1 is sepc
['j-sheet'] = ': Sheet $1',
['j-sheets'] = ': Sheets $1',
['language'] = '(in $1)',
['via'] = " – liuhusi $1",
['event'] = 'Eventu akontese iha',
['minutes'] = ' $1 minutu iha', -- $1 is the number of minutes
-- Determines the location of the help page
['help page link'] = 'Help:CS1 errors',
['help page label'] = 'help',
-- categories
['cat wikilink'] = '[[Category:$1]]', -- $1 is the category name
['cat wikilink sk'] = '[[Category:$1|$2]]', -- $1 is the category name; $2 is namespace sort key
[':cat wikilink'] = '[[:Category:$1|link]]', -- category name as maintenance message wikilink; $1 is the category name
-- Internal errors (should only occur if configuration is bad)
['undefined_error'] = 'Bolu ho kondisaun erru ne\'ebé la define',
['unknown_ID_key'] = 'Xave ID ne\'ebé la rekoñese:', -- an ID key in id_handlers not found in ~/Identifiers func_map{}
['unknown_ID_access'] = 'Liafuan xave asesu ID ne\'ebé la rekoñese:', -- an ID access keyword in id_handlers not found in keywords_lists['id-access']{}
['unknown_argument_map'] = 'Mapa argumentu la define ba variável ida-ne\'e',
['bare_url_no_origin'] = 'URL mamuk hetan maibé indikadór orijen nian laiha ka mamuk',
['warning_msg_e'] = '<span style="color:#d33"><code style="color: inherit; background: inherit; border: none; padding: inherit;">{{$1}}</code>: [[#$2|referénsia]] ida-ne\'e iha erru sira</span>; mensajen sira bele subar ([[Help:CS1_errors#Controlling_error_message_display|ajuda]]).'; -- $1 is template link; $2 is anchor ID
['warning_msg_m'] = '<span style="color:#085"><code style="color: inherit; background: inherit; border: none; padding: inherit;">{{$1}}</code>: [[#$2|referénsia]] ida-ne\'e iha mensajen manutensaun nian</span>; mensajen sira bele subar ([[Help:CS1_errors#Controlling_error_message_display|ajuda]]).'; -- $1 is template link; $2 is anchor ID
}
--[[--------------------------< C I T A T I O N _ C L A S S _ M A P >------------------------------------------
this table maps the value assigned to |CitationClass= in the cs1|2 templates to the canonical template name when
the value assigned to |CitationClass= is different from the canonical template name. |CitationClass= values are
used as class attributes in the <cite> tag that encloses the citation so these names may not contain spaces while
the canonical template name may. These names are used in warning_msg_e and warning_msg_m to create links to the
template's documentation when an article is displayed in preview mode.
]]
local citation_class_map_t = { -- TODO: in Module:Cite/config write a function to use this table
arxiv = 'cite arXiv', -- as the source for known_templates_t and citation_classes_t
['audio-visual'] = 'cite AV media',
['AV-media-notes'] = 'cite AV media notes',
biorxiv = 'cite bioRxiv',
book = 'cite book',
citation = 'citation',
citeseerx = 'cite CiteSeerX',
conference = 'cite conference',
document = 'cite document',
encyclopaedia = 'cite encyclopedia',
episode = 'cite episode',
interview = 'cite interview',
journal = 'cite journal',
magazine = 'cite magazine',
mailinglist = 'cite mailing list',
map = 'cite map',
medrxiv = 'cite medRxiv',
news = 'cite news',
newsgroup = 'cite newsgroup',
podcast = 'cite podcast',
pressrelease = 'cite press release',
report = 'cite report',
serial = 'cite serial',
sign = 'cite sign',
speech = 'cite speech',
ssrn = 'cite SSRN',
techreport = 'cite tech report',
thesis = 'cite thesis',
web = 'cite web',
}
--[=[-------------------------< E T _ A L _ P A T T E R N S >--------------------------------------------------
This table provides Lua patterns for the phrase "et al" and variants in name text
(author, editor, etc.). The main module uses these to identify and emit the 'etal' message.
]=]
local et_al_patterns = {
"[;,]? *[\"']*%f[%a][Ee][Tt]%.? *[Aa][Ll][%.;,\"']*$", -- variations on the 'et al' theme
"[;,]? *[\"']*%f[%a][Ee][Tt]%.? *[Aa][Ll][Ii][AaIi][Ee]?[%.;,\"']*$", -- variations on the 'et alia', 'et alii' and 'et aliae' themes (false positive 'et aliie' unlikely to match)
"[;,]? *%f[%a]and [Oo]thers", -- an alternative to et al.
"%[%[ *[Ee][Tt]%.? *[Aa][Ll]%.? *%]%]", -- a wikilinked form
"%(%( *[Ee][Tt]%.? *[Aa][Ll]%.? *%)%)", -- a double-bracketed form (to counter partial removal of ((...)) syntax)
"[%(%[] *[Ee][Tt]%.? *[Aa][Ll]%.? *[%)%]]", -- a bracketed form
}
--[[--------------------------< P R E S E N T A T I O N >------------------------
Fixed presentation markup. Originally part of citation_config.messages it has
been moved into its own, more semantically correct place.
]]
local presentation =
{
-- .citation-comment class is specified at Help:CS1_errors#Controlling_error_message_display
['hidden-error'] = '<span class="cs1-hidden-error citation-comment">$1</span>',
['visible-error'] = '<span class="cs1-visible-error citation-comment">$1</span>',
['hidden-maint'] = '<span class="cs1-maint citation-comment">$1</span>',
['accessdate'] = '<span class="reference-accessdate">$1$2</span>', -- to allow editors to hide accessdate using personal CSS
['bdi'] = '<bdi$1>$2</bdi>', -- bidirectional isolation used with |script-title= and the like
['cite'] = '<cite class="$1">$2</cite>'; -- for use when citation does not have a namelist and |ref= not set so no id="..." attribute
['cite-id'] = '<cite id="$1" class="$2">$3</cite>'; -- for use when when |ref= is set or when citation has a namelist
['format'] = ' <span class="cs1-format">($1)</span>', -- for |format=, |chapter-format=, etc.
['interwiki'] = ' <span class="cs1-format">[iha laran $1]</span>', -- for interwiki-language-linked author, editor, etc
['interproj'] = ' <span class="cs1-format">[iha $1]</span>', -- for interwiki-project-linked author, editor, etc (:d: and :s: supported; :w: ignored)
-- various access levels, for |access=, |doi-access=, |arxiv=, ...
-- narrow no-break space   may work better than nowrap CSS. Or not? Browser support?
['ext-link-access-signal'] = '<span class="$1" title="$2">$3</span>', -- external link with appropriate lock icon
['free'] = {class='id-lock-free', title='Asesivel ho livre'}, -- classes defined in Module:Citation/CS1/styles.css
['registration'] = {class='id-lock-registration', title='Rejistu gratuitu presiza'},
['limited'] = {class='id-lock-limited', title='Asesu gratuitu sujeitu ba teste limitadu, normalmente presiza subskrisaun'},
['subscription'] = {class='id-lock-subscription', title='Presiza subskrisaun selu'},
['interwiki-icon'] = '<span class="$1" title="$2">$3</span>',
['class-wikisource'] = 'cs1-ws-icon',
['italic-title'] = "''$1''",
['kern-left'] = '<span class="cs1-kern-left"></span>$1', -- spacing to use when title contains leading single or double quote mark
['kern-right'] = '$1<span class="cs1-kern-right"></span>', -- spacing to use when title contains trailing single or double quote mark
['nowrap1'] = '<span class="nowrap">$1</span>', -- for nowrapping an item: <span ...>yyyy-mm-dd</span>
['nowrap2'] = '<span class="nowrap">$1</span> $2', -- for nowrapping portions of an item: <span ...>dd mmmm</span> yyyy (note white space)
['ocins'] = '<span title="$1" class="Z3988"></span>',
['parameter'] = '<code class="cs1-code">|$1=</code>',
['ps_cs1'] = '.'; -- CS1 style postscript (terminal) character
['ps_cs2'] = ''; -- CS2 style postscript (terminal) character (empty string)
['quoted-text'] = '<q>$1</q>', -- for wrapping |quote= content
['quoted-title'] = '"$1"',
['sep_cs1'] = '.', -- CS1 element separator
['sep_cs2'] = ',', -- CS2 separator
['sep_nl'] = ';', -- CS1|2 style name-list separator between names is a semicolon
['sep_nl_and'] = ' no ', -- used as last nl sep when |name-list-style=and and list has 2 items
['sep_nl_end'] = '; no ', -- used as last nl sep when |name-list-style=and and list has 3+ names
['sep_name'] = ', ', -- CS1|2 style last/first separator is <comma><space>
['sep_nl_vanc'] = ',', -- Vancouver style name-list separator between authors is a comma
['sep_name_vanc'] = ' ', -- Vancouver style last/first separator is a space
['sep_list'] = ', ', -- used for |language= when list has 3+ items except for last sep which uses sep_list_end
['sep_list_pair'] = ' no ', -- used for |language= when list has 2 items
['sep_list_end'] = ', no ', -- used as last list sep for |language= when list has 3+ items
['trans-italic-title'] = "[''$1'']",
['trans-quoted-title'] = "[$1]", -- for |trans-title= and |trans-quote=
['vol-bold'] = '$1 <b>$2</b>', -- sepc, volume; for bold journal cites; for other cites ['vol'] in messages{}
}
--[[--------------------------< A L I A S E S >---------------------------------
Aliases table for commonly passed parameters.
Parameter names on the right side in the assignments in this table must have been
defined in the Whitelist before they will be recognized as valid parameter names
]]
local aliases = {
['AccessDate'] = {'access-date', 'accessdate'}, -- Used by InternetArchiveBot
['Agency'] = 'agency',
['ArchiveDate'] = {'archive-date', 'archivedate'}, -- Used by InternetArchiveBot
['ArchiveFormat'] = 'archive-format',
['ArchiveURL'] = {'archive-url', 'archiveurl'}, -- Used by InternetArchiveBot
['ArticleNumber'] = 'article-number',
['ASINTLD'] = 'asin-tld',
['At'] = 'at', -- Used by InternetArchiveBot
['Authors'] = {'people', 'credits'},
['BookTitle'] = {'book-title', 'booktitle'},
['Cartography'] = 'cartography',
['Chapter'] = {'chapter', 'contribution', 'entry', 'article', 'section'},
['ChapterFormat'] = {'chapter-format', 'contribution-format', 'entry-format',
'article-format', 'section-format'};
['ChapterURL'] = {'chapter-url', 'contribution-url', 'entry-url', 'article-url', 'section-url'}, -- Used by InternetArchiveBot
['ChapterUrlAccess'] = {'chapter-url-access', 'contribution-url-access',
'entry-url-access', 'article-url-access', 'section-url-access'}, -- Used by InternetArchiveBot
['Class'] = 'class', -- cite arxiv and arxiv identifier
['Collaboration'] = 'collaboration',
['Conference'] = {'conference', 'event'},
['ConferenceFormat'] = 'conference-format',
['ConferenceURL'] = 'conference-url', -- Used by InternetArchiveBot
['Date'] = {'date', 'air-date', 'airdate'}, -- air-date and airdate for cite episode and cite serial only
['Degree'] = 'degree',
['DF'] = 'df',
['DisplayAuthors'] = {'display-authors', 'display-subjects'},
['DisplayContributors'] = 'display-contributors',
['DisplayEditors'] = 'display-editors',
['DisplayInterviewers'] = 'display-interviewers',
['DisplayTranslators'] = 'display-translators',
['Docket'] = 'docket',
['DoiBroken'] = 'doi-broken-date',
['Edition'] = 'edition',
['Embargo'] = 'pmc-embargo-date',
['Encyclopedia'] = {'encyclopedia', 'encyclopaedia', 'dictionary'}, -- cite encyclopedia only
['Episode'] = 'episode', -- cite serial only TODO: make available to cite episode?
['Format'] = 'format',
['ID'] = {'id', 'ID'},
['Inset'] = 'inset',
['Issue'] = {'issue', 'number'},
['Language'] = {'language', 'lang'},
['MailingList'] = {'mailing-list', 'mailinglist'}, -- cite mailing list only
['Map'] = 'map', -- cite map only
['MapFormat'] = 'map-format', -- cite map only
['MapURL'] = {'map-url', 'mapurl'}, -- cite map only -- Used by InternetArchiveBot
['MapUrlAccess'] = 'map-url-access', -- cite map only -- Used by InternetArchiveBot
['Minutes'] = 'minutes',
['Mode'] = 'mode',
['NameListStyle'] = 'name-list-style',
['Network'] = 'network',
['Newsgroup'] = 'newsgroup', -- cite newsgroup only
['NoPP'] = {'no-pp', 'nopp'},
['NoTracking'] = {'no-tracking', 'template-doc-demo'},
['Number'] = 'number', -- this case only for cite techreport
['OrigDate'] = {'orig-date', 'orig-year', 'origyear'},
['Others'] = 'others',
['Page'] = {'page', 'p'}, -- Used by InternetArchiveBot
['Pages'] = {'pages', 'pp'}, -- Used by InternetArchiveBot
['Periodical'] = {'journal', 'magazine', 'newspaper', 'periodical', 'website', 'work'},
['Place'] = {'place', 'location'},
['PostScript'] = 'postscript',
['PublicationDate'] = {'publication-date', 'publicationdate'},
['PublicationPlace'] = {'publication-place', 'publicationplace'},
['PublisherName'] = {'publisher', 'institution'},
['Quote'] = {'quote', 'quotation'},
['QuotePage'] = 'quote-page',
['QuotePages'] = 'quote-pages',
['Ref'] = 'ref',
['Scale'] = 'scale',
['ScriptChapter'] = {'script-chapter', 'script-contribution', 'script-entry',
'script-article', 'script-section'},
['ScriptEncyclopedia'] = {'script-encyclopedia', 'script-encyclopaedia'}, -- cite encyclopedia only
['ScriptMap'] = 'script-map',
['ScriptPeriodical'] = {'script-journal', 'script-magazine', 'script-newspaper',
'script-periodical', 'script-website', 'script-work'},
['ScriptQuote'] = 'script-quote',
['ScriptTitle'] = 'script-title', -- Used by InternetArchiveBot
['Season'] = 'season',
['Sections'] = 'sections', -- cite map only
['Series'] = {'series', 'version'},
['SeriesLink'] = {'series-link', 'serieslink'},
['SeriesNumber'] = {'series-number', 'series-no'},
['Sheet'] = 'sheet', -- cite map only
['Sheets'] = 'sheets', -- cite map only
['Station'] = 'station',
['Time'] = 'time',
['TimeCaption'] = 'time-caption',
['Title'] = 'title', -- Used by InternetArchiveBot
['TitleLink'] = {'title-link', 'episode-link', 'episodelink'}, -- Used by InternetArchiveBot
['TitleNote'] = {'title-note', 'department'},
['TitleType'] = {'type', 'medium'},
['TransChapter'] = {'trans-article', 'trans-chapter', 'trans-contribution',
'trans-entry', 'trans-section'},
['Transcript'] = 'transcript',
['TranscriptFormat'] = 'transcript-format',
['TranscriptURL'] = 'transcript-url', -- Used by InternetArchiveBot
['TransEncyclopedia'] = {'trans-encyclopedia', 'trans-encyclopaedia'}, -- cite encyclopedia only
['TransMap'] = 'trans-map', -- cite map only
['TransPeriodical'] = {'trans-journal', 'trans-magazine', 'trans-newspaper',
'trans-periodical', 'trans-website', 'trans-work'},
['TransQuote'] = 'trans-quote',
['TransTitle'] = 'trans-title', -- Used by InternetArchiveBot
['URL'] = {'url', 'URL'}, -- Used by InternetArchiveBot
['UrlAccess'] = 'url-access', -- Used by InternetArchiveBot
['UrlStatus'] = 'url-status', -- Used by InternetArchiveBot
['Vauthors'] = 'vauthors',
['Veditors'] = 'veditors',
['Via'] = 'via',
['Volume'] = 'volume',
['Year'] = 'year',
['AuthorList-First'] = {"first#", "author-first#", "author#-first", "author-given#", "author#-given",
"subject-first#", "subject#-first", "subject-given#", "subject#-given",
"given#"},
['AuthorList-Last'] = {"last#", "author-last#", "author#-last", "author-surname#", "author#-surname",
"subject-last#", "subject#-last", "subject-surname#", "subject#-surname",
"author#", 'host#', "subject#", "surname#"},
['AuthorList-Link'] = {"author-link#", "author#-link", "subject-link#",
"subject#-link", "authorlink#", "author#link"},
['AuthorList-Mask'] = {"author-mask#", "author#-mask", "subject-mask#", "subject#-mask"},
['ContributorList-First'] = {'contributor-first#', 'contributor#-first',
'contributor-given#', 'contributor#-given'},
['ContributorList-Last'] = {'contributor-last#', 'contributor#-last',
'contributor-surname#', 'contributor#-surname', 'contributor#'},
['ContributorList-Link'] = {'contributor-link#', 'contributor#-link'},
['ContributorList-Mask'] = {'contributor-mask#', 'contributor#-mask'},
['EditorList-First'] = {"editor-first#", "editor#-first", "editor-given#", "editor#-given"},
['EditorList-Last'] = {"editor-last#", "editor#-last", "editor-surname#",
"editor#-surname", "editor#"},
['EditorList-Link'] = {"editor-link#", "editor#-link"},
['EditorList-Mask'] = {"editor-mask#", "editor#-mask"},
['InterviewerList-First'] = {'interviewer-first#', 'interviewer#-first',
'interviewer-given#', 'interviewer#-given'},
['InterviewerList-Last'] = {'interviewer-last#', 'interviewer#-last',
'interviewer-surname#', 'interviewer#-surname', 'interviewer#'},
['InterviewerList-Link'] = {'interviewer-link#', 'interviewer#-link'},
['InterviewerList-Mask'] = {'interviewer-mask#', 'interviewer#-mask'},
['TranslatorList-First'] = {'translator-first#', 'translator#-first',
'translator-given#', 'translator#-given'},
['TranslatorList-Last'] = {'translator-last#', 'translator#-last',
'translator-surname#', 'translator#-surname', 'translator#'},
['TranslatorList-Link'] = {'translator-link#', 'translator#-link'},
['TranslatorList-Mask'] = {'translator-mask#', 'translator#-mask'},
}
--[[--------------------------< D E P E N D E N C I E S _ T >--------------------------------------------------
a table of url-holding parameters upon which other parameters are dependent.
this table is used by has_archive_today_url() to suppress parameters that are dependant upon a url-holding parameter
that has as a value an archive.today (or alternate tld) url.
archive.today is deprecated at en.wiki; see Wikipedia:Requests_for_comment/Archive.is_RFC_5
]]
local url_dependency_map_t = { -- table of url-holding parameters and the meta-parameters that are dependent on them
['url'] = {'AccessDate', 'ArchiveURL', 'Format', 'UrlAccess'},
['archive-url'] = {'ArchiveDate', 'ArchiveFormat', 'UrlStatus'},
['archiveurl'] = {'ArchiveDate', 'ArchiveFormat', 'UrlStatus'},
['article-url'] = {'ChapterFormat', 'ChapterUrlAccess'},
['chapter-url'] = {'ChapterFormat', 'ChapterUrlAccess'},
['conference-url'] = {'ConferenceFormat'},
['contribution-url'] = {'ChapterFormat', 'ChapterUrlAccess'},
['entry-url'] = {'ChapterFormat', 'ChapterUrlAccess'},
['map-url'] = {'MapFormat', 'MapUrlAccess'},
['section-url'] = {'ChapterFormat', 'ChapterUrlAccess'},
['transcript-url'] = {'TranscriptFormat'},
};
local dependencies_t = {}; -- the table of url-holding parameters and their dependent parameters
for url_param, meta_parameters_t in pairs (url_dependency_map_t) do -- sequence of meta-parameters (indexes) into <aliases> table
local dependant_params_t = {}; -- collection of parameters that are dependent on this <url_param>
for _, meta_parameter in ipairs (meta_parameters_t) do -- for each <aliases> meta-parameter (index)
if 'string' == type (aliases[meta_parameter]) then -- for single parameter names (no aliases), <aliases[meta_parameter]> will be a string
table.insert (dependant_params_t, aliases[meta_parameter]); -- add to this <url_param>'s dependency sequence
else
for _, alias in ipairs (aliases[meta_parameter]) do -- for each alias in aliases[meta_parameter] (aliases['AccessDate'] for example)
table.insert (dependant_params_t, alias); -- add to this <url_param>'s dependency sequence
end
end
end
dependencies_t[url_param] = dependant_params_t; -- add the <url_param> and its dependent parameters
end
--[[--------------------------< P U N C T _ S K I P >---------------------------
builds a table of parameter names that the extraneous terminal punctuation check should not check.
]]
local punct_meta_params = { -- table of aliases[] keys (meta parameters); each key has a table of parameter names for a value
'BookTitle', 'Chapter', 'ScriptChapter', 'ScriptTitle', 'Title', 'TransChapter', 'Transcript', 'TransMap', 'TransTitle', -- title-holding parameters
'AuthorList-Mask', 'ContributorList-Mask', 'EditorList-Mask', 'InterviewerList-Mask', 'TranslatorList-Mask', -- name-list mask may have name separators
'PostScript', 'Quote', 'ScriptQuote', 'TransQuote', 'Ref', -- miscellaneous
'ArchiveURL', 'ChapterURL', 'ConferenceURL', 'MapURL', 'TranscriptURL', 'URL', -- URL-holding parameters
}
local url_meta_params = { -- table of aliases[] keys (meta parameters); each key has a table of parameter names for a value
'ArchiveURL', 'ChapterURL', 'ConferenceURL', 'ID', 'MapURL', 'TranscriptURL', 'URL', -- parameters allowed to hold urls
'Page', 'Pages', 'At', 'QuotePage', 'QuotePages', -- insource locators allowed to hold urls
}
local function build_skip_table (skip_t, meta_params)
for _, meta_param in ipairs (meta_params) do -- for each meta parameter key
local params = aliases[meta_param]; -- get the parameter or the table of parameters associated with the meta parameter name
if 'string' == type (params) then
skip_t[params] = 1; -- just a single parameter
else
for _, param in ipairs (params) do -- get the parameter name
skip_t[param] = 1; -- add the parameter name to the skip table
local count;
param, count = param:gsub ('#', ''); -- remove enumerator marker from enumerated parameters
if 0 ~= count then -- if removed
skip_t[param] = 1; -- add param name without enumerator marker
end
end
end
end
return skip_t;
end
local punct_skip = {};
local url_skip = {};
--[[--------------------------< U R L _ A C C E S S _ M A P >--------------------------------------------------
this table used by the wikipedia library url test, has_twl_url(), which automatically sets a url-access parameter
to 'subscription' when it discovers a wikipedia library url in any of the url-holding paramters used as keys in
this table.
translators: if your wiki uses parameter names for these url-holding parameters and their matching -access parameters,
add your wiki's parameters to this list. Leave the English parameters in place.
TODO: is there a better way to do this?
]]
local url_access_map_t = {
['chapter-url'] = 'chapter-url-access',
['contribution-url'] = 'contribution-url-access',
['entry-url'] = 'entry-url-access',
['article-url'] = 'article-url-access',
['section-url'] = 'section-url-access',
['map-url'] = 'map-url-access',
['mapurl'] = 'map-url-access',
['url'] = 'url-access',
['URL'] = 'url-access'
}
--[[--------------------------< S I N G L E - L E T T E R S E C O N D - L E V E L D O M A I N S >----------
this is a list of tlds that are known to have single-letter second-level domain names. This list does not include
ccTLDs which are accepted in is_domain_name().
]]
local single_letter_2nd_lvl_domains_t = {'cash', 'company', 'foundation', 'media', 'org', 'today'};
--[[-----------< S P E C I A L C A S E T R A N S L A T I O N S >------------
This table is primarily here to support internationalization. Translations in
this table are used, for example, when an error message, category name, etc.,
is extracted from the English alias key. There may be other cases where
this translation table may be useful.
]]
local is_Latn = 'A-Za-z\195\128-\195\150\195\152-\195\182\195\184-\198\191\199\132-\201\143\225\184\128-\225\187\191';
local special_case_translation = {
author = 'na\'in',
editor = 'editór',
name_list_params = '$1-name-list parámetru sira', -- $1 is 'author' or 'editor'; used with err_redundant_parameters
['AuthorList'] = 'lista autór sira', -- used to assemble maintenance category names
['ContributorList'] = 'lista kontribuinte sira', -- translation of these names plus translation of the base maintenance category names in maint_cats{} table below
['EditorList'] = 'lista editór sira', -- must match the names of the actual categories
['InterviewerList'] = 'lista entrevistadór sira', -- this group or translations used by name_has_ed_markup() and name_has_mult_names()
['TranslatorList'] = 'lista tradutór sira',
-- Lua patterns to match pseudo-titles used by InternetArchiveBot and others as placeholder for unknown |title= value
['archived_copy'] = { -- used with CS1 maint: Archive[d] copy as title
['en'] = '^archived?%s+copy$', -- for English; translators: keep this because templates imported from en.wiki
['local'] = '^kópia?%s+arkivadu$', -- translators: replace ['local'] = nil with lowercase translation only when bots or tools create generic titles in your language
},
-- Lua patterns to match generic titles; usually created by bots or reference filling tools
-- translators: replace ['local'] = nil with lowercase translation only when bots or tools create generic titles in your language
-- generic titles and patterns in this table should be lowercase only
-- leave ['local'] nil except when there is a matching generic title in your language
-- boolean 'true' for plain-text searches; 'false' for pattern searches
['generic_titles'] = {
['accept'] = {
},
['reject'] = {
{['en'] = {'^wayback%s+machine$', false}, ['local'] = nil},
{['en'] = {'are you a robot', true}, ['local'] = nil},
{['en'] = {'hugedomains', true}, ['local'] = nil},
{['en'] = {'^[%(%[{<]?no +title[>}%]%)]?$', false}, ['local'] = nil},
{['en'] = {'page not found', true}, ['local'] = nil},
{['en'] = {'subscribe to read', true}, ['local'] = nil},
{['en'] = {'^[%(%[{<]?unknown[>}%]%)]?$', false}, ['local'] = nil},
{['en'] = {'website is for sale', true}, ['local'] = nil},
{['en'] = {'^404', false}, ['local'] = nil},
{['en'] = {'error[ %-]404', false}, ['local'] = nil},
{['en'] = {'internet archive wayback machine', true}, ['local'] = nil},
{['en'] = {'log into facebook', true}, ['local'] = nil},
{['en'] = {'login • instagram', true}, ['local'] = nil},
{['en'] = {'redirecting...', true}, ['local'] = nil},
{['en'] = {'usurped title', true}, ['local'] = nil}, -- added by a GreenC bot
{['en'] = {'wayback machine', true}, ['local'] = nil},
{['en'] = {'webcite query result', true}, ['local'] = nil},
{['en'] = {'wikiwix\'s cache', true}, ['local'] = nil},
{['en'] = {'bot verification', true}, ['local'] = nil},
}
},
-- boolean 'true' for plain-text searches, search string must be lowercase only
-- boolean 'false' for pattern searches
-- leave ['local'] nil except when there is a matching generic name in your language
['generic_names'] = {
['accept'] = {
{['en'] = {'%[%[[^|]*%(author%) *|[^%]]*%]%]', false}, ['local'] = nil},
},
['reject'] = {
{['en'] = {'about us', true}, ['local'] = nil},
{['en'] = {'%f[%a][Aa]dvisor%f[%A]', false}, ['local'] = nil},
{['en'] = {'allmusic', true}, ['local'] = nil},
{['en'] = {'%f[%a][Aa]uthor%f[%A]', false}, ['local'] = nil},
{['en'] = {'^[Bb]ureau$', false}, ['local'] = nil},
{['en'] = {'business', true}, ['local'] = nil},
{['en'] = {'cnn', true}, ['local'] = nil},
{['en'] = {'collaborator', true}, ['local'] = nil},
{['en'] = {'^[Cc]ompany$', false}, ['local'] = nil},
{['en'] = {'contributor', true}, ['local'] = nil},
{['en'] = {'contact us', true}, ['local'] = nil},
{['en'] = {'correspondent', true}, ['local'] = nil},
{['en'] = {'^[Dd]esk$', false}, ['local'] = nil},
{['en'] = {'directory', true}, ['local'] = nil},
{['en'] = {'%f[%(%[][%(%[]%s*eds?%.?%s*[%)%]]?$', false}, ['local'] = nil},
{['en'] = {'[,%.%s]%f[e]eds?%.?$', false}, ['local'] = nil},
{['en'] = {'^eds?[%.,;]', false}, ['local'] = nil},
{['en'] = {'^[%(%[]%s*[Ee][Dd][Ss]?%.?%s*[%)%]]', false}, ['local'] = nil},
{['en'] = {'%f[%a][Ee]dited%f[%A]', false}, ['local'] = nil},
{['en'] = {'%f[%a][Ee]ditors?%f[%A]', false}, ['local'] = nil},
{['en'] = {'%f[%a][Ee]mail%f[%A]', false}, ['local'] = nil},
{['en'] = {'facebook', true}, ['local'] = nil},
{['en'] = {'google', true}, ['local'] = nil},
{['en'] = {'^[Gg]roup$', false}, ['local'] = nil},
{['en'] = {'home page', true}, ['local'] = nil},
{['en'] = {'^[Ii]nc%.?$', false}, ['local'] = nil},
{['en'] = {'instagram', true}, ['local'] = nil},
{['en'] = {'interviewer', true}, ['local'] = nil},
{['en'] = {'^[Ll]imited$', false}, ['local'] = nil},
{['en'] = {'linkedIn', true}, ['local'] = nil},
{['en'] = {'^[Nn]ews$', false}, ['local'] = nil},
{['en'] = {'[Nn]ews[ %-]?[Rr]oom', false}, ['local'] = nil},
{['en'] = {'pinterest', true}, ['local'] = nil},
{['en'] = {'policy', true}, ['local'] = nil},
{['en'] = {'privacy', true}, ['local'] = nil},
{['en'] = {'reuters', true}, ['local'] = nil},
{['en'] = {'translator', true}, ['local'] = nil},
{['en'] = {'tumblr', true}, ['local'] = nil},
{['en'] = {'twitter', true}, ['local'] = nil},
{['en'] = {'site name', true}, ['local'] = nil},
{['en'] = {'statement', true}, ['local'] = nil},
{['en'] = {'submitted', true}, ['local'] = nil},
{['en'] = {'super.?user', false}, ['local'] = nil},
{['en'] = {'%f['..is_Latn..'][Uu]ser%f[^'..is_Latn..']', false}, ['local'] = nil},
{['en'] = {'updated', true}, ['local'] = nil},
{['en'] = {'verfasser', true}, ['local'] = nil},
}
}
}
--[[--------------------------< D A T E _ N A M E S >----------------------------------------------------------
This table of tables lists local language date names and fallback English date names.
The code in Date_validation will look first in the local table for valid date names.
If date names are not found in the local table, the code will look in the English table.
Because citations can be copied to the local wiki from en.wiki, the English is
required when the date-name translation function date_name_xlate() is used.
In these tables, season numbering is defined by
Extended Date/Time Format (EDTF) Specification (https://www.loc.gov/standards/datetime/)
which became part of ISO 8601 in 2019. See '§Sub-year groupings'. The standard
defines various divisions using numbers 21-41. CS1|2 only supports generic seasons.
EDTF does support the distinction between north and south hemisphere seasons
but CS1|2 has no way to make that distinction.
33-36 = Quarter 1, Quarter 2, Quarter 3, Quarter 4 (3 months each)
The standard does not address 'named' dates so, for the purposes of CS1|2,
Easter and Christmas are defined here as 98 and 99, which should be out of the
ISO 8601 (EDTF) range of uses for a while.
local_date_names_from_mediawiki is a boolean. When set to:
true – module will fetch local month names from MediaWiki for both date_names['local']['long'] and date_names['local']['short']; this will unconditionally overwrite manual translations
false – module will *not* fetch local month names from MediaWiki
Caveat lector: There is no guarantee that MediaWiki will provide short month names. At your wiki you can test
the results of the MediaWiki fetch in the debug console with this command (the result is alpha sorted):
=mw.dumpObject (p.date_names['local'])
While the module can fetch month names from MediaWiki, it cannot fetch the quarter, season, and named date names
from MediaWiki. Those must be translated manually.
]]
local local_date_names_from_mediawiki = true; -- when false, manual translation required for date_names['local']['long'] and date_names['local']['short']; overwrites manual translations
-- when true, module fetches long and short month names from MediaWiki
local date_names = {
['en'] = { -- English
['long'] = {['January'] = 1, ['February'] = 2, ['March'] = 3, ['April'] = 4, ['May'] = 5, ['June'] = 6, ['July'] = 7, ['August'] = 8, ['September'] = 9, ['October'] = 10, ['November'] = 11, ['December'] = 12},
['short'] = {['Jan'] = 1, ['Feb'] = 2, ['Mar'] = 3, ['Apr'] = 4, ['May'] = 5, ['Jun'] = 6, ['Jul'] = 7, ['Aug'] = 8, ['Sep'] = 9, ['Oct'] = 10, ['Nov'] = 11, ['Dec'] = 12},
['quarter'] = {['First Quarter'] = 33, ['Second Quarter'] = 34, ['Third Quarter'] = 35, ['Fourth Quarter'] = 36},
['season'] = {['Winter'] = 24, ['Spring'] = 21, ['Summer'] = 22, ['Fall'] = 23, ['Autumn'] = 23},
['named'] = {['Easter'] = 98, ['Christmas'] = 99},
},
-- when local_date_names_from_mediawiki = false
['local'] = { -- replace these English date names with the local language equivalents
['long'] = {['January'] = 1, ['February'] = 2, ['March'] = 3, ['April'] = 4, ['May'] = 5, ['June'] = 6, ['July'] = 7, ['August'] = 8, ['September'] = 9, ['October'] = 10, ['November'] = 11, ['December'] = 12},
['short'] = {['Jan'] = 1, ['Feb'] = 2, ['Mar'] = 3, ['Apr'] = 4, ['May'] = 5, ['Jun'] = 6, ['Jul'] = 7, ['Aug'] = 8, ['Sep'] = 9, ['Oct'] = 10, ['Nov'] = 11, ['Dec'] = 12},
['quarter'] = {['First Quarter'] = 33, ['Second Quarter'] = 34, ['Third Quarter'] = 35, ['Fourth Quarter'] = 36},
['season'] = {['Winter'] = 24, ['Spring'] = 21, ['Summer'] = 22, ['Fall'] = 23, ['Autumn'] = 23},
['named'] = {['Easter'] = 98, ['Christmas'] = 99},
},
['inv_local_long'] = {}, -- used in date reformatting & translation; copy of date_names['local'].long where k/v are inverted: [1]='<local name>' etc.
['inv_local_short'] = {}, -- used in date reformatting & translation; copy of date_names['local'].short where k/v are inverted: [1]='<local name>' etc.
['inv_local_quarter'] = {}, -- used in date translation; copy of date_names['local'].quarter where k/v are inverted: [1]='<local name>' etc.
['inv_local_season'] = {}, -- used in date translation; copy of date_names['local'].season where k/v are inverted: [1]='<local name>' etc.
['inv_local_named'] = {}, -- used in date translation; copy of date_names['local'].named where k/v are inverted: [1]='<local name>' etc.
['local_digits'] = {['0'] = '0', ['1'] = '1', ['2'] = '2', ['3'] = '3', ['4'] = '4', ['5'] = '5', ['6'] = '6', ['7'] = '7', ['8'] = '8', ['9'] = '9'}, -- used to convert local language digits to Western 0-9
['xlate_digits'] = {},
}
if local_date_names_from_mediawiki then -- if fetching local month names from MediaWiki is enabled
local long_t = {};
local short_t = {};
for i=1, 12 do -- loop 12x and
local name = lang_obj:formatDate('F', '2022-' .. i .. '-1'); -- get long month name for each i
long_t[name] = i; -- save it
name = lang_obj:formatDate('M', '2022-' .. i .. '-1'); -- get short month name for each i
short_t[name] = i; -- save it
end
date_names['local']['long'] = long_t; -- write the long table – overwrites manual translation
date_names['local']['short'] = short_t; -- write the short table – overwrites manual translation
end
-- create inverted date-name tables for reformatting and/or translation
for _, invert_t in pairs {{'long', 'inv_local_long'}, {'short', 'inv_local_short'}, {'quarter', 'inv_local_quarter'}, {'season', 'inv_local_season'}, {'named', 'inv_local_named'}} do
for name, i in pairs (date_names['local'][invert_t[1]]) do -- this table is ['name'] = i
date_names[invert_t[2]][i] = name; -- invert to get [i] = 'name' for conversions from ymd
end
end
if local_digits_from_mediawiki then -- if fetching local digits from MediaWiki is enabled
local digits_t = {};
for i=0, 9 do -- loop 10x and
digits_t [lang_obj:formatNum (i)] = tostring (i); -- format the loop indexer as local lang table index and assign loop indexer (a string) as the value
end
date_names['local_digits'] = digits_t;
end
for ld, ed in pairs (date_names.local_digits) do -- make a digit translation table for simple date translation from en to local language using local_digits table
date_names.xlate_digits [ed] = ld; -- en digit becomes index with local digit as the value
end
local df_template_patterns = { -- table of redirects to {{Use dmy dates}} and {{Use mdy dates}}
'{{ *[Uu]se +(dmy) +dates *[|}]', -- 1159k -- sorted by approximate transclusion count
'{{ *[Uu]se +(mdy) +dates *[|}]', -- 212k
'{{ *[Uu]se +(MDY) +dates *[|}]', -- 788
'{{ *[Uu]se +(DMY) +dates *[|}]', -- 343
'{{ *([Mm]dy) *[|}]', -- 176
'{{ *[Uu]se *(dmy) *[|}]', -- 156 + 18
'{{ *[Uu]se *(mdy) *[|}]', -- 149 + 11
'{{ *([Dd]my) *[|}]', -- 56
'{{ *[Uu]se +(MDY) *[|}]', -- 5
'{{ *([Dd]MY) *[|}]', -- 3
'{{ *[Uu]se(mdy)dates *[|}]', -- 1
'{{ *[Uu]se +(DMY) *[|}]', -- 0
'{{ *([Mm]DY) *[|}]', -- 0
}
local title_object = mw.title.getCurrentTitle();
local content; -- done this way so that unused templates appear in unused-template-reports; self-transcluded makes them look like they are used
if 10 ~= title_object.namespace then -- all namespaces except Template
content = title_object:getContent() or ''; -- get the content of the article or ''; new pages edited w/ve do not have 'content' until saved; ve does not preview; phab:T221625
end
local function get_date_format ()
if not content then -- nil content when we're in template
return nil; -- auto-formatting does not work in Template space so don't set global_df
end
for _, pattern in ipairs (df_template_patterns) do -- loop through the patterns looking for {{Use dmy dates}} or {{Use mdy dates}} or any of their redirects
local start, _, match = content:find(pattern); -- match is the three letters indicating desired date format
if match then
local use_dates_template = content:match ('%b{}', start); -- get the whole template
if use_dates_template:match ('| *cs1%-dates *= *[lsy][sy]?') then -- look for |cs1-dates=publication date length access-/archive-date length
return match:lower() .. '-' .. use_dates_template:match ('| *cs1%-dates *= *([lsy][sy]?)');
else
return match:lower() .. '-all'; -- no |cs1-dates= k/v pair; return value appropriate for use in |df=
end
end
end
end
local global_df; -- TODO: add this to <global_cs1_config_t>?
--[[-----------------< V O L U M E , I S S U E , P A G E S >------------------
These tables hold cite class values (from the template invocation) and identify those templates that support
|volume=, |issue=, and |page(s)= parameters. Cite conference and cite map require further qualification which
is handled in the main module.
]]
local templates_using_volume = {'citation', 'audio-visual', 'book', 'conference', 'encyclopaedia', 'interview', 'journal', 'magazine', 'map', 'news', 'report', 'techreport', 'thesis'}
local templates_using_issue = {'citation', 'conference', 'episode', 'interview', 'journal', 'magazine', 'map', 'news', 'podcast'}
local templates_not_using_page = {'audio-visual', 'episode', 'mailinglist', 'newsgroup', 'podcast', 'serial', 'sign', 'speech'}
--[[
These tables control when it is appropriate for {{citation}} to render |volume= and/or |issue=. The parameter
names in the tables constrain {{citation}} so that its renderings match the renderings of the equivalent cs1
templates. For example, {{cite web}} does not support |volume= so the equivalent {{citation |website=...}} must
not support |volume=.
]]
local citation_no_volume_t = { -- {{citation}} does not render |volume= when these parameters are used
'website', 'mailinglist', 'script-website',
}
local citation_issue_t = { -- {{citation}} may render |issue= when these parameters are used
'journal', 'magazine', 'newspaper', 'periodical', 'work',
'script-journal', 'script-magazine', 'script-newspaper', 'script-periodical', 'script-work',
}
--[[
Patterns for finding extra text in |volume=, |issue=, |page=, |pages=
]]
local vol_iss_pg_patterns = {
good_ppattern = '^P[^%.PpGg]', -- OK to begin with uppercase P: P7 (page 7 of section P), but not p123 (page 123); TODO: this allows 'Pages' which it should not
bad_ppatterns = { -- patterns for |page= and |pages=
'^[Pp][PpGg]?%.?[ %d]',
'^[Pp][Pp]?%. ', -- from {{p.}} and {{pp.}} templates
'^[Pp]ages?',
'^[Pp]gs.?',
},
vi_patterns_t = { -- combined to catch volume-like text in |issue= and issue-like text in |volume=
'^volumes?', -- volume-like text
'^vols?[%.:=]?',
'^issues?', --issue-like text
'^iss[%.:=]?',
'^numbers?',
'^nos?%A', -- don't match 'november' or 'nostradamus'
'^nr[%.:=]?',
'^n[%.:= ]', -- might be a valid issue without separator (space char is sep char here)
'^n°', -- 'n' with degree sign (U+00B0)
'^№', -- precomposed unicode numero character (U+2116)
},
}
--[[--------------------------< K E Y W O R D S >-------------------------------
These tables hold keywords for those parameters that have defined sets of acceptable keywords.
]]
--[[-------------------< K E Y W O R D S T A B L E >--------------------------
this is a list of keywords; each key in the list is associated with a table of
synonymous keywords possibly from different languages.
for I18N: add local-language keywords to value table; do not change the key.
For example, adding the German keyword 'ja':
['affirmative'] = {'yes', 'true', 'y', 'ja'},
Because CS1|2 templates from en.wiki articles are often copied to other local wikis,
it is recommended that the English keywords remain in these tables.
]]
local keywords = {
['amp'] = {'&', 'amp', 'ampersand'}, -- |name-list-style=
['and'] = {'and', 'serial', 'no'}, -- |name-list-style=
['affirmative'] = {'yes', 'true', 'y'}, -- |no-tracking=, |no-pp= -- Used by InternetArchiveBot
['afterword'] = {'afterword'}, -- |contribution=
['bot: unknown'] = {'bot: unknown'}, -- |url-status= -- Used by InternetArchiveBot
['cs1'] = {'cs1'}, -- |mode=
['cs2'] = {'cs2'}, -- |mode=
['dead'] = {'dead', 'deviated', 'mate'}, -- |url-status= -- Used by InternetArchiveBot
['dmy'] = {'dmy'}, -- |df=
['dmy-all'] = {'dmy-all'}, -- |df=
['foreword'] = {'foreword'}, -- |contribution=
['free'] = {'free' ,'gratis', 'gratuitu', 'gratuita'}, -- |<id>-access= -- Used by InternetArchiveBot
['harv'] = {'harv'}, -- |ref=; this no longer supported; is_valid_parameter_value() called with <invert> = true
['introduction'] = {'introduction', 'introdusaun'}, -- |contribution=
['limited'] = {'limited', 'limitadu', 'limitada'}, -- |url-access= -- Used by InternetArchiveBot
['live'] = {'live', 'moris'}, -- |url-status= -- Used by InternetArchiveBot
['mdy'] = {'mdy'}, -- |df=
['mdy-all'] = {'mdy-all'}, -- |df=
['none'] = {'none'}, -- |postscript=, |ref=, |title=, |type= -- Used by InternetArchiveBot
['off'] = {'off'}, -- |title= (potentially also: |title-link=, |postscript=, |ref=, |type=)
['preface'] = {'preface', 'prefásiu'}, -- |contribution=
['registration'] = {'registration', 'rejistrasaun'}, -- |url-access= -- Used by InternetArchiveBot
['subscription'] = {'subscription', 'asinatura'}, -- |url-access= -- Used by InternetArchiveBot
['unfit'] = {'unfit'}, -- |url-status= -- Used by InternetArchiveBot
['usurped'] = {'usurped'}, -- |url-status= -- Used by InternetArchiveBot
['vanc'] = {'vanc'}, -- |name-list-style=
['ymd'] = {'ymd'}, -- |df=
['ymd-all'] = {'ymd-all'}, -- |df=
-- ['yMd'] = {'yMd'}, -- |df=; not supported at en.wiki
-- ['yMd-all'] = {'yMd-all'}, -- |df=; not supported at en.wiki
}
--[[------------------------< X L A T E _ K E Y W O R D S >---------------------
this function builds a list, keywords_xlate{}, of the keywords found in keywords{} where the values from keywords{}
become the keys in keywords_xlate{} and the keys from keywords{} become the values in keywords_xlate{}:
['affirmative'] = {'yes', 'true', 'y'}, -- in keywords{}
becomes
['yes'] = 'affirmative', -- in keywords_xlate{}
['true'] = 'affirmative',
['y'] = 'affirmative',
the purpose of this function is to act as a translator between a non-English keyword and its English equivalent
that may be used in other modules of this suite
]]
local function xlate_keywords ()
local out_table = {}; -- output goes here
for k, keywords_t in pairs (keywords) do -- spin through the keywords table
for _, keyword in ipairs (keywords_t) do -- for each keyword
out_table[keyword] = k; -- create an entry in the output table where keyword is the key
end
end
return out_table;
end
local keywords_xlate = xlate_keywords (); -- the list of translated keywords
--[[----------------< M A K E _ K E Y W O R D S _ L I S T >---------------------
this function assembles, for parameter-value validation, the list of keywords appropriate to that parameter.
keywords_lists{}, is a table of tables from keywords{}
]]
local function make_keywords_list (keywords_lists)
local out_table = {}; -- output goes here
for _, keyword_list in ipairs (keywords_lists) do -- spin through keywords_lists{} and get a table of keywords
for _, keyword in ipairs (keyword_list) do -- spin through keyword_list{} and add each keyword, ...
table.insert (out_table, keyword); -- ... as plain text, to the output list
end
end
return out_table;
end
--[[----------------< K E Y W O R D S _ L I S T S >-----------------------------
this is a list of lists of valid keywords for the various parameters in [key].
Generally the keys in this table are the canonical en.wiki parameter names though
some are contrived because of use in multiple differently named parameters:
['yes_true_y'], ['id-access'].
The function make_keywords_list() extracts the individual keywords from the
appropriate list in keywords{}.
The lists in this table are used to validate the keyword assignment for the
parameters named in this table's keys.
]]
local keywords_lists = {
['yes_true_y'] = make_keywords_list ({keywords.affirmative}),
['contribution'] = make_keywords_list ({keywords.afterword, keywords.foreword, keywords.introduction, keywords.preface}),
['df'] = make_keywords_list ({keywords.dmy, keywords['dmy-all'], keywords.mdy, keywords['mdy-all'], keywords.ymd, keywords['ymd-all']}),
-- ['df'] = make_keywords_list ({keywords.dmy, keywords['dmy-all'], keywords.mdy, keywords['mdy-all'], keywords.ymd, keywords['ymd-all'], keywords.yMd, keywords['yMd-all']}), -- not supported at en.wiki
['mode'] = make_keywords_list ({keywords.cs1, keywords.cs2}),
['name-list-style'] = make_keywords_list ({keywords.amp, keywords['and'], keywords.vanc}),
['ref'] = make_keywords_list ({keywords.harv}), -- inverted check; |ref=harv no longer supported
['url-access'] = make_keywords_list ({keywords.subscription, keywords.limited, keywords.registration}),
['url-status'] = make_keywords_list ({keywords.dead, keywords.live, keywords.unfit, keywords.usurped, keywords['bot: unknown']}),
['id-access'] = make_keywords_list ({keywords.free}),
}
--[[--------------------------< C S 1 _ C O N F I G _ G E T >--------------------------------------------------
fetch and validate values from {{cs1 config}} template to fill <global_cs1_config_t>
no error messages; when errors are detected, the parameter value from {{cs1 config}} is blanked.
Supports all parameters and aliases associated with the metaparameters: DisplayAuthors, DisplayContributors,
DisplayEditors, DisplayInterviewers, DisplayTranslators, NameListStyle, and Mode. The DisplayWhatever metaparameters
accept numeric values only (|display-authors=etal and the like is not supported).
]]
local global_cs1_config_t = {}; -- TODO: add value returned from get_date_format() to this table?
local function get_cs1_config ()
if not content then -- nil content when we're in template
return nil; -- auto-formatting does not work in Template space so don't set global_df
end
local start = content:find('{{ *[Cc][Ss]1 config *[|}]'); -- <start> is offset into <content> when {{cs1 config}} found; nil else
if start then
local cs1_config_template = content:match ('%b{}', start); -- get the whole template
if not cs1_config_template then
return nil;
end
local params_t = mw.text.split (cs1_config_template:gsub ('^{{%s*', ''):gsub ('%s*}}$', ''), '%s*|%s*'); -- remove '{{' and '}}'; make a sequence of parameter/value pairs (split on the pipe)
table.remove (params_t, 1); -- remove the template name because it isn't a parameter/value pair
local config_meta_params_t = {'DisplayAuthors', 'DisplayContributors', 'DisplayEditors', 'DisplayInterviewers', 'DisplayTranslators', 'NameListStyle', 'Mode'};
local meta_param_map_t = {}; -- list of accepted parameter names usable in {{cs1 config}} goes here
for _, meta_param in ipairs (config_meta_params_t) do -- for i18n using <config_meta_params_t>, map template parameter names to their metaparameter equivalents
if 'table' == type (aliases[meta_param]) then -- if <meta_param> is a sequence,
for _, param in ipairs (aliases[meta_param]) do -- extract its contents
meta_param_map_t[param] = meta_param; -- and add to <meta_param_map_t>
end
else
meta_param_map_t[aliases[meta_param]] = meta_param; -- not a sequence so just add the parameter to <meta_param_map_t>
end
end
local keywords_t = {}; -- map valid keywords to their associate metaparameter; reverse form of <keyword_lists[key] for these metaparameters
for _, metaparam_t in ipairs ({{'NameListStyle', 'name-list-style'}, {'Mode', 'mode'}}) do -- only these metaparameter / keywords_lists key pairs
for _, keyword in ipairs (keywords_lists[metaparam_t[2]]) do -- spin through the list of keywords
keywords_t[keyword] = metaparam_t[1]; -- add [keyword] = metaparameter to the map
end
end
for _, param in ipairs (params_t) do -- spin through the {{cs1 config}} parameters and fill <global_cs1_config_t>
local k, v = param:match ('([^=]-)%s*=%s*(.+)'); -- <k> is the parameter name; <v> is parameter's assigned value
if k then
if k:find ('^display') then -- if <k> is one of the |display-<namelist>= parameters
if v:match ('%d+') then -- the assigned value must be digits; doesn't accept 'etal'
global_cs1_config_t[meta_param_map_t[k]]=v; -- add the display param and its value to globals table
end
else
if keywords_t[v] == meta_param_map_t[k] then -- keywords_t[v] returns nil or the metaparam name; these must be the same
global_cs1_config_t[meta_param_map_t[k]]=v; -- add the parameter and its value to globals table
end
end
end
end
end
end
get_cs1_config (); -- fill <global_cs1_config_t>
--[[---------------------< S T R I P M A R K E R S >----------------------------
Common pattern definition location for stripmarkers so that we don't have to go
hunting for them if (when) MediaWiki changes their form.
]]
local stripmarkers = {
['any'] = '\127[^\127]*UNIQ%-%-(%a+)%-[%a%d]+%-QINU[^\127]*\127', -- capture returns name of stripmarker
['math'] = '\127[^\127]*UNIQ%-%-math%-[%a%d]+%-QINU[^\127]*\127' -- math stripmarkers used in coins_cleanup() and coins_replace_math_stripmarker()
}
--[[------------< I N V I S I B L E _ C H A R A C T E R S >---------------------
This table holds non-printing or invisible characters indexed either by name or
by Unicode group. Values are decimal representations of UTF-8 codes. The table
is organized as a table of tables because the Lua pairs keyword returns table
data in an arbitrary order. Here, we want to process the table from top to bottom
because the entries at the top of the table are also found in the ranges specified
by the entries at the bottom of the table.
Also here is a pattern that recognizes stripmarkers that begin and end with the
delete characters. The nowiki stripmarker is not an error but some others are
because the parameter values that include them become part of the template's
metadata before stripmarker replacement.
]]
local invisible_defs = {
del = '\127', -- used to distinguish between stripmarker and del char
zwj = '\226\128\141', -- used with capture because zwj may be allowed
}
local invisible_chars = {
{'replacement', '\239\191\189'}, -- U+FFFD, EF BF BD
{'zero width joiner', '('.. invisible_defs.zwj .. ')'}, -- U+200D, E2 80 8D; capture because zwj may be allowed
{'zero width space', '\226\128\139'}, -- U+200B, E2 80 8B
{'hair space', '\226\128\138'}, -- U+200A, E2 80 8A
{'soft hyphen', '\194\173'}, -- U+00AD, C2 AD
{'horizontal tab', '\009'}, -- U+0009 (HT), 09
{'line feed', '\010'}, -- U+000A (LF), 0A
{'no-break space', '\194\160'}, -- U+00A0 (NBSP), C2 A0
{'carriage return', '\013'}, -- U+000D (CR), 0D
{'stripmarker', stripmarkers.any}, -- stripmarker; may or may not be an error; capture returns the stripmaker type
{'delete', '('.. invisible_defs.del .. ')'}, -- U+007F (DEL), 7F; must be done after stripmarker test; capture to distinguish isolated del chars not part of stripmarker
{'C0 control', '[\000-\008\011\012\014-\031]'}, -- U+0000–U+001F (NULL–US), 00–1F (except HT, LF, CR (09, 0A, 0D))
{'C1 control', '[\194\128-\194\159]'}, -- U+0080–U+009F (XXX–APC), C2 80 – C2 9F
-- {'Specials', '[\239\191\185-\239\191\191]'}, -- U+FFF9-U+FFFF, EF BF B9 – EF BF BF
-- {'Private use area', '[\238\128\128-\239\163\191]'}, -- U+E000–U+F8FF, EE 80 80 – EF A3 BF
-- {'Supplementary Private Use Area-A', '[\243\176\128\128-\243\191\191\189]'}, -- U+F0000–U+FFFFD, F3 B0 80 80 – F3 BF BF BD
-- {'Supplementary Private Use Area-B', '[\244\128\128\128-\244\143\191\189]'}, -- U+100000–U+10FFFD, F4 80 80 80 – F4 8F BF BD
}
--[[
Indic script makes use of zero width joiner as a character modifier so zwj
characters must be left in. This pattern covers all of the unicode characters
for these languages:
Devanagari 0900–097F – https://unicode.org/charts/PDF/U0900.pdf
Devanagari extended A8E0–A8FF – https://unicode.org/charts/PDF/UA8E0.pdf
Bengali 0980–09FF – https://unicode.org/charts/PDF/U0980.pdf
Gurmukhi 0A00–0A7F – https://unicode.org/charts/PDF/U0A00.pdf
Gujarati 0A80–0AFF – https://unicode.org/charts/PDF/U0A80.pdf
Oriya 0B00–0B7F – https://unicode.org/charts/PDF/U0B00.pdf
Tamil 0B80–0BFF – https://unicode.org/charts/PDF/U0B80.pdf
Telugu 0C00–0C7F – https://unicode.org/charts/PDF/U0C00.pdf
Kannada 0C80–0CFF – https://unicode.org/charts/PDF/U0C80.pdf
Malayalam 0D00–0D7F – https://unicode.org/charts/PDF/U0D00.pdf
plus the not-necessarily Indic scripts for Sinhala and Burmese:
Sinhala 0D80-0DFF - https://unicode.org/charts/PDF/U0D80.pdf
Myanmar 1000-109F - https://unicode.org/charts/PDF/U1000.pdf
Myanmar extended A AA60-AA7F - https://unicode.org/charts/PDF/UAA60.pdf
Myanmar extended B A9E0-A9FF - https://unicode.org/charts/PDF/UA9E0.pdf
the pattern is used by has_invisible_chars() and coins_cleanup()
]]
local indic_script = '[\224\164\128-\224\181\191\224\163\160-\224\183\191\225\128\128-\225\130\159\234\167\160-\234\167\191\234\169\160-\234\169\191]';
-- list of emoji that use a zwj character (U+200D) to combine with another emoji
-- from: https://unicode.org/Public/emoji/17.0/emoji-zwj-sequences.txt; version: 17.0; 2025-01-08
-- table created by: [[:en:Module:Make emoji zwj table]]
local emoji_t = { -- indexes are decimal forms of the hex values in U+xxxx
[8596] = true, -- U+2194 ↔ left right arrow
[8597] = true, -- U+2195 ↕ up down arrow
[9760] = true, -- U+2620 ☠ skull and crossbones
[9792] = true, -- U+2640 ♀ female sign
[9794] = true, -- U+2642 ♂ male sign
[9877] = true, -- U+2695 ⚕ staff of aesculapius
[9878] = true, -- U+2696 ⚖ scales
[9895] = true, -- U+26A7 ⚧ male with stroke and male and female sign
[9992] = true, -- U+2708 ✈ airplane
[10052] = true, -- U+2744 ❄ snowflake
[10084] = true, -- U+2764 ❤ heavy black heart
[10145] = true, -- U+27A1 ➡ black rightwards arrow
[11035] = true, -- U+2B1B ⬛ black large square
[127752] = true, -- U+1F308 🌈 rainbow
[127787] = true, -- U+1F32B 🌫 fog
[127806] = true, -- U+1F33E 🌾 ear of rice
[127859] = true, -- U+1F373 🍳 cooking
[127868] = true, -- U+1F37C 🍼 baby bottle
[127876] = true, -- U+1F384 🎄 christmas tree
[127891] = true, -- U+1F393 🎓 graduation cap
[127908] = true, -- U+1F3A4 🎤 microphone
[127912] = true, -- U+1F3A8 🎨 artist palette
[127979] = true, -- U+1F3EB 🏫 school
[127981] = true, -- U+1F3ED 🏭 factory
[128048] = true, -- U+1F430 🐰 rabbit face
[128102] = true, -- U+1F466 👦 boy
[128103] = true, -- U+1F467 👧 girl
[128104] = true, -- U+1F468 👨 man
[128105] = true, -- U+1F469 👩 woman
[128139] = true, -- U+1F48B 💋 kiss mark
[128165] = true, -- U+1F4A5 💥 collision symbol
[128168] = true, -- U+1F4A8 💨 dash symbol
[128171] = true, -- U+1F4AB 💫 dizzy symbol
[128187] = true, -- U+1F4BB 💻 personal computer
[128188] = true, -- U+1F4BC 💼 brief case
[128293] = true, -- U+1F525 🔥 fire
[128295] = true, -- U+1F527 🔧 wrench
[128300] = true, -- U+1F52C 🔬 microscope
[128488] = true, -- U+1F5E8 🗨 left speech bubble
[128640] = true, -- U+1F680 🚀 rocket
[128658] = true, -- U+1F692 🚒 fire engine
[129001] = true, -- U+1F7E9 🟩 large green square
[129003] = true, -- U+1F7EB 🟫 large brown square
[129309] = true, -- U+1F91D 🤝 handshake
[129455] = true, -- U+1F9AF 🦯 probing cane
[129456] = true, -- U+1F9B0 🦰 emoji component red hair
[129457] = true, -- U+1F9B1 🦱 emoji component curly hair
[129458] = true, -- U+1F9B2 🦲 emoji component bald
[129459] = true, -- U+1F9B3 🦳 emoji component white hair
[129466] = true, -- U+1F9BA 🦺 safety vest
[129468] = true, -- U+1F9BC 🦼 motorized wheelchair
[129469] = true, -- U+1F9BD 🦽 manual wheelchair
[129489] = true, -- U+1F9D1 🧑 adult
[129490] = true, -- U+1F9D2 🧒 child
[129648] = true, -- U+1FA70 🩰 ballet shoes
[129657] = true, -- U+1FA79 🩹 adhesive bandage
[129775] = true, -- U+1FAEF fight cloud
[129778] = true, -- U+1FAF2 🫲 leftwards hand
}
--[[----------------------< L A N G U A G E S U P P O R T >-------------------
These tables and constants support various language-specific functionality.
]]
--local this_wiki_code = mw.getContentLanguage():getCode(); -- get this wiki's language code
local this_wiki_code = lang_obj:getCode(); -- get this wiki's language code
if string.match (mw.site.server, 'wikidata') then
this_wiki_code = mw.getCurrentFrame():callParserFunction('int', {'lang'}); -- on Wikidata so use interface language setting instead
end
local mw_languages_by_tag_t = mw.language.fetchLanguageNames (this_wiki_code, 'all'); -- get a table of language tag/name pairs known to Wikimedia; used for interwiki tests
local mw_languages_by_name_t = {};
for k, v in pairs (mw_languages_by_tag_t) do -- build a 'reversed' table name/tag language pairs know to MediaWiki; used for |language=
v = mw.ustring.lower (v); -- lowercase for tag fetch; get name's proper case from mw_languages_by_tag_t[<tag>]
if mw_languages_by_name_t[v] then -- when name already in the table
if 2 == #k or 3 == #k then -- if tag does not have subtags
mw_languages_by_name_t[v] = k; -- prefer the shortest tag for this name
end
else -- here when name not in the table
mw_languages_by_name_t[v] = k; -- so add name and matching tag
end
end
local inter_wiki_map = {}; -- map of interwiki prefixes that are language-code prefixes
for k, v in pairs (mw.site.interwikiMap ('local')) do -- spin through the base interwiki map (limited to local)
if mw_languages_by_tag_t[v["prefix"]] then -- if the prefix matches a known language tag
inter_wiki_map[v["prefix"]] = true; -- add it to our local map
end
end
--[[--------------------< S C R I P T _ L A N G _ C O D E S >-------------------
This table is used to hold ISO 639-1 two-character and ISO 639-3 three-character
language codes that apply only to |script-title= and |script-chapter=
]]
local script_lang_codes = {
'ab', 'am', 'ar', 'as', 'az', 'be', 'bg', 'bn', 'bo', 'bs', 'ce', 'chr',
'cu', 'dv', 'dz', 'el', 'fa', 'grc', 'gu', 'he', 'hi', 'hy', 'ja', 'ka',
'kaa', 'kk', 'km', 'kn', 'ko', 'ku', 'ky', 'lo', 'mk', 'ml', 'mn', 'mni',
'mr', 'my', 'ne', 'or', 'ota', 'pa', 'ps', 'ru', 'sd', 'si', 'sr', 'syc',
'ta', 'te', 'tg', 'th', 'ti', 'tkr', 'tt', 'ug', 'uk', 'ur', 'uz', 'yi',
'yue', 'zh', 'zgh'
};
--[[---------------< L A N G U A G E R E M A P P I N G >----------------------
These tables hold language information that is different (correct) from MediaWiki's definitions
For each ['<tag>'] = 'language name' in lang_code_remap{} there must be a matching ['language name'] = {'language name', '<tag>'} in lang_name_remap{}
lang_tag_remap{}:
key is always lowercase ISO 639-1, -2, -3 language tag or a valid lowercase IETF language tag
value is properly spelled and capitalized language name associated with <tag>
only one language name per <tag>;
key/value pair must have matching entry in lang_name_remap{}
lang_name_remap{}:
key is always lowercase language name
value is a table the holds correctly spelled and capitalized language name [1] and associated tag [2] (tag must match a tag key in lang_tag_remap{})
may have multiple keys referring to a common preferred name and tag; For example:
['kolsch'] and ['kölsch'] both refer to 'Kölsch' and 'ksh'
]]
local lang_tag_remap = { -- used for |language= and |script-title= / |script-chapter=
['als'] = 'Tosk Albanian', -- MediaWiki returns Alemannisch
['bh'] = 'Bihari', -- MediaWiki uses 'bh' as a subdomain name for Bhojpuri Wikipedia: bh.wikipedia.org
['bla'] = 'Blackfoot', -- MediaWiki/IANA/ISO 639: Siksika; use en.wiki preferred name
['bn'] = 'Bengali', -- MediaWiki returns Bangla
['ca-valencia'] = 'Valencian', -- IETF variant of Catalan
['fkv'] = 'Kven', -- MediaWiki returns Kvensk
['gsw'] = 'Swiss German',
['ilo'] = 'Ilocano', -- MediaWiki/IANA/ISO 639: Iloko; use en.wiki preferred name
['ksh'] = 'Kölsch', -- MediaWiki: Colognian; use IANA/ISO 639 preferred name
['ksh-x-colog'] = 'Colognian', -- override MediaWiki ksh; no IANA/ISO 639 code for Colognian; IETF private code created at Module:Lang/data
['mis-x-ripuar'] = 'Ripuarian', -- override MediaWiki ksh; no IANA/ISO 639 code for Ripuarian; IETF private code created at Module:Lang/data
['nan-tw'] = 'Taiwanese Hokkien', -- make room for MediaWiki/IANA/ISO 639 nan: Min Nan Chinese and support en.wiki preferred name
['sr-ec'] = 'Serbian (Cyrillic script)', -- MediaWiki returns српски (ћирилица)
['sr-el'] = 'Serbian (Latin script)', -- MediaWiki returns srpski (latinica)
}
local lang_name_remap = { -- used for |language=; names require proper capitalization; tags must be lowercase
['alemannic'] = {'Swiss German', 'gsw'}, -- ISO 639-2, -3 alternate for Swiss German; MediaWiki mediawiki returns Alemannic for gsw; en.wiki preferred name
['alemannisch'] = {'Swiss German', 'gsw'}, -- not an ISO or IANA language name; MediaWiki uses 'als' as a subdomain name for Alemannic Wikipedia: als.wikipedia.org
['bangla'] = {'Bengali', 'bn'}, -- MediaWiki returns Bangla (the endonym) but we want Bengali (the exonym); here we remap
['bengali'] = {'Bengali', 'bn'}, -- MediaWiki doesn't use exonym so here we provide correct language name and 639-1 code
['bhojpuri'] = {'Bhojpuri', 'bho'}, -- MediaWiki uses 'bh' as a subdomain name for Bhojpuri Wikipedia: bh.wikipedia.org
['bihari'] = {'Bihari', 'bh'}, -- MediaWiki replaces 'Bihari' with 'Bhojpuri' so 'Bihari' cannot be found
['blackfoot'] = {'Blackfoot', 'bla'}, -- MediaWiki/IANA/ISO 639: Siksika; use en.wiki preferred name
['colognian'] = {'Colognian', 'ksh-x-colog'}, -- MediaWiki preferred name for ksh
['ilocano'] = {'Ilocano', 'ilo'}, -- MediaWiki/IANA/ISO 639: Iloko; use en.wiki preferred name
['kolsch'] = {'Kölsch', 'ksh'}, -- use IANA/ISO 639 preferred name (use non-diacritical o instead of umlaut ö)
['kölsch'] = {'Kölsch', 'ksh'}, -- use IANA/ISO 639 preferred name
['kven'] = {'Kven', 'fkv'}, -- Unicode CLDR have decided not to support English language name for these two...
['kvensk'] = {'Kven', 'fkv'}, -- ...they say to refer to IANA registry for English names
['ripuarian'] = {'Ripuarian', 'mis-x-ripuar'}, -- group of dialects; no code in MediaWiki or in IANA/ISO 639
['serbian (cyrillic script)'] = {'Serbian (Cyrillic script)', 'sr-cyrl'}, -- special case to get correct tag when |language=sr-ec
['serbian (latin script)'] = {'Serbian (Latin script)', 'sr-latn'}, -- special case to get correct tag when |language=sr-el
['swiss german'] = {'Swiss German', 'gsw'},
['taiwanese hokkien'] = {'Taiwanese Hokkien', 'nan-tw'}, -- make room for MediaWiki/IANA/ISO 639 nan: Min Nan Chinese
['tosk albanian'] = {'Tosk Albanian', 'als'}, -- MediaWiki replaces 'Tosk Albanian' with 'Alemannisch' so 'Tosk Albanian' cannot be found
['valencian'] = {'Valencian', 'ca-valencia'}, -- variant of Catalan; categorizes as Valencian
}
--[[---------------< P R O P E R T I E S _ C A T E G O R I E S >----------------
Properties categories. These are used for investigating qualities of citations.
]]
local prop_cats = {
['foreign-lang-source'] = 'CS1 $1-fonte lian sira ($2)', -- |language= categories; $1 is foreign-language name, $2 is ISO639-1 code
['foreign-lang-source-2'] = 'CS1 fonte lian estranjeiru sira (ISO 639-2)|$1', -- |language= category; a cat for ISO639-2 languages; $1 is the ISO 639-2 code used as a sort key
['interproj-linked-name'] = 'CS1 naran sira ne\'ebé liga ba interprojetu sira|$1', -- any author, editor, etc that has an interproject link; $1 is interproject tag used as a sort key
['interwiki-linked-name'] = 'CS1 naran sira ne\'ebé iha ligasaun entre wiki|$1', -- any author, editor, etc that has an interwiki link; $1 is interwiki tag used as a sort key; yeilds to interproject
['local-lang-source'] = 'CS1 $1-fonte lian sira ($2)', -- |language= categories; $1 is local-language name, $2 is ISO639-1 code; not emitted when local_lang_cat_enable is false
['location-test'] = 'CS1 teste lokalizasaun',
['long-vol'] = 'CS1: valór volume naruk', -- probably temporary cat to identify scope of |volume= values longer than 4 characters
['script'] = 'CS1 uza letra lian $1 ($2)', -- |script-title=xx: has matching category; $1 is language name, $2 is language tag
['tracked-param'] = 'CS1 parametru ne\'ebé akompaña: $1', -- $1 is base (enumerators removed) parameter name
['unfit'] = 'CS1: URL ne\'ebé la apropriadu', -- |url-status=unfit or |url-status=usurped; used to be a maint cat
['vanc-accept'] = 'CS1:Vancouver nia naran sira ho aseitasaun', -- for |vauthors=/|veditors= with accept-as-written markup
['year-range-abbreviated'] = 'CS1: tinan ne\'ebé badak', -- probably temporary cat to identify scope of |date=, |year= values using YYYY–YY form
}
--[[-------------------< T I T L E _ T Y P E S >--------------------------------
Here we map a template's CitationClass to TitleType (default values for |type= parameter)
]]
local title_types = {
['AV-media-notes'] = 'Nota sira hosi mídia',
['document'] = 'Dokumentu',
['interview'] = 'Intervista',
['mailinglist'] = 'Lista mailing',
['map'] = 'Mapa',
['podcast'] = 'Podcast',
['pressrelease'] = 'Komunikadu imprensa',
['report'] = 'Relatóriu',
['speech'] = 'Diskursu',
['techreport'] = 'Relatóriu tékniku',
['thesis'] = 'Teze',
}
--[[--------------------------< B U I L D _ K N O W N _ F R E E _ D O I _ R E G I S T R A N T S _ T A B L E >--
build a table of doi registrants known to be free-to-read In a doi, the registrant ID is the series of digits
between the '10.' and the first '/': in doi 10.1100/sommat, 1100 is the registrant ID
see §3.2.2 DOI prefix of the Doi Handbook p. 43
https://www.doi.org/doi-handbook/DOI_Handbook_Final.pdf#page=43
]]
local function build_free_doi_registrants_table()
local registrants_t = {};
for _, v in ipairs ({
'1045', '1074', '1096', '1100', '1155', '1186', '1194', '1371', '1613', '1629', '1989', '1999', '2147', '2196', '3285', '3389', '3390', '3906',
'3748', '3814', '3847', '3897', '4061', '4089', '4103', '4172', '4175', '4230', '4236', '4239', '4240', '4249', '4251',
'4252', '4253', '4254', '4291', '4292', '4329', '4330', '4331', '5086', '5194', '5210', '5306', '5312', '5313', '5314',
'5315', '5316', '5317', '5318', '5319', '5320', '5321', '5334', '5402', '5409', '5410', '5411', '5412',
'5492', '5493', '5494', '5495', '5496', '5497', '5498', '5499', '5500', '5501', '5527', '5528', '5662',
'6064', '6219', '7167', '7217', '7287', '7482', '7490', '7554', '7717', '7759', '7766', '9778', '11131', '11569', '11647',
'11648', '12688', '12703', '12715', '12942', '12998', '13105', '14256', '14293', '14303', '15215', '15347', '15412', '15560', '16995',
'17645', '18637', '19080', '19173', '20944', '21037', '21105', '21468', '21767', '21425', '22261', '22323', '22459', '24105', '24196', '24966',
'26775', '30845', '32545', '35711', '35712', '35713', '35995', '36648', '37126', '37532', '37871', '47128',
'47622', '47959', '52437', '52975', '53288', '53347', '54081', '54947', '55667', '55914', '57009', '58647', '59081',
}) do
registrants_t[v] = true; -- build a k/v table of known free-to-read doi registrants
end
return registrants_t;
end
-- known free registrants identifiable by the doi suffix incipit
local extended_registrants_t = { -- doi suffix incipits are evaluated as lua patterns
['1002'] = {'aelm', 'leap', 'loe2%.', 'lol2%.'}, -- Advanced Electronic Materials, Learned Publishing, L&O e-Lectures, L&O Letters
['1016'] = {'j%.aace', 'j%.aed', 'j%.aiopen', 'j%.animal', 'j%.apsb', 'j%.addicn', -- AACE Endocrinology and Diabetes, AACE Endocrinology and Diabetes, AI Open, Animal, Acta Pharmaceutica Sinica B, Addiction Neuroscience
'j%.abrep', 'j%.gpb', 'j%.heliyon', 'j%.nlp', 'j%.patter', 'j%.proche', -- Addictive Behaviors Reports, Genomics, Proteomics & Bioinformatics after 2015, Heliyon, Natural Language Processing, Patterns, Procedia Chemistry
'j%.vgie', 'S1672-0229'}, -- VideoGIE, Genomics, Proteomics & Bioinformatics before 2015
['1017'] = {'apj%.', 'nlp', 'mdh', 'S15574660'}, -- Natural Language Processing Journal, Medical History, Asia Pacific Journal
['1046'] = {'j%.1365-8711', 'j%.1365-246x'}, -- MNRAS, GJI
['1021'] = {'acscentsci', 'acsomega'}, -- ACS Central Science, ACS Omega
['1093'] = {'mnras', 'mnrasl', 'gji', 'pnasnexus', 'rasti'}, -- MNRAS, MNRAS Letters, GJI, PNAS Nexus, RASTI
['1098'] = {'rsbm', 'rsob', 'rsos'}, -- Biographical Memoirs of Fellows of the Royal Society, Open Biology, Royal Society Open Science
['1099'] = {'acmi', 'mic', '00221287', 'mgen'}, -- Access Microbiology, Microbiology, Journal of General Microbiology, Microbial Genomics
['1107'] = {'S20569890', 'S20522525', 'S16005775', 'S24143146'}, -- Acta Crystallographica E, IUCrJ, Journal of Synchrotron Radiation, IUCrData
['1109'] = {'oa', 'oj'}, -- IEEE Open Access..., IEEE Open Journal...
['1111'] = {'aogs', 'j%.1365-2966', 'j%.1745-3933', 'j%.1365-246X'}, -- Acta Obstetricia et Gynecologica Scandinavica, MNRAS, MNRAS Letters, GJI
['1128'] = {'asmcr', 'jmbe', 'mbio', 'mra', 'spectrum', 'msphere', 'msystems'}, --ASM Case Reports, Journal of Microbiology & Biology Education, mBio, Microbiology Resource Announcements, Microbiology Spectrum, mSphere, mSystems
['1136'] = {'bmjopen'}, -- BMJ Open
['1140'] = {'epjc'}, -- European Physical Journal C
['1192'] = {'bjo'}, -- BJPsych Open
['1210'] = {'jendso','jcemcr'}, -- Journal of the Endocrine Society, JCEM Case Reports
['1215'] = {'21573689', '21573698'}, -- L&O Fluids
['1590'] = {'0102-3306'}, -- Acta Botanica Brasilica
['4171'] = {'dm','mag'}, -- Documenta Mathematica, EMS Magazine
['4319'] = {'lo%.', 'lol%.', 'lom%.'}, -- L&O, L&O e-Lectures, L&O Methods
['5852'] = {'ejt'}, -- European Journal of Taxonomy
['7155'] = {'jgaa'}, -- Journal of Graph Algorithms and Applications
['11158'] = {'saasp'}, -- Systematic and Applied Acarology Special Publications
['11646'] = {'megataxa', 'mesozoic'}, -- Megataxa, Mesozoic
['14231'] = {'ag'}, -- Algebraic Geometry
['15446'] = {'abc'}, -- Acta Biológica Colombiana
['17239'] = {'jowr'}, -- Journal of Writing Research
['22073'] = {'pja'}, -- Persian Journal of Acarology
['24310'] = {'abm'}, -- Acta Botanica Malacitana
['24425'] = {'agp'}, -- Acta Geologica Polonica
['35249'] = {'rche'}, -- Revista Chilena de Entomología
['37520'] = {'fi'}, -- Fossil Imprint
['53562'] = {'ajcb'} -- Asian Journal of Conservation Biology
}
--[[===================<< E R R O R M E S S A G I N G >>======================
]]
--[[----------< E R R O R M E S S A G E S U P P L E M E N T S >-------------
I18N for those messages that are supplemented with additional specific text that
describes the reason for the error
TODO: merge this with special_case_translations{}?
]]
local err_msg_supl = {
['char'] = 'karakter ne\'ebé la válidu', -- |isbn=, |sbn=
['check'] = 'checksum', -- |isbn=, |sbn=
empty_str = '(string mamuk)', -- empty unknown parameter check when cite has |=
['flag'] = 'bandeira', -- |archive-url=
['form'] = 'formuláriu ne\'ebé la válidu', -- |isbn=, |sbn=
['group'] = 'id grupu nian ne\'ebé la válidu', -- |isbn=
['initials'] = 'inisiál sira', -- Vancouver
['invalid language code'] = 'kódigu linguajen ne\'ebé la válidu', -- |script-<param>=
['journal'] = 'jornál', -- |bibcode=
['length'] = 'naruk', -- |isbn=, |bibcode=, |sbn=
['liveweb'] = 'liveweb', -- |archive-url=
['missing comma'] = 'vírgula ne\'ebé laiha', -- Vancouver
['missing prefix'] = 'prefiksu ne\'ebé laiha', -- |script-<param>=
['missing title part'] = 'parte títulu nian ne\'ebé laiha', -- |script-<param>=
['name'] = 'naran', -- Vancouver
['non-Latin char'] = 'karakter la\'ós-latín', -- Vancouver
['path'] = 'dalan', -- |archive-url=
['prefix'] = 'prefiksu ne\'ebé la válidu', -- |isbn=
['punctuation'] = 'pontuasaun', -- Vancouver
['save'] = 'komandu salva', -- |archive-url=
['suffix'] = 'sufiksu', -- Vancouver
['timestamp'] = 'karimbu tempu', -- |archive-url=
['unknown language code'] = 'kódigu lian deskoñesidu', -- |script-<param>=
['value'] = 'valór', -- |bibcode=
['year'] = 'tinan', -- |bibcode=
}
--[[--------------< E R R O R _ C O N D I T I O N S >---------------------------
Error condition table. This table has two sections: errors at the top, maintenance
at the bottom. Maint 'messaging' does not have a 'message' (message=nil)
The following contains a list of IDs for various error conditions defined in the
code. For each ID, we specify a text message to display, an error category to
include, and whether the error message should be wrapped as a hidden comment.
Anchor changes require identical changes to matching anchor in Help:CS1 errors
TODO: rename error_conditions{} to something more generic; create separate error
and maint tables inside that?
]]
local error_conditions = {
err_accessdate_missing_url = {
message = '<code class="cs1-code">|access-date=</code> presiza <code class="cs1-code">|url=</code>',
anchor = 'accessdate_missing_url',
category = 'Erru CS1: access-date nian lahó URL',
hidden = false
},
err_apostrophe_markup = {
message = 'Markup itáliku ka metan la permite iha: <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'apostrophe_markup',
category = 'Erru CS1: marka',
hidden = false
},
err_archive_date_missing_url = {
message = '<code class="cs1-code">|archive-date=</code> presiza <code class="cs1-code">|archive-url=</code>',
anchor = 'archive_date_missing_url',
category = 'Erru CS1: archive-url',
hidden = false
},
err_archive_date_url_ts_mismatch = {
message = '<code class="cs1-code">|archive-date=</code> / <code class="cs1-code">|archive-url=</code> tempu ne\'ebé la hanesan; $1 sujere',
anchor = 'archive_date_url_ts_mismatch',
category = 'Erru CS1: archive-url',
hidden = false
},
err_archive_missing_date = {
message = '<code class="cs1-code">|archive-url=</code> presiza <code class="cs1-code">|archive-date=</code>',
anchor = 'archive_missing_date',
category = 'Erru CS1: archive-url',
hidden = false
},
err_archive_missing_url = {
message = '<code class="cs1-code">|archive-url=</code> presiza <code class="cs1-code">|url=</code>',
anchor = 'archive_missing_url',
category = 'Erru CS1: archive-url',
hidden = false
},
err_archive_url = {
message = '<code class="cs1-code">|archive-url=</code> la forma: $1', -- $1 is error message detail
anchor = 'archive_url',
category = 'Erru CS1: archive-url',
hidden = false
},
err_arxiv_missing = {
message = '<code class="cs1-code">|arxiv=</code> presiza',
anchor = 'arxiv_missing',
category = 'Erru CS1: arXiv', -- same as bad arxiv
hidden = false
},
err_asintld_missing_asin = {
message = '<code class="cs1-code">|$1=</code> presiza <code class="cs1-code">|asin=</code>', -- $1 is parameter name
anchor = 'asintld_missing_asin',
category = 'Erru CS1: ASIN TLD',
hidden = false
},
err_bad_arxiv = {
message = 'Verifika valór <code class="cs1-code">|arxiv=</code>',
anchor = 'bad_arxiv',
category = 'Erru CS1: arXiv',
hidden = false
},
err_bad_asin = {
message = 'Verifika valór <code class="cs1-code">|asin=</code>',
anchor = 'bad_asin',
category ='Erru CS1: ASIN',
hidden = false
},
err_bad_asin_tld = {
message = 'Verifika valór <code class="cs1-code">|asin-tld=</code>e',
anchor = 'bad_asin_tld',
category ='Erru CS1: ASIN TLD',
hidden = false
},
err_bad_bibcode = {
message = 'Verifika <code class="cs1-code">|bibcode=</code> $1', -- $1 is error message detail
anchor = 'bad_bibcode',
category = 'Erru CS1: bibcode',
hidden = false
},
err_bad_biorxiv = {
message = 'Verifika valór <code class="cs1-code">|biorxiv=</code>',
anchor = 'bad_biorxiv',
category = 'Erru CS1: bioRxiv',
hidden = false
},
err_bad_citeseerx = {
message = 'Verifika valór <code class="cs1-code">|citeseerx=</code>',
anchor = 'bad_citeseerx',
category = 'Erru CS1: citeseerx',
hidden = false
},
err_bad_date = {
message = 'Verifika valór data nian iha: $1', -- $1 is a parameter name list
anchor = 'bad_date',
category = 'Erru CS1: data sira',
hidden = false
},
err_bad_doi = {
message = 'Verifika valór <code class="cs1-code">|doi=</code>',
anchor = 'bad_doi',
category = 'Erru CS1: DOI',
hidden = false
},
err_bad_hdl = {
message = 'Verifika valór <code class="cs1-code">|hdl=</code>',
anchor = 'bad_hdl',
category = 'Erru CS1: HDL',
hidden = false
},
err_bad_isbn = {
message = 'Verifika valór <code class="cs1-code">|isbn=</code>: $1', -- $1 is error message detail
anchor = 'bad_isbn',
category = 'Erru CS1: ISBN',
hidden = false
},
err_bad_ismn = {
message = 'Verifika valór <code class="cs1-code">|ismn=</code>',
anchor = 'bad_ismn',
category = 'Erru CS1: ISMN',
hidden = false
},
err_bad_issn = {
message = 'Verifika valór <code class="cs1-code">|$1issn=</code>', -- $1 is 'e' or '' for eissn or issn
anchor = 'bad_issn',
category = 'Erru CS1: ISSN',
hidden = false
},
err_bad_jfm = {
message = 'Verifika valór <code class="cs1-code">|jfm=</code>',
anchor = 'bad_jfm',
category = 'Erru CS1: JFM',
hidden = false
},
err_bad_jstor = {
message = 'Verifika valór <code class="cs1-code">|jstor=</code>',
anchor = 'bad_jstor',
category = 'Erru CS1: JSTOR',
hidden = false
},
err_bad_lccn = {
message = 'Verifika valór <code class="cs1-code">|lccn=</code>',
anchor = 'bad_lccn',
category = 'Erru CS1: LCCN',
hidden = false
},
err_bad_medrxiv = {
message = 'Verifika valór <code class="cs1-code">|medrxiv=</code>',
anchor = 'bad_medrxiv',
category = 'Erru CS1: medRxiv',
hidden = false
},
err_bad_mr = {
message = 'Verifika valór <code class="cs1-code">|mr=</code>',
anchor = 'bad_mr',
category = 'Erru CS1: MR',
hidden = false
},
err_bad_oclc = {
message = 'Verifika valór <code class="cs1-code">|oclc=</code>',
anchor = 'bad_oclc',
category = 'Erru CS1: OCLC',
hidden = false
},
err_bad_ol = {
message = 'Verifika valór <code class="cs1-code">|ol=</code>',
anchor = 'bad_ol',
category = 'Erru CS1: OL',
hidden = false
},
err_bad_osti = {
message = 'Verifika valór <code class="cs1-code">|osti=</code>',
anchor = 'bad_osti',
category = 'Erru CS1: OSTI',
hidden = false
},
err_bad_paramlink = { -- for |title-link=, |author/editor/translator-link=, |series-link=, |episode-link=
message = 'Verifika valór <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'bad_paramlink',
category = 'Erru CS1: parameter link',
hidden = false
},
err_bad_pmc = {
message = 'Verifika valór <code class="cs1-code">|pmc=</code>',
anchor = 'bad_pmc',
category = 'Erru CS1: PMC',
hidden = false
},
err_bad_pmid = {
message = 'Verifika valór <code class="cs1-code">|pmid=</code>',
anchor = 'bad_pmid',
category = 'Erru CS1: PMID',
hidden = false
},
err_bad_rfc = {
message = 'Verifika valór <code class="cs1-code">|rfc=</code>',
anchor = 'bad_rfc',
category = 'Erru CS1: RFC',
hidden = false
},
err_bad_s2cid = {
message = 'Verifika valór <code class="cs1-code">|s2cid=</code>',
anchor = 'bad_s2cid',
category = 'Erru CS1: S2CID',
hidden = false
},
err_bad_sbn = {
message = 'Verifika valór <code class="cs1-code">|sbn=</code>: $1', -- $1 is error message detail
anchor = 'bad_sbn',
category = 'Erru CS1: SBN',
hidden = false
},
err_bad_ssrn = {
message = 'Verifika valór <code class="cs1-code">|ssrn=</code>',
anchor = 'bad_ssrn',
category = 'Erru CS1: SSRN',
hidden = false
},
err_bad_url = {
message = 'Verifika valór $1', -- $1 is parameter name
anchor = 'bad_url',
category = 'Erru CS1: URL',
hidden = false
},
err_bad_usenet_id = {
message = 'Verifika valór <code class="cs1-code">|message-id=</code> value',
anchor = 'bad_message_id',
category = 'Erru CS1: message-id',
hidden = false
},
err_bad_zbl = {
message = 'Verifika valór <code class="cs1-code">|zbl=</code> value',
anchor = 'bad_zbl',
category = 'Erru CS1: Zbl',
hidden = false
},
err_bare_url_missing_title = {
message = '$1 missing title', -- $1 is parameter name
anchor = 'bare_url_missing_title',
category = 'Erru CS1: URL mamuk',
hidden = false
},
err_biorxiv_missing = {
message = '<code class="cs1-code">|biorxiv=</code> presija',
anchor = 'biorxiv_missing',
category = 'Erru CS1: bioRxiv', -- same as bad bioRxiv
hidden = false
},
err_chapter_ignored = {
message = '<code class="cs1-code">|$1=</code> ignora', -- $1 is parameter name
anchor = 'chapter_ignored',
category = 'Erru CS1: kapítulu ne\'ebé ignora',
hidden = false
},
err_citation_missing_title = {
message = 'Missing or empty <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'citation_missing_title',
category = 'Erru CS1: missing title',
hidden = false
},
err_citeseerx_missing = {
message = '<code class="cs1-code">|citeseerx=</code> presija',
anchor = 'citeseerx_missing',
category = 'Erru CS1: citeseerx', -- same as bad citeseerx
hidden = false
},
err_cite_web_url = { -- this error applies to cite web and to cite podcast
message = 'La iha ka mamuk <code class="cs1-code">|url=</code>',
anchor = 'cite_web_url',
category = 'Erru CS1: presiza URL',
hidden = false
},
err_class_ignored = {
message = '<code class="cs1-code">|class=</code> ignora',
anchor = 'class_ignored',
category = 'Erru CS1: class',
hidden = false
},
err_contributor_ignored = {
message = '<code class="cs1-code">|contributor=</code> ignora',
anchor = 'contributor_ignored',
category = 'Erru CS1: contributor',
hidden = false
},
err_contributor_missing_required_param = {
message = '<code class="cs1-code">|contributor=</code> presiza <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'contributor_missing_required_param',
category = 'Erru CS1: contributor',
hidden = false
},
err_deprecated_params = {
message = 'Cite uza parametru ne\'ebé la uza ona <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'deprecated_params',
category = 'Erru CS1: parámetru sira ne\'ebé la uza ona',
hidden = false
},
err_disp_name = {
message = 'La válidu <code class="cs1-code">|$1=$2</code>', -- $1 is parameter name; $2 is the assigned value
anchor = 'disp_name',
category = 'Erru CS1: display-names',
hidden = false,
},
err_doibroken_missing_doi = {
message = '<code class="cs1-code">|$1=</code> presiza <code class="cs1-code">|doi=</code>', -- $1 is parameter name
anchor = 'doibroken_missing_doi',
category = 'Erru CS1: DOI',
hidden = false
},
err_embargo_missing_pmc = {
message = '<code class="cs1-code">|$1=</code> presiza <code class="cs1-code">|pmc=</code>', -- $1 is parameter name
anchor = 'embargo_missing_pmc',
category = 'Erru CS1: PMC embargo',
hidden = false
},
err_empty_citation = {
message = 'Sitasaun mamuk',
anchor = 'empty_citation',
category = 'Erru CS1: sitasaun mamuk',
hidden = false
},
err_etal = {
message = 'Uzu esplísitu husi et al. iha: <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'explicit_et_al',
category = 'Erru CS1: uza esplísitu husi et al.',
hidden = false
},
err_extra_text_edition = {
message = '<code class="cs1-code">|edition=</code> iha testu estra',
anchor = 'extra_text_edition',
category = 'Erru CS1: testu estra: edition',
hidden = false,
},
err_extra_text_issue = {
message = '<code class="cs1-code">|$1=</code> iha testu estra', -- $1 is parameter name
anchor = 'extra_text_issue',
category = 'Erru CS1: testu estra: issue',
hidden = false,
},
err_extra_text_pages = {
message = '<code class="cs1-code">|$1=</code> iha testu estra', -- $1 is parameter name
anchor = 'extra_text_pages',
category = 'Erru CS1: testu estra: pages',
hidden = false,
},
err_extra_text_volume = {
message = '<code class="cs1-code">|$1=</code> iha testu estra', -- $1 is parameter name
anchor = 'extra_text_volume',
category = 'Erru CS1: testu estra: volume',
hidden = false,
},
err_first_missing_last = {
message = '<code class="cs1-code">|$1=</code> laiha <code class="cs1-code">|$2=</code>', -- $1 is first alias, $2 is matching last alias
anchor = 'first_missing_last',
category = 'Erru CS1: naran ne\'ebé lakon', -- author, contributor, editor, interviewer, translator
hidden = false
},
err_format_missing_url = {
message = '<code class="cs1-code">|$1=</code> presiza <code class="cs1-code">|$2=</code>', -- $1 is format parameter $2 is url parameter
anchor = 'format_missing_url',
category = 'Erru CS1: formatu lahó URL',
hidden = false
},
err_generic_name = {
message = '<code class="cs1-code">|$1=</code> iha naran jenériku', -- $1 is parameter name
anchor = 'generic_name',
category = 'Erru CS1: naran jenériku',
hidden = false,
},
err_generic_title = {
message = 'Cite uza títulu jenériku',
anchor = 'generic_title',
category = 'Erru CS1: títulu jenériku',
hidden = false,
},
err_invalid_isbn_date = {
message = 'ISBN / Data inkompatibilidade',
anchor = 'invalid_isbn_date',
category = 'Erru CS1: ISBN data',
hidden = true
},
err_invalid_param_val = {
message = 'La válidu <code class="cs1-code">|$1=$2</code>', -- $1 is parameter name $2 is parameter value
anchor = 'invalid_param_val',
category = 'Erru CS1: valór parámetru ne\'ebé la válidu',
hidden = false
},
err_invisible_char = {
message = '$1 iha $2 iha pozisaun $3', -- $1 is invisible char $2 is parameter name $3 is position number
anchor = 'invisible_char',
category = 'Erru CS1: karakter invizível sira',
hidden = false
},
err_medrxiv_missing = {
message = '<code class="cs1-code">|medrxiv=</code> presiza',
anchor = 'medrxiv_missing',
category = 'Erru CS1: medRxiv', -- same as bad medRxiv
hidden = false
},
err_missing_name = {
message = 'La iha <code class="cs1-code">|$1$2=</code>', -- $1 is modified NameList; $2 is enumerator
anchor = 'missing_name',
category = 'Erru CS1: naran ne\'ebé lakon', -- author, contributor, editor, interviewer, translator
hidden = false
},
err_missing_periodical = {
message = 'Cite $1 presiza <code class="cs1-code">|$2=</code>', -- $1 is cs1 template name; $2 is canonical periodical parameter name for cite $1
anchor = 'missing_periodical',
category = 'Erru CS1: periódiku ne\'ebé laiha',
hidden = false
},
err_missing_pipe = {
message = 'Lakon kanu iha laran: <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'missing_pipe',
category = 'Erru CS1: lakon kanu',
hidden = false
},
err_missing_publisher = {
message = 'Cite $1 presiza <code class="cs1-code">|$2=</code>', -- $1 is cs1 template name; $2 is canonical publisher parameter name for cite $1
anchor = 'missing_publisher',
category = 'Erru CS1: publisher ne\'ebé lakon',
hidden = false
},
err_numeric_names = {
message = '<code class="cs1-code">|$1=</code> iha naran numériku', -- $1 is parameter name',
anchor = 'numeric_names',
category = 'Erru CS1: naran numériku',
hidden = false,
},
err_param_access_requires_param = {
message = '<code class="cs1-code">|$1-access=</code> presiza <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'param_access_requires_param',
category = 'Erru CS1: param-access',
hidden = false
},
err_param_has_ext_link = {
message = 'Ligasaun esternu iha <code class="cs1-code">$1</code>', -- $1 is parameter name
anchor = 'param_has_ext_link',
category = 'Erru CS1: ligasaun esternu sira',
hidden = false
},
err_param_has_twl_url = {
message = 'Ligasaun Biblioteka Wikipedia iha <code class="cs1-code">$1</code>', -- $1 is parameter name
anchor = 'param_has_twl_url',
category = 'Erru CS1: URL',
hidden = false
},
err_parameter_ignored = {
message = 'Parametru deskoñesidu <code class="cs1-code">|$1=</code> ignora', -- $1 is parameter name
anchor = 'parameter_ignored',
category = 'Erru CS1: parametru ne\'ebé la suporta',
hidden = false
},
err_parameter_ignored_suggest = {
message = 'Parametru deskoñesidu <code class="cs1-code">|$1=</code> ignora (<code class="cs1-code">|$2=</code> sujere)', -- $1 is unknown parameter $2 is suggested parameter name
anchor = 'parameter_ignored_suggest',
category = 'Erru CS1: parametru ne\'ebé la suporta',
hidden = false
},
err_periodical_ignored = {
message = '<code class="cs1-code">|$1=</code> ignora', -- $1 is parameter name
anchor = 'periodical_ignored',
category = 'Erru CS1: periódiku ignoradu',
hidden = false
},
err_redundant_parameters = {
message = 'Liu ida hosi $1 ne\'ebé espesifika ona', -- $1 is error message detail
anchor = 'redundant_parameters',
category = 'Erru CS1: parámetru redundante',
hidden = false
},
err_script_parameter = {
message = 'La válidu <code class="cs1-code">|$1=</code>: $2', -- $1 is parameter name $2 is script language code or error detail
anchor = 'script_parameter',
category = 'Erru CS1: parametru sira skript nian',
hidden = false
},
err_ssrn_missing = {
message = '<code class="cs1-code">|ssrn=</code> presiza',
anchor = 'ssrn_missing',
category = 'Erru CS1: SSRN',
hidden = false
},
err_text_ignored = {
message = 'Testu "$1" ignora', -- $1 is ignored text
anchor = 'text_ignored',
category = 'Erru CS1: parametru ne\'ebé la rekoñese',
hidden = false
},
err_trans_missing_title = {
message = '<code class="cs1-code">|trans-$1=</code> presiza <code class="cs1-code">|$1=</code> ka <code class="cs1-code">|script-$1=</code>', -- $1 is base parameter name
anchor = 'trans_missing_title',
category = 'Erru CS1: títulu ne\'ebé tradús',
hidden = false
},
err_param_unknown_empty = {
message = 'Cite iha parametru deskoñesidu mamuk$1: $2', -- $1 is 's' or empty space; $2 is emty unknown param list
anchor = 'param_unknown_empty',
category = 'Erru CS1: mamuk parametru deskoñesidu sira',
hidden = false
},
err_vancouver = {
message = 'Erru estilu Vancouver: $1 iha naran $2', -- $1 is error detail, $2 is the nth name
anchor = 'vancouver',
category = 'Erru CS1: Estilu Vancouver',
hidden = false
},
err_wikilink_in_url = {
message = 'Konflitu URL–wikilink', -- uses ndash
anchor = 'wikilink_in_url',
category = 'Erru CS1: konflitu URL–wikilink', -- uses ndash
hidden = false
},
--[[--------------------------< M A I N T >-------------------------------------
maint messages do not have a message (message = nil); otherwise the structure
is the same as error messages
]]
maint_archive_origin = {
message = nil,
anchor = 'archive_origin',
category = 'Manutensaun CS1: orijen arkivu nian',
hidden = true,
},
maint_archived_copy = {
message = nil,
anchor = 'archived_copy',
category = 'Manutensaun CS1: archived copy as title',
hidden = true,
},
maint_bibcode = {
message = nil,
anchor = 'bibcode',
category = 'Manutensaun CS1: bibcode',
hidden = true,
},
maint_location_no_publisher = { -- cite book, conference, encyclopedia; citation as book cite or encyclopedia cite
message = nil,
anchor = 'location_no_publisher',
category = 'Manutensaun CS1: location missing publisher',
hidden = true,
},
maint_bot_unknown = {
message = nil,
anchor = 'bot:_unknown',
category = 'Manutensaun CS1: bot: original URL status unknown',
hidden = true,
},
maint_date_auto_xlated = { -- date auto-translation not supported by en.wiki
message = nil,
anchor = 'date_auto_xlated',
category = 'Manutensaun CS1: date auto-translated',
hidden = true,
},
maint_date_format = {
message = nil,
anchor = 'date_format',
category = 'Manutensaun CS1: date format',
hidden = true,
},
maint_date_year = {
message = nil,
anchor = 'date_year',
category = 'Manutensaun CS1: date and year',
hidden = true,
},
maint_deprecated_archive = {
message = nil,
anchor = 'deprecated_archive',
category = 'Manutensaun CS1: deprecated archival service',
hidden = true,
},
maint_doi_ignore = {
message = nil,
anchor = 'doi_ignore',
category = 'Manutensaun CS1: ignored DOI errors',
hidden = true,
},
maint_doi_inactive = {
message = nil,
anchor = 'doi_inactive',
category = 'Manutensaun CS1: DOI inactive',
hidden = true,
},
maint_doi_inactive_dated = {
message = nil,
anchor = 'doi_inactive_dated',
category = 'Manutensaun CS1: DOI inactive as of $2$3$1', -- $1 is year, $2 is month-name or empty string, $3 is space or empty string
hidden = true,
},
maint_doi_unflagged_free = {
message = nil,
anchor = 'doi_unflagged_free',
category = 'Manutensaun CS1: unflagged free DOI',
hidden = true,
},
maint_extra_punct = {
message = nil,
anchor = 'extra_punct',
category = 'Manutensaun CS1: extra punctuation',
hidden = true,
},
maint_id_limit_load_fail = { -- applies to all cs1|2 templates on a page;
message = nil, -- maint message (category link) never emitted
anchor = 'id_limit_load_fail',
category = 'Manutensaun CS1: ID limit load fail',
hidden = true,
},
maint_isbn_ignore = {
message = nil,
anchor = 'ignore_isbn_err',
category = 'Manutensaun CS1: ignored ISBN errors',
hidden = true,
},
maint_issn_ignore = {
message = nil,
anchor = 'ignore_issn',
category = 'Manutensaun CS1: ignored ISSN errors',
hidden = true,
},
maint_jfm_format = {
message = nil,
anchor = 'jfm_format',
category = 'Manutensaun CS1: JFM format',
hidden = true,
},
maint_location = {
message = nil,
anchor = 'location',
category = 'Manutensaun CS1: location',
hidden = true,
},
maint_missing_class = {
message = nil,
anchor = 'missing_class',
category = 'Manutensaun CS1: missing class',
hidden = true,
},
maint_mr_format = {
message = nil,
anchor = 'mr_format',
category = 'Manutensaun CS1: MR format',
hidden = true,
},
maint_mult_names = {
message = nil,
anchor = 'mult_names',
category = 'Manutensaun CS1: multiple names: $1', -- $1 is '<name>s list'; gets value from special_case_translation table
hidden = true,
},
maint_numeric_names = {
message = nil,
anchor = 'numeric_names',
category = 'Manutensaun CS1: numeric names: $1', -- $1 is '<name>s list'; gets value from special_case_translation table
hidden = true,
},
maint_others = {
message = nil,
anchor = 'others',
category = 'Manutensaun CS1: others',
hidden = true,
},
maint_others_avm = {
message = nil,
anchor = 'others_avm',
category = 'Manutensaun CS1: others in cite AV media (notes)',
hidden = true,
},
maint_overridden_setting = {
message = nil,
anchor = 'overridden',
category = 'Manutensaun CS1: overridden setting',
hidden = true,
},
maint_page_art_num = {
message = nil,
anchor = 'page_art_num',
category = 'Manutensaun CS1: article number as page number',
hidden = true,
},
maint_pmc_embargo = {
message = nil,
anchor = 'embargo',
category = 'Manutensaun CS1: PMC embargo expired',
hidden = true,
},
maint_pmc_format = {
message = nil,
anchor = 'pmc_format',
category = 'Manutensaun CS1: PMC format',
hidden = true,
},
maint_postscript = {
message = nil,
anchor = 'postscript',
category = 'Manutensaun CS1: postscript',
hidden = true,
},
maint_publisher_location = {
message = nil,
anchor = 'publisher_location',
category = 'Manutensaun CS1: publisher location',
hidden = true,
},
maint_ref_duplicates_default = {
message = nil,
anchor = 'ref_default',
category = 'Manutensaun CS1: ref duplicates default',
hidden = true,
},
maint_shortened_archive_url = {
message = nil,
anchor = 'shortened_archive_url',
category = 'Manutensaun CS1: shortened archive url',
hidden = true,
},
maint_unknown_lang = {
message = nil,
anchor = 'unknown_lang',
category = 'Manutensaun CS1: unrecognized language',
hidden = true,
},
maint_untitled = {
message = nil,
anchor = 'untitled',
category = 'Manutensaun CS1: untitled periodical',
hidden = true,
},
maint_url_status = {
message = nil,
anchor = 'url_status',
category = 'Manutensaun CS1: url-status',
hidden = true,
},
maint_work_isbn = {
message = nil,
anchor = 'work_isbn',
category = 'Manutensaun CS1: work parameter with ISBN',
hidden = true,
},
maint_year= {
message = nil,
anchor = 'year',
category = 'Manutensaun CS1: year',
hidden = true,
},
maint_zbl = {
message = nil,
anchor = 'zbl',
category = 'Manutensaun CS1: Zbl',
hidden = true,
},
}
--[[--------------------------< I D _ L I M I T S _ D A T A _ T >----------------------------------------------
fetch id limits for certain identifiers from c:Data:CS1/Identifier limits.tab. This source is a json tabular
data file maintained at wikipedia commons. Convert the json format to a table of k/v pairs.
The values from <id_limits_data_t> are used to set handle.id_limit.
From 2025-02-21, MediaWiki is broken. Use this link to edit the tablular data file:
https://commons.wikimedia.org/w/index.php?title=Data:CS1/Identifier_limits.tab&action=edit
See Phab:T389105
]]
local id_limits_data_t = {};
local use_commons_data = true; -- set to false if your wiki does not have access to mediawiki commons; then,
if false == use_commons_data then -- update this table from https://commons.wikimedia.org/wiki/Data:CS1/Identifier_limits.tab; last update: 2025-02-21
id_limits_data_t = {['OCLC'] = 10450000000, ['OSTI'] = 23010000, ['PMC'] = 11900000, ['PMID'] = 40400000, ['RFC'] = 9300, ['SSRN'] = 5200000, ['S2CID'] = 276000000}; -- this table must be maintained locally
else -- here for wikis that do have access to mediawiki commons
local load_fail_limit = 99999999999; -- very high number to avoid error messages on load failure
id_limits_data_t = {['OCLC'] = load_fail_limit, ['OSTI'] = load_fail_limit, ['PMC'] = load_fail_limit, ['PMID'] = load_fail_limit, ['RFC'] = load_fail_limit, ['SSRN'] = load_fail_limit, ['S2CID'] = load_fail_limit};
local id_limits_data_load_fail = false; -- flag; assume that we will be successful when loading json id limit tabular data
if mw.ext.data == nil then
id_limits_data_load_fail = true; -- safeguard against Lua errors if mw.ext.data is not available for some reason
else
local tab_data_t = mw.ext.data.get ('CS1/Identifier limits.tab'); -- attempt to load the tabular data from commons into <tab_data_t>
if false == tab_data_t then -- undocumented 'feature': mw.ext.data.get() sometimes returns false
id_limits_data_load_fail = true; -- set the flag so that Module:Citation/CS1 can create an unannotated maint category
else
for _, limit_t in ipairs (tab_data_t.data) do -- overwrite default <load_fail_limit> values from the data table in the tabular data
id_limits_data_t[limit_t[1]] = limit_t[2]; -- <limit[1]> is identifier; <limit[2]> is upper limit for that identifier
end
end
end
end
--[[--------------------------< I D _ H A N D L E R S >--------------------------------------------------------
The following contains a list of values for various defined identifiers. For each
identifier we specify a variety of information necessary to properly render the
identifier in the citation.
parameters: a list of parameter aliases for this identifier; first in the list is the canonical form
link: Wikipedia article name
redirect: a local redirect to a local Wikipedia article name; at en.wiki, 'ISBN (identifier)' is a redirect to 'International Standard Book Number'
q: Wikidata q number for the identifier
label: the label preceding the identifier; label is linked to a Wikipedia article (in this order):
redirect from id_handlers['<id>'].redirect when use_identifier_redirects is true
Wikidata-supplied article name for the local wiki from id_handlers['<id>'].q
local article name from id_handlers['<id>'].link
prefix: the first part of a URL that will be concatenated with a second part which usually contains the identifier
suffix: optional third part to be added after the identifier
encode: true if URI should be percent-encoded; otherwise false
COinS: identifier link or keyword for use in COinS:
for identifiers registered at info-uri.info use: info:.... where '...' is the appropriate identifier label
for identifiers that have COinS keywords, use the keyword: rft.isbn, rft.issn, rft.eissn
for |asin= and |ol=, which require assembly, use the keyword: url
for others make a URL using the value in prefix/suffix and #label, use the keyword: pre (not checked; any text other than 'info', 'rft', or 'url' works here)
set to nil to leave the identifier out of the COinS
separator: character or text between label and the identifier in the rendered citation
id_limit: for those identifiers with established limits, this property holds the upper limit
access: use this parameter to set the access level for all instances of this identifier.
the value must be a valid access level for an identifier (see ['id-access'] in this file).
custom_access: to enable custom access level for an identifier, set this parameter
to the parameter that should control it (normally 'id-access')
]]
local id_handlers = {
['ARXIV'] = {
parameters = {'arxiv', 'eprint'},
link = 'arXiv',
redirect = 'arXiv (identifier)',
q = 'Q118398',
label = 'arXiv',
prefix = 'https://arxiv.org/abs/',
encode = false,
COinS = 'info:arxiv',
separator = ':',
access = 'free', -- free to read
},
['ASIN'] = {
parameters = { 'asin', 'ASIN' },
link = 'Amazon Standard Identification Number',
redirect = 'ASIN (identifier)',
q = 'Q1753278',
label = 'ASIN',
prefix = 'https://www.amazon.',
COinS = 'url',
separator = ' ',
encode = false;
},
['BIBCODE'] = {
parameters = {'bibcode'},
link = 'Bibcode',
redirect = 'Bibcode (identifier)',
q = 'Q25754',
label = 'Bibcode',
prefix = 'https://ui.adsabs.harvard.edu/abs/',
encode = false,
COinS = 'info:bibcode',
separator = ':',
custom_access = 'bibcode-access',
},
['BIORXIV'] = {
parameters = {'biorxiv'},
link = 'bioRxiv',
redirect = 'bioRxiv (identifier)',
q = 'Q19835482',
label = 'bioRxiv',
prefix = 'https://doi.org/',
COinS = 'pre', -- use prefix value
access = 'free', -- free to read
encode = true,
separator = ' ',
},
['CITESEERX'] = {
parameters = {'citeseerx'},
link = 'CiteSeerX',
redirect = 'CiteSeerX (identifier)',
q = 'Q2715061',
label = 'CiteSeerX',
prefix = 'https://citeseerx.ist.psu.edu/viewdoc/summary?doi=',
COinS = 'pre', -- use prefix value
access = 'free', -- free to read
encode = true,
separator = ' ',
},
['DOI'] = { -- Used by InternetArchiveBot
parameters = { 'doi', 'DOI'},
link = 'Digital object identifier',
redirect = 'doi (identifier)',
q = 'Q25670',
label = 'doi',
prefix = 'https://doi.org/',
COinS = 'info:doi',
separator = ':',
encode = true,
custom_access = 'doi-access',
},
['EISSN'] = {
parameters = {'eissn', 'EISSN'},
link = 'International Standard Serial Number#Electronic ISSN',
redirect = 'eISSN (identifier)',
q = 'Q46339674',
label = 'eISSN',
prefix = 'https://search.worldcat.org/issn/',
COinS = 'rft.eissn',
encode = false,
separator = ' ',
},
['HDL'] = {
parameters = { 'hdl', 'HDL' },
link = 'Handle System',
redirect = 'hdl (identifier)',
q = 'Q3126718',
label = 'hdl',
prefix = 'https://hdl.handle.net/',
COinS = 'info:hdl',
separator = ':',
encode = true,
custom_access = 'hdl-access',
},
['ISBN'] = { -- Used by InternetArchiveBot
parameters = {'isbn', 'ISBN'},
link = 'International Standard Book Number',
redirect = 'ISBN (identifier)',
q = 'Q33057',
label = 'ISBN',
prefix = 'Special:BookSources/',
COinS = 'rft.isbn',
separator = ' ',
},
['ISMN'] = {
parameters = {'ismn', 'ISMN'},
link = 'International Standard Music Number',
redirect = 'ISMN (identifier)',
q = 'Q1666938',
label = 'ISMN',
prefix = '', -- not currently used;
COinS = nil, -- nil because we can't use pre or rft or info:
separator = ' ',
},
['ISSN'] = {
parameters = {'issn', 'ISSN'},
link = 'International Standard Serial Number',
redirect = 'ISSN (identifier)',
q = 'Q131276',
label = 'ISSN',
prefix = 'https://search.worldcat.org/issn/',
COinS = 'rft.issn',
encode = false,
separator = ' ',
},
['JFM'] = {
parameters = {'jfm', 'JFM'},
link = 'Jahrbuch über die Fortschritte der Mathematik',
redirect = 'JFM (identifier)',
q = '',
label = 'JFM',
prefix = 'https://zbmath.org/?format=complete&q=an:',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
},
['JSTOR'] = {
parameters = {'jstor', 'JSTOR'},
link = 'JSTOR',
redirect = 'JSTOR (identifier)',
q = 'Q1420342',
label = 'JSTOR',
prefix = 'https://www.jstor.org/stable/',
COinS = 'pre', -- use prefix value
encode = false,
separator = ' ',
custom_access = 'jstor-access',
},
['LCCN'] = {
parameters = {'lccn', 'LCCN'},
link = 'Library of Congress Control Number',
redirect = 'LCCN (identifier)',
q = 'Q620946',
label = 'LCCN',
prefix = 'https://lccn.loc.gov/',
COinS = 'info:lccn',
encode = false,
separator = ' ',
},
['MEDRXIV'] = {
parameters = {'medrxiv'},
link = 'medRxiv',
redirect = 'medRxiv (identifier)',
q = 'Q58465838',
label = 'medRxiv',
prefix = 'https://www.medrxiv.org/content/',
COinS = 'pre', -- use prefix value
access = 'free', -- free to read
encode = false,
separator = ' ',
},
['MR'] = {
parameters = {'mr', 'MR'},
link = 'Mathematical Reviews',
redirect = 'MR (identifier)',
q = 'Q211172',
label = 'MR',
prefix = 'https://mathscinet.ams.org/mathscinet-getitem?mr=',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
},
['OCLC'] = {
parameters = {'oclc', 'OCLC'},
link = 'OCLC',
redirect = 'OCLC (identifier)',
q = 'Q190593',
label = 'OCLC',
prefix = 'https://search.worldcat.org/oclc/',
COinS = 'info:oclcnum',
encode = true,
separator = ' ',
id_limit = id_limits_data_t.OCLC or 0,
},
['OL'] = {
parameters = { 'ol', 'OL' },
link = 'Open Library',
redirect = 'OL (identifier)',
q = 'Q1201876',
label = 'OL',
prefix = 'https://openlibrary.org/',
COinS = 'url',
separator = ' ',
encode = true,
custom_access = 'ol-access',
},
['OSTI'] = {
parameters = {'osti', 'OSTI'},
link = 'Office of Scientific and Technical Information',
redirect = 'OSTI (identifier)',
q = 'Q2015776',
label = 'OSTI',
prefix = 'https://www.osti.gov/biblio/',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
id_limit = id_limits_data_t.OSTI or 0,
custom_access = 'osti-access',
},
['PMC'] = {
parameters = {'pmc', 'PMC'},
link = 'PubMed Central',
redirect = 'PMC (identifier)',
q = 'Q229883',
label = 'PMC',
prefix = 'https://www.ncbi.nlm.nih.gov/pmc/articles/PMC',
suffix = '',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
id_limit = id_limits_data_t.PMC or 0,
access = 'free', -- free to read
},
['PMID'] = {
parameters = {'pmid', 'PMID'},
link = 'PubMed Identifier',
redirect = 'PMID (identifier)',
q = 'Q2082879',
label = 'PMID',
prefix = 'https://pubmed.ncbi.nlm.nih.gov/',
COinS = 'info:pmid',
encode = false,
separator = ' ',
id_limit = id_limits_data_t.PMID or 0,
},
['RFC'] = {
parameters = {'rfc', 'RFC'},
link = 'Request for Comments',
redirect = 'RFC (identifier)',
q = 'Q212971',
label = 'RFC',
prefix = 'https://tools.ietf.org/html/rfc',
COinS = 'pre', -- use prefix value
encode = false,
separator = ' ',
id_limit = id_limits_data_t.RFC or 0,
access = 'free', -- free to read
},
['SBN'] = {
parameters = {'sbn', 'SBN'},
link = 'Standard Book Number', -- redirect to International_Standard_Book_Number#History
redirect = 'SBN (identifier)',
label = 'SBN',
prefix = 'Special:BookSources/0-', -- prefix has leading zero necessary to make 9-digit sbn a 10-digit isbn
COinS = nil, -- nil because we can't use pre or rft or info:
separator = ' ',
},
['SSRN'] = {
parameters = {'ssrn', 'SSRN'},
link = 'Social Science Research Network',
redirect = 'SSRN (identifier)',
q = 'Q7550801',
label = 'SSRN',
prefix = 'https://papers.ssrn.com/sol3/papers.cfm?abstract_id=',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
id_limit = id_limits_data_t.SSRN or 0,
custom_access = 'ssrn-access',
},
['S2CID'] = {
parameters = {'s2cid', 'S2CID'},
link = 'Semantic Scholar',
redirect = 'S2CID (identifier)',
q = 'Q22908627',
label = 'S2CID',
prefix = 'https://api.semanticscholar.org/CorpusID:',
COinS = 'pre', -- use prefix value
encode = false,
separator = ' ',
id_limit = id_limits_data_t.S2CID or 0,
custom_access = 's2cid-access',
},
['USENETID'] = {
parameters = {'message-id'},
link = 'Usenet',
redirect = 'Usenet (identifier)',
q = 'Q193162',
label = 'Usenet:',
prefix = 'news:',
encode = false,
COinS = 'pre', -- use prefix value
separator = ' ',
},
['ZBL'] = {
parameters = {'zbl', 'ZBL' },
link = 'Zentralblatt MATH',
redirect = 'Zbl (identifier)',
q = 'Q190269',
label = 'Zbl',
prefix = 'https://zbmath.org/?format=complete&q=an:',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
},
}
--[[--------------------------< E X P O R T S >---------------------------------
]]
return {
use_identifier_redirects = use_identifier_redirects, -- booleans defined in the settings at the top of this module
local_lang_cat_enable = local_lang_cat_enable,
date_name_auto_xlate_enable = date_name_auto_xlate_enable,
date_digit_auto_xlate_enable = date_digit_auto_xlate_enable,
enable_sort_keys = enable_sort_keys,
suppress_archive_today_urls = suppress_archive_today_urls,
-- tables and variables created when this module is loaded
dependencies_t = dependencies_t, -- used to suppress parameters dependent on url-holding parameters holding archive.today urls
enum_needs_xlation = '1' ~= date_names.xlate_digits['1'], -- to avoid unnecessary enumerator translation
global_df = get_date_format (), -- this line can be replaced with "global_df = 'dmy-all'," to have all dates auto translated to dmy format.
global_cs1_config_t = global_cs1_config_t, -- global settings from {{cs1 config}}
id_limits_data_load_fail = id_limits_data_load_fail, -- true when commons tabular identifier-limit data fails to load
known_free_doi_registrants_t = build_free_doi_registrants_table(),
punct_skip = build_skip_table (punct_skip, punct_meta_params),
url_skip = build_skip_table (url_skip, url_meta_params),
archive_today_tlds_t = {['today'] = true, ['ph'] = true, ['is'] = true, ['md'] = true, ['li'] = true, ['fo'] = true, ['vn'] = true}; -- used by is_archive_today_url()
name_space_sort_keys = name_space_sort_keys,
aliases = aliases,
special_case_translation = special_case_translation,
date_names = date_names,
err_msg_supl = err_msg_supl,
error_conditions = error_conditions,
editor_markup_patterns = editor_markup_patterns,
et_al_patterns = et_al_patterns,
extended_registrants_t = extended_registrants_t,
id_handlers = id_handlers,
keywords_lists = keywords_lists,
keywords_xlate = keywords_xlate,
stripmarkers = stripmarkers,
invisible_chars = invisible_chars,
invisible_defs = invisible_defs,
indic_script = indic_script,
emoji_t = emoji_t,
maint_cats = maint_cats,
messages = messages,
presentation = presentation,
prop_cats = prop_cats,
script_lang_codes = script_lang_codes,
lang_tag_remap = lang_tag_remap,
lang_name_remap = lang_name_remap,
this_wiki_code = this_wiki_code,
title_types = title_types,
uncategorized_namespaces = uncategorized_namespaces_t,
uncategorized_subpages = uncategorized_subpages,
templates_using_volume = templates_using_volume,
templates_using_issue = templates_using_issue,
templates_not_using_page = templates_not_using_page,
vol_iss_pg_patterns = vol_iss_pg_patterns,
single_letter_2nd_lvl_domains_t = single_letter_2nd_lvl_domains_t,
url_access_map_t = url_access_map_t,
inter_wiki_map = inter_wiki_map,
mw_languages_by_tag_t = mw_languages_by_tag_t,
mw_languages_by_name_t = mw_languages_by_name_t,
citation_class_map_t = citation_class_map_t,
citation_issue_t = citation_issue_t,
citation_no_volume_t = citation_no_volume_t,
}
b31e0duydptykq99dh260j0cb4kvo2m
73093
73092
2026-07-08T19:24:35Z
Robertsky
10424
Protegeu "[[Módulo:Citation/CS1/Configuration]]" ([Edita=Blokeiu ema anónimu ho uza-na'in foun] (indefinidamente) [Book=Blokeiu ema anónimu ho uza-na'in foun] (indefinidamente))
73092
Scribunto
text/plain
local lang_obj = mw.language.getContentLanguage(); -- make a language object for the local language; used here for languages and dates
--[[--------------------------< S E T T I N G S >--------------------------------------------------------------
boolean settings used to control various things. these setting located here to make them easy to find
]]
-- these settings local to this module only
local local_digits_from_mediawiki = true; -- for i18n; when true, module fills date_names['local_digits'] from MediaWiki; manual fill required else; always false at en.wiki
local local_date_names_from_mediawiki = true; -- for i18n; when true, module fills date_names['local']['long'] and date_names['local']['short'] from MediaWiki;
-- manual translation required else; ; always false at en.wiki
-- these settings exported to other modules
local use_identifier_redirects = true; -- when true use redirect name for identifier label links; always true at en.wiki
local local_lang_cat_enable = true; -- when true categorizes pages where |language=<local wiki's language>; always false at en.wiki
local date_name_auto_xlate_enable = true; -- when true translates English month-names to the local-wiki's language month names; always false at en.wiki
local date_digit_auto_xlate_enable = true; -- when true translates Western date digit to the local-wiki's language digits (date_names['local_digits']); always false at en.wiki
local enable_sort_keys = true; -- when true module adds namespace sort keys to error and maintenance category links
local suppress_archive_today_urls = true; -- when true module suppresses all parameters with an archive.today url and any deprendent parameters
--[[--------------------------< U N C A T E G O R I Z E D _ N A M E S P A C E S >------------------------------
List of namespaces identifiers for namespaces that will not be included in citation error categories.
Same as setting notracking = true by default.
For wikis that have a current version of Module:cs1 documentation support, this #invoke will return an unordered
list of namespace names and their associated identifiers:
{{#invoke:cs1 documentation support|uncategorized_namespace_lister|all=<anything>}}
]]
local uncategorized_namespaces_t = {[2]=true}; -- init with user namespace id
for k, _ in pairs (mw.site.talkNamespaces) do -- add all talk namespace ids
uncategorized_namespaces_t[k] = true;
end
local uncategorized_subpages = {'/[Ss]andbox', '/[Tt]estcases', '/[^/]*[Ll]og', '/[Aa]rchive'}; -- list of Lua patterns found in page names of pages we should not categorize
--[[
at en.wiki Greek characters are used as sort keys for certain items in a category so that those items are
placed at the end of a category page. See Wikipedia:Categorization#Sort_keys. That works well for en.wiki
because English is written using the Latn script. This may not work well for other languages. At en.wiki it
is desireable to place content from certain namespaces at the end of a category listing so the module adds sort
keys to error and maintenance category links when rendering a cs1|2 template on a page in that namespace.
i18n: if this does not work well for your language, set <enable_sort_keys> to false.
]]
local name_space_sort_keys = { -- sort keys to be used with these namespaces:
[4] = 'ω', -- wikipedia; omega
[10] = 'τ', -- template; tau
[118] = 'Δ', -- draft; delta
['other'] = 'ο', -- all other non-talk namespaces except main (article); omicron
}
--[[--------------------------< M E S S A G E S >--------------------------------------------------------------
Translation table
The following contains fixed text that may be output as part of a citation.
This is separated from the main body to aid in future translations of this
module.
]]
local messages = {
['agency'] = '$1 $2', -- $1 is sepc, $2 is agency
['archived-dead'] = 'Arkivadu hosi $1 iha $2.',
['archived-live'] = '$1 hosi orijinál iha $2',
['archived-unfit'] = 'Arkivadu hosi orijinál iha $1',
['archived'] = 'Arkivadu',
['by'] = 'Husi', -- contributions to authored works: introduction, foreword, afterword
['cartography'] = 'Kartografia husi $1',
['editor'] = 'ed.',
['editors'] = 'eds.',
['edition'] = '($1 ed.)',
['episode'] = 'Episode $1',
['et al'] = 'et al.',
['in'] = 'In', -- edited works
['inactive'] = ' (inativu $1)', -- $1 is date which the doi was found to be broken in
['inset'] = '$1 tau iha',
['interview'] = 'Entrevista husi by $1',
invisible_1 = '$1 $2', -- $1 stripmarker name; $2 is text from <invisible_chars[1]>
invisible_2 = '$1 karákter', -- $1 character name from <invisible_chars[1]>
['mismatch'] = '<code class="cs1-code">|$1=</code> / <code class="cs1-code">|$2=</code> la hanesan', -- $1 is year param name; $2 is date param name
['newsgroup'] = '[[:en:Usenet newsgroup|Grupu notísia]]: $1',
['notitle'] = 'Laiha títulu', -- for |title=(()) and (in the future) |title=none
['original'] = 'orijinál',
['origdate'] = ' [$1]',
['published'] = ' (publika husi $1)',
['retrieved'] = 'Rekupera iha $1',
['season'] = 'Tempu $1',
['section'] = '§ $1',
['sections'] = '§§ $1',
['series'] = '$1 $2', -- $1 is sepc, $2 is series
['seriesnum'] = 'Sere $1',
['translated'] = 'Tradús husi $1',
['type'] = ' ($1)', -- for titletype
wikidata = 'Wikidata', -- these used for interwikilinked author/editor/... names
wikipedia = 'Wikipédia',
wikisource = 'Wikisource',
['written'] = 'Hakerek iha $1',
['vol'] = '$1 Vol. $2', -- $1 is sepc; bold journal style volume is in presentation{}
['vol-no'] = '$1 Vol. $2, no. $3', -- sepc, volume, issue (alternatively insert $1 after $2, but then we'd also have to change capitalization)
['issue'] = '$1 No. $2', -- $1 is sepc
['art'] = '$1 Art. $2', -- $1 is sepc; for {{cite conference}} only
['vol-art'] = '$1 Vol. $2, art. $3', -- sepc, volume, article-number; for {{cite conference}} only
['j-vol'] = '$1 $2', -- sepc, volume; bold journal volume is in presentation{}
['j-issue'] = ' ($1)',
['j-article-num'] = ' $1', -- TODO: any punctuation here? static text?
['nopp'] = '$1 $2'; -- page(s) without prefix; $1 is sepc
['p-prefix'] = "$1 p. $2", -- $1 is sepc
['pp-prefix'] = "$1 pp. $2", -- $1 is sepc
['j-page(s)'] = ': $1', -- same for page and pages
['sheet'] = '$1 Sheet $2', -- $1 is sepc
['sheets'] = '$1 Sheets $2', -- $1 is sepc
['j-sheet'] = ': Sheet $1',
['j-sheets'] = ': Sheets $1',
['language'] = '(in $1)',
['via'] = " – liuhusi $1",
['event'] = 'Eventu akontese iha',
['minutes'] = ' $1 minutu iha', -- $1 is the number of minutes
-- Determines the location of the help page
['help page link'] = 'Help:CS1 errors',
['help page label'] = 'help',
-- categories
['cat wikilink'] = '[[Category:$1]]', -- $1 is the category name
['cat wikilink sk'] = '[[Category:$1|$2]]', -- $1 is the category name; $2 is namespace sort key
[':cat wikilink'] = '[[:Category:$1|link]]', -- category name as maintenance message wikilink; $1 is the category name
-- Internal errors (should only occur if configuration is bad)
['undefined_error'] = 'Bolu ho kondisaun erru ne\'ebé la define',
['unknown_ID_key'] = 'Xave ID ne\'ebé la rekoñese:', -- an ID key in id_handlers not found in ~/Identifiers func_map{}
['unknown_ID_access'] = 'Liafuan xave asesu ID ne\'ebé la rekoñese:', -- an ID access keyword in id_handlers not found in keywords_lists['id-access']{}
['unknown_argument_map'] = 'Mapa argumentu la define ba variável ida-ne\'e',
['bare_url_no_origin'] = 'URL mamuk hetan maibé indikadór orijen nian laiha ka mamuk',
['warning_msg_e'] = '<span style="color:#d33"><code style="color: inherit; background: inherit; border: none; padding: inherit;">{{$1}}</code>: [[#$2|referénsia]] ida-ne\'e iha erru sira</span>; mensajen sira bele subar ([[Help:CS1_errors#Controlling_error_message_display|ajuda]]).'; -- $1 is template link; $2 is anchor ID
['warning_msg_m'] = '<span style="color:#085"><code style="color: inherit; background: inherit; border: none; padding: inherit;">{{$1}}</code>: [[#$2|referénsia]] ida-ne\'e iha mensajen manutensaun nian</span>; mensajen sira bele subar ([[Help:CS1_errors#Controlling_error_message_display|ajuda]]).'; -- $1 is template link; $2 is anchor ID
}
--[[--------------------------< C I T A T I O N _ C L A S S _ M A P >------------------------------------------
this table maps the value assigned to |CitationClass= in the cs1|2 templates to the canonical template name when
the value assigned to |CitationClass= is different from the canonical template name. |CitationClass= values are
used as class attributes in the <cite> tag that encloses the citation so these names may not contain spaces while
the canonical template name may. These names are used in warning_msg_e and warning_msg_m to create links to the
template's documentation when an article is displayed in preview mode.
]]
local citation_class_map_t = { -- TODO: in Module:Cite/config write a function to use this table
arxiv = 'cite arXiv', -- as the source for known_templates_t and citation_classes_t
['audio-visual'] = 'cite AV media',
['AV-media-notes'] = 'cite AV media notes',
biorxiv = 'cite bioRxiv',
book = 'cite book',
citation = 'citation',
citeseerx = 'cite CiteSeerX',
conference = 'cite conference',
document = 'cite document',
encyclopaedia = 'cite encyclopedia',
episode = 'cite episode',
interview = 'cite interview',
journal = 'cite journal',
magazine = 'cite magazine',
mailinglist = 'cite mailing list',
map = 'cite map',
medrxiv = 'cite medRxiv',
news = 'cite news',
newsgroup = 'cite newsgroup',
podcast = 'cite podcast',
pressrelease = 'cite press release',
report = 'cite report',
serial = 'cite serial',
sign = 'cite sign',
speech = 'cite speech',
ssrn = 'cite SSRN',
techreport = 'cite tech report',
thesis = 'cite thesis',
web = 'cite web',
}
--[=[-------------------------< E T _ A L _ P A T T E R N S >--------------------------------------------------
This table provides Lua patterns for the phrase "et al" and variants in name text
(author, editor, etc.). The main module uses these to identify and emit the 'etal' message.
]=]
local et_al_patterns = {
"[;,]? *[\"']*%f[%a][Ee][Tt]%.? *[Aa][Ll][%.;,\"']*$", -- variations on the 'et al' theme
"[;,]? *[\"']*%f[%a][Ee][Tt]%.? *[Aa][Ll][Ii][AaIi][Ee]?[%.;,\"']*$", -- variations on the 'et alia', 'et alii' and 'et aliae' themes (false positive 'et aliie' unlikely to match)
"[;,]? *%f[%a]and [Oo]thers", -- an alternative to et al.
"%[%[ *[Ee][Tt]%.? *[Aa][Ll]%.? *%]%]", -- a wikilinked form
"%(%( *[Ee][Tt]%.? *[Aa][Ll]%.? *%)%)", -- a double-bracketed form (to counter partial removal of ((...)) syntax)
"[%(%[] *[Ee][Tt]%.? *[Aa][Ll]%.? *[%)%]]", -- a bracketed form
}
--[[--------------------------< P R E S E N T A T I O N >------------------------
Fixed presentation markup. Originally part of citation_config.messages it has
been moved into its own, more semantically correct place.
]]
local presentation =
{
-- .citation-comment class is specified at Help:CS1_errors#Controlling_error_message_display
['hidden-error'] = '<span class="cs1-hidden-error citation-comment">$1</span>',
['visible-error'] = '<span class="cs1-visible-error citation-comment">$1</span>',
['hidden-maint'] = '<span class="cs1-maint citation-comment">$1</span>',
['accessdate'] = '<span class="reference-accessdate">$1$2</span>', -- to allow editors to hide accessdate using personal CSS
['bdi'] = '<bdi$1>$2</bdi>', -- bidirectional isolation used with |script-title= and the like
['cite'] = '<cite class="$1">$2</cite>'; -- for use when citation does not have a namelist and |ref= not set so no id="..." attribute
['cite-id'] = '<cite id="$1" class="$2">$3</cite>'; -- for use when when |ref= is set or when citation has a namelist
['format'] = ' <span class="cs1-format">($1)</span>', -- for |format=, |chapter-format=, etc.
['interwiki'] = ' <span class="cs1-format">[iha laran $1]</span>', -- for interwiki-language-linked author, editor, etc
['interproj'] = ' <span class="cs1-format">[iha $1]</span>', -- for interwiki-project-linked author, editor, etc (:d: and :s: supported; :w: ignored)
-- various access levels, for |access=, |doi-access=, |arxiv=, ...
-- narrow no-break space   may work better than nowrap CSS. Or not? Browser support?
['ext-link-access-signal'] = '<span class="$1" title="$2">$3</span>', -- external link with appropriate lock icon
['free'] = {class='id-lock-free', title='Asesivel ho livre'}, -- classes defined in Module:Citation/CS1/styles.css
['registration'] = {class='id-lock-registration', title='Rejistu gratuitu presiza'},
['limited'] = {class='id-lock-limited', title='Asesu gratuitu sujeitu ba teste limitadu, normalmente presiza subskrisaun'},
['subscription'] = {class='id-lock-subscription', title='Presiza subskrisaun selu'},
['interwiki-icon'] = '<span class="$1" title="$2">$3</span>',
['class-wikisource'] = 'cs1-ws-icon',
['italic-title'] = "''$1''",
['kern-left'] = '<span class="cs1-kern-left"></span>$1', -- spacing to use when title contains leading single or double quote mark
['kern-right'] = '$1<span class="cs1-kern-right"></span>', -- spacing to use when title contains trailing single or double quote mark
['nowrap1'] = '<span class="nowrap">$1</span>', -- for nowrapping an item: <span ...>yyyy-mm-dd</span>
['nowrap2'] = '<span class="nowrap">$1</span> $2', -- for nowrapping portions of an item: <span ...>dd mmmm</span> yyyy (note white space)
['ocins'] = '<span title="$1" class="Z3988"></span>',
['parameter'] = '<code class="cs1-code">|$1=</code>',
['ps_cs1'] = '.'; -- CS1 style postscript (terminal) character
['ps_cs2'] = ''; -- CS2 style postscript (terminal) character (empty string)
['quoted-text'] = '<q>$1</q>', -- for wrapping |quote= content
['quoted-title'] = '"$1"',
['sep_cs1'] = '.', -- CS1 element separator
['sep_cs2'] = ',', -- CS2 separator
['sep_nl'] = ';', -- CS1|2 style name-list separator between names is a semicolon
['sep_nl_and'] = ' no ', -- used as last nl sep when |name-list-style=and and list has 2 items
['sep_nl_end'] = '; no ', -- used as last nl sep when |name-list-style=and and list has 3+ names
['sep_name'] = ', ', -- CS1|2 style last/first separator is <comma><space>
['sep_nl_vanc'] = ',', -- Vancouver style name-list separator between authors is a comma
['sep_name_vanc'] = ' ', -- Vancouver style last/first separator is a space
['sep_list'] = ', ', -- used for |language= when list has 3+ items except for last sep which uses sep_list_end
['sep_list_pair'] = ' no ', -- used for |language= when list has 2 items
['sep_list_end'] = ', no ', -- used as last list sep for |language= when list has 3+ items
['trans-italic-title'] = "[''$1'']",
['trans-quoted-title'] = "[$1]", -- for |trans-title= and |trans-quote=
['vol-bold'] = '$1 <b>$2</b>', -- sepc, volume; for bold journal cites; for other cites ['vol'] in messages{}
}
--[[--------------------------< A L I A S E S >---------------------------------
Aliases table for commonly passed parameters.
Parameter names on the right side in the assignments in this table must have been
defined in the Whitelist before they will be recognized as valid parameter names
]]
local aliases = {
['AccessDate'] = {'access-date', 'accessdate'}, -- Used by InternetArchiveBot
['Agency'] = 'agency',
['ArchiveDate'] = {'archive-date', 'archivedate'}, -- Used by InternetArchiveBot
['ArchiveFormat'] = 'archive-format',
['ArchiveURL'] = {'archive-url', 'archiveurl'}, -- Used by InternetArchiveBot
['ArticleNumber'] = 'article-number',
['ASINTLD'] = 'asin-tld',
['At'] = 'at', -- Used by InternetArchiveBot
['Authors'] = {'people', 'credits'},
['BookTitle'] = {'book-title', 'booktitle'},
['Cartography'] = 'cartography',
['Chapter'] = {'chapter', 'contribution', 'entry', 'article', 'section'},
['ChapterFormat'] = {'chapter-format', 'contribution-format', 'entry-format',
'article-format', 'section-format'};
['ChapterURL'] = {'chapter-url', 'contribution-url', 'entry-url', 'article-url', 'section-url'}, -- Used by InternetArchiveBot
['ChapterUrlAccess'] = {'chapter-url-access', 'contribution-url-access',
'entry-url-access', 'article-url-access', 'section-url-access'}, -- Used by InternetArchiveBot
['Class'] = 'class', -- cite arxiv and arxiv identifier
['Collaboration'] = 'collaboration',
['Conference'] = {'conference', 'event'},
['ConferenceFormat'] = 'conference-format',
['ConferenceURL'] = 'conference-url', -- Used by InternetArchiveBot
['Date'] = {'date', 'air-date', 'airdate'}, -- air-date and airdate for cite episode and cite serial only
['Degree'] = 'degree',
['DF'] = 'df',
['DisplayAuthors'] = {'display-authors', 'display-subjects'},
['DisplayContributors'] = 'display-contributors',
['DisplayEditors'] = 'display-editors',
['DisplayInterviewers'] = 'display-interviewers',
['DisplayTranslators'] = 'display-translators',
['Docket'] = 'docket',
['DoiBroken'] = 'doi-broken-date',
['Edition'] = 'edition',
['Embargo'] = 'pmc-embargo-date',
['Encyclopedia'] = {'encyclopedia', 'encyclopaedia', 'dictionary'}, -- cite encyclopedia only
['Episode'] = 'episode', -- cite serial only TODO: make available to cite episode?
['Format'] = 'format',
['ID'] = {'id', 'ID'},
['Inset'] = 'inset',
['Issue'] = {'issue', 'number'},
['Language'] = {'language', 'lang'},
['MailingList'] = {'mailing-list', 'mailinglist'}, -- cite mailing list only
['Map'] = 'map', -- cite map only
['MapFormat'] = 'map-format', -- cite map only
['MapURL'] = {'map-url', 'mapurl'}, -- cite map only -- Used by InternetArchiveBot
['MapUrlAccess'] = 'map-url-access', -- cite map only -- Used by InternetArchiveBot
['Minutes'] = 'minutes',
['Mode'] = 'mode',
['NameListStyle'] = 'name-list-style',
['Network'] = 'network',
['Newsgroup'] = 'newsgroup', -- cite newsgroup only
['NoPP'] = {'no-pp', 'nopp'},
['NoTracking'] = {'no-tracking', 'template-doc-demo'},
['Number'] = 'number', -- this case only for cite techreport
['OrigDate'] = {'orig-date', 'orig-year', 'origyear'},
['Others'] = 'others',
['Page'] = {'page', 'p'}, -- Used by InternetArchiveBot
['Pages'] = {'pages', 'pp'}, -- Used by InternetArchiveBot
['Periodical'] = {'journal', 'magazine', 'newspaper', 'periodical', 'website', 'work'},
['Place'] = {'place', 'location'},
['PostScript'] = 'postscript',
['PublicationDate'] = {'publication-date', 'publicationdate'},
['PublicationPlace'] = {'publication-place', 'publicationplace'},
['PublisherName'] = {'publisher', 'institution'},
['Quote'] = {'quote', 'quotation'},
['QuotePage'] = 'quote-page',
['QuotePages'] = 'quote-pages',
['Ref'] = 'ref',
['Scale'] = 'scale',
['ScriptChapter'] = {'script-chapter', 'script-contribution', 'script-entry',
'script-article', 'script-section'},
['ScriptEncyclopedia'] = {'script-encyclopedia', 'script-encyclopaedia'}, -- cite encyclopedia only
['ScriptMap'] = 'script-map',
['ScriptPeriodical'] = {'script-journal', 'script-magazine', 'script-newspaper',
'script-periodical', 'script-website', 'script-work'},
['ScriptQuote'] = 'script-quote',
['ScriptTitle'] = 'script-title', -- Used by InternetArchiveBot
['Season'] = 'season',
['Sections'] = 'sections', -- cite map only
['Series'] = {'series', 'version'},
['SeriesLink'] = {'series-link', 'serieslink'},
['SeriesNumber'] = {'series-number', 'series-no'},
['Sheet'] = 'sheet', -- cite map only
['Sheets'] = 'sheets', -- cite map only
['Station'] = 'station',
['Time'] = 'time',
['TimeCaption'] = 'time-caption',
['Title'] = 'title', -- Used by InternetArchiveBot
['TitleLink'] = {'title-link', 'episode-link', 'episodelink'}, -- Used by InternetArchiveBot
['TitleNote'] = {'title-note', 'department'},
['TitleType'] = {'type', 'medium'},
['TransChapter'] = {'trans-article', 'trans-chapter', 'trans-contribution',
'trans-entry', 'trans-section'},
['Transcript'] = 'transcript',
['TranscriptFormat'] = 'transcript-format',
['TranscriptURL'] = 'transcript-url', -- Used by InternetArchiveBot
['TransEncyclopedia'] = {'trans-encyclopedia', 'trans-encyclopaedia'}, -- cite encyclopedia only
['TransMap'] = 'trans-map', -- cite map only
['TransPeriodical'] = {'trans-journal', 'trans-magazine', 'trans-newspaper',
'trans-periodical', 'trans-website', 'trans-work'},
['TransQuote'] = 'trans-quote',
['TransTitle'] = 'trans-title', -- Used by InternetArchiveBot
['URL'] = {'url', 'URL'}, -- Used by InternetArchiveBot
['UrlAccess'] = 'url-access', -- Used by InternetArchiveBot
['UrlStatus'] = 'url-status', -- Used by InternetArchiveBot
['Vauthors'] = 'vauthors',
['Veditors'] = 'veditors',
['Via'] = 'via',
['Volume'] = 'volume',
['Year'] = 'year',
['AuthorList-First'] = {"first#", "author-first#", "author#-first", "author-given#", "author#-given",
"subject-first#", "subject#-first", "subject-given#", "subject#-given",
"given#"},
['AuthorList-Last'] = {"last#", "author-last#", "author#-last", "author-surname#", "author#-surname",
"subject-last#", "subject#-last", "subject-surname#", "subject#-surname",
"author#", 'host#', "subject#", "surname#"},
['AuthorList-Link'] = {"author-link#", "author#-link", "subject-link#",
"subject#-link", "authorlink#", "author#link"},
['AuthorList-Mask'] = {"author-mask#", "author#-mask", "subject-mask#", "subject#-mask"},
['ContributorList-First'] = {'contributor-first#', 'contributor#-first',
'contributor-given#', 'contributor#-given'},
['ContributorList-Last'] = {'contributor-last#', 'contributor#-last',
'contributor-surname#', 'contributor#-surname', 'contributor#'},
['ContributorList-Link'] = {'contributor-link#', 'contributor#-link'},
['ContributorList-Mask'] = {'contributor-mask#', 'contributor#-mask'},
['EditorList-First'] = {"editor-first#", "editor#-first", "editor-given#", "editor#-given"},
['EditorList-Last'] = {"editor-last#", "editor#-last", "editor-surname#",
"editor#-surname", "editor#"},
['EditorList-Link'] = {"editor-link#", "editor#-link"},
['EditorList-Mask'] = {"editor-mask#", "editor#-mask"},
['InterviewerList-First'] = {'interviewer-first#', 'interviewer#-first',
'interviewer-given#', 'interviewer#-given'},
['InterviewerList-Last'] = {'interviewer-last#', 'interviewer#-last',
'interviewer-surname#', 'interviewer#-surname', 'interviewer#'},
['InterviewerList-Link'] = {'interviewer-link#', 'interviewer#-link'},
['InterviewerList-Mask'] = {'interviewer-mask#', 'interviewer#-mask'},
['TranslatorList-First'] = {'translator-first#', 'translator#-first',
'translator-given#', 'translator#-given'},
['TranslatorList-Last'] = {'translator-last#', 'translator#-last',
'translator-surname#', 'translator#-surname', 'translator#'},
['TranslatorList-Link'] = {'translator-link#', 'translator#-link'},
['TranslatorList-Mask'] = {'translator-mask#', 'translator#-mask'},
}
--[[--------------------------< D E P E N D E N C I E S _ T >--------------------------------------------------
a table of url-holding parameters upon which other parameters are dependent.
this table is used by has_archive_today_url() to suppress parameters that are dependant upon a url-holding parameter
that has as a value an archive.today (or alternate tld) url.
archive.today is deprecated at en.wiki; see Wikipedia:Requests_for_comment/Archive.is_RFC_5
]]
local url_dependency_map_t = { -- table of url-holding parameters and the meta-parameters that are dependent on them
['url'] = {'AccessDate', 'ArchiveURL', 'Format', 'UrlAccess'},
['archive-url'] = {'ArchiveDate', 'ArchiveFormat', 'UrlStatus'},
['archiveurl'] = {'ArchiveDate', 'ArchiveFormat', 'UrlStatus'},
['article-url'] = {'ChapterFormat', 'ChapterUrlAccess'},
['chapter-url'] = {'ChapterFormat', 'ChapterUrlAccess'},
['conference-url'] = {'ConferenceFormat'},
['contribution-url'] = {'ChapterFormat', 'ChapterUrlAccess'},
['entry-url'] = {'ChapterFormat', 'ChapterUrlAccess'},
['map-url'] = {'MapFormat', 'MapUrlAccess'},
['section-url'] = {'ChapterFormat', 'ChapterUrlAccess'},
['transcript-url'] = {'TranscriptFormat'},
};
local dependencies_t = {}; -- the table of url-holding parameters and their dependent parameters
for url_param, meta_parameters_t in pairs (url_dependency_map_t) do -- sequence of meta-parameters (indexes) into <aliases> table
local dependant_params_t = {}; -- collection of parameters that are dependent on this <url_param>
for _, meta_parameter in ipairs (meta_parameters_t) do -- for each <aliases> meta-parameter (index)
if 'string' == type (aliases[meta_parameter]) then -- for single parameter names (no aliases), <aliases[meta_parameter]> will be a string
table.insert (dependant_params_t, aliases[meta_parameter]); -- add to this <url_param>'s dependency sequence
else
for _, alias in ipairs (aliases[meta_parameter]) do -- for each alias in aliases[meta_parameter] (aliases['AccessDate'] for example)
table.insert (dependant_params_t, alias); -- add to this <url_param>'s dependency sequence
end
end
end
dependencies_t[url_param] = dependant_params_t; -- add the <url_param> and its dependent parameters
end
--[[--------------------------< P U N C T _ S K I P >---------------------------
builds a table of parameter names that the extraneous terminal punctuation check should not check.
]]
local punct_meta_params = { -- table of aliases[] keys (meta parameters); each key has a table of parameter names for a value
'BookTitle', 'Chapter', 'ScriptChapter', 'ScriptTitle', 'Title', 'TransChapter', 'Transcript', 'TransMap', 'TransTitle', -- title-holding parameters
'AuthorList-Mask', 'ContributorList-Mask', 'EditorList-Mask', 'InterviewerList-Mask', 'TranslatorList-Mask', -- name-list mask may have name separators
'PostScript', 'Quote', 'ScriptQuote', 'TransQuote', 'Ref', -- miscellaneous
'ArchiveURL', 'ChapterURL', 'ConferenceURL', 'MapURL', 'TranscriptURL', 'URL', -- URL-holding parameters
}
local url_meta_params = { -- table of aliases[] keys (meta parameters); each key has a table of parameter names for a value
'ArchiveURL', 'ChapterURL', 'ConferenceURL', 'ID', 'MapURL', 'TranscriptURL', 'URL', -- parameters allowed to hold urls
'Page', 'Pages', 'At', 'QuotePage', 'QuotePages', -- insource locators allowed to hold urls
}
local function build_skip_table (skip_t, meta_params)
for _, meta_param in ipairs (meta_params) do -- for each meta parameter key
local params = aliases[meta_param]; -- get the parameter or the table of parameters associated with the meta parameter name
if 'string' == type (params) then
skip_t[params] = 1; -- just a single parameter
else
for _, param in ipairs (params) do -- get the parameter name
skip_t[param] = 1; -- add the parameter name to the skip table
local count;
param, count = param:gsub ('#', ''); -- remove enumerator marker from enumerated parameters
if 0 ~= count then -- if removed
skip_t[param] = 1; -- add param name without enumerator marker
end
end
end
end
return skip_t;
end
local punct_skip = {};
local url_skip = {};
--[[--------------------------< U R L _ A C C E S S _ M A P >--------------------------------------------------
this table used by the wikipedia library url test, has_twl_url(), which automatically sets a url-access parameter
to 'subscription' when it discovers a wikipedia library url in any of the url-holding paramters used as keys in
this table.
translators: if your wiki uses parameter names for these url-holding parameters and their matching -access parameters,
add your wiki's parameters to this list. Leave the English parameters in place.
TODO: is there a better way to do this?
]]
local url_access_map_t = {
['chapter-url'] = 'chapter-url-access',
['contribution-url'] = 'contribution-url-access',
['entry-url'] = 'entry-url-access',
['article-url'] = 'article-url-access',
['section-url'] = 'section-url-access',
['map-url'] = 'map-url-access',
['mapurl'] = 'map-url-access',
['url'] = 'url-access',
['URL'] = 'url-access'
}
--[[--------------------------< S I N G L E - L E T T E R S E C O N D - L E V E L D O M A I N S >----------
this is a list of tlds that are known to have single-letter second-level domain names. This list does not include
ccTLDs which are accepted in is_domain_name().
]]
local single_letter_2nd_lvl_domains_t = {'cash', 'company', 'foundation', 'media', 'org', 'today'};
--[[-----------< S P E C I A L C A S E T R A N S L A T I O N S >------------
This table is primarily here to support internationalization. Translations in
this table are used, for example, when an error message, category name, etc.,
is extracted from the English alias key. There may be other cases where
this translation table may be useful.
]]
local is_Latn = 'A-Za-z\195\128-\195\150\195\152-\195\182\195\184-\198\191\199\132-\201\143\225\184\128-\225\187\191';
local special_case_translation = {
author = 'na\'in',
editor = 'editór',
name_list_params = '$1-name-list parámetru sira', -- $1 is 'author' or 'editor'; used with err_redundant_parameters
['AuthorList'] = 'lista autór sira', -- used to assemble maintenance category names
['ContributorList'] = 'lista kontribuinte sira', -- translation of these names plus translation of the base maintenance category names in maint_cats{} table below
['EditorList'] = 'lista editór sira', -- must match the names of the actual categories
['InterviewerList'] = 'lista entrevistadór sira', -- this group or translations used by name_has_ed_markup() and name_has_mult_names()
['TranslatorList'] = 'lista tradutór sira',
-- Lua patterns to match pseudo-titles used by InternetArchiveBot and others as placeholder for unknown |title= value
['archived_copy'] = { -- used with CS1 maint: Archive[d] copy as title
['en'] = '^archived?%s+copy$', -- for English; translators: keep this because templates imported from en.wiki
['local'] = '^kópia?%s+arkivadu$', -- translators: replace ['local'] = nil with lowercase translation only when bots or tools create generic titles in your language
},
-- Lua patterns to match generic titles; usually created by bots or reference filling tools
-- translators: replace ['local'] = nil with lowercase translation only when bots or tools create generic titles in your language
-- generic titles and patterns in this table should be lowercase only
-- leave ['local'] nil except when there is a matching generic title in your language
-- boolean 'true' for plain-text searches; 'false' for pattern searches
['generic_titles'] = {
['accept'] = {
},
['reject'] = {
{['en'] = {'^wayback%s+machine$', false}, ['local'] = nil},
{['en'] = {'are you a robot', true}, ['local'] = nil},
{['en'] = {'hugedomains', true}, ['local'] = nil},
{['en'] = {'^[%(%[{<]?no +title[>}%]%)]?$', false}, ['local'] = nil},
{['en'] = {'page not found', true}, ['local'] = nil},
{['en'] = {'subscribe to read', true}, ['local'] = nil},
{['en'] = {'^[%(%[{<]?unknown[>}%]%)]?$', false}, ['local'] = nil},
{['en'] = {'website is for sale', true}, ['local'] = nil},
{['en'] = {'^404', false}, ['local'] = nil},
{['en'] = {'error[ %-]404', false}, ['local'] = nil},
{['en'] = {'internet archive wayback machine', true}, ['local'] = nil},
{['en'] = {'log into facebook', true}, ['local'] = nil},
{['en'] = {'login • instagram', true}, ['local'] = nil},
{['en'] = {'redirecting...', true}, ['local'] = nil},
{['en'] = {'usurped title', true}, ['local'] = nil}, -- added by a GreenC bot
{['en'] = {'wayback machine', true}, ['local'] = nil},
{['en'] = {'webcite query result', true}, ['local'] = nil},
{['en'] = {'wikiwix\'s cache', true}, ['local'] = nil},
{['en'] = {'bot verification', true}, ['local'] = nil},
}
},
-- boolean 'true' for plain-text searches, search string must be lowercase only
-- boolean 'false' for pattern searches
-- leave ['local'] nil except when there is a matching generic name in your language
['generic_names'] = {
['accept'] = {
{['en'] = {'%[%[[^|]*%(author%) *|[^%]]*%]%]', false}, ['local'] = nil},
},
['reject'] = {
{['en'] = {'about us', true}, ['local'] = nil},
{['en'] = {'%f[%a][Aa]dvisor%f[%A]', false}, ['local'] = nil},
{['en'] = {'allmusic', true}, ['local'] = nil},
{['en'] = {'%f[%a][Aa]uthor%f[%A]', false}, ['local'] = nil},
{['en'] = {'^[Bb]ureau$', false}, ['local'] = nil},
{['en'] = {'business', true}, ['local'] = nil},
{['en'] = {'cnn', true}, ['local'] = nil},
{['en'] = {'collaborator', true}, ['local'] = nil},
{['en'] = {'^[Cc]ompany$', false}, ['local'] = nil},
{['en'] = {'contributor', true}, ['local'] = nil},
{['en'] = {'contact us', true}, ['local'] = nil},
{['en'] = {'correspondent', true}, ['local'] = nil},
{['en'] = {'^[Dd]esk$', false}, ['local'] = nil},
{['en'] = {'directory', true}, ['local'] = nil},
{['en'] = {'%f[%(%[][%(%[]%s*eds?%.?%s*[%)%]]?$', false}, ['local'] = nil},
{['en'] = {'[,%.%s]%f[e]eds?%.?$', false}, ['local'] = nil},
{['en'] = {'^eds?[%.,;]', false}, ['local'] = nil},
{['en'] = {'^[%(%[]%s*[Ee][Dd][Ss]?%.?%s*[%)%]]', false}, ['local'] = nil},
{['en'] = {'%f[%a][Ee]dited%f[%A]', false}, ['local'] = nil},
{['en'] = {'%f[%a][Ee]ditors?%f[%A]', false}, ['local'] = nil},
{['en'] = {'%f[%a][Ee]mail%f[%A]', false}, ['local'] = nil},
{['en'] = {'facebook', true}, ['local'] = nil},
{['en'] = {'google', true}, ['local'] = nil},
{['en'] = {'^[Gg]roup$', false}, ['local'] = nil},
{['en'] = {'home page', true}, ['local'] = nil},
{['en'] = {'^[Ii]nc%.?$', false}, ['local'] = nil},
{['en'] = {'instagram', true}, ['local'] = nil},
{['en'] = {'interviewer', true}, ['local'] = nil},
{['en'] = {'^[Ll]imited$', false}, ['local'] = nil},
{['en'] = {'linkedIn', true}, ['local'] = nil},
{['en'] = {'^[Nn]ews$', false}, ['local'] = nil},
{['en'] = {'[Nn]ews[ %-]?[Rr]oom', false}, ['local'] = nil},
{['en'] = {'pinterest', true}, ['local'] = nil},
{['en'] = {'policy', true}, ['local'] = nil},
{['en'] = {'privacy', true}, ['local'] = nil},
{['en'] = {'reuters', true}, ['local'] = nil},
{['en'] = {'translator', true}, ['local'] = nil},
{['en'] = {'tumblr', true}, ['local'] = nil},
{['en'] = {'twitter', true}, ['local'] = nil},
{['en'] = {'site name', true}, ['local'] = nil},
{['en'] = {'statement', true}, ['local'] = nil},
{['en'] = {'submitted', true}, ['local'] = nil},
{['en'] = {'super.?user', false}, ['local'] = nil},
{['en'] = {'%f['..is_Latn..'][Uu]ser%f[^'..is_Latn..']', false}, ['local'] = nil},
{['en'] = {'updated', true}, ['local'] = nil},
{['en'] = {'verfasser', true}, ['local'] = nil},
}
}
}
--[[--------------------------< D A T E _ N A M E S >----------------------------------------------------------
This table of tables lists local language date names and fallback English date names.
The code in Date_validation will look first in the local table for valid date names.
If date names are not found in the local table, the code will look in the English table.
Because citations can be copied to the local wiki from en.wiki, the English is
required when the date-name translation function date_name_xlate() is used.
In these tables, season numbering is defined by
Extended Date/Time Format (EDTF) Specification (https://www.loc.gov/standards/datetime/)
which became part of ISO 8601 in 2019. See '§Sub-year groupings'. The standard
defines various divisions using numbers 21-41. CS1|2 only supports generic seasons.
EDTF does support the distinction between north and south hemisphere seasons
but CS1|2 has no way to make that distinction.
33-36 = Quarter 1, Quarter 2, Quarter 3, Quarter 4 (3 months each)
The standard does not address 'named' dates so, for the purposes of CS1|2,
Easter and Christmas are defined here as 98 and 99, which should be out of the
ISO 8601 (EDTF) range of uses for a while.
local_date_names_from_mediawiki is a boolean. When set to:
true – module will fetch local month names from MediaWiki for both date_names['local']['long'] and date_names['local']['short']; this will unconditionally overwrite manual translations
false – module will *not* fetch local month names from MediaWiki
Caveat lector: There is no guarantee that MediaWiki will provide short month names. At your wiki you can test
the results of the MediaWiki fetch in the debug console with this command (the result is alpha sorted):
=mw.dumpObject (p.date_names['local'])
While the module can fetch month names from MediaWiki, it cannot fetch the quarter, season, and named date names
from MediaWiki. Those must be translated manually.
]]
local local_date_names_from_mediawiki = true; -- when false, manual translation required for date_names['local']['long'] and date_names['local']['short']; overwrites manual translations
-- when true, module fetches long and short month names from MediaWiki
local date_names = {
['en'] = { -- English
['long'] = {['January'] = 1, ['February'] = 2, ['March'] = 3, ['April'] = 4, ['May'] = 5, ['June'] = 6, ['July'] = 7, ['August'] = 8, ['September'] = 9, ['October'] = 10, ['November'] = 11, ['December'] = 12},
['short'] = {['Jan'] = 1, ['Feb'] = 2, ['Mar'] = 3, ['Apr'] = 4, ['May'] = 5, ['Jun'] = 6, ['Jul'] = 7, ['Aug'] = 8, ['Sep'] = 9, ['Oct'] = 10, ['Nov'] = 11, ['Dec'] = 12},
['quarter'] = {['First Quarter'] = 33, ['Second Quarter'] = 34, ['Third Quarter'] = 35, ['Fourth Quarter'] = 36},
['season'] = {['Winter'] = 24, ['Spring'] = 21, ['Summer'] = 22, ['Fall'] = 23, ['Autumn'] = 23},
['named'] = {['Easter'] = 98, ['Christmas'] = 99},
},
-- when local_date_names_from_mediawiki = false
['local'] = { -- replace these English date names with the local language equivalents
['long'] = {['January'] = 1, ['February'] = 2, ['March'] = 3, ['April'] = 4, ['May'] = 5, ['June'] = 6, ['July'] = 7, ['August'] = 8, ['September'] = 9, ['October'] = 10, ['November'] = 11, ['December'] = 12},
['short'] = {['Jan'] = 1, ['Feb'] = 2, ['Mar'] = 3, ['Apr'] = 4, ['May'] = 5, ['Jun'] = 6, ['Jul'] = 7, ['Aug'] = 8, ['Sep'] = 9, ['Oct'] = 10, ['Nov'] = 11, ['Dec'] = 12},
['quarter'] = {['First Quarter'] = 33, ['Second Quarter'] = 34, ['Third Quarter'] = 35, ['Fourth Quarter'] = 36},
['season'] = {['Winter'] = 24, ['Spring'] = 21, ['Summer'] = 22, ['Fall'] = 23, ['Autumn'] = 23},
['named'] = {['Easter'] = 98, ['Christmas'] = 99},
},
['inv_local_long'] = {}, -- used in date reformatting & translation; copy of date_names['local'].long where k/v are inverted: [1]='<local name>' etc.
['inv_local_short'] = {}, -- used in date reformatting & translation; copy of date_names['local'].short where k/v are inverted: [1]='<local name>' etc.
['inv_local_quarter'] = {}, -- used in date translation; copy of date_names['local'].quarter where k/v are inverted: [1]='<local name>' etc.
['inv_local_season'] = {}, -- used in date translation; copy of date_names['local'].season where k/v are inverted: [1]='<local name>' etc.
['inv_local_named'] = {}, -- used in date translation; copy of date_names['local'].named where k/v are inverted: [1]='<local name>' etc.
['local_digits'] = {['0'] = '0', ['1'] = '1', ['2'] = '2', ['3'] = '3', ['4'] = '4', ['5'] = '5', ['6'] = '6', ['7'] = '7', ['8'] = '8', ['9'] = '9'}, -- used to convert local language digits to Western 0-9
['xlate_digits'] = {},
}
if local_date_names_from_mediawiki then -- if fetching local month names from MediaWiki is enabled
local long_t = {};
local short_t = {};
for i=1, 12 do -- loop 12x and
local name = lang_obj:formatDate('F', '2022-' .. i .. '-1'); -- get long month name for each i
long_t[name] = i; -- save it
name = lang_obj:formatDate('M', '2022-' .. i .. '-1'); -- get short month name for each i
short_t[name] = i; -- save it
end
date_names['local']['long'] = long_t; -- write the long table – overwrites manual translation
date_names['local']['short'] = short_t; -- write the short table – overwrites manual translation
end
-- create inverted date-name tables for reformatting and/or translation
for _, invert_t in pairs {{'long', 'inv_local_long'}, {'short', 'inv_local_short'}, {'quarter', 'inv_local_quarter'}, {'season', 'inv_local_season'}, {'named', 'inv_local_named'}} do
for name, i in pairs (date_names['local'][invert_t[1]]) do -- this table is ['name'] = i
date_names[invert_t[2]][i] = name; -- invert to get [i] = 'name' for conversions from ymd
end
end
if local_digits_from_mediawiki then -- if fetching local digits from MediaWiki is enabled
local digits_t = {};
for i=0, 9 do -- loop 10x and
digits_t [lang_obj:formatNum (i)] = tostring (i); -- format the loop indexer as local lang table index and assign loop indexer (a string) as the value
end
date_names['local_digits'] = digits_t;
end
for ld, ed in pairs (date_names.local_digits) do -- make a digit translation table for simple date translation from en to local language using local_digits table
date_names.xlate_digits [ed] = ld; -- en digit becomes index with local digit as the value
end
local df_template_patterns = { -- table of redirects to {{Use dmy dates}} and {{Use mdy dates}}
'{{ *[Uu]se +(dmy) +dates *[|}]', -- 1159k -- sorted by approximate transclusion count
'{{ *[Uu]se +(mdy) +dates *[|}]', -- 212k
'{{ *[Uu]se +(MDY) +dates *[|}]', -- 788
'{{ *[Uu]se +(DMY) +dates *[|}]', -- 343
'{{ *([Mm]dy) *[|}]', -- 176
'{{ *[Uu]se *(dmy) *[|}]', -- 156 + 18
'{{ *[Uu]se *(mdy) *[|}]', -- 149 + 11
'{{ *([Dd]my) *[|}]', -- 56
'{{ *[Uu]se +(MDY) *[|}]', -- 5
'{{ *([Dd]MY) *[|}]', -- 3
'{{ *[Uu]se(mdy)dates *[|}]', -- 1
'{{ *[Uu]se +(DMY) *[|}]', -- 0
'{{ *([Mm]DY) *[|}]', -- 0
}
local title_object = mw.title.getCurrentTitle();
local content; -- done this way so that unused templates appear in unused-template-reports; self-transcluded makes them look like they are used
if 10 ~= title_object.namespace then -- all namespaces except Template
content = title_object:getContent() or ''; -- get the content of the article or ''; new pages edited w/ve do not have 'content' until saved; ve does not preview; phab:T221625
end
local function get_date_format ()
if not content then -- nil content when we're in template
return nil; -- auto-formatting does not work in Template space so don't set global_df
end
for _, pattern in ipairs (df_template_patterns) do -- loop through the patterns looking for {{Use dmy dates}} or {{Use mdy dates}} or any of their redirects
local start, _, match = content:find(pattern); -- match is the three letters indicating desired date format
if match then
local use_dates_template = content:match ('%b{}', start); -- get the whole template
if use_dates_template:match ('| *cs1%-dates *= *[lsy][sy]?') then -- look for |cs1-dates=publication date length access-/archive-date length
return match:lower() .. '-' .. use_dates_template:match ('| *cs1%-dates *= *([lsy][sy]?)');
else
return match:lower() .. '-all'; -- no |cs1-dates= k/v pair; return value appropriate for use in |df=
end
end
end
end
local global_df; -- TODO: add this to <global_cs1_config_t>?
--[[-----------------< V O L U M E , I S S U E , P A G E S >------------------
These tables hold cite class values (from the template invocation) and identify those templates that support
|volume=, |issue=, and |page(s)= parameters. Cite conference and cite map require further qualification which
is handled in the main module.
]]
local templates_using_volume = {'citation', 'audio-visual', 'book', 'conference', 'encyclopaedia', 'interview', 'journal', 'magazine', 'map', 'news', 'report', 'techreport', 'thesis'}
local templates_using_issue = {'citation', 'conference', 'episode', 'interview', 'journal', 'magazine', 'map', 'news', 'podcast'}
local templates_not_using_page = {'audio-visual', 'episode', 'mailinglist', 'newsgroup', 'podcast', 'serial', 'sign', 'speech'}
--[[
These tables control when it is appropriate for {{citation}} to render |volume= and/or |issue=. The parameter
names in the tables constrain {{citation}} so that its renderings match the renderings of the equivalent cs1
templates. For example, {{cite web}} does not support |volume= so the equivalent {{citation |website=...}} must
not support |volume=.
]]
local citation_no_volume_t = { -- {{citation}} does not render |volume= when these parameters are used
'website', 'mailinglist', 'script-website',
}
local citation_issue_t = { -- {{citation}} may render |issue= when these parameters are used
'journal', 'magazine', 'newspaper', 'periodical', 'work',
'script-journal', 'script-magazine', 'script-newspaper', 'script-periodical', 'script-work',
}
--[[
Patterns for finding extra text in |volume=, |issue=, |page=, |pages=
]]
local vol_iss_pg_patterns = {
good_ppattern = '^P[^%.PpGg]', -- OK to begin with uppercase P: P7 (page 7 of section P), but not p123 (page 123); TODO: this allows 'Pages' which it should not
bad_ppatterns = { -- patterns for |page= and |pages=
'^[Pp][PpGg]?%.?[ %d]',
'^[Pp][Pp]?%. ', -- from {{p.}} and {{pp.}} templates
'^[Pp]ages?',
'^[Pp]gs.?',
},
vi_patterns_t = { -- combined to catch volume-like text in |issue= and issue-like text in |volume=
'^volumes?', -- volume-like text
'^vols?[%.:=]?',
'^issues?', --issue-like text
'^iss[%.:=]?',
'^numbers?',
'^nos?%A', -- don't match 'november' or 'nostradamus'
'^nr[%.:=]?',
'^n[%.:= ]', -- might be a valid issue without separator (space char is sep char here)
'^n°', -- 'n' with degree sign (U+00B0)
'^№', -- precomposed unicode numero character (U+2116)
},
}
--[[--------------------------< K E Y W O R D S >-------------------------------
These tables hold keywords for those parameters that have defined sets of acceptable keywords.
]]
--[[-------------------< K E Y W O R D S T A B L E >--------------------------
this is a list of keywords; each key in the list is associated with a table of
synonymous keywords possibly from different languages.
for I18N: add local-language keywords to value table; do not change the key.
For example, adding the German keyword 'ja':
['affirmative'] = {'yes', 'true', 'y', 'ja'},
Because CS1|2 templates from en.wiki articles are often copied to other local wikis,
it is recommended that the English keywords remain in these tables.
]]
local keywords = {
['amp'] = {'&', 'amp', 'ampersand'}, -- |name-list-style=
['and'] = {'and', 'serial', 'no'}, -- |name-list-style=
['affirmative'] = {'yes', 'true', 'y'}, -- |no-tracking=, |no-pp= -- Used by InternetArchiveBot
['afterword'] = {'afterword'}, -- |contribution=
['bot: unknown'] = {'bot: unknown'}, -- |url-status= -- Used by InternetArchiveBot
['cs1'] = {'cs1'}, -- |mode=
['cs2'] = {'cs2'}, -- |mode=
['dead'] = {'dead', 'deviated', 'mate'}, -- |url-status= -- Used by InternetArchiveBot
['dmy'] = {'dmy'}, -- |df=
['dmy-all'] = {'dmy-all'}, -- |df=
['foreword'] = {'foreword'}, -- |contribution=
['free'] = {'free' ,'gratis', 'gratuitu', 'gratuita'}, -- |<id>-access= -- Used by InternetArchiveBot
['harv'] = {'harv'}, -- |ref=; this no longer supported; is_valid_parameter_value() called with <invert> = true
['introduction'] = {'introduction', 'introdusaun'}, -- |contribution=
['limited'] = {'limited', 'limitadu', 'limitada'}, -- |url-access= -- Used by InternetArchiveBot
['live'] = {'live', 'moris'}, -- |url-status= -- Used by InternetArchiveBot
['mdy'] = {'mdy'}, -- |df=
['mdy-all'] = {'mdy-all'}, -- |df=
['none'] = {'none'}, -- |postscript=, |ref=, |title=, |type= -- Used by InternetArchiveBot
['off'] = {'off'}, -- |title= (potentially also: |title-link=, |postscript=, |ref=, |type=)
['preface'] = {'preface', 'prefásiu'}, -- |contribution=
['registration'] = {'registration', 'rejistrasaun'}, -- |url-access= -- Used by InternetArchiveBot
['subscription'] = {'subscription', 'asinatura'}, -- |url-access= -- Used by InternetArchiveBot
['unfit'] = {'unfit'}, -- |url-status= -- Used by InternetArchiveBot
['usurped'] = {'usurped'}, -- |url-status= -- Used by InternetArchiveBot
['vanc'] = {'vanc'}, -- |name-list-style=
['ymd'] = {'ymd'}, -- |df=
['ymd-all'] = {'ymd-all'}, -- |df=
-- ['yMd'] = {'yMd'}, -- |df=; not supported at en.wiki
-- ['yMd-all'] = {'yMd-all'}, -- |df=; not supported at en.wiki
}
--[[------------------------< X L A T E _ K E Y W O R D S >---------------------
this function builds a list, keywords_xlate{}, of the keywords found in keywords{} where the values from keywords{}
become the keys in keywords_xlate{} and the keys from keywords{} become the values in keywords_xlate{}:
['affirmative'] = {'yes', 'true', 'y'}, -- in keywords{}
becomes
['yes'] = 'affirmative', -- in keywords_xlate{}
['true'] = 'affirmative',
['y'] = 'affirmative',
the purpose of this function is to act as a translator between a non-English keyword and its English equivalent
that may be used in other modules of this suite
]]
local function xlate_keywords ()
local out_table = {}; -- output goes here
for k, keywords_t in pairs (keywords) do -- spin through the keywords table
for _, keyword in ipairs (keywords_t) do -- for each keyword
out_table[keyword] = k; -- create an entry in the output table where keyword is the key
end
end
return out_table;
end
local keywords_xlate = xlate_keywords (); -- the list of translated keywords
--[[----------------< M A K E _ K E Y W O R D S _ L I S T >---------------------
this function assembles, for parameter-value validation, the list of keywords appropriate to that parameter.
keywords_lists{}, is a table of tables from keywords{}
]]
local function make_keywords_list (keywords_lists)
local out_table = {}; -- output goes here
for _, keyword_list in ipairs (keywords_lists) do -- spin through keywords_lists{} and get a table of keywords
for _, keyword in ipairs (keyword_list) do -- spin through keyword_list{} and add each keyword, ...
table.insert (out_table, keyword); -- ... as plain text, to the output list
end
end
return out_table;
end
--[[----------------< K E Y W O R D S _ L I S T S >-----------------------------
this is a list of lists of valid keywords for the various parameters in [key].
Generally the keys in this table are the canonical en.wiki parameter names though
some are contrived because of use in multiple differently named parameters:
['yes_true_y'], ['id-access'].
The function make_keywords_list() extracts the individual keywords from the
appropriate list in keywords{}.
The lists in this table are used to validate the keyword assignment for the
parameters named in this table's keys.
]]
local keywords_lists = {
['yes_true_y'] = make_keywords_list ({keywords.affirmative}),
['contribution'] = make_keywords_list ({keywords.afterword, keywords.foreword, keywords.introduction, keywords.preface}),
['df'] = make_keywords_list ({keywords.dmy, keywords['dmy-all'], keywords.mdy, keywords['mdy-all'], keywords.ymd, keywords['ymd-all']}),
-- ['df'] = make_keywords_list ({keywords.dmy, keywords['dmy-all'], keywords.mdy, keywords['mdy-all'], keywords.ymd, keywords['ymd-all'], keywords.yMd, keywords['yMd-all']}), -- not supported at en.wiki
['mode'] = make_keywords_list ({keywords.cs1, keywords.cs2}),
['name-list-style'] = make_keywords_list ({keywords.amp, keywords['and'], keywords.vanc}),
['ref'] = make_keywords_list ({keywords.harv}), -- inverted check; |ref=harv no longer supported
['url-access'] = make_keywords_list ({keywords.subscription, keywords.limited, keywords.registration}),
['url-status'] = make_keywords_list ({keywords.dead, keywords.live, keywords.unfit, keywords.usurped, keywords['bot: unknown']}),
['id-access'] = make_keywords_list ({keywords.free}),
}
--[[--------------------------< C S 1 _ C O N F I G _ G E T >--------------------------------------------------
fetch and validate values from {{cs1 config}} template to fill <global_cs1_config_t>
no error messages; when errors are detected, the parameter value from {{cs1 config}} is blanked.
Supports all parameters and aliases associated with the metaparameters: DisplayAuthors, DisplayContributors,
DisplayEditors, DisplayInterviewers, DisplayTranslators, NameListStyle, and Mode. The DisplayWhatever metaparameters
accept numeric values only (|display-authors=etal and the like is not supported).
]]
local global_cs1_config_t = {}; -- TODO: add value returned from get_date_format() to this table?
local function get_cs1_config ()
if not content then -- nil content when we're in template
return nil; -- auto-formatting does not work in Template space so don't set global_df
end
local start = content:find('{{ *[Cc][Ss]1 config *[|}]'); -- <start> is offset into <content> when {{cs1 config}} found; nil else
if start then
local cs1_config_template = content:match ('%b{}', start); -- get the whole template
if not cs1_config_template then
return nil;
end
local params_t = mw.text.split (cs1_config_template:gsub ('^{{%s*', ''):gsub ('%s*}}$', ''), '%s*|%s*'); -- remove '{{' and '}}'; make a sequence of parameter/value pairs (split on the pipe)
table.remove (params_t, 1); -- remove the template name because it isn't a parameter/value pair
local config_meta_params_t = {'DisplayAuthors', 'DisplayContributors', 'DisplayEditors', 'DisplayInterviewers', 'DisplayTranslators', 'NameListStyle', 'Mode'};
local meta_param_map_t = {}; -- list of accepted parameter names usable in {{cs1 config}} goes here
for _, meta_param in ipairs (config_meta_params_t) do -- for i18n using <config_meta_params_t>, map template parameter names to their metaparameter equivalents
if 'table' == type (aliases[meta_param]) then -- if <meta_param> is a sequence,
for _, param in ipairs (aliases[meta_param]) do -- extract its contents
meta_param_map_t[param] = meta_param; -- and add to <meta_param_map_t>
end
else
meta_param_map_t[aliases[meta_param]] = meta_param; -- not a sequence so just add the parameter to <meta_param_map_t>
end
end
local keywords_t = {}; -- map valid keywords to their associate metaparameter; reverse form of <keyword_lists[key] for these metaparameters
for _, metaparam_t in ipairs ({{'NameListStyle', 'name-list-style'}, {'Mode', 'mode'}}) do -- only these metaparameter / keywords_lists key pairs
for _, keyword in ipairs (keywords_lists[metaparam_t[2]]) do -- spin through the list of keywords
keywords_t[keyword] = metaparam_t[1]; -- add [keyword] = metaparameter to the map
end
end
for _, param in ipairs (params_t) do -- spin through the {{cs1 config}} parameters and fill <global_cs1_config_t>
local k, v = param:match ('([^=]-)%s*=%s*(.+)'); -- <k> is the parameter name; <v> is parameter's assigned value
if k then
if k:find ('^display') then -- if <k> is one of the |display-<namelist>= parameters
if v:match ('%d+') then -- the assigned value must be digits; doesn't accept 'etal'
global_cs1_config_t[meta_param_map_t[k]]=v; -- add the display param and its value to globals table
end
else
if keywords_t[v] == meta_param_map_t[k] then -- keywords_t[v] returns nil or the metaparam name; these must be the same
global_cs1_config_t[meta_param_map_t[k]]=v; -- add the parameter and its value to globals table
end
end
end
end
end
end
get_cs1_config (); -- fill <global_cs1_config_t>
--[[---------------------< S T R I P M A R K E R S >----------------------------
Common pattern definition location for stripmarkers so that we don't have to go
hunting for them if (when) MediaWiki changes their form.
]]
local stripmarkers = {
['any'] = '\127[^\127]*UNIQ%-%-(%a+)%-[%a%d]+%-QINU[^\127]*\127', -- capture returns name of stripmarker
['math'] = '\127[^\127]*UNIQ%-%-math%-[%a%d]+%-QINU[^\127]*\127' -- math stripmarkers used in coins_cleanup() and coins_replace_math_stripmarker()
}
--[[------------< I N V I S I B L E _ C H A R A C T E R S >---------------------
This table holds non-printing or invisible characters indexed either by name or
by Unicode group. Values are decimal representations of UTF-8 codes. The table
is organized as a table of tables because the Lua pairs keyword returns table
data in an arbitrary order. Here, we want to process the table from top to bottom
because the entries at the top of the table are also found in the ranges specified
by the entries at the bottom of the table.
Also here is a pattern that recognizes stripmarkers that begin and end with the
delete characters. The nowiki stripmarker is not an error but some others are
because the parameter values that include them become part of the template's
metadata before stripmarker replacement.
]]
local invisible_defs = {
del = '\127', -- used to distinguish between stripmarker and del char
zwj = '\226\128\141', -- used with capture because zwj may be allowed
}
local invisible_chars = {
{'replacement', '\239\191\189'}, -- U+FFFD, EF BF BD
{'zero width joiner', '('.. invisible_defs.zwj .. ')'}, -- U+200D, E2 80 8D; capture because zwj may be allowed
{'zero width space', '\226\128\139'}, -- U+200B, E2 80 8B
{'hair space', '\226\128\138'}, -- U+200A, E2 80 8A
{'soft hyphen', '\194\173'}, -- U+00AD, C2 AD
{'horizontal tab', '\009'}, -- U+0009 (HT), 09
{'line feed', '\010'}, -- U+000A (LF), 0A
{'no-break space', '\194\160'}, -- U+00A0 (NBSP), C2 A0
{'carriage return', '\013'}, -- U+000D (CR), 0D
{'stripmarker', stripmarkers.any}, -- stripmarker; may or may not be an error; capture returns the stripmaker type
{'delete', '('.. invisible_defs.del .. ')'}, -- U+007F (DEL), 7F; must be done after stripmarker test; capture to distinguish isolated del chars not part of stripmarker
{'C0 control', '[\000-\008\011\012\014-\031]'}, -- U+0000–U+001F (NULL–US), 00–1F (except HT, LF, CR (09, 0A, 0D))
{'C1 control', '[\194\128-\194\159]'}, -- U+0080–U+009F (XXX–APC), C2 80 – C2 9F
-- {'Specials', '[\239\191\185-\239\191\191]'}, -- U+FFF9-U+FFFF, EF BF B9 – EF BF BF
-- {'Private use area', '[\238\128\128-\239\163\191]'}, -- U+E000–U+F8FF, EE 80 80 – EF A3 BF
-- {'Supplementary Private Use Area-A', '[\243\176\128\128-\243\191\191\189]'}, -- U+F0000–U+FFFFD, F3 B0 80 80 – F3 BF BF BD
-- {'Supplementary Private Use Area-B', '[\244\128\128\128-\244\143\191\189]'}, -- U+100000–U+10FFFD, F4 80 80 80 – F4 8F BF BD
}
--[[
Indic script makes use of zero width joiner as a character modifier so zwj
characters must be left in. This pattern covers all of the unicode characters
for these languages:
Devanagari 0900–097F – https://unicode.org/charts/PDF/U0900.pdf
Devanagari extended A8E0–A8FF – https://unicode.org/charts/PDF/UA8E0.pdf
Bengali 0980–09FF – https://unicode.org/charts/PDF/U0980.pdf
Gurmukhi 0A00–0A7F – https://unicode.org/charts/PDF/U0A00.pdf
Gujarati 0A80–0AFF – https://unicode.org/charts/PDF/U0A80.pdf
Oriya 0B00–0B7F – https://unicode.org/charts/PDF/U0B00.pdf
Tamil 0B80–0BFF – https://unicode.org/charts/PDF/U0B80.pdf
Telugu 0C00–0C7F – https://unicode.org/charts/PDF/U0C00.pdf
Kannada 0C80–0CFF – https://unicode.org/charts/PDF/U0C80.pdf
Malayalam 0D00–0D7F – https://unicode.org/charts/PDF/U0D00.pdf
plus the not-necessarily Indic scripts for Sinhala and Burmese:
Sinhala 0D80-0DFF - https://unicode.org/charts/PDF/U0D80.pdf
Myanmar 1000-109F - https://unicode.org/charts/PDF/U1000.pdf
Myanmar extended A AA60-AA7F - https://unicode.org/charts/PDF/UAA60.pdf
Myanmar extended B A9E0-A9FF - https://unicode.org/charts/PDF/UA9E0.pdf
the pattern is used by has_invisible_chars() and coins_cleanup()
]]
local indic_script = '[\224\164\128-\224\181\191\224\163\160-\224\183\191\225\128\128-\225\130\159\234\167\160-\234\167\191\234\169\160-\234\169\191]';
-- list of emoji that use a zwj character (U+200D) to combine with another emoji
-- from: https://unicode.org/Public/emoji/17.0/emoji-zwj-sequences.txt; version: 17.0; 2025-01-08
-- table created by: [[:en:Module:Make emoji zwj table]]
local emoji_t = { -- indexes are decimal forms of the hex values in U+xxxx
[8596] = true, -- U+2194 ↔ left right arrow
[8597] = true, -- U+2195 ↕ up down arrow
[9760] = true, -- U+2620 ☠ skull and crossbones
[9792] = true, -- U+2640 ♀ female sign
[9794] = true, -- U+2642 ♂ male sign
[9877] = true, -- U+2695 ⚕ staff of aesculapius
[9878] = true, -- U+2696 ⚖ scales
[9895] = true, -- U+26A7 ⚧ male with stroke and male and female sign
[9992] = true, -- U+2708 ✈ airplane
[10052] = true, -- U+2744 ❄ snowflake
[10084] = true, -- U+2764 ❤ heavy black heart
[10145] = true, -- U+27A1 ➡ black rightwards arrow
[11035] = true, -- U+2B1B ⬛ black large square
[127752] = true, -- U+1F308 🌈 rainbow
[127787] = true, -- U+1F32B 🌫 fog
[127806] = true, -- U+1F33E 🌾 ear of rice
[127859] = true, -- U+1F373 🍳 cooking
[127868] = true, -- U+1F37C 🍼 baby bottle
[127876] = true, -- U+1F384 🎄 christmas tree
[127891] = true, -- U+1F393 🎓 graduation cap
[127908] = true, -- U+1F3A4 🎤 microphone
[127912] = true, -- U+1F3A8 🎨 artist palette
[127979] = true, -- U+1F3EB 🏫 school
[127981] = true, -- U+1F3ED 🏭 factory
[128048] = true, -- U+1F430 🐰 rabbit face
[128102] = true, -- U+1F466 👦 boy
[128103] = true, -- U+1F467 👧 girl
[128104] = true, -- U+1F468 👨 man
[128105] = true, -- U+1F469 👩 woman
[128139] = true, -- U+1F48B 💋 kiss mark
[128165] = true, -- U+1F4A5 💥 collision symbol
[128168] = true, -- U+1F4A8 💨 dash symbol
[128171] = true, -- U+1F4AB 💫 dizzy symbol
[128187] = true, -- U+1F4BB 💻 personal computer
[128188] = true, -- U+1F4BC 💼 brief case
[128293] = true, -- U+1F525 🔥 fire
[128295] = true, -- U+1F527 🔧 wrench
[128300] = true, -- U+1F52C 🔬 microscope
[128488] = true, -- U+1F5E8 🗨 left speech bubble
[128640] = true, -- U+1F680 🚀 rocket
[128658] = true, -- U+1F692 🚒 fire engine
[129001] = true, -- U+1F7E9 🟩 large green square
[129003] = true, -- U+1F7EB 🟫 large brown square
[129309] = true, -- U+1F91D 🤝 handshake
[129455] = true, -- U+1F9AF 🦯 probing cane
[129456] = true, -- U+1F9B0 🦰 emoji component red hair
[129457] = true, -- U+1F9B1 🦱 emoji component curly hair
[129458] = true, -- U+1F9B2 🦲 emoji component bald
[129459] = true, -- U+1F9B3 🦳 emoji component white hair
[129466] = true, -- U+1F9BA 🦺 safety vest
[129468] = true, -- U+1F9BC 🦼 motorized wheelchair
[129469] = true, -- U+1F9BD 🦽 manual wheelchair
[129489] = true, -- U+1F9D1 🧑 adult
[129490] = true, -- U+1F9D2 🧒 child
[129648] = true, -- U+1FA70 🩰 ballet shoes
[129657] = true, -- U+1FA79 🩹 adhesive bandage
[129775] = true, -- U+1FAEF fight cloud
[129778] = true, -- U+1FAF2 🫲 leftwards hand
}
--[[----------------------< L A N G U A G E S U P P O R T >-------------------
These tables and constants support various language-specific functionality.
]]
--local this_wiki_code = mw.getContentLanguage():getCode(); -- get this wiki's language code
local this_wiki_code = lang_obj:getCode(); -- get this wiki's language code
if string.match (mw.site.server, 'wikidata') then
this_wiki_code = mw.getCurrentFrame():callParserFunction('int', {'lang'}); -- on Wikidata so use interface language setting instead
end
local mw_languages_by_tag_t = mw.language.fetchLanguageNames (this_wiki_code, 'all'); -- get a table of language tag/name pairs known to Wikimedia; used for interwiki tests
local mw_languages_by_name_t = {};
for k, v in pairs (mw_languages_by_tag_t) do -- build a 'reversed' table name/tag language pairs know to MediaWiki; used for |language=
v = mw.ustring.lower (v); -- lowercase for tag fetch; get name's proper case from mw_languages_by_tag_t[<tag>]
if mw_languages_by_name_t[v] then -- when name already in the table
if 2 == #k or 3 == #k then -- if tag does not have subtags
mw_languages_by_name_t[v] = k; -- prefer the shortest tag for this name
end
else -- here when name not in the table
mw_languages_by_name_t[v] = k; -- so add name and matching tag
end
end
local inter_wiki_map = {}; -- map of interwiki prefixes that are language-code prefixes
for k, v in pairs (mw.site.interwikiMap ('local')) do -- spin through the base interwiki map (limited to local)
if mw_languages_by_tag_t[v["prefix"]] then -- if the prefix matches a known language tag
inter_wiki_map[v["prefix"]] = true; -- add it to our local map
end
end
--[[--------------------< S C R I P T _ L A N G _ C O D E S >-------------------
This table is used to hold ISO 639-1 two-character and ISO 639-3 three-character
language codes that apply only to |script-title= and |script-chapter=
]]
local script_lang_codes = {
'ab', 'am', 'ar', 'as', 'az', 'be', 'bg', 'bn', 'bo', 'bs', 'ce', 'chr',
'cu', 'dv', 'dz', 'el', 'fa', 'grc', 'gu', 'he', 'hi', 'hy', 'ja', 'ka',
'kaa', 'kk', 'km', 'kn', 'ko', 'ku', 'ky', 'lo', 'mk', 'ml', 'mn', 'mni',
'mr', 'my', 'ne', 'or', 'ota', 'pa', 'ps', 'ru', 'sd', 'si', 'sr', 'syc',
'ta', 'te', 'tg', 'th', 'ti', 'tkr', 'tt', 'ug', 'uk', 'ur', 'uz', 'yi',
'yue', 'zh', 'zgh'
};
--[[---------------< L A N G U A G E R E M A P P I N G >----------------------
These tables hold language information that is different (correct) from MediaWiki's definitions
For each ['<tag>'] = 'language name' in lang_code_remap{} there must be a matching ['language name'] = {'language name', '<tag>'} in lang_name_remap{}
lang_tag_remap{}:
key is always lowercase ISO 639-1, -2, -3 language tag or a valid lowercase IETF language tag
value is properly spelled and capitalized language name associated with <tag>
only one language name per <tag>;
key/value pair must have matching entry in lang_name_remap{}
lang_name_remap{}:
key is always lowercase language name
value is a table the holds correctly spelled and capitalized language name [1] and associated tag [2] (tag must match a tag key in lang_tag_remap{})
may have multiple keys referring to a common preferred name and tag; For example:
['kolsch'] and ['kölsch'] both refer to 'Kölsch' and 'ksh'
]]
local lang_tag_remap = { -- used for |language= and |script-title= / |script-chapter=
['als'] = 'Tosk Albanian', -- MediaWiki returns Alemannisch
['bh'] = 'Bihari', -- MediaWiki uses 'bh' as a subdomain name for Bhojpuri Wikipedia: bh.wikipedia.org
['bla'] = 'Blackfoot', -- MediaWiki/IANA/ISO 639: Siksika; use en.wiki preferred name
['bn'] = 'Bengali', -- MediaWiki returns Bangla
['ca-valencia'] = 'Valencian', -- IETF variant of Catalan
['fkv'] = 'Kven', -- MediaWiki returns Kvensk
['gsw'] = 'Swiss German',
['ilo'] = 'Ilocano', -- MediaWiki/IANA/ISO 639: Iloko; use en.wiki preferred name
['ksh'] = 'Kölsch', -- MediaWiki: Colognian; use IANA/ISO 639 preferred name
['ksh-x-colog'] = 'Colognian', -- override MediaWiki ksh; no IANA/ISO 639 code for Colognian; IETF private code created at Module:Lang/data
['mis-x-ripuar'] = 'Ripuarian', -- override MediaWiki ksh; no IANA/ISO 639 code for Ripuarian; IETF private code created at Module:Lang/data
['nan-tw'] = 'Taiwanese Hokkien', -- make room for MediaWiki/IANA/ISO 639 nan: Min Nan Chinese and support en.wiki preferred name
['sr-ec'] = 'Serbian (Cyrillic script)', -- MediaWiki returns српски (ћирилица)
['sr-el'] = 'Serbian (Latin script)', -- MediaWiki returns srpski (latinica)
}
local lang_name_remap = { -- used for |language=; names require proper capitalization; tags must be lowercase
['alemannic'] = {'Swiss German', 'gsw'}, -- ISO 639-2, -3 alternate for Swiss German; MediaWiki mediawiki returns Alemannic for gsw; en.wiki preferred name
['alemannisch'] = {'Swiss German', 'gsw'}, -- not an ISO or IANA language name; MediaWiki uses 'als' as a subdomain name for Alemannic Wikipedia: als.wikipedia.org
['bangla'] = {'Bengali', 'bn'}, -- MediaWiki returns Bangla (the endonym) but we want Bengali (the exonym); here we remap
['bengali'] = {'Bengali', 'bn'}, -- MediaWiki doesn't use exonym so here we provide correct language name and 639-1 code
['bhojpuri'] = {'Bhojpuri', 'bho'}, -- MediaWiki uses 'bh' as a subdomain name for Bhojpuri Wikipedia: bh.wikipedia.org
['bihari'] = {'Bihari', 'bh'}, -- MediaWiki replaces 'Bihari' with 'Bhojpuri' so 'Bihari' cannot be found
['blackfoot'] = {'Blackfoot', 'bla'}, -- MediaWiki/IANA/ISO 639: Siksika; use en.wiki preferred name
['colognian'] = {'Colognian', 'ksh-x-colog'}, -- MediaWiki preferred name for ksh
['ilocano'] = {'Ilocano', 'ilo'}, -- MediaWiki/IANA/ISO 639: Iloko; use en.wiki preferred name
['kolsch'] = {'Kölsch', 'ksh'}, -- use IANA/ISO 639 preferred name (use non-diacritical o instead of umlaut ö)
['kölsch'] = {'Kölsch', 'ksh'}, -- use IANA/ISO 639 preferred name
['kven'] = {'Kven', 'fkv'}, -- Unicode CLDR have decided not to support English language name for these two...
['kvensk'] = {'Kven', 'fkv'}, -- ...they say to refer to IANA registry for English names
['ripuarian'] = {'Ripuarian', 'mis-x-ripuar'}, -- group of dialects; no code in MediaWiki or in IANA/ISO 639
['serbian (cyrillic script)'] = {'Serbian (Cyrillic script)', 'sr-cyrl'}, -- special case to get correct tag when |language=sr-ec
['serbian (latin script)'] = {'Serbian (Latin script)', 'sr-latn'}, -- special case to get correct tag when |language=sr-el
['swiss german'] = {'Swiss German', 'gsw'},
['taiwanese hokkien'] = {'Taiwanese Hokkien', 'nan-tw'}, -- make room for MediaWiki/IANA/ISO 639 nan: Min Nan Chinese
['tosk albanian'] = {'Tosk Albanian', 'als'}, -- MediaWiki replaces 'Tosk Albanian' with 'Alemannisch' so 'Tosk Albanian' cannot be found
['valencian'] = {'Valencian', 'ca-valencia'}, -- variant of Catalan; categorizes as Valencian
}
--[[---------------< P R O P E R T I E S _ C A T E G O R I E S >----------------
Properties categories. These are used for investigating qualities of citations.
]]
local prop_cats = {
['foreign-lang-source'] = 'CS1 $1-fonte lian sira ($2)', -- |language= categories; $1 is foreign-language name, $2 is ISO639-1 code
['foreign-lang-source-2'] = 'CS1 fonte lian estranjeiru sira (ISO 639-2)|$1', -- |language= category; a cat for ISO639-2 languages; $1 is the ISO 639-2 code used as a sort key
['interproj-linked-name'] = 'CS1 naran sira ne\'ebé liga ba interprojetu sira|$1', -- any author, editor, etc that has an interproject link; $1 is interproject tag used as a sort key
['interwiki-linked-name'] = 'CS1 naran sira ne\'ebé iha ligasaun entre wiki|$1', -- any author, editor, etc that has an interwiki link; $1 is interwiki tag used as a sort key; yeilds to interproject
['local-lang-source'] = 'CS1 $1-fonte lian sira ($2)', -- |language= categories; $1 is local-language name, $2 is ISO639-1 code; not emitted when local_lang_cat_enable is false
['location-test'] = 'CS1 teste lokalizasaun',
['long-vol'] = 'CS1: valór volume naruk', -- probably temporary cat to identify scope of |volume= values longer than 4 characters
['script'] = 'CS1 uza letra lian $1 ($2)', -- |script-title=xx: has matching category; $1 is language name, $2 is language tag
['tracked-param'] = 'CS1 parametru ne\'ebé akompaña: $1', -- $1 is base (enumerators removed) parameter name
['unfit'] = 'CS1: URL ne\'ebé la apropriadu', -- |url-status=unfit or |url-status=usurped; used to be a maint cat
['vanc-accept'] = 'CS1:Vancouver nia naran sira ho aseitasaun', -- for |vauthors=/|veditors= with accept-as-written markup
['year-range-abbreviated'] = 'CS1: tinan ne\'ebé badak', -- probably temporary cat to identify scope of |date=, |year= values using YYYY–YY form
}
--[[-------------------< T I T L E _ T Y P E S >--------------------------------
Here we map a template's CitationClass to TitleType (default values for |type= parameter)
]]
local title_types = {
['AV-media-notes'] = 'Nota sira hosi mídia',
['document'] = 'Dokumentu',
['interview'] = 'Intervista',
['mailinglist'] = 'Lista mailing',
['map'] = 'Mapa',
['podcast'] = 'Podcast',
['pressrelease'] = 'Komunikadu imprensa',
['report'] = 'Relatóriu',
['speech'] = 'Diskursu',
['techreport'] = 'Relatóriu tékniku',
['thesis'] = 'Teze',
}
--[[--------------------------< B U I L D _ K N O W N _ F R E E _ D O I _ R E G I S T R A N T S _ T A B L E >--
build a table of doi registrants known to be free-to-read In a doi, the registrant ID is the series of digits
between the '10.' and the first '/': in doi 10.1100/sommat, 1100 is the registrant ID
see §3.2.2 DOI prefix of the Doi Handbook p. 43
https://www.doi.org/doi-handbook/DOI_Handbook_Final.pdf#page=43
]]
local function build_free_doi_registrants_table()
local registrants_t = {};
for _, v in ipairs ({
'1045', '1074', '1096', '1100', '1155', '1186', '1194', '1371', '1613', '1629', '1989', '1999', '2147', '2196', '3285', '3389', '3390', '3906',
'3748', '3814', '3847', '3897', '4061', '4089', '4103', '4172', '4175', '4230', '4236', '4239', '4240', '4249', '4251',
'4252', '4253', '4254', '4291', '4292', '4329', '4330', '4331', '5086', '5194', '5210', '5306', '5312', '5313', '5314',
'5315', '5316', '5317', '5318', '5319', '5320', '5321', '5334', '5402', '5409', '5410', '5411', '5412',
'5492', '5493', '5494', '5495', '5496', '5497', '5498', '5499', '5500', '5501', '5527', '5528', '5662',
'6064', '6219', '7167', '7217', '7287', '7482', '7490', '7554', '7717', '7759', '7766', '9778', '11131', '11569', '11647',
'11648', '12688', '12703', '12715', '12942', '12998', '13105', '14256', '14293', '14303', '15215', '15347', '15412', '15560', '16995',
'17645', '18637', '19080', '19173', '20944', '21037', '21105', '21468', '21767', '21425', '22261', '22323', '22459', '24105', '24196', '24966',
'26775', '30845', '32545', '35711', '35712', '35713', '35995', '36648', '37126', '37532', '37871', '47128',
'47622', '47959', '52437', '52975', '53288', '53347', '54081', '54947', '55667', '55914', '57009', '58647', '59081',
}) do
registrants_t[v] = true; -- build a k/v table of known free-to-read doi registrants
end
return registrants_t;
end
-- known free registrants identifiable by the doi suffix incipit
local extended_registrants_t = { -- doi suffix incipits are evaluated as lua patterns
['1002'] = {'aelm', 'leap', 'loe2%.', 'lol2%.'}, -- Advanced Electronic Materials, Learned Publishing, L&O e-Lectures, L&O Letters
['1016'] = {'j%.aace', 'j%.aed', 'j%.aiopen', 'j%.animal', 'j%.apsb', 'j%.addicn', -- AACE Endocrinology and Diabetes, AACE Endocrinology and Diabetes, AI Open, Animal, Acta Pharmaceutica Sinica B, Addiction Neuroscience
'j%.abrep', 'j%.gpb', 'j%.heliyon', 'j%.nlp', 'j%.patter', 'j%.proche', -- Addictive Behaviors Reports, Genomics, Proteomics & Bioinformatics after 2015, Heliyon, Natural Language Processing, Patterns, Procedia Chemistry
'j%.vgie', 'S1672-0229'}, -- VideoGIE, Genomics, Proteomics & Bioinformatics before 2015
['1017'] = {'apj%.', 'nlp', 'mdh', 'S15574660'}, -- Natural Language Processing Journal, Medical History, Asia Pacific Journal
['1046'] = {'j%.1365-8711', 'j%.1365-246x'}, -- MNRAS, GJI
['1021'] = {'acscentsci', 'acsomega'}, -- ACS Central Science, ACS Omega
['1093'] = {'mnras', 'mnrasl', 'gji', 'pnasnexus', 'rasti'}, -- MNRAS, MNRAS Letters, GJI, PNAS Nexus, RASTI
['1098'] = {'rsbm', 'rsob', 'rsos'}, -- Biographical Memoirs of Fellows of the Royal Society, Open Biology, Royal Society Open Science
['1099'] = {'acmi', 'mic', '00221287', 'mgen'}, -- Access Microbiology, Microbiology, Journal of General Microbiology, Microbial Genomics
['1107'] = {'S20569890', 'S20522525', 'S16005775', 'S24143146'}, -- Acta Crystallographica E, IUCrJ, Journal of Synchrotron Radiation, IUCrData
['1109'] = {'oa', 'oj'}, -- IEEE Open Access..., IEEE Open Journal...
['1111'] = {'aogs', 'j%.1365-2966', 'j%.1745-3933', 'j%.1365-246X'}, -- Acta Obstetricia et Gynecologica Scandinavica, MNRAS, MNRAS Letters, GJI
['1128'] = {'asmcr', 'jmbe', 'mbio', 'mra', 'spectrum', 'msphere', 'msystems'}, --ASM Case Reports, Journal of Microbiology & Biology Education, mBio, Microbiology Resource Announcements, Microbiology Spectrum, mSphere, mSystems
['1136'] = {'bmjopen'}, -- BMJ Open
['1140'] = {'epjc'}, -- European Physical Journal C
['1192'] = {'bjo'}, -- BJPsych Open
['1210'] = {'jendso','jcemcr'}, -- Journal of the Endocrine Society, JCEM Case Reports
['1215'] = {'21573689', '21573698'}, -- L&O Fluids
['1590'] = {'0102-3306'}, -- Acta Botanica Brasilica
['4171'] = {'dm','mag'}, -- Documenta Mathematica, EMS Magazine
['4319'] = {'lo%.', 'lol%.', 'lom%.'}, -- L&O, L&O e-Lectures, L&O Methods
['5852'] = {'ejt'}, -- European Journal of Taxonomy
['7155'] = {'jgaa'}, -- Journal of Graph Algorithms and Applications
['11158'] = {'saasp'}, -- Systematic and Applied Acarology Special Publications
['11646'] = {'megataxa', 'mesozoic'}, -- Megataxa, Mesozoic
['14231'] = {'ag'}, -- Algebraic Geometry
['15446'] = {'abc'}, -- Acta Biológica Colombiana
['17239'] = {'jowr'}, -- Journal of Writing Research
['22073'] = {'pja'}, -- Persian Journal of Acarology
['24310'] = {'abm'}, -- Acta Botanica Malacitana
['24425'] = {'agp'}, -- Acta Geologica Polonica
['35249'] = {'rche'}, -- Revista Chilena de Entomología
['37520'] = {'fi'}, -- Fossil Imprint
['53562'] = {'ajcb'} -- Asian Journal of Conservation Biology
}
--[[===================<< E R R O R M E S S A G I N G >>======================
]]
--[[----------< E R R O R M E S S A G E S U P P L E M E N T S >-------------
I18N for those messages that are supplemented with additional specific text that
describes the reason for the error
TODO: merge this with special_case_translations{}?
]]
local err_msg_supl = {
['char'] = 'karakter ne\'ebé la válidu', -- |isbn=, |sbn=
['check'] = 'checksum', -- |isbn=, |sbn=
empty_str = '(string mamuk)', -- empty unknown parameter check when cite has |=
['flag'] = 'bandeira', -- |archive-url=
['form'] = 'formuláriu ne\'ebé la válidu', -- |isbn=, |sbn=
['group'] = 'id grupu nian ne\'ebé la válidu', -- |isbn=
['initials'] = 'inisiál sira', -- Vancouver
['invalid language code'] = 'kódigu linguajen ne\'ebé la válidu', -- |script-<param>=
['journal'] = 'jornál', -- |bibcode=
['length'] = 'naruk', -- |isbn=, |bibcode=, |sbn=
['liveweb'] = 'liveweb', -- |archive-url=
['missing comma'] = 'vírgula ne\'ebé laiha', -- Vancouver
['missing prefix'] = 'prefiksu ne\'ebé laiha', -- |script-<param>=
['missing title part'] = 'parte títulu nian ne\'ebé laiha', -- |script-<param>=
['name'] = 'naran', -- Vancouver
['non-Latin char'] = 'karakter la\'ós-latín', -- Vancouver
['path'] = 'dalan', -- |archive-url=
['prefix'] = 'prefiksu ne\'ebé la válidu', -- |isbn=
['punctuation'] = 'pontuasaun', -- Vancouver
['save'] = 'komandu salva', -- |archive-url=
['suffix'] = 'sufiksu', -- Vancouver
['timestamp'] = 'karimbu tempu', -- |archive-url=
['unknown language code'] = 'kódigu lian deskoñesidu', -- |script-<param>=
['value'] = 'valór', -- |bibcode=
['year'] = 'tinan', -- |bibcode=
}
--[[--------------< E R R O R _ C O N D I T I O N S >---------------------------
Error condition table. This table has two sections: errors at the top, maintenance
at the bottom. Maint 'messaging' does not have a 'message' (message=nil)
The following contains a list of IDs for various error conditions defined in the
code. For each ID, we specify a text message to display, an error category to
include, and whether the error message should be wrapped as a hidden comment.
Anchor changes require identical changes to matching anchor in Help:CS1 errors
TODO: rename error_conditions{} to something more generic; create separate error
and maint tables inside that?
]]
local error_conditions = {
err_accessdate_missing_url = {
message = '<code class="cs1-code">|access-date=</code> presiza <code class="cs1-code">|url=</code>',
anchor = 'accessdate_missing_url',
category = 'Erru CS1: access-date nian lahó URL',
hidden = false
},
err_apostrophe_markup = {
message = 'Markup itáliku ka metan la permite iha: <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'apostrophe_markup',
category = 'Erru CS1: marka',
hidden = false
},
err_archive_date_missing_url = {
message = '<code class="cs1-code">|archive-date=</code> presiza <code class="cs1-code">|archive-url=</code>',
anchor = 'archive_date_missing_url',
category = 'Erru CS1: archive-url',
hidden = false
},
err_archive_date_url_ts_mismatch = {
message = '<code class="cs1-code">|archive-date=</code> / <code class="cs1-code">|archive-url=</code> tempu ne\'ebé la hanesan; $1 sujere',
anchor = 'archive_date_url_ts_mismatch',
category = 'Erru CS1: archive-url',
hidden = false
},
err_archive_missing_date = {
message = '<code class="cs1-code">|archive-url=</code> presiza <code class="cs1-code">|archive-date=</code>',
anchor = 'archive_missing_date',
category = 'Erru CS1: archive-url',
hidden = false
},
err_archive_missing_url = {
message = '<code class="cs1-code">|archive-url=</code> presiza <code class="cs1-code">|url=</code>',
anchor = 'archive_missing_url',
category = 'Erru CS1: archive-url',
hidden = false
},
err_archive_url = {
message = '<code class="cs1-code">|archive-url=</code> la forma: $1', -- $1 is error message detail
anchor = 'archive_url',
category = 'Erru CS1: archive-url',
hidden = false
},
err_arxiv_missing = {
message = '<code class="cs1-code">|arxiv=</code> presiza',
anchor = 'arxiv_missing',
category = 'Erru CS1: arXiv', -- same as bad arxiv
hidden = false
},
err_asintld_missing_asin = {
message = '<code class="cs1-code">|$1=</code> presiza <code class="cs1-code">|asin=</code>', -- $1 is parameter name
anchor = 'asintld_missing_asin',
category = 'Erru CS1: ASIN TLD',
hidden = false
},
err_bad_arxiv = {
message = 'Verifika valór <code class="cs1-code">|arxiv=</code>',
anchor = 'bad_arxiv',
category = 'Erru CS1: arXiv',
hidden = false
},
err_bad_asin = {
message = 'Verifika valór <code class="cs1-code">|asin=</code>',
anchor = 'bad_asin',
category ='Erru CS1: ASIN',
hidden = false
},
err_bad_asin_tld = {
message = 'Verifika valór <code class="cs1-code">|asin-tld=</code>e',
anchor = 'bad_asin_tld',
category ='Erru CS1: ASIN TLD',
hidden = false
},
err_bad_bibcode = {
message = 'Verifika <code class="cs1-code">|bibcode=</code> $1', -- $1 is error message detail
anchor = 'bad_bibcode',
category = 'Erru CS1: bibcode',
hidden = false
},
err_bad_biorxiv = {
message = 'Verifika valór <code class="cs1-code">|biorxiv=</code>',
anchor = 'bad_biorxiv',
category = 'Erru CS1: bioRxiv',
hidden = false
},
err_bad_citeseerx = {
message = 'Verifika valór <code class="cs1-code">|citeseerx=</code>',
anchor = 'bad_citeseerx',
category = 'Erru CS1: citeseerx',
hidden = false
},
err_bad_date = {
message = 'Verifika valór data nian iha: $1', -- $1 is a parameter name list
anchor = 'bad_date',
category = 'Erru CS1: data sira',
hidden = false
},
err_bad_doi = {
message = 'Verifika valór <code class="cs1-code">|doi=</code>',
anchor = 'bad_doi',
category = 'Erru CS1: DOI',
hidden = false
},
err_bad_hdl = {
message = 'Verifika valór <code class="cs1-code">|hdl=</code>',
anchor = 'bad_hdl',
category = 'Erru CS1: HDL',
hidden = false
},
err_bad_isbn = {
message = 'Verifika valór <code class="cs1-code">|isbn=</code>: $1', -- $1 is error message detail
anchor = 'bad_isbn',
category = 'Erru CS1: ISBN',
hidden = false
},
err_bad_ismn = {
message = 'Verifika valór <code class="cs1-code">|ismn=</code>',
anchor = 'bad_ismn',
category = 'Erru CS1: ISMN',
hidden = false
},
err_bad_issn = {
message = 'Verifika valór <code class="cs1-code">|$1issn=</code>', -- $1 is 'e' or '' for eissn or issn
anchor = 'bad_issn',
category = 'Erru CS1: ISSN',
hidden = false
},
err_bad_jfm = {
message = 'Verifika valór <code class="cs1-code">|jfm=</code>',
anchor = 'bad_jfm',
category = 'Erru CS1: JFM',
hidden = false
},
err_bad_jstor = {
message = 'Verifika valór <code class="cs1-code">|jstor=</code>',
anchor = 'bad_jstor',
category = 'Erru CS1: JSTOR',
hidden = false
},
err_bad_lccn = {
message = 'Verifika valór <code class="cs1-code">|lccn=</code>',
anchor = 'bad_lccn',
category = 'Erru CS1: LCCN',
hidden = false
},
err_bad_medrxiv = {
message = 'Verifika valór <code class="cs1-code">|medrxiv=</code>',
anchor = 'bad_medrxiv',
category = 'Erru CS1: medRxiv',
hidden = false
},
err_bad_mr = {
message = 'Verifika valór <code class="cs1-code">|mr=</code>',
anchor = 'bad_mr',
category = 'Erru CS1: MR',
hidden = false
},
err_bad_oclc = {
message = 'Verifika valór <code class="cs1-code">|oclc=</code>',
anchor = 'bad_oclc',
category = 'Erru CS1: OCLC',
hidden = false
},
err_bad_ol = {
message = 'Verifika valór <code class="cs1-code">|ol=</code>',
anchor = 'bad_ol',
category = 'Erru CS1: OL',
hidden = false
},
err_bad_osti = {
message = 'Verifika valór <code class="cs1-code">|osti=</code>',
anchor = 'bad_osti',
category = 'Erru CS1: OSTI',
hidden = false
},
err_bad_paramlink = { -- for |title-link=, |author/editor/translator-link=, |series-link=, |episode-link=
message = 'Verifika valór <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'bad_paramlink',
category = 'Erru CS1: parameter link',
hidden = false
},
err_bad_pmc = {
message = 'Verifika valór <code class="cs1-code">|pmc=</code>',
anchor = 'bad_pmc',
category = 'Erru CS1: PMC',
hidden = false
},
err_bad_pmid = {
message = 'Verifika valór <code class="cs1-code">|pmid=</code>',
anchor = 'bad_pmid',
category = 'Erru CS1: PMID',
hidden = false
},
err_bad_rfc = {
message = 'Verifika valór <code class="cs1-code">|rfc=</code>',
anchor = 'bad_rfc',
category = 'Erru CS1: RFC',
hidden = false
},
err_bad_s2cid = {
message = 'Verifika valór <code class="cs1-code">|s2cid=</code>',
anchor = 'bad_s2cid',
category = 'Erru CS1: S2CID',
hidden = false
},
err_bad_sbn = {
message = 'Verifika valór <code class="cs1-code">|sbn=</code>: $1', -- $1 is error message detail
anchor = 'bad_sbn',
category = 'Erru CS1: SBN',
hidden = false
},
err_bad_ssrn = {
message = 'Verifika valór <code class="cs1-code">|ssrn=</code>',
anchor = 'bad_ssrn',
category = 'Erru CS1: SSRN',
hidden = false
},
err_bad_url = {
message = 'Verifika valór $1', -- $1 is parameter name
anchor = 'bad_url',
category = 'Erru CS1: URL',
hidden = false
},
err_bad_usenet_id = {
message = 'Verifika valór <code class="cs1-code">|message-id=</code> value',
anchor = 'bad_message_id',
category = 'Erru CS1: message-id',
hidden = false
},
err_bad_zbl = {
message = 'Verifika valór <code class="cs1-code">|zbl=</code> value',
anchor = 'bad_zbl',
category = 'Erru CS1: Zbl',
hidden = false
},
err_bare_url_missing_title = {
message = '$1 missing title', -- $1 is parameter name
anchor = 'bare_url_missing_title',
category = 'Erru CS1: URL mamuk',
hidden = false
},
err_biorxiv_missing = {
message = '<code class="cs1-code">|biorxiv=</code> presija',
anchor = 'biorxiv_missing',
category = 'Erru CS1: bioRxiv', -- same as bad bioRxiv
hidden = false
},
err_chapter_ignored = {
message = '<code class="cs1-code">|$1=</code> ignora', -- $1 is parameter name
anchor = 'chapter_ignored',
category = 'Erru CS1: kapítulu ne\'ebé ignora',
hidden = false
},
err_citation_missing_title = {
message = 'Missing or empty <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'citation_missing_title',
category = 'Erru CS1: missing title',
hidden = false
},
err_citeseerx_missing = {
message = '<code class="cs1-code">|citeseerx=</code> presija',
anchor = 'citeseerx_missing',
category = 'Erru CS1: citeseerx', -- same as bad citeseerx
hidden = false
},
err_cite_web_url = { -- this error applies to cite web and to cite podcast
message = 'La iha ka mamuk <code class="cs1-code">|url=</code>',
anchor = 'cite_web_url',
category = 'Erru CS1: presiza URL',
hidden = false
},
err_class_ignored = {
message = '<code class="cs1-code">|class=</code> ignora',
anchor = 'class_ignored',
category = 'Erru CS1: class',
hidden = false
},
err_contributor_ignored = {
message = '<code class="cs1-code">|contributor=</code> ignora',
anchor = 'contributor_ignored',
category = 'Erru CS1: contributor',
hidden = false
},
err_contributor_missing_required_param = {
message = '<code class="cs1-code">|contributor=</code> presiza <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'contributor_missing_required_param',
category = 'Erru CS1: contributor',
hidden = false
},
err_deprecated_params = {
message = 'Cite uza parametru ne\'ebé la uza ona <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'deprecated_params',
category = 'Erru CS1: parámetru sira ne\'ebé la uza ona',
hidden = false
},
err_disp_name = {
message = 'La válidu <code class="cs1-code">|$1=$2</code>', -- $1 is parameter name; $2 is the assigned value
anchor = 'disp_name',
category = 'Erru CS1: display-names',
hidden = false,
},
err_doibroken_missing_doi = {
message = '<code class="cs1-code">|$1=</code> presiza <code class="cs1-code">|doi=</code>', -- $1 is parameter name
anchor = 'doibroken_missing_doi',
category = 'Erru CS1: DOI',
hidden = false
},
err_embargo_missing_pmc = {
message = '<code class="cs1-code">|$1=</code> presiza <code class="cs1-code">|pmc=</code>', -- $1 is parameter name
anchor = 'embargo_missing_pmc',
category = 'Erru CS1: PMC embargo',
hidden = false
},
err_empty_citation = {
message = 'Sitasaun mamuk',
anchor = 'empty_citation',
category = 'Erru CS1: sitasaun mamuk',
hidden = false
},
err_etal = {
message = 'Uzu esplísitu husi et al. iha: <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'explicit_et_al',
category = 'Erru CS1: uza esplísitu husi et al.',
hidden = false
},
err_extra_text_edition = {
message = '<code class="cs1-code">|edition=</code> iha testu estra',
anchor = 'extra_text_edition',
category = 'Erru CS1: testu estra: edition',
hidden = false,
},
err_extra_text_issue = {
message = '<code class="cs1-code">|$1=</code> iha testu estra', -- $1 is parameter name
anchor = 'extra_text_issue',
category = 'Erru CS1: testu estra: issue',
hidden = false,
},
err_extra_text_pages = {
message = '<code class="cs1-code">|$1=</code> iha testu estra', -- $1 is parameter name
anchor = 'extra_text_pages',
category = 'Erru CS1: testu estra: pages',
hidden = false,
},
err_extra_text_volume = {
message = '<code class="cs1-code">|$1=</code> iha testu estra', -- $1 is parameter name
anchor = 'extra_text_volume',
category = 'Erru CS1: testu estra: volume',
hidden = false,
},
err_first_missing_last = {
message = '<code class="cs1-code">|$1=</code> laiha <code class="cs1-code">|$2=</code>', -- $1 is first alias, $2 is matching last alias
anchor = 'first_missing_last',
category = 'Erru CS1: naran ne\'ebé lakon', -- author, contributor, editor, interviewer, translator
hidden = false
},
err_format_missing_url = {
message = '<code class="cs1-code">|$1=</code> presiza <code class="cs1-code">|$2=</code>', -- $1 is format parameter $2 is url parameter
anchor = 'format_missing_url',
category = 'Erru CS1: formatu lahó URL',
hidden = false
},
err_generic_name = {
message = '<code class="cs1-code">|$1=</code> iha naran jenériku', -- $1 is parameter name
anchor = 'generic_name',
category = 'Erru CS1: naran jenériku',
hidden = false,
},
err_generic_title = {
message = 'Cite uza títulu jenériku',
anchor = 'generic_title',
category = 'Erru CS1: títulu jenériku',
hidden = false,
},
err_invalid_isbn_date = {
message = 'ISBN / Data inkompatibilidade',
anchor = 'invalid_isbn_date',
category = 'Erru CS1: ISBN data',
hidden = true
},
err_invalid_param_val = {
message = 'La válidu <code class="cs1-code">|$1=$2</code>', -- $1 is parameter name $2 is parameter value
anchor = 'invalid_param_val',
category = 'Erru CS1: valór parámetru ne\'ebé la válidu',
hidden = false
},
err_invisible_char = {
message = '$1 iha $2 iha pozisaun $3', -- $1 is invisible char $2 is parameter name $3 is position number
anchor = 'invisible_char',
category = 'Erru CS1: karakter invizível sira',
hidden = false
},
err_medrxiv_missing = {
message = '<code class="cs1-code">|medrxiv=</code> presiza',
anchor = 'medrxiv_missing',
category = 'Erru CS1: medRxiv', -- same as bad medRxiv
hidden = false
},
err_missing_name = {
message = 'La iha <code class="cs1-code">|$1$2=</code>', -- $1 is modified NameList; $2 is enumerator
anchor = 'missing_name',
category = 'Erru CS1: naran ne\'ebé lakon', -- author, contributor, editor, interviewer, translator
hidden = false
},
err_missing_periodical = {
message = 'Cite $1 presiza <code class="cs1-code">|$2=</code>', -- $1 is cs1 template name; $2 is canonical periodical parameter name for cite $1
anchor = 'missing_periodical',
category = 'Erru CS1: periódiku ne\'ebé laiha',
hidden = false
},
err_missing_pipe = {
message = 'Lakon kanu iha laran: <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'missing_pipe',
category = 'Erru CS1: lakon kanu',
hidden = false
},
err_missing_publisher = {
message = 'Cite $1 presiza <code class="cs1-code">|$2=</code>', -- $1 is cs1 template name; $2 is canonical publisher parameter name for cite $1
anchor = 'missing_publisher',
category = 'Erru CS1: publisher ne\'ebé lakon',
hidden = false
},
err_numeric_names = {
message = '<code class="cs1-code">|$1=</code> iha naran numériku', -- $1 is parameter name',
anchor = 'numeric_names',
category = 'Erru CS1: naran numériku',
hidden = false,
},
err_param_access_requires_param = {
message = '<code class="cs1-code">|$1-access=</code> presiza <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'param_access_requires_param',
category = 'Erru CS1: param-access',
hidden = false
},
err_param_has_ext_link = {
message = 'Ligasaun esternu iha <code class="cs1-code">$1</code>', -- $1 is parameter name
anchor = 'param_has_ext_link',
category = 'Erru CS1: ligasaun esternu sira',
hidden = false
},
err_param_has_twl_url = {
message = 'Ligasaun Biblioteka Wikipedia iha <code class="cs1-code">$1</code>', -- $1 is parameter name
anchor = 'param_has_twl_url',
category = 'Erru CS1: URL',
hidden = false
},
err_parameter_ignored = {
message = 'Parametru deskoñesidu <code class="cs1-code">|$1=</code> ignora', -- $1 is parameter name
anchor = 'parameter_ignored',
category = 'Erru CS1: parametru ne\'ebé la suporta',
hidden = false
},
err_parameter_ignored_suggest = {
message = 'Parametru deskoñesidu <code class="cs1-code">|$1=</code> ignora (<code class="cs1-code">|$2=</code> sujere)', -- $1 is unknown parameter $2 is suggested parameter name
anchor = 'parameter_ignored_suggest',
category = 'Erru CS1: parametru ne\'ebé la suporta',
hidden = false
},
err_periodical_ignored = {
message = '<code class="cs1-code">|$1=</code> ignora', -- $1 is parameter name
anchor = 'periodical_ignored',
category = 'Erru CS1: periódiku ignoradu',
hidden = false
},
err_redundant_parameters = {
message = 'Liu ida hosi $1 ne\'ebé espesifika ona', -- $1 is error message detail
anchor = 'redundant_parameters',
category = 'Erru CS1: parámetru redundante',
hidden = false
},
err_script_parameter = {
message = 'La válidu <code class="cs1-code">|$1=</code>: $2', -- $1 is parameter name $2 is script language code or error detail
anchor = 'script_parameter',
category = 'Erru CS1: parametru sira skript nian',
hidden = false
},
err_ssrn_missing = {
message = '<code class="cs1-code">|ssrn=</code> presiza',
anchor = 'ssrn_missing',
category = 'Erru CS1: SSRN',
hidden = false
},
err_text_ignored = {
message = 'Testu "$1" ignora', -- $1 is ignored text
anchor = 'text_ignored',
category = 'Erru CS1: parametru ne\'ebé la rekoñese',
hidden = false
},
err_trans_missing_title = {
message = '<code class="cs1-code">|trans-$1=</code> presiza <code class="cs1-code">|$1=</code> ka <code class="cs1-code">|script-$1=</code>', -- $1 is base parameter name
anchor = 'trans_missing_title',
category = 'Erru CS1: títulu ne\'ebé tradús',
hidden = false
},
err_param_unknown_empty = {
message = 'Cite iha parametru deskoñesidu mamuk$1: $2', -- $1 is 's' or empty space; $2 is emty unknown param list
anchor = 'param_unknown_empty',
category = 'Erru CS1: mamuk parametru deskoñesidu sira',
hidden = false
},
err_vancouver = {
message = 'Erru estilu Vancouver: $1 iha naran $2', -- $1 is error detail, $2 is the nth name
anchor = 'vancouver',
category = 'Erru CS1: Estilu Vancouver',
hidden = false
},
err_wikilink_in_url = {
message = 'Konflitu URL–wikilink', -- uses ndash
anchor = 'wikilink_in_url',
category = 'Erru CS1: konflitu URL–wikilink', -- uses ndash
hidden = false
},
--[[--------------------------< M A I N T >-------------------------------------
maint messages do not have a message (message = nil); otherwise the structure
is the same as error messages
]]
maint_archive_origin = {
message = nil,
anchor = 'archive_origin',
category = 'Manutensaun CS1: orijen arkivu nian',
hidden = true,
},
maint_archived_copy = {
message = nil,
anchor = 'archived_copy',
category = 'Manutensaun CS1: archived copy as title',
hidden = true,
},
maint_bibcode = {
message = nil,
anchor = 'bibcode',
category = 'Manutensaun CS1: bibcode',
hidden = true,
},
maint_location_no_publisher = { -- cite book, conference, encyclopedia; citation as book cite or encyclopedia cite
message = nil,
anchor = 'location_no_publisher',
category = 'Manutensaun CS1: location missing publisher',
hidden = true,
},
maint_bot_unknown = {
message = nil,
anchor = 'bot:_unknown',
category = 'Manutensaun CS1: bot: original URL status unknown',
hidden = true,
},
maint_date_auto_xlated = { -- date auto-translation not supported by en.wiki
message = nil,
anchor = 'date_auto_xlated',
category = 'Manutensaun CS1: date auto-translated',
hidden = true,
},
maint_date_format = {
message = nil,
anchor = 'date_format',
category = 'Manutensaun CS1: date format',
hidden = true,
},
maint_date_year = {
message = nil,
anchor = 'date_year',
category = 'Manutensaun CS1: date and year',
hidden = true,
},
maint_deprecated_archive = {
message = nil,
anchor = 'deprecated_archive',
category = 'Manutensaun CS1: deprecated archival service',
hidden = true,
},
maint_doi_ignore = {
message = nil,
anchor = 'doi_ignore',
category = 'Manutensaun CS1: ignored DOI errors',
hidden = true,
},
maint_doi_inactive = {
message = nil,
anchor = 'doi_inactive',
category = 'Manutensaun CS1: DOI inactive',
hidden = true,
},
maint_doi_inactive_dated = {
message = nil,
anchor = 'doi_inactive_dated',
category = 'Manutensaun CS1: DOI inactive as of $2$3$1', -- $1 is year, $2 is month-name or empty string, $3 is space or empty string
hidden = true,
},
maint_doi_unflagged_free = {
message = nil,
anchor = 'doi_unflagged_free',
category = 'Manutensaun CS1: unflagged free DOI',
hidden = true,
},
maint_extra_punct = {
message = nil,
anchor = 'extra_punct',
category = 'Manutensaun CS1: extra punctuation',
hidden = true,
},
maint_id_limit_load_fail = { -- applies to all cs1|2 templates on a page;
message = nil, -- maint message (category link) never emitted
anchor = 'id_limit_load_fail',
category = 'Manutensaun CS1: ID limit load fail',
hidden = true,
},
maint_isbn_ignore = {
message = nil,
anchor = 'ignore_isbn_err',
category = 'Manutensaun CS1: ignored ISBN errors',
hidden = true,
},
maint_issn_ignore = {
message = nil,
anchor = 'ignore_issn',
category = 'Manutensaun CS1: ignored ISSN errors',
hidden = true,
},
maint_jfm_format = {
message = nil,
anchor = 'jfm_format',
category = 'Manutensaun CS1: JFM format',
hidden = true,
},
maint_location = {
message = nil,
anchor = 'location',
category = 'Manutensaun CS1: location',
hidden = true,
},
maint_missing_class = {
message = nil,
anchor = 'missing_class',
category = 'Manutensaun CS1: missing class',
hidden = true,
},
maint_mr_format = {
message = nil,
anchor = 'mr_format',
category = 'Manutensaun CS1: MR format',
hidden = true,
},
maint_mult_names = {
message = nil,
anchor = 'mult_names',
category = 'Manutensaun CS1: multiple names: $1', -- $1 is '<name>s list'; gets value from special_case_translation table
hidden = true,
},
maint_numeric_names = {
message = nil,
anchor = 'numeric_names',
category = 'Manutensaun CS1: numeric names: $1', -- $1 is '<name>s list'; gets value from special_case_translation table
hidden = true,
},
maint_others = {
message = nil,
anchor = 'others',
category = 'Manutensaun CS1: others',
hidden = true,
},
maint_others_avm = {
message = nil,
anchor = 'others_avm',
category = 'Manutensaun CS1: others in cite AV media (notes)',
hidden = true,
},
maint_overridden_setting = {
message = nil,
anchor = 'overridden',
category = 'Manutensaun CS1: overridden setting',
hidden = true,
},
maint_page_art_num = {
message = nil,
anchor = 'page_art_num',
category = 'Manutensaun CS1: article number as page number',
hidden = true,
},
maint_pmc_embargo = {
message = nil,
anchor = 'embargo',
category = 'Manutensaun CS1: PMC embargo expired',
hidden = true,
},
maint_pmc_format = {
message = nil,
anchor = 'pmc_format',
category = 'Manutensaun CS1: PMC format',
hidden = true,
},
maint_postscript = {
message = nil,
anchor = 'postscript',
category = 'Manutensaun CS1: postscript',
hidden = true,
},
maint_publisher_location = {
message = nil,
anchor = 'publisher_location',
category = 'Manutensaun CS1: publisher location',
hidden = true,
},
maint_ref_duplicates_default = {
message = nil,
anchor = 'ref_default',
category = 'Manutensaun CS1: ref duplicates default',
hidden = true,
},
maint_shortened_archive_url = {
message = nil,
anchor = 'shortened_archive_url',
category = 'Manutensaun CS1: shortened archive url',
hidden = true,
},
maint_unknown_lang = {
message = nil,
anchor = 'unknown_lang',
category = 'Manutensaun CS1: unrecognized language',
hidden = true,
},
maint_untitled = {
message = nil,
anchor = 'untitled',
category = 'Manutensaun CS1: untitled periodical',
hidden = true,
},
maint_url_status = {
message = nil,
anchor = 'url_status',
category = 'Manutensaun CS1: url-status',
hidden = true,
},
maint_work_isbn = {
message = nil,
anchor = 'work_isbn',
category = 'Manutensaun CS1: work parameter with ISBN',
hidden = true,
},
maint_year= {
message = nil,
anchor = 'year',
category = 'Manutensaun CS1: year',
hidden = true,
},
maint_zbl = {
message = nil,
anchor = 'zbl',
category = 'Manutensaun CS1: Zbl',
hidden = true,
},
}
--[[--------------------------< I D _ L I M I T S _ D A T A _ T >----------------------------------------------
fetch id limits for certain identifiers from c:Data:CS1/Identifier limits.tab. This source is a json tabular
data file maintained at wikipedia commons. Convert the json format to a table of k/v pairs.
The values from <id_limits_data_t> are used to set handle.id_limit.
From 2025-02-21, MediaWiki is broken. Use this link to edit the tablular data file:
https://commons.wikimedia.org/w/index.php?title=Data:CS1/Identifier_limits.tab&action=edit
See Phab:T389105
]]
local id_limits_data_t = {};
local use_commons_data = true; -- set to false if your wiki does not have access to mediawiki commons; then,
if false == use_commons_data then -- update this table from https://commons.wikimedia.org/wiki/Data:CS1/Identifier_limits.tab; last update: 2025-02-21
id_limits_data_t = {['OCLC'] = 10450000000, ['OSTI'] = 23010000, ['PMC'] = 11900000, ['PMID'] = 40400000, ['RFC'] = 9300, ['SSRN'] = 5200000, ['S2CID'] = 276000000}; -- this table must be maintained locally
else -- here for wikis that do have access to mediawiki commons
local load_fail_limit = 99999999999; -- very high number to avoid error messages on load failure
id_limits_data_t = {['OCLC'] = load_fail_limit, ['OSTI'] = load_fail_limit, ['PMC'] = load_fail_limit, ['PMID'] = load_fail_limit, ['RFC'] = load_fail_limit, ['SSRN'] = load_fail_limit, ['S2CID'] = load_fail_limit};
local id_limits_data_load_fail = false; -- flag; assume that we will be successful when loading json id limit tabular data
if mw.ext.data == nil then
id_limits_data_load_fail = true; -- safeguard against Lua errors if mw.ext.data is not available for some reason
else
local tab_data_t = mw.ext.data.get ('CS1/Identifier limits.tab'); -- attempt to load the tabular data from commons into <tab_data_t>
if false == tab_data_t then -- undocumented 'feature': mw.ext.data.get() sometimes returns false
id_limits_data_load_fail = true; -- set the flag so that Module:Citation/CS1 can create an unannotated maint category
else
for _, limit_t in ipairs (tab_data_t.data) do -- overwrite default <load_fail_limit> values from the data table in the tabular data
id_limits_data_t[limit_t[1]] = limit_t[2]; -- <limit[1]> is identifier; <limit[2]> is upper limit for that identifier
end
end
end
end
--[[--------------------------< I D _ H A N D L E R S >--------------------------------------------------------
The following contains a list of values for various defined identifiers. For each
identifier we specify a variety of information necessary to properly render the
identifier in the citation.
parameters: a list of parameter aliases for this identifier; first in the list is the canonical form
link: Wikipedia article name
redirect: a local redirect to a local Wikipedia article name; at en.wiki, 'ISBN (identifier)' is a redirect to 'International Standard Book Number'
q: Wikidata q number for the identifier
label: the label preceding the identifier; label is linked to a Wikipedia article (in this order):
redirect from id_handlers['<id>'].redirect when use_identifier_redirects is true
Wikidata-supplied article name for the local wiki from id_handlers['<id>'].q
local article name from id_handlers['<id>'].link
prefix: the first part of a URL that will be concatenated with a second part which usually contains the identifier
suffix: optional third part to be added after the identifier
encode: true if URI should be percent-encoded; otherwise false
COinS: identifier link or keyword for use in COinS:
for identifiers registered at info-uri.info use: info:.... where '...' is the appropriate identifier label
for identifiers that have COinS keywords, use the keyword: rft.isbn, rft.issn, rft.eissn
for |asin= and |ol=, which require assembly, use the keyword: url
for others make a URL using the value in prefix/suffix and #label, use the keyword: pre (not checked; any text other than 'info', 'rft', or 'url' works here)
set to nil to leave the identifier out of the COinS
separator: character or text between label and the identifier in the rendered citation
id_limit: for those identifiers with established limits, this property holds the upper limit
access: use this parameter to set the access level for all instances of this identifier.
the value must be a valid access level for an identifier (see ['id-access'] in this file).
custom_access: to enable custom access level for an identifier, set this parameter
to the parameter that should control it (normally 'id-access')
]]
local id_handlers = {
['ARXIV'] = {
parameters = {'arxiv', 'eprint'},
link = 'arXiv',
redirect = 'arXiv (identifier)',
q = 'Q118398',
label = 'arXiv',
prefix = 'https://arxiv.org/abs/',
encode = false,
COinS = 'info:arxiv',
separator = ':',
access = 'free', -- free to read
},
['ASIN'] = {
parameters = { 'asin', 'ASIN' },
link = 'Amazon Standard Identification Number',
redirect = 'ASIN (identifier)',
q = 'Q1753278',
label = 'ASIN',
prefix = 'https://www.amazon.',
COinS = 'url',
separator = ' ',
encode = false;
},
['BIBCODE'] = {
parameters = {'bibcode'},
link = 'Bibcode',
redirect = 'Bibcode (identifier)',
q = 'Q25754',
label = 'Bibcode',
prefix = 'https://ui.adsabs.harvard.edu/abs/',
encode = false,
COinS = 'info:bibcode',
separator = ':',
custom_access = 'bibcode-access',
},
['BIORXIV'] = {
parameters = {'biorxiv'},
link = 'bioRxiv',
redirect = 'bioRxiv (identifier)',
q = 'Q19835482',
label = 'bioRxiv',
prefix = 'https://doi.org/',
COinS = 'pre', -- use prefix value
access = 'free', -- free to read
encode = true,
separator = ' ',
},
['CITESEERX'] = {
parameters = {'citeseerx'},
link = 'CiteSeerX',
redirect = 'CiteSeerX (identifier)',
q = 'Q2715061',
label = 'CiteSeerX',
prefix = 'https://citeseerx.ist.psu.edu/viewdoc/summary?doi=',
COinS = 'pre', -- use prefix value
access = 'free', -- free to read
encode = true,
separator = ' ',
},
['DOI'] = { -- Used by InternetArchiveBot
parameters = { 'doi', 'DOI'},
link = 'Digital object identifier',
redirect = 'doi (identifier)',
q = 'Q25670',
label = 'doi',
prefix = 'https://doi.org/',
COinS = 'info:doi',
separator = ':',
encode = true,
custom_access = 'doi-access',
},
['EISSN'] = {
parameters = {'eissn', 'EISSN'},
link = 'International Standard Serial Number#Electronic ISSN',
redirect = 'eISSN (identifier)',
q = 'Q46339674',
label = 'eISSN',
prefix = 'https://search.worldcat.org/issn/',
COinS = 'rft.eissn',
encode = false,
separator = ' ',
},
['HDL'] = {
parameters = { 'hdl', 'HDL' },
link = 'Handle System',
redirect = 'hdl (identifier)',
q = 'Q3126718',
label = 'hdl',
prefix = 'https://hdl.handle.net/',
COinS = 'info:hdl',
separator = ':',
encode = true,
custom_access = 'hdl-access',
},
['ISBN'] = { -- Used by InternetArchiveBot
parameters = {'isbn', 'ISBN'},
link = 'International Standard Book Number',
redirect = 'ISBN (identifier)',
q = 'Q33057',
label = 'ISBN',
prefix = 'Special:BookSources/',
COinS = 'rft.isbn',
separator = ' ',
},
['ISMN'] = {
parameters = {'ismn', 'ISMN'},
link = 'International Standard Music Number',
redirect = 'ISMN (identifier)',
q = 'Q1666938',
label = 'ISMN',
prefix = '', -- not currently used;
COinS = nil, -- nil because we can't use pre or rft or info:
separator = ' ',
},
['ISSN'] = {
parameters = {'issn', 'ISSN'},
link = 'International Standard Serial Number',
redirect = 'ISSN (identifier)',
q = 'Q131276',
label = 'ISSN',
prefix = 'https://search.worldcat.org/issn/',
COinS = 'rft.issn',
encode = false,
separator = ' ',
},
['JFM'] = {
parameters = {'jfm', 'JFM'},
link = 'Jahrbuch über die Fortschritte der Mathematik',
redirect = 'JFM (identifier)',
q = '',
label = 'JFM',
prefix = 'https://zbmath.org/?format=complete&q=an:',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
},
['JSTOR'] = {
parameters = {'jstor', 'JSTOR'},
link = 'JSTOR',
redirect = 'JSTOR (identifier)',
q = 'Q1420342',
label = 'JSTOR',
prefix = 'https://www.jstor.org/stable/',
COinS = 'pre', -- use prefix value
encode = false,
separator = ' ',
custom_access = 'jstor-access',
},
['LCCN'] = {
parameters = {'lccn', 'LCCN'},
link = 'Library of Congress Control Number',
redirect = 'LCCN (identifier)',
q = 'Q620946',
label = 'LCCN',
prefix = 'https://lccn.loc.gov/',
COinS = 'info:lccn',
encode = false,
separator = ' ',
},
['MEDRXIV'] = {
parameters = {'medrxiv'},
link = 'medRxiv',
redirect = 'medRxiv (identifier)',
q = 'Q58465838',
label = 'medRxiv',
prefix = 'https://www.medrxiv.org/content/',
COinS = 'pre', -- use prefix value
access = 'free', -- free to read
encode = false,
separator = ' ',
},
['MR'] = {
parameters = {'mr', 'MR'},
link = 'Mathematical Reviews',
redirect = 'MR (identifier)',
q = 'Q211172',
label = 'MR',
prefix = 'https://mathscinet.ams.org/mathscinet-getitem?mr=',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
},
['OCLC'] = {
parameters = {'oclc', 'OCLC'},
link = 'OCLC',
redirect = 'OCLC (identifier)',
q = 'Q190593',
label = 'OCLC',
prefix = 'https://search.worldcat.org/oclc/',
COinS = 'info:oclcnum',
encode = true,
separator = ' ',
id_limit = id_limits_data_t.OCLC or 0,
},
['OL'] = {
parameters = { 'ol', 'OL' },
link = 'Open Library',
redirect = 'OL (identifier)',
q = 'Q1201876',
label = 'OL',
prefix = 'https://openlibrary.org/',
COinS = 'url',
separator = ' ',
encode = true,
custom_access = 'ol-access',
},
['OSTI'] = {
parameters = {'osti', 'OSTI'},
link = 'Office of Scientific and Technical Information',
redirect = 'OSTI (identifier)',
q = 'Q2015776',
label = 'OSTI',
prefix = 'https://www.osti.gov/biblio/',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
id_limit = id_limits_data_t.OSTI or 0,
custom_access = 'osti-access',
},
['PMC'] = {
parameters = {'pmc', 'PMC'},
link = 'PubMed Central',
redirect = 'PMC (identifier)',
q = 'Q229883',
label = 'PMC',
prefix = 'https://www.ncbi.nlm.nih.gov/pmc/articles/PMC',
suffix = '',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
id_limit = id_limits_data_t.PMC or 0,
access = 'free', -- free to read
},
['PMID'] = {
parameters = {'pmid', 'PMID'},
link = 'PubMed Identifier',
redirect = 'PMID (identifier)',
q = 'Q2082879',
label = 'PMID',
prefix = 'https://pubmed.ncbi.nlm.nih.gov/',
COinS = 'info:pmid',
encode = false,
separator = ' ',
id_limit = id_limits_data_t.PMID or 0,
},
['RFC'] = {
parameters = {'rfc', 'RFC'},
link = 'Request for Comments',
redirect = 'RFC (identifier)',
q = 'Q212971',
label = 'RFC',
prefix = 'https://tools.ietf.org/html/rfc',
COinS = 'pre', -- use prefix value
encode = false,
separator = ' ',
id_limit = id_limits_data_t.RFC or 0,
access = 'free', -- free to read
},
['SBN'] = {
parameters = {'sbn', 'SBN'},
link = 'Standard Book Number', -- redirect to International_Standard_Book_Number#History
redirect = 'SBN (identifier)',
label = 'SBN',
prefix = 'Special:BookSources/0-', -- prefix has leading zero necessary to make 9-digit sbn a 10-digit isbn
COinS = nil, -- nil because we can't use pre or rft or info:
separator = ' ',
},
['SSRN'] = {
parameters = {'ssrn', 'SSRN'},
link = 'Social Science Research Network',
redirect = 'SSRN (identifier)',
q = 'Q7550801',
label = 'SSRN',
prefix = 'https://papers.ssrn.com/sol3/papers.cfm?abstract_id=',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
id_limit = id_limits_data_t.SSRN or 0,
custom_access = 'ssrn-access',
},
['S2CID'] = {
parameters = {'s2cid', 'S2CID'},
link = 'Semantic Scholar',
redirect = 'S2CID (identifier)',
q = 'Q22908627',
label = 'S2CID',
prefix = 'https://api.semanticscholar.org/CorpusID:',
COinS = 'pre', -- use prefix value
encode = false,
separator = ' ',
id_limit = id_limits_data_t.S2CID or 0,
custom_access = 's2cid-access',
},
['USENETID'] = {
parameters = {'message-id'},
link = 'Usenet',
redirect = 'Usenet (identifier)',
q = 'Q193162',
label = 'Usenet:',
prefix = 'news:',
encode = false,
COinS = 'pre', -- use prefix value
separator = ' ',
},
['ZBL'] = {
parameters = {'zbl', 'ZBL' },
link = 'Zentralblatt MATH',
redirect = 'Zbl (identifier)',
q = 'Q190269',
label = 'Zbl',
prefix = 'https://zbmath.org/?format=complete&q=an:',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
},
}
--[[--------------------------< E X P O R T S >---------------------------------
]]
return {
use_identifier_redirects = use_identifier_redirects, -- booleans defined in the settings at the top of this module
local_lang_cat_enable = local_lang_cat_enable,
date_name_auto_xlate_enable = date_name_auto_xlate_enable,
date_digit_auto_xlate_enable = date_digit_auto_xlate_enable,
enable_sort_keys = enable_sort_keys,
suppress_archive_today_urls = suppress_archive_today_urls,
-- tables and variables created when this module is loaded
dependencies_t = dependencies_t, -- used to suppress parameters dependent on url-holding parameters holding archive.today urls
enum_needs_xlation = '1' ~= date_names.xlate_digits['1'], -- to avoid unnecessary enumerator translation
global_df = get_date_format (), -- this line can be replaced with "global_df = 'dmy-all'," to have all dates auto translated to dmy format.
global_cs1_config_t = global_cs1_config_t, -- global settings from {{cs1 config}}
id_limits_data_load_fail = id_limits_data_load_fail, -- true when commons tabular identifier-limit data fails to load
known_free_doi_registrants_t = build_free_doi_registrants_table(),
punct_skip = build_skip_table (punct_skip, punct_meta_params),
url_skip = build_skip_table (url_skip, url_meta_params),
archive_today_tlds_t = {['today'] = true, ['ph'] = true, ['is'] = true, ['md'] = true, ['li'] = true, ['fo'] = true, ['vn'] = true}; -- used by is_archive_today_url()
name_space_sort_keys = name_space_sort_keys,
aliases = aliases,
special_case_translation = special_case_translation,
date_names = date_names,
err_msg_supl = err_msg_supl,
error_conditions = error_conditions,
editor_markup_patterns = editor_markup_patterns,
et_al_patterns = et_al_patterns,
extended_registrants_t = extended_registrants_t,
id_handlers = id_handlers,
keywords_lists = keywords_lists,
keywords_xlate = keywords_xlate,
stripmarkers = stripmarkers,
invisible_chars = invisible_chars,
invisible_defs = invisible_defs,
indic_script = indic_script,
emoji_t = emoji_t,
maint_cats = maint_cats,
messages = messages,
presentation = presentation,
prop_cats = prop_cats,
script_lang_codes = script_lang_codes,
lang_tag_remap = lang_tag_remap,
lang_name_remap = lang_name_remap,
this_wiki_code = this_wiki_code,
title_types = title_types,
uncategorized_namespaces = uncategorized_namespaces_t,
uncategorized_subpages = uncategorized_subpages,
templates_using_volume = templates_using_volume,
templates_using_issue = templates_using_issue,
templates_not_using_page = templates_not_using_page,
vol_iss_pg_patterns = vol_iss_pg_patterns,
single_letter_2nd_lvl_domains_t = single_letter_2nd_lvl_domains_t,
url_access_map_t = url_access_map_t,
inter_wiki_map = inter_wiki_map,
mw_languages_by_tag_t = mw_languages_by_tag_t,
mw_languages_by_name_t = mw_languages_by_name_t,
citation_class_map_t = citation_class_map_t,
citation_issue_t = citation_issue_t,
citation_no_volume_t = citation_no_volume_t,
}
b31e0duydptykq99dh260j0cb4kvo2m
Módulo:Transclusion count/data/C
828
7696
73239
71758
2026-07-05T05:12:23Z
en>Ahechtbot
0
[[Wikipedia:BOT|Bot]]: Updated page.
73239
Scribunto
text/plain
return {
["C"] = 792000,
["C-Class"] = 17000,
["C-SPAN"] = 13000,
["C-cmn"] = 2800,
["C-pl"] = 51000,
["C."] = 351000,
["CAN"] = 20000,
["CANelec"] = 18000,
["CANelec/gain"] = 3400,
["CANelec/hold"] = 6600,
["CANelec/source"] = 11000,
["CANelec/top"] = 8600,
["CANelec/total"] = 9300,
["CAS"] = 3800,
["CAS_Registry_Number"] = 3800,
["CBB_Yearly_Record_End"] = 3500,
["CBB_Yearly_Record_Entry"] = 3600,
["CBB_Yearly_Record_Start"] = 3400,
["CBB_Yearly_Record_Subhead"] = 4200,
["CBB_Yearly_Record_Subtotal"] = 3300,
["CBB_roster/Footer"] = 10000,
["CBB_roster/Header"] = 10000,
["CBB_roster/Player"] = 10000,
["CBB_schedule_end"] = 13000,
["CBB_schedule_entry"] = 13000,
["CBB_schedule_start"] = 13000,
["CBB_standings_end"] = 19000,
["CBB_standings_entry"] = 19000,
["CBB_standings_start"] = 19000,
["CBB_yearly_record_end"] = 4700,
["CBB_yearly_record_end/legend"] = 4100,
["CBB_yearly_record_entry"] = 4600,
["CBB_yearly_record_start"] = 4500,
["CBB_yearly_record_subhead"] = 4300,
["CBB_yearly_record_subtotal"] = 4400,
["CBSB_Standings_End"] = 2700,
["CBSB_Standings_Entry"] = 2700,
["CBSB_Standings_Start"] = 2600,
["CBSB_link"] = 4100,
["CBSB_standings_end"] = 5500,
["CBSB_standings_entry"] = 5500,
["CBSB_standings_start"] = 5500,
["CC0"] = 3900,
["CC_BY-SA_2.5"] = 2100,
["CC_BY-SA_2.5,_2.0,_1.0"] = 2100,
["CC_BY-SA_3.0"] = 21000,
["CC_BY-SA_3.0_migrated"] = 19000,
["CC_BY-SA_4.0"] = 13000,
["CC_BY_2.5"] = 2600,
["CC_BY_3.0"] = 7000,
["CFB_Standings_End"] = 16000,
["CFB_Standings_Entry"] = 16000,
["CFB_Standings_Start"] = 16000,
["CFB_Yearly_Record_End"] = 7900,
["CFB_Yearly_Record_End/legend"] = 2900,
["CFB_Yearly_Record_Entry"] = 7900,
["CFB_Yearly_Record_Start"] = 7900,
["CFB_Yearly_Record_Subhead"] = 8000,
["CFB_Yearly_Record_Subtotal"] = 7800,
["CFB_schedule"] = 29000,
["CFB_schedule_entry"] = 22000,
["CFB_standings_end"] = 39000,
["CFB_standings_entry"] = 39000,
["CFB_standings_start"] = 39000,
["CFL_Year"] = 7200,
["CGF_year"] = 3600,
["CGNDB_URL"] = 5300,
["CHE"] = 11000,
["CHI"] = 3300,
["CHL"] = 4200,
["CHN"] = 15000,
["CN"] = 4000,
["CO2"] = 3500,
["COI"] = 14000,
["COIUL"] = 131000,
["COI_editnotice"] = 7800,
["COL"] = 5600,
["COLON"] = 14000,
["CRI"] = 2300,
["CRO"] = 6500,
["CS1_config"] = 15000,
["CSK"] = 2800,
["CSS_image_crop"] = 9200,
["CUB"] = 4200,
["CURRENTDATE"] = 3600,
["CURRENTMINUTE"] = 2500,
["CYP"] = 2200,
["CZE"] = 16000,
["Calendar"] = 2500,
["Calendar/styles.css"] = 2700,
["California/color"] = 12000,
["Call_sign_disambiguation"] = 3100,
["Campaignbox"] = 26000,
["CanProvName"] = 19000,
["CanadaByProvinceCatNav"] = 9500,
["CanadaProvinceThe"] = 4500,
["Canada_NTS_Map_Sheet"] = 2100,
["Canada_by_province_category_navigation"] = 9900,
["Canadian_English"] = 13000,
["Canadian_Parliament_links"] = 5100,
["Canadian_election_result"] = 18000,
["Canadian_election_result/gain"] = 3600,
["Canadian_election_result/hold"] = 6900,
["Canadian_election_result/source"] = 12000,
["Canadian_election_result/top"] = 18000,
["Canadian_election_result/total"] = 14000,
["Canadian_party_colour"] = 11000,
["Canadian_party_colour/colour"] = 23000,
["Canadian_party_colour/colour/default"] = 22000,
["Canadian_party_colour/name"] = 19000,
["Canadian_party_colour/name/default"] = 8200,
["Canadian_province_name"] = 19000,
["Canned_search"] = 8000,
["Cascite"] = 17000,
["Caselaw_source"] = 4800,
["Cassini-Ehess"] = 3100,
["Cast_listing"] = 29000,
["Castlist"] = 5200,
["Cat"] = 461000,
["CatAutoTOC"] = 374000,
["CatRel"] = 4100,
["CatTrack"] = 20000,
["Cat_class"] = 6600,
["Cat_main"] = 149000,
["Cat_more"] = 103000,
["Cat_more_if_exists"] = 29000,
["Cat_see_also"] = 3800,
["Catalog_lookup_link"] = 59000,
["Catalog_of_Fishes"] = 9500,
["Catalogue_of_Life"] = 23000,
["Category"] = 2400,
["Category-Class"] = 14000,
["Category-inline"] = 11000,
["Category_TOC"] = 81000,
["Category_TOC/tracking"] = 81000,
["Category_U.S._State_elections_by_year"] = 7500,
["Category_U.S._State_elections_by_year/core"] = 7500,
["Category_class"] = 25000,
["Category_described_in_year"] = 6400,
["Category_diffuse"] = 11000,
["Category_disambiguation"] = 2700,
["Category_explanation"] = 415000,
["Category_handler"] = 2720000,
["Category_if_exists"] = 83000,
["Category_ifexist"] = 4800,
["Category_importance"] = 8900,
["Category_link"] = 678000,
["Category_link/core"] = 678000,
["Category_link_if_exists"] = 79000,
["Category_link_with_count"] = 9200,
["Category_link_without_namespace"] = 793000,
["Category_links"] = 9900,
["Category_main_article"] = 221000,
["Category_more"] = 143000,
["Category_more_if_exists"] = 49000,
["Category_ordered_by_date"] = 13000,
["Category_other"] = 1100000,
["Category_pair"] = 2100,
["Category_redirect"] = 163000,
["Category_redirect/core"] = 163000,
["Category_see_also"] = 55000,
["Category_see_also/Category_pair_check"] = 55000,
["Category_see_also_if_exists"] = 94000,
["Category_see_also_if_exists_2"] = 101000,
["Category_series_navigation"] = 595000,
["Category_title"] = 2400,
["Catexp"] = 5900,
["CathEncy"] = 2300,
["Catholic"] = 3700,
["Catholic_Encyclopedia"] = 5100,
["Catmain"] = 29000,
["Catmore"] = 9800,
["Catseealso"] = 2300,
["Cbb_link"] = 10000,
["Cbignore"] = 131000,
["Cbsb_link"] = 2500,
["Cc-by-2.5"] = 2600,
["Cc-by-3.0"] = 7000,
["Cc-by-sa-2.5"] = 2100,
["Cc-by-sa-2.5,2.0,1.0"] = 2100,
["Cc-by-sa-3.0"] = 20000,
["Cc-by-sa-3.0-migrated"] = 19000,
["Cc-by-sa-4.0"] = 13000,
["Cc-zero"] = 3800,
["CensusAU"] = 9100,
["Census_2016_AUS"] = 5700,
["Census_2021_AUS"] = 6200,
["Cent"] = 6800,
["Center"] = 299000,
["Centralized_discussion"] = 7200,
["Centralized_discussion/core"] = 7200,
["Centralized_discussion/styles.css"] = 7200,
["Centre"] = 4100,
["Century"] = 16000,
["Century_name_from_decade"] = 2400,
["Century_name_from_decade_or_year"] = 126000,
["Century_name_from_title_decade"] = 7500,
["Century_name_from_title_year"] = 7500,
["Certification_Cite_Ref"] = 38000,
["Certification_Table_Bottom"] = 37000,
["Certification_Table_Entry"] = 38000,
["Certification_Table_Entry/Foot"] = 37000,
["Certification_Table_Entry/Foot/helper"] = 37000,
["Certification_Table_Entry/MexicanAward"] = 2300,
["Certification_Table_Entry/Region"] = 38000,
["Certification_Table_Entry/Sales"] = 37000,
["Certification_Table_Entry/Sales/AustrianPeriod"] = 2400,
["Certification_Table_Entry/Sales/BelgianPeriod"] = 2400,
["Certification_Table_Entry/Sales/DanishPeriod"] = 4300,
["Certification_Table_Entry/Sales/DanishPeriodHelper1"] = 4300,
["Certification_Table_Entry/Sales/DanishPeriodHelper2"] = 4300,
["Certification_Table_Entry/Sales/FrenchPeriod"] = 2200,
["Certification_Table_Entry/Sales/FrenchPeriodAlbum"] = 2000,
["Certification_Table_Entry/Sales/GermanPeriod"] = 4100,
["Certification_Table_Entry/Sales/ItalianHelper"] = 4400,
["Certification_Table_Entry/Sales/MexicanSales"] = 2200,
["Certification_Table_Entry/Sales/NewZealandPeriod"] = 7700,
["Certification_Table_Entry/Sales/SpanishSinglesPeriod"] = 2800,
["Certification_Table_Entry/Sales/SwedishPeriod"] = 2200,
["Certification_Table_Separator"] = 3200,
["Certification_Table_Top"] = 38000,
["Cfb_link"] = 26000,
["Cfd_all"] = 3800,
["Chart_bottom"] = 4400,
["Chart_top"] = 4400,
["Check_completeness_of_transclusions"] = 63000,
["Check_talk"] = 63000,
["Check_talk_wp"] = 1450000,
["Check_winner_by_scores"] = 16000,
["CheckedSockpuppet"] = 7200,
["Checked_sockpuppet"] = 18000,
["Checkedsockpuppet"] = 5300,
["Checkip"] = 12000,
["Checkuser"] = 89000,
["Checkuserblock-account"] = 43000,
["Chem"] = 6100,
["Chem/atom"] = 6000,
["Chem/link"] = 6100,
["Chem2"] = 11000,
["Chem_molar_mass"] = 22000,
["Chem_molar_mass/format"] = 22000,
["Chembox"] = 16000,
["Chembox/styles.css"] = 16000,
["Chembox_3DMet"] = 15000,
["Chembox_AllOtherNames"] = 14000,
["Chembox_AllOtherNames/format"] = 14000,
["Chembox_Appearance"] = 7200,
["Chembox_BoilingPt"] = 4200,
["Chembox_CASNo"] = 15000,
["Chembox_CASNo/format"] = 15000,
["Chembox_CalcTemperatures"] = 7500,
["Chembox_ChEBI"] = 15000,
["Chembox_ChEBI/format"] = 15000,
["Chembox_ChEMBL"] = 15000,
["Chembox_ChEMBL/format"] = 15000,
["Chembox_ChemSpiderID"] = 15000,
["Chembox_ChemSpiderID/format"] = 15000,
["Chembox_CompTox"] = 15000,
["Chembox_CompTox/format"] = 15000,
["Chembox_Datapage_check"] = 16000,
["Chembox_Density"] = 5600,
["Chembox_DrugBank"] = 15000,
["Chembox_DrugBank/format"] = 15000,
["Chembox_ECHA"] = 8200,
["Chembox_ECNumber"] = 15000,
["Chembox_ECNumber/format"] = 15000,
["Chembox_Elements"] = 15000,
["Chembox_Elements/molecular_formula"] = 21000,
["Chembox_FlashPt"] = 2100,
["Chembox_Footer"] = 15000,
["Chembox_Footer/tracking"] = 15000,
["Chembox_GHS_(set)"] = 4500,
["Chembox_Hazards"] = 13000,
["Chembox_IUPHAR_ligand"] = 15000,
["Chembox_IUPHAR_ligand/format"] = 15000,
["Chembox_Identifiers"] = 15000,
["Chembox_InChI"] = 15000,
["Chembox_InChI/format"] = 15000,
["Chembox_Indexlist"] = 15000,
["Chembox_Jmol"] = 15000,
["Chembox_Jmol/format"] = 15000,
["Chembox_KEGG"] = 15000,
["Chembox_KEGG/format"] = 15000,
["Chembox_MeltingPt"] = 6600,
["Chembox_OtherCpds"] = 2100,
["Chembox_Properties"] = 15000,
["Chembox_PubChem"] = 15000,
["Chembox_PubChem/format"] = 15000,
["Chembox_RTECS"] = 15000,
["Chembox_RTECS/format"] = 15000,
["Chembox_Related"] = 4200,
["Chembox_SMILES"] = 15000,
["Chembox_SMILES/format"] = 15000,
["Chembox_SolubilityInWater"] = 4500,
["Chembox_Structure"] = 2400,
["Chembox_UNII"] = 15000,
["Chembox_UNII/format"] = 15000,
["Chembox_headerbar"] = 16000,
["Chembox_image"] = 14000,
["Chembox_image_cell"] = 14000,
["Chembox_image_sbs"] = 14000,
["Chembox_parametercheck"] = 15000,
["Chembox_setDatarow"] = 5400,
["Chembox_setHeader"] = 5400,
["Chembox_templatePar/formatPreviewMessage"] = 16000,
["Chembox_verification"] = 6900,
["Chemspidercite"] = 11000,
["Chessgames_player"] = 3800,
["Chinese"] = 3600,
["Circa"] = 465000,
["Circular_reference"] = 3900,
["Citation"] = 410000,
["Citation/make_link"] = 7800,
["Citation/styles.css"] = 52000,
["Citation_needed"] = 634000,
["Citation_needed_span"] = 3600,
["Citation_style"] = 4500,
["Cite_AV_media"] = 79000,
["Cite_AV_media_notes"] = 33000,
["Cite_Appletons'"] = 2400,
["Cite_Australian_Dictionary_of_Biography"] = 4900,
["Cite_Box_Office_Mojo"] = 2500,
["Cite_Catholic_Encyclopedia"] = 8600,
["Cite_DCB"] = 3300,
["Cite_DGRBM"] = 2200,
["Cite_DNB"] = 20000,
["Cite_EB1911"] = 26000,
["Cite_FTP"] = 2500,
["Cite_GBIF"] = 4300,
["Cite_GNIS"] = 2300,
["Cite_Gaia_DR3"] = 3100,
["Cite_Google_Maps"] = 20000,
["Cite_Hansard"] = 2700,
["Cite_IUCN"] = 70000,
["Cite_Instagram"] = 7100,
["Cite_Jewish_Encyclopedia"] = 3200,
["Cite_LCDB"] = 2000,
["Cite_Metacritic"] = 2200,
["Cite_NIE"] = 3500,
["Cite_NSW_Parliament"] = 3300,
["Cite_NSW_SHR"] = 2700,
["Cite_NatureServe"] = 2800,
["Cite_ODNB"] = 22000,
["Cite_OED"] = 2500,
["Cite_POWO"] = 5900,
["Cite_Q"] = 17000,
["Cite_QHR"] = 3100,
["Cite_QPN"] = 4100,
["Cite_Rotten_Tomatoes"] = 2800,
["Cite_Rowlett"] = 2500,
["Cite_Russian_law"] = 7800,
["Cite_Ryan"] = 3300,
["Cite_Sports-Reference"] = 55000,
["Cite_USGov"] = 13000,
["Cite_WoRMS"] = 13000,
["Cite_act"] = 3900,
["Cite_arXiv"] = 6900,
["Cite_bcgnis"] = 3700,
["Cite_book"] = 1900000,
["Cite_certification"] = 43000,
["Cite_certification/Title"] = 39000,
["Cite_certification/URL"] = 43000,
["Cite_certification/archivedate"] = 7600,
["Cite_certification/archiveurl"] = 7600,
["Cite_cgndb"] = 5300,
["Cite_comic"] = 2100,
["Cite_conference"] = 22000,
["Cite_court"] = 6700,
["Cite_dictionary"] = 3500,
["Cite_document"] = 2000,
["Cite_encyclopedia"] = 242000,
["Cite_episode"] = 19000,
["Cite_gnis"] = 35000,
["Cite_instagram"] = 3000,
["Cite_interview"] = 11000,
["Cite_iucn"] = 69000,
["Cite_journal"] = 1160000,
["Cite_legislation_UK"] = 3500,
["Cite_magazine"] = 377000,
["Cite_map"] = 60000,
["Cite_news"] = 1910000,
["Cite_newspaper_The_Times"] = 7200,
["Cite_patent"] = 7200,
["Cite_patent/authors"] = 6000,
["Cite_patent/core"] = 7500,
["Cite_peakbagger"] = 5300,
["Cite_podcast"] = 6100,
["Cite_press_release"] = 85000,
["Cite_report"] = 74000,
["Cite_rowlett"] = 2500,
["Cite_ship_register"] = 2000,
["Cite_simbad"] = 5600,
["Cite_sports-reference"] = 59000,
["Cite_taxon"] = 5300,
["Cite_tech_report"] = 3000,
["Cite_thesis"] = 49000,
["Cite_tweet"] = 48000,
["Cite_video"] = 13000,
["Cite_video_game"] = 3400,
["Cite_web"] = 5390000,
["Cite_wikisource"] = 7000,
["Cite_wikisource/make_link"] = 65000,
["Citeweb"] = 3500,
["Civil_navigation"] = 2200,
["Cjersey"] = 3000,
["Cl"] = 215000,
["Clade"] = 10000,
["Clade/styles.css"] = 10000,
["Clarification_needed"] = 2500,
["Clarify"] = 45000,
["Class"] = 40000,
["Class/colour"] = 19000,
["Class/icon"] = 21000,
["Class_mask"] = 457000,
["Classicon"] = 5200,
["Clc"] = 7400,
["Cleanup"] = 8800,
["Cleanup_reorganize"] = 2300,
["Cleanup_rewrite"] = 6900,
["Clear"] = 3740000,
["Clear_left"] = 29000,
["Clear_right"] = 2800,
["Clerk_Request"] = 2500,
["Clerk_note"] = 11000,
["Clerknote"] = 8500,
["Clickable_button"] = 1880000,
["Clickable_button_2"] = 228000,
["Closed_access"] = 5500,
["Closed_peer_review_page"] = 3100,
["Closed_rfc_bottom"] = 2200,
["Closed_rfc_top"] = 2800,
["Clr"] = 3100,
["Club_players_category"] = 9400,
["Clubplayerscat"] = 9400,
["Cmbox"] = 534000,
["Cn"] = 113000,
["Cnote2"] = 2800,
["Cnote2_Begin"] = 2900,
["Cnote2_End"] = 2900,
["Coat_of_arms"] = 2500,
["Cob"] = 14000,
["Code"] = 83000,
["Cof_family"] = 4500,
["Cof_genus"] = 5200,
["Col-1-of-2"] = 2400,
["Col-2"] = 186000,
["Col-2-of-2"] = 2300,
["Col-3"] = 11000,
["Col-4"] = 3800,
["Col-begin"] = 231000,
["Col-begin/styles.css"] = 231000,
["Col-break"] = 228000,
["Col-end"] = 230000,
["Col-float"] = 4800,
["Col-float-break"] = 4700,
["Col-float-end"] = 4800,
["Col-float/styles.css"] = 4800,
["Col-start"] = 10000,
["Col_div"] = 2200,
["Colbegin"] = 24000,
["Colend"] = 27000,
["Collapse"] = 8600,
["Collapse_bottom"] = 56000,
["Collapse_top"] = 56000,
["Collapse_top/styles.css"] = 56000,
["Collapsebottom"] = 4000,
["Collapsed_infobox_section_begin"] = 4200,
["Collapsed_infobox_section_end"] = 4300,
["Collapsetop"] = 4100,
["Collapsible_list"] = 68000,
["Collapsible_option"] = 151000,
["Colledge:_Ships_RN"] = 3000,
["College"] = 12000,
["CollegePrimaryHeader"] = 8200,
["CollegePrimaryStyle"] = 111000,
["CollegeSecondaryStyle"] = 11000,
["College_Athlete_Recruit_End"] = 2800,
["College_Athlete_Recruit_Entry"] = 2900,
["College_Athlete_Recruit_Start"] = 2900,
["College_athlete_recruit_end"] = 4900,
["College_athlete_recruit_entry"] = 5100,
["College_athlete_recruit_start"] = 5100,
["College_color_list"] = 4400,
["College_sports_team_link"] = 31000,
["Colon"] = 20000,
["Color"] = 504000,
["Color/styles.css"] = 504000,
["Color_box"] = 86000,
["Colorbox"] = 2600,
["Colorbull"] = 4600,
["Colored_link"] = 102000,
["Coloredlink"] = 2800,
["Colors"] = 3600,
["Colour"] = 5500,
["Colour_box"] = 2500,
["Coloured_link"] = 12000,
["Column"] = 4300,
["Column/styles.css"] = 4300,
["Columns-end"] = 4000,
["Columns-list"] = 125000,
["Columns-start"] = 4000,
["Comic_Book_DB"] = 3500,
["Comicbookdb"] = 3400,
["Comics-replaceability"] = 2800,
["Comics_infobox_sec/formcat"] = 3400,
["Comics_infobox_sec/genre"] = 4200,
["Comics_infobox_sec/genrecat"] = 3800,
["Comics_infobox_sec/styles.css"] = 8100,
["Comma_separated_entries"] = 521000,
["Comment"] = 7400,
["Committed_identity"] = 3200,
["Committed_identity/styles.css"] = 3200,
["Commons"] = 72000,
["Commons-inline"] = 25000,
["Commons_cat"] = 45000,
["Commons_category"] = 902000,
["Commons_category-inline"] = 176000,
["Commons_category_inline"] = 5700,
["Commonscat"] = 60000,
["Commonscat-inline"] = 15000,
["Commonscat_inline"] = 2300,
["Commonscatinline"] = 7300,
["Compact_TOC"] = 7300,
["Compact_ToC"] = 3200,
["Compose_molecular_formula"] = 2300,
["Composition_bar"] = 13000,
["Confirmed"] = 20000,
["Confused"] = 3200,
["Confusing"] = 2400,
["CongBio"] = 9400,
["CongLinks"] = 4800,
["Connected_contributor"] = 21000,
["Connected_contributor_(paid)"] = 9800,
["Constellation_navbox"] = 9900,
["Container"] = 14000,
["Container_cat"] = 9100,
["Container_category"] = 84000,
["Containercat"] = 2800,
["Contains_special_characters"] = 5200,
["Contains_special_characters/core"] = 5200,
["Contains_special_characters/styles.css"] = 5200,
["Content_category"] = 7900,
["Contentious_topics/Additional_restrictions.json"] = 21000,
["Contentious_topics/Arab-Israeli_editnotice"] = 6800,
["Contentious_topics/Arab-Israeli_talk_notice"] = 6100,
["Contentious_topics/Category_database.json"] = 21000,
["Contentious_topics/Restrictions_definition.json"] = 21000,
["Contentious_topics/Standard_set.json"] = 21000,
["Contentious_topics/list"] = 29000,
["Contentious_topics/page_restriction_editnotice_base"] = 7300,
["Contentious_topics/page_restriction_talk_notice"] = 2600,
["Contentious_topics/talk_notice"] = 21000,
["Context"] = 2600,
["Continent2continental"] = 45000,
["Continent_adjective_to_noun"] = 10000,
["Continental2continent"] = 22000,
["Controversial"] = 3000,
["Convert"] = 1410000,
["Convert_abbreviated"] = 165000,
["Convinfobox"] = 291000,
["Coord"] = 1400000,
["Coord_missing"] = 71000,
["Coord_missing/CheckCat"] = 70000,
["Coords"] = 6700,
["Copied"] = 22000,
["Copy_edit"] = 2200,
["Copy_to_Wikimedia_Commons"] = 85000,
["Copy_to_Wikimedia_Commons_in"] = 4100,
["Copyvios"] = 5200,
["Cospar"] = 2800,
["Cot"] = 14000,
["Count"] = 972000,
["Country2continent"] = 88000,
["Country2continental"] = 31000,
["Country2nationality"] = 35000,
["CountryPrefixThe"] = 82000,
["Country_abbreviation"] = 96000,
["Country_alias"] = 17000,
["Country_at_games_navbox"] = 5800,
["Country_at_games_navbox/below"] = 5800,
["Country_data"] = 12000,
["Country_data_AFG"] = 2600,
["Country_data_ALB"] = 7200,
["Country_data_ALG"] = 11000,
["Country_data_AND"] = 3600,
["Country_data_ANG"] = 4400,
["Country_data_ARG"] = 53000,
["Country_data_ARM"] = 8300,
["Country_data_AUS"] = 88000,
["Country_data_AUT"] = 52000,
["Country_data_AZE"] = 11000,
["Country_data_Afghanistan"] = 22000,
["Country_data_Alabama"] = 2600,
["Country_data_Alaska"] = 2100,
["Country_data_Albania"] = 36000,
["Country_data_Alberta"] = 3100,
["Country_data_Algeria"] = 48000,
["Country_data_American_Samoa"] = 2900,
["Country_data_Andorra"] = 9200,
["Country_data_Angola"] = 21000,
["Country_data_Anguilla"] = 2400,
["Country_data_Antigua_and_Barbuda"] = 6400,
["Country_data_Apulia"] = 7900,
["Country_data_Argentina"] = 155000,
["Country_data_Arizona"] = 2500,
["Country_data_Arkansas"] = 2800,
["Country_data_Armenia"] = 48000,
["Country_data_Aruba"] = 4000,
["Country_data_Australia"] = 279000,
["Country_data_Austria"] = 149000,
["Country_data_Austria-Hungary"] = 2300,
["Country_data_Azerbaijan"] = 52000,
["Country_data_BAH"] = 4600,
["Country_data_BAN"] = 4400,
["Country_data_BAR"] = 2700,
["Country_data_BDI"] = 2000,
["Country_data_BEL"] = 60000,
["Country_data_BER"] = 2500,
["Country_data_BHR"] = 5800,
["Country_data_BIH"] = 14000,
["Country_data_BLR"] = 26000,
["Country_data_BOL"] = 6600,
["Country_data_BOT"] = 3100,
["Country_data_BRA"] = 64000,
["Country_data_BUL"] = 31000,
["Country_data_Bahamas"] = 11000,
["Country_data_Bahrain"] = 22000,
["Country_data_Bangladesh"] = 35000,
["Country_data_Barbados"] = 8700,
["Country_data_Belarus"] = 92000,
["Country_data_Belgium"] = 160000,
["Country_data_Belize"] = 5100,
["Country_data_Benin"] = 8000,
["Country_data_Bermuda"] = 6300,
["Country_data_Bhutan"] = 4900,
["Country_data_Bolivia"] = 24000,
["Country_data_Bosnia_and_Herzegovina"] = 54000,
["Country_data_Botswana"] = 10000,
["Country_data_Brazil"] = 173000,
["Country_data_British_Columbia"] = 3400,
["Country_data_British_Empire"] = 2000,
["Country_data_British_Raj"] = 2500,
["Country_data_British_Virgin_Islands"] = 3300,
["Country_data_Brunei"] = 6800,
["Country_data_Bulgaria"] = 103000,
["Country_data_Burkina_Faso"] = 11000,
["Country_data_Burma"] = 2300,
["Country_data_Burundi"] = 6800,
["Country_data_CAM"] = 2500,
["Country_data_CAN"] = 68000,
["Country_data_CGO"] = 2500,
["Country_data_CHE"] = 5900,
["Country_data_CHI"] = 19000,
["Country_data_CHL"] = 2300,
["Country_data_CHN"] = 49000,
["Country_data_CIV"] = 8500,
["Country_data_CMR"] = 8800,
["Country_data_COD"] = 3500,
["Country_data_COL"] = 28000,
["Country_data_CPV"] = 2300,
["Country_data_CRC"] = 6900,
["Country_data_CRO"] = 37000,
["Country_data_CUB"] = 13000,
["Country_data_CYP"] = 10000,
["Country_data_CZE"] = 54000,
["Country_data_California"] = 6200,
["Country_data_Cambodia"] = 9800,
["Country_data_Cameroon"] = 32000,
["Country_data_Canada"] = 267000,
["Country_data_Cape_Verde"] = 7000,
["Country_data_Castile_and_León"] = 2000,
["Country_data_Catalonia"] = 3500,
["Country_data_Cayman_Islands"] = 4500,
["Country_data_Central_African_Republic"] = 5100,
["Country_data_Chad"] = 5400,
["Country_data_Chile"] = 92000,
["Country_data_China"] = 154000,
["Country_data_Chinese_Taipei"] = 39000,
["Country_data_Colombia"] = 97000,
["Country_data_Colorado"] = 5300,
["Country_data_Commonwealth_of_Independent_States"] = 2200,
["Country_data_Comoros"] = 4700,
["Country_data_Confederate_States_of_America"] = 3100,
["Country_data_Connecticut"] = 3400,
["Country_data_Cook_Islands"] = 3800,
["Country_data_Costa_Rica"] = 34000,
["Country_data_Croatia"] = 106000,
["Country_data_Cuba"] = 47000,
["Country_data_Curaçao"] = 4400,
["Country_data_Cyprus"] = 48000,
["Country_data_Czech_Republic"] = 156000,
["Country_data_Czechoslovakia"] = 35000,
["Country_data_DEN"] = 40000,
["Country_data_DEU"] = 10000,
["Country_data_DNK"] = 4400,
["Country_data_DOM"] = 8400,
["Country_data_DRC"] = 2000,
["Country_data_Delaware"] = 2700,
["Country_data_Democratic_Republic_of_the_Congo"] = 23000,
["Country_data_Denmark"] = 122000,
["Country_data_Djibouti"] = 4900,
["Country_data_Dominica"] = 4200,
["Country_data_Dominican_Republic"] = 35000,
["Country_data_ECU"] = 13000,
["Country_data_EGY"] = 15000,
["Country_data_ENG"] = 52000,
["Country_data_ESA"] = 2500,
["Country_data_ESP"] = 84000,
["Country_data_EST"] = 17000,
["Country_data_ETH"] = 4500,
["Country_data_EU"] = 2600,
["Country_data_East_Germany"] = 29000,
["Country_data_Ecuador"] = 50000,
["Country_data_Egypt"] = 67000,
["Country_data_El_Salvador"] = 23000,
["Country_data_Empire_of_Japan"] = 4400,
["Country_data_England"] = 166000,
["Country_data_Equatorial_Guinea"] = 5500,
["Country_data_Eritrea"] = 5500,
["Country_data_Estonia"] = 70000,
["Country_data_Eswatini"] = 5000,
["Country_data_Ethiopia"] = 22000,
["Country_data_Europe"] = 2700,
["Country_data_European_Union"] = 8100,
["Country_data_FIJ"] = 4500,
["Country_data_FIN"] = 40000,
["Country_data_FRA"] = 114000,
["Country_data_FRG"] = 17000,
["Country_data_FRO"] = 2200,
["Country_data_FR_Yugoslavia"] = 4400,
["Country_data_Faroe_Islands"] = 5700,
["Country_data_Federated_States_of_Micronesia"] = 2700,
["Country_data_Fiji"] = 22000,
["Country_data_Finland"] = 115000,
["Country_data_Florida"] = 5800,
["Country_data_France"] = 329000,
["Country_data_French_Polynesia"] = 3800,
["Country_data_GAB"] = 2500,
["Country_data_GAM"] = 2300,
["Country_data_GBR"] = 66000,
["Country_data_GDR"] = 11000,
["Country_data_GEO"] = 16000,
["Country_data_GER"] = 95000,
["Country_data_GHA"] = 9900,
["Country_data_GIB"] = 2100,
["Country_data_GRE"] = 29000,
["Country_data_GUA"] = 5300,
["Country_data_GUI"] = 3400,
["Country_data_GUY"] = 2500,
["Country_data_Gabon"] = 8100,
["Country_data_Gambia"] = 7600,
["Country_data_Georgia"] = 8600,
["Country_data_Georgia_(U.S._state)"] = 3200,
["Country_data_Georgia_(country)"] = 55000,
["Country_data_German_Empire"] = 5700,
["Country_data_Germany"] = 296000,
["Country_data_Ghana"] = 47000,
["Country_data_Gibraltar"] = 5100,
["Country_data_Great_Britain"] = 129000,
["Country_data_Greece"] = 107000,
["Country_data_Greenland"] = 2800,
["Country_data_Grenada"] = 5600,
["Country_data_Guadeloupe"] = 2800,
["Country_data_Guam"] = 4600,
["Country_data_Guatemala"] = 22000,
["Country_data_Guinea"] = 9300,
["Country_data_Guinea-Bissau"] = 5400,
["Country_data_Guyana"] = 7700,
["Country_data_HAI"] = 3300,
["Country_data_HKG"] = 15000,
["Country_data_HON"] = 4400,
["Country_data_HUN"] = 44000,
["Country_data_Haiti"] = 9700,
["Country_data_Hawaii"] = 2200,
["Country_data_Honduras"] = 22000,
["Country_data_Hong_Kong"] = 52000,
["Country_data_Hungary"] = 116000,
["Country_data_IDN"] = 5700,
["Country_data_INA"] = 12000,
["Country_data_IND"] = 34000,
["Country_data_IRE"] = 12000,
["Country_data_IRI"] = 6700,
["Country_data_IRL"] = 24000,
["Country_data_IRN"] = 7300,
["Country_data_IRQ"] = 4800,
["Country_data_ISL"] = 9200,
["Country_data_ISR"] = 23000,
["Country_data_ITA"] = 101000,
["Country_data_Iceland"] = 48000,
["Country_data_Idaho"] = 2200,
["Country_data_Illinois"] = 4500,
["Country_data_India"] = 264000,
["Country_data_Indiana"] = 3300,
["Country_data_Indonesia"] = 73000,
["Country_data_Iowa"] = 2400,
["Country_data_Iran"] = 165000,
["Country_data_Iraq"] = 23000,
["Country_data_Ireland"] = 68000,
["Country_data_Isle_of_Man"] = 2800,
["Country_data_Israel"] = 95000,
["Country_data_Italy"] = 292000,
["Country_data_Ivory_Coast"] = 34000,
["Country_data_JAM"] = 12000,
["Country_data_JAP"] = 2200,
["Country_data_JOR"] = 4800,
["Country_data_JP"] = 8600,
["Country_data_JPN"] = 68000,
["Country_data_Jamaica"] = 46000,
["Country_data_Japan"] = 269000,
["Country_data_Jersey"] = 2500,
["Country_data_Jordan"] = 22000,
["Country_data_KAZ"] = 24000,
["Country_data_KEN"] = 10000,
["Country_data_KGZ"] = 4500,
["Country_data_KOR"] = 35000,
["Country_data_KOS"] = 3100,
["Country_data_KSA"] = 7500,
["Country_data_KUW"] = 4600,
["Country_data_Kazakhstan"] = 69000,
["Country_data_Kentucky"] = 2000,
["Country_data_Kenya"] = 35000,
["Country_data_Kingdom_of_France"] = 2200,
["Country_data_Kingdom_of_Great_Britain"] = 4600,
["Country_data_Kingdom_of_Italy"] = 4800,
["Country_data_Kiribati"] = 2600,
["Country_data_Kosovo"] = 10000,
["Country_data_Kuwait"] = 21000,
["Country_data_Kyrgyzstan"] = 11000,
["Country_data_LAO"] = 2100,
["Country_data_LAT"] = 17000,
["Country_data_LBN"] = 2900,
["Country_data_LIB"] = 2600,
["Country_data_LIE"] = 3800,
["Country_data_LIT"] = 3700,
["Country_data_LTU"] = 14000,
["Country_data_LUX"] = 12000,
["Country_data_LVA"] = 3000,
["Country_data_Laos"] = 7900,
["Country_data_Latvia"] = 56000,
["Country_data_Lebanon"] = 24000,
["Country_data_Lesotho"] = 5400,
["Country_data_Liberia"] = 7900,
["Country_data_Libya"] = 9100,
["Country_data_Liechtenstein"] = 8900,
["Country_data_Lithuania"] = 55000,
["Country_data_Louisiana"] = 2300,
["Country_data_Luxembourg"] = 50000,
["Country_data_MAC"] = 2900,
["Country_data_MAD"] = 2400,
["Country_data_MAR"] = 15000,
["Country_data_MAS"] = 13000,
["Country_data_MDA"] = 8800,
["Country_data_MEX"] = 35000,
["Country_data_MGL"] = 3500,
["Country_data_MKD"] = 8500,
["Country_data_MLI"] = 4600,
["Country_data_MLT"] = 6400,
["Country_data_MNE"] = 8500,
["Country_data_MON"] = 4700,
["Country_data_MOZ"] = 2600,
["Country_data_MRI"] = 2200,
["Country_data_MYA"] = 3400,
["Country_data_MYS"] = 4100,
["Country_data_Macau"] = 6800,
["Country_data_Macedonia"] = 4700,
["Country_data_Madagascar"] = 9600,
["Country_data_Malawi"] = 6100,
["Country_data_Malaysia"] = 73000,
["Country_data_Maldives"] = 6700,
["Country_data_Mali"] = 22000,
["Country_data_Malta"] = 33000,
["Country_data_Manitoba"] = 2800,
["Country_data_Marshall_Islands"] = 3300,
["Country_data_Martinique"] = 2900,
["Country_data_Maryland"] = 3300,
["Country_data_Massachusetts"] = 2600,
["Country_data_Mauritania"] = 5900,
["Country_data_Mauritius"] = 8400,
["Country_data_Mexico"] = 116000,
["Country_data_Michigan"] = 3800,
["Country_data_Minas_Gerais"] = 2000,
["Country_data_Minnesota"] = 3700,
["Country_data_Missouri"] = 2500,
["Country_data_Moldova"] = 35000,
["Country_data_Monaco"] = 12000,
["Country_data_Mongolia"] = 11000,
["Country_data_Montana"] = 2400,
["Country_data_Montenegro"] = 34000,
["Country_data_Montserrat"] = 2400,
["Country_data_Morocco"] = 52000,
["Country_data_Mozambique"] = 7900,
["Country_data_Myanmar"] = 24000,
["Country_data_NAM"] = 3900,
["Country_data_NED"] = 72000,
["Country_data_NEP"] = 3300,
["Country_data_NGA"] = 8600,
["Country_data_NGR"] = 9200,
["Country_data_NIR"] = 11000,
["Country_data_NLD"] = 7400,
["Country_data_NOR"] = 35000,
["Country_data_NZ"] = 3600,
["Country_data_NZL"] = 38000,
["Country_data_Namibia"] = 10000,
["Country_data_Nauru"] = 2500,
["Country_data_Nazi_Germany"] = 10000,
["Country_data_Nepal"] = 33000,
["Country_data_Netherlands"] = 266000,
["Country_data_Netherlands_Antilles"] = 2400,
["Country_data_Nevada"] = 2100,
["Country_data_New_Brunswick"] = 2600,
["Country_data_New_Caledonia"] = 3300,
["Country_data_New_Hampshire"] = 2000,
["Country_data_New_Jersey"] = 4200,
["Country_data_New_South_Wales"] = 6400,
["Country_data_New_York"] = 4200,
["Country_data_New_York_(state)"] = 6800,
["Country_data_New_Zealand"] = 121000,
["Country_data_Newfoundland_and_Labrador"] = 2700,
["Country_data_Nicaragua"] = 8900,
["Country_data_Niger"] = 6200,
["Country_data_Nigeria"] = 67000,
["Country_data_North_Carolina"] = 3500,
["Country_data_North_Korea"] = 23000,
["Country_data_North_Macedonia"] = 34000,
["Country_data_Northern_Ireland"] = 28000,
["Country_data_Northern_Mariana_Islands"] = 2800,
["Country_data_Norway"] = 119000,
["Country_data_Nova_Scotia"] = 2500,
["Country_data_OMA"] = 3200,
["Country_data_Ohio"] = 5800,
["Country_data_Oklahoma"] = 2500,
["Country_data_Oman"] = 10000,
["Country_data_Ontario"] = 3700,
["Country_data_Ottoman_Empire"] = 3100,
["Country_data_PAK"] = 9000,
["Country_data_PAN"] = 5900,
["Country_data_PAR"] = 11000,
["Country_data_PER"] = 14000,
["Country_data_PHI"] = 13000,
["Country_data_PLE"] = 2000,
["Country_data_PNG"] = 3200,
["Country_data_POL"] = 60000,
["Country_data_POR"] = 37000,
["Country_data_PRK"] = 5000,
["Country_data_PRT"] = 3600,
["Country_data_PUR"] = 8000,
["Country_data_Pakistan"] = 52000,
["Country_data_Palau"] = 2600,
["Country_data_Palestine"] = 7600,
["Country_data_Panama"] = 31000,
["Country_data_Papua_New_Guinea"] = 8400,
["Country_data_Paraguay"] = 46000,
["Country_data_Pennsylvania"] = 3600,
["Country_data_Peru"] = 66000,
["Country_data_Philippines"] = 69000,
["Country_data_Poland"] = 247000,
["Country_data_Portugal"] = 118000,
["Country_data_Prussia"] = 2800,
["Country_data_Puerto_Rico"] = 35000,
["Country_data_QAT"] = 9400,
["Country_data_Qatar"] = 33000,
["Country_data_Quebec"] = 4100,
["Country_data_Queensland"] = 2300,
["Country_data_ROM"] = 15000,
["Country_data_ROU"] = 31000,
["Country_data_RSA"] = 36000,
["Country_data_RUS"] = 68000,
["Country_data_RWA"] = 2400,
["Country_data_Republic_of_China"] = 4600,
["Country_data_Republic_of_Ireland"] = 56000,
["Country_data_Republic_of_the_Congo"] = 8200,
["Country_data_Romania"] = 115000,
["Country_data_Russia"] = 260000,
["Country_data_Russian_Empire"] = 5600,
["Country_data_Rwanda"] = 8400,
["Country_data_SAM"] = 3700,
["Country_data_SCG"] = 3000,
["Country_data_SCO"] = 29000,
["Country_data_SEN"] = 8400,
["Country_data_SER"] = 3700,
["Country_data_SGP"] = 4400,
["Country_data_SIN"] = 7400,
["Country_data_SLE"] = 2000,
["Country_data_SLO"] = 22000,
["Country_data_SLV"] = 3200,
["Country_data_SMR"] = 3500,
["Country_data_SPA"] = 5500,
["Country_data_SRB"] = 30000,
["Country_data_SRI"] = 5200,
["Country_data_SUI"] = 50000,
["Country_data_SUR"] = 2300,
["Country_data_SVK"] = 32000,
["Country_data_SVN"] = 7300,
["Country_data_SWE"] = 65000,
["Country_data_SWI"] = 5000,
["Country_data_SYR"] = 3900,
["Country_data_Saint_Kitts_and_Nevis"] = 4900,
["Country_data_Saint_Lucia"] = 5200,
["Country_data_Saint_Vincent_and_the_Grenadines"] = 5000,
["Country_data_Samoa"] = 8000,
["Country_data_San_Marino"] = 9600,
["Country_data_Saskatchewan"] = 3700,
["Country_data_Saudi_Arabia"] = 38000,
["Country_data_Scotland"] = 103000,
["Country_data_Senegal"] = 32000,
["Country_data_Serbia"] = 106000,
["Country_data_Serbia_and_Montenegro"] = 5400,
["Country_data_Seychelles"] = 5700,
["Country_data_Sierra_Leone"] = 7500,
["Country_data_Singapore"] = 51000,
["Country_data_Slovakia"] = 97000,
["Country_data_Slovenia"] = 93000,
["Country_data_Solomon_Islands"] = 4600,
["Country_data_Somalia"] = 6300,
["Country_data_South_Africa"] = 123000,
["Country_data_South_Australia"] = 2300,
["Country_data_South_Carolina"] = 3100,
["Country_data_South_Korea"] = 118000,
["Country_data_South_Sudan"] = 4800,
["Country_data_Soviet_Union"] = 78000,
["Country_data_Spain"] = 281000,
["Country_data_Sri_Lanka"] = 36000,
["Country_data_Sudan"] = 8600,
["Country_data_Suriname"] = 6700,
["Country_data_Sweden"] = 170000,
["Country_data_Switzerland"] = 154000,
["Country_data_Syria"] = 22000,
["Country_data_São_Tomé_and_Príncipe"] = 3300,
["Country_data_TAN"] = 3400,
["Country_data_TCH"] = 12000,
["Country_data_THA"] = 25000,
["Country_data_TJK"] = 2900,
["Country_data_TKM"] = 3100,
["Country_data_TOG"] = 2100,
["Country_data_TON"] = 2000,
["Country_data_TPE"] = 18000,
["Country_data_TRI"] = 5100,
["Country_data_TTO"] = 2100,
["Country_data_TUN"] = 12000,
["Country_data_TUR"] = 33000,
["Country_data_TWN"] = 2200,
["Country_data_Taiwan"] = 28000,
["Country_data_Tajikistan"] = 9700,
["Country_data_Tanzania"] = 23000,
["Country_data_Tennessee"] = 2200,
["Country_data_Texas"] = 5700,
["Country_data_Thailand"] = 98000,
["Country_data_Timor-Leste"] = 5000,
["Country_data_Togo"] = 7500,
["Country_data_Tonga"] = 6700,
["Country_data_Trinidad_and_Tobago"] = 24000,
["Country_data_Tunisia"] = 47000,
["Country_data_Turkey"] = 144000,
["Country_data_Turkmenistan"] = 8300,
["Country_data_Turks_and_Caicos_Islands"] = 2800,
["Country_data_Tuvalu"] = 2600,
["Country_data_U.S."] = 2000,
["Country_data_U.S._Virgin_Islands"] = 4900,
["Country_data_UAE"] = 11000,
["Country_data_UGA"] = 5200,
["Country_data_UK"] = 18000,
["Country_data_UKGBI"] = 3500,
["Country_data_UKR"] = 44000,
["Country_data_URS"] = 19000,
["Country_data_URU"] = 16000,
["Country_data_US"] = 5600,
["Country_data_USA"] = 150000,
["Country_data_USSR"] = 5300,
["Country_data_UZB"] = 13000,
["Country_data_Uganda"] = 23000,
["Country_data_Ukraine"] = 120000,
["Country_data_United_Arab_Emirates"] = 39000,
["Country_data_United_Kingdom"] = 163000,
["Country_data_United_Kingdom_of_Great_Britain_and_Ireland"] = 4800,
["Country_data_United_Nations"] = 4400,
["Country_data_United_States"] = 440000,
["Country_data_United_States_of_America"] = 4500,
["Country_data_Uruguay"] = 53000,
["Country_data_Uzbekistan"] = 37000,
["Country_data_VEN"] = 18000,
["Country_data_VIE"] = 7200,
["Country_data_Vanuatu"] = 5000,
["Country_data_Vatican_City"] = 2900,
["Country_data_Venezuela"] = 67000,
["Country_data_Victoria"] = 2400,
["Country_data_Vietnam"] = 48000,
["Country_data_Virginia"] = 3100,
["Country_data_WAL"] = 19000,
["Country_data_Wales"] = 69000,
["Country_data_Washington"] = 2700,
["Country_data_Washington,_D.C."] = 2200,
["Country_data_Washington_(state)"] = 3400,
["Country_data_West_Germany"] = 54000,
["Country_data_West_Indies"] = 2800,
["Country_data_Wisconsin"] = 5600,
["Country_data_Wyoming"] = 2100,
["Country_data_YUG"] = 11000,
["Country_data_Yemen"] = 8000,
["Country_data_Yugoslavia"] = 34000,
["Country_data_ZAF"] = 5400,
["Country_data_ZAM"] = 3800,
["Country_data_ZIM"] = 9100,
["Country_data_Zambia"] = 11000,
["Country_data_Zimbabwe"] = 33000,
["Country_data_none"] = 2100,
["Country_flagbio"] = 39000,
["Country_in_the_Eurovision_Song_Contest"] = 2800,
["Country_name"] = 58000,
["Country_prefix_the"] = 176000,
["Country_showdata"] = 7000,
["Country_topics"] = 25000,
["County"] = 7000,
["County_(judet)_of_Romania"] = 3300,
["Course_assignment"] = 4200,
["Course_details"] = 8300,
["Course_instructor"] = 3100,
["Cquote"] = 37000,
["Cr"] = 4900,
["Cr-rt"] = 2400,
["Create_taxonomy/link"] = 150000,
["Creative_Commons_text_attribution_notice"] = 6300,
["Cref2"] = 2800,
["Cricinfo"] = 24000,
["Cricket_squad2_coach"] = 2300,
["Cricket_squad2_player"] = 3100,
["Cricketarchive"] = 3000,
["Croatian_Census_2021"] = 4200,
["Cross"] = 4000,
["Crossreference"] = 2800,
["Crossreference/styles.css"] = 2800,
["Cs1_config"] = 13000,
["Cslist"] = 3700,
["Cslist/styles.css"] = 3700,
["Csv"] = 75000,
["Currency"] = 5300,
["Current_events"] = 9400,
["Current_events/styles.css"] = 9400,
["Currentdate"] = 24000,
["Cvt"] = 165000,
["Cycling_Archives"] = 4300,
["Cycling_data_DAT"] = 2000,
["Cycling_data_LTD"] = 2400,
["Cycling_data_MOV_men"] = 2300,
["Cycling_data_SOQ"] = 2200,
["Cycling_data_TVL"] = 2400,
["Cycling_data_UEX"] = 2300,
["Cycling_team_link"] = 14000,
["Module:CFB_schedule"] = 29000,
["Module:CS1_identifiers"] = 506000,
["Module:CallAssert"] = 122000,
["Module:Canada_NTS"] = 2100,
["Module:Canada_NTS/data"] = 2100,
["Module:Canada_by_province_category_navigation"] = 9900,
["Module:Catalog_lookup_link"] = 61000,
["Module:Category_described_in_year"] = 6400,
["Module:Category_described_in_year/config"] = 6400,
["Module:Category_disambiguation"] = 2700,
["Module:Category_handler"] = 4970000,
["Module:Category_handler/blacklist"] = 4970000,
["Module:Category_handler/config"] = 4970000,
["Module:Category_handler/data"] = 4970000,
["Module:Category_handler/shared"] = 4970000,
["Module:Category_main_article"] = 221000,
["Module:Category_more_if_exists"] = 49000,
["Module:Category_pair"] = 7000,
["Module:Category_see_also"] = 55000,
["Module:Category_series_navigation"] = 595000,
["Module:Category_series_navigation/styles.css"] = 595000,
["Module:Celestial_object_quadrangle"] = 2100,
["Module:Chart"] = 2900,
["Module:Chart/Default_colors"] = 2900,
["Module:Check_DYK_hook"] = 125000,
["Module:Check_blp_parameter"] = 2900000,
["Module:Check_for_conflicting_parameters"] = 4740000,
["Module:Check_for_deprecated_parameters"] = 199000,
["Module:Check_for_unknown_parameters"] = 23300000,
["Module:Check_height"] = 152000,
["Module:Check_isxn"] = 16000,
["Module:Check_winner_by_scores"] = 16000,
["Module:Checkuser"] = 90000,
["Module:Chem2"] = 11000,
["Module:Chem2/styles.css"] = 11000,
["Module:Citation/CS1"] = 6510000,
["Module:Citation/CS1/COinS"] = 6510000,
["Module:Citation/CS1/Configuration"] = 6630000,
["Module:Citation/CS1/Date_validation"] = 6510000,
["Module:Citation/CS1/Identifiers"] = 6630000,
["Module:Citation/CS1/Suggestions"] = 26000,
["Module:Citation/CS1/Utilities"] = 6630000,
["Module:Citation/CS1/Whitelist"] = 6510000,
["Module:Citation/CS1/styles.css"] = 6630000,
["Module:Citation_mode"] = 49000,
["Module:Cite"] = 52000,
["Module:Cite/config"] = 69000,
["Module:Cite_IUCN"] = 70000,
["Module:Cite_Q"] = 17000,
["Module:Cite_Q/config"] = 17000,
["Module:Cite_taxon"] = 54000,
["Module:Cite_tweet"] = 48000,
["Module:Clade"] = 10000,
["Module:Class"] = 62000,
["Module:Class/definition.json"] = 62000,
["Module:Class/styles.css"] = 40000,
["Module:Class_mask"] = 457000,
["Module:Clickable_button"] = 1880000,
["Module:Collapsible_list"] = 70000,
["Module:College_color"] = 137000,
["Module:College_color/data"] = 137000,
["Module:Color_contrast"] = 569000,
["Module:Color_contrast/colors"] = 572000,
["Module:Commons_link"] = 306000,
["Module:Compact_list"] = 2000,
["Module:Complex_date"] = 47000,
["Module:Conservation_status"] = 88000,
["Module:Contentious_topics/talk_notice"] = 21000,
["Module:Convert"] = 1510000,
["Module:Convert/data"] = 1510000,
["Module:Convert/helper"] = 13000,
["Module:Convert/text"] = 1510000,
["Module:Convert/wikidata"] = 2700,
["Module:Convert/wikidata/data"] = 2700,
["Module:ConvertIB"] = 782000,
["Module:ConvertIB/data"] = 259000,
["Module:ConvertNumeric"] = 20000,
["Module:Convert_character_width"] = 2800,
["Module:Convert_character_width/data"] = 2800,
["Module:Coordinates"] = 1410000,
["Module:Coordinates/styles.css"] = 1410000,
["Module:Copied"] = 43000,
["Module:Country2nationality"] = 97000,
["Module:CountryAdjectiveDemonym"] = 115000,
["Module:CountryAdjectiveDemonym/Adjectives"] = 115000,
["Module:CountryAdjectiveDemonym/Demonyms"] = 115000,
["Module:CountryAdjectiveDemonym/The"] = 115000,
["Module:CountryData"] = 473000,
["Module:CountryData/cacheA"] = 172000,
["Module:CountryData/cacheB"] = 87000,
["Module:CountryData/cacheC"] = 62000,
["Module:CountryData/cacheD"] = 59000,
["Module:CountryData/cacheE"] = 40000,
["Module:CountryData/cacheF"] = 28000,
["Module:CountryData/cacheG"] = 29000,
["Module:CountryData/cacheH"] = 19000,
["Module:CountryData/cacheI"] = 18000,
["Module:CountryData/cacheJ"] = 11000,
["Module:CountryData/cacheK"] = 12000,
["Module:CountryData/summary"] = 473000,
["Module:Country_adjective"] = 4600,
["Module:Country_alias"] = 61000,
["Module:Country_alias/data"] = 62000,
["Module:Cslist"] = 3700,
["Module:Currency"] = 5400,
["Module:Currency/Presentation"] = 5400,
}
34557nxcf30vow7kf9e9lwq0v8mbin5
73240
73239
2026-07-08T22:05:07Z
Robertsky
10424
1 versaun husi [[:en:Module:Transclusion_count/data/C]]
73239
Scribunto
text/plain
return {
["C"] = 792000,
["C-Class"] = 17000,
["C-SPAN"] = 13000,
["C-cmn"] = 2800,
["C-pl"] = 51000,
["C."] = 351000,
["CAN"] = 20000,
["CANelec"] = 18000,
["CANelec/gain"] = 3400,
["CANelec/hold"] = 6600,
["CANelec/source"] = 11000,
["CANelec/top"] = 8600,
["CANelec/total"] = 9300,
["CAS"] = 3800,
["CAS_Registry_Number"] = 3800,
["CBB_Yearly_Record_End"] = 3500,
["CBB_Yearly_Record_Entry"] = 3600,
["CBB_Yearly_Record_Start"] = 3400,
["CBB_Yearly_Record_Subhead"] = 4200,
["CBB_Yearly_Record_Subtotal"] = 3300,
["CBB_roster/Footer"] = 10000,
["CBB_roster/Header"] = 10000,
["CBB_roster/Player"] = 10000,
["CBB_schedule_end"] = 13000,
["CBB_schedule_entry"] = 13000,
["CBB_schedule_start"] = 13000,
["CBB_standings_end"] = 19000,
["CBB_standings_entry"] = 19000,
["CBB_standings_start"] = 19000,
["CBB_yearly_record_end"] = 4700,
["CBB_yearly_record_end/legend"] = 4100,
["CBB_yearly_record_entry"] = 4600,
["CBB_yearly_record_start"] = 4500,
["CBB_yearly_record_subhead"] = 4300,
["CBB_yearly_record_subtotal"] = 4400,
["CBSB_Standings_End"] = 2700,
["CBSB_Standings_Entry"] = 2700,
["CBSB_Standings_Start"] = 2600,
["CBSB_link"] = 4100,
["CBSB_standings_end"] = 5500,
["CBSB_standings_entry"] = 5500,
["CBSB_standings_start"] = 5500,
["CC0"] = 3900,
["CC_BY-SA_2.5"] = 2100,
["CC_BY-SA_2.5,_2.0,_1.0"] = 2100,
["CC_BY-SA_3.0"] = 21000,
["CC_BY-SA_3.0_migrated"] = 19000,
["CC_BY-SA_4.0"] = 13000,
["CC_BY_2.5"] = 2600,
["CC_BY_3.0"] = 7000,
["CFB_Standings_End"] = 16000,
["CFB_Standings_Entry"] = 16000,
["CFB_Standings_Start"] = 16000,
["CFB_Yearly_Record_End"] = 7900,
["CFB_Yearly_Record_End/legend"] = 2900,
["CFB_Yearly_Record_Entry"] = 7900,
["CFB_Yearly_Record_Start"] = 7900,
["CFB_Yearly_Record_Subhead"] = 8000,
["CFB_Yearly_Record_Subtotal"] = 7800,
["CFB_schedule"] = 29000,
["CFB_schedule_entry"] = 22000,
["CFB_standings_end"] = 39000,
["CFB_standings_entry"] = 39000,
["CFB_standings_start"] = 39000,
["CFL_Year"] = 7200,
["CGF_year"] = 3600,
["CGNDB_URL"] = 5300,
["CHE"] = 11000,
["CHI"] = 3300,
["CHL"] = 4200,
["CHN"] = 15000,
["CN"] = 4000,
["CO2"] = 3500,
["COI"] = 14000,
["COIUL"] = 131000,
["COI_editnotice"] = 7800,
["COL"] = 5600,
["COLON"] = 14000,
["CRI"] = 2300,
["CRO"] = 6500,
["CS1_config"] = 15000,
["CSK"] = 2800,
["CSS_image_crop"] = 9200,
["CUB"] = 4200,
["CURRENTDATE"] = 3600,
["CURRENTMINUTE"] = 2500,
["CYP"] = 2200,
["CZE"] = 16000,
["Calendar"] = 2500,
["Calendar/styles.css"] = 2700,
["California/color"] = 12000,
["Call_sign_disambiguation"] = 3100,
["Campaignbox"] = 26000,
["CanProvName"] = 19000,
["CanadaByProvinceCatNav"] = 9500,
["CanadaProvinceThe"] = 4500,
["Canada_NTS_Map_Sheet"] = 2100,
["Canada_by_province_category_navigation"] = 9900,
["Canadian_English"] = 13000,
["Canadian_Parliament_links"] = 5100,
["Canadian_election_result"] = 18000,
["Canadian_election_result/gain"] = 3600,
["Canadian_election_result/hold"] = 6900,
["Canadian_election_result/source"] = 12000,
["Canadian_election_result/top"] = 18000,
["Canadian_election_result/total"] = 14000,
["Canadian_party_colour"] = 11000,
["Canadian_party_colour/colour"] = 23000,
["Canadian_party_colour/colour/default"] = 22000,
["Canadian_party_colour/name"] = 19000,
["Canadian_party_colour/name/default"] = 8200,
["Canadian_province_name"] = 19000,
["Canned_search"] = 8000,
["Cascite"] = 17000,
["Caselaw_source"] = 4800,
["Cassini-Ehess"] = 3100,
["Cast_listing"] = 29000,
["Castlist"] = 5200,
["Cat"] = 461000,
["CatAutoTOC"] = 374000,
["CatRel"] = 4100,
["CatTrack"] = 20000,
["Cat_class"] = 6600,
["Cat_main"] = 149000,
["Cat_more"] = 103000,
["Cat_more_if_exists"] = 29000,
["Cat_see_also"] = 3800,
["Catalog_lookup_link"] = 59000,
["Catalog_of_Fishes"] = 9500,
["Catalogue_of_Life"] = 23000,
["Category"] = 2400,
["Category-Class"] = 14000,
["Category-inline"] = 11000,
["Category_TOC"] = 81000,
["Category_TOC/tracking"] = 81000,
["Category_U.S._State_elections_by_year"] = 7500,
["Category_U.S._State_elections_by_year/core"] = 7500,
["Category_class"] = 25000,
["Category_described_in_year"] = 6400,
["Category_diffuse"] = 11000,
["Category_disambiguation"] = 2700,
["Category_explanation"] = 415000,
["Category_handler"] = 2720000,
["Category_if_exists"] = 83000,
["Category_ifexist"] = 4800,
["Category_importance"] = 8900,
["Category_link"] = 678000,
["Category_link/core"] = 678000,
["Category_link_if_exists"] = 79000,
["Category_link_with_count"] = 9200,
["Category_link_without_namespace"] = 793000,
["Category_links"] = 9900,
["Category_main_article"] = 221000,
["Category_more"] = 143000,
["Category_more_if_exists"] = 49000,
["Category_ordered_by_date"] = 13000,
["Category_other"] = 1100000,
["Category_pair"] = 2100,
["Category_redirect"] = 163000,
["Category_redirect/core"] = 163000,
["Category_see_also"] = 55000,
["Category_see_also/Category_pair_check"] = 55000,
["Category_see_also_if_exists"] = 94000,
["Category_see_also_if_exists_2"] = 101000,
["Category_series_navigation"] = 595000,
["Category_title"] = 2400,
["Catexp"] = 5900,
["CathEncy"] = 2300,
["Catholic"] = 3700,
["Catholic_Encyclopedia"] = 5100,
["Catmain"] = 29000,
["Catmore"] = 9800,
["Catseealso"] = 2300,
["Cbb_link"] = 10000,
["Cbignore"] = 131000,
["Cbsb_link"] = 2500,
["Cc-by-2.5"] = 2600,
["Cc-by-3.0"] = 7000,
["Cc-by-sa-2.5"] = 2100,
["Cc-by-sa-2.5,2.0,1.0"] = 2100,
["Cc-by-sa-3.0"] = 20000,
["Cc-by-sa-3.0-migrated"] = 19000,
["Cc-by-sa-4.0"] = 13000,
["Cc-zero"] = 3800,
["CensusAU"] = 9100,
["Census_2016_AUS"] = 5700,
["Census_2021_AUS"] = 6200,
["Cent"] = 6800,
["Center"] = 299000,
["Centralized_discussion"] = 7200,
["Centralized_discussion/core"] = 7200,
["Centralized_discussion/styles.css"] = 7200,
["Centre"] = 4100,
["Century"] = 16000,
["Century_name_from_decade"] = 2400,
["Century_name_from_decade_or_year"] = 126000,
["Century_name_from_title_decade"] = 7500,
["Century_name_from_title_year"] = 7500,
["Certification_Cite_Ref"] = 38000,
["Certification_Table_Bottom"] = 37000,
["Certification_Table_Entry"] = 38000,
["Certification_Table_Entry/Foot"] = 37000,
["Certification_Table_Entry/Foot/helper"] = 37000,
["Certification_Table_Entry/MexicanAward"] = 2300,
["Certification_Table_Entry/Region"] = 38000,
["Certification_Table_Entry/Sales"] = 37000,
["Certification_Table_Entry/Sales/AustrianPeriod"] = 2400,
["Certification_Table_Entry/Sales/BelgianPeriod"] = 2400,
["Certification_Table_Entry/Sales/DanishPeriod"] = 4300,
["Certification_Table_Entry/Sales/DanishPeriodHelper1"] = 4300,
["Certification_Table_Entry/Sales/DanishPeriodHelper2"] = 4300,
["Certification_Table_Entry/Sales/FrenchPeriod"] = 2200,
["Certification_Table_Entry/Sales/FrenchPeriodAlbum"] = 2000,
["Certification_Table_Entry/Sales/GermanPeriod"] = 4100,
["Certification_Table_Entry/Sales/ItalianHelper"] = 4400,
["Certification_Table_Entry/Sales/MexicanSales"] = 2200,
["Certification_Table_Entry/Sales/NewZealandPeriod"] = 7700,
["Certification_Table_Entry/Sales/SpanishSinglesPeriod"] = 2800,
["Certification_Table_Entry/Sales/SwedishPeriod"] = 2200,
["Certification_Table_Separator"] = 3200,
["Certification_Table_Top"] = 38000,
["Cfb_link"] = 26000,
["Cfd_all"] = 3800,
["Chart_bottom"] = 4400,
["Chart_top"] = 4400,
["Check_completeness_of_transclusions"] = 63000,
["Check_talk"] = 63000,
["Check_talk_wp"] = 1450000,
["Check_winner_by_scores"] = 16000,
["CheckedSockpuppet"] = 7200,
["Checked_sockpuppet"] = 18000,
["Checkedsockpuppet"] = 5300,
["Checkip"] = 12000,
["Checkuser"] = 89000,
["Checkuserblock-account"] = 43000,
["Chem"] = 6100,
["Chem/atom"] = 6000,
["Chem/link"] = 6100,
["Chem2"] = 11000,
["Chem_molar_mass"] = 22000,
["Chem_molar_mass/format"] = 22000,
["Chembox"] = 16000,
["Chembox/styles.css"] = 16000,
["Chembox_3DMet"] = 15000,
["Chembox_AllOtherNames"] = 14000,
["Chembox_AllOtherNames/format"] = 14000,
["Chembox_Appearance"] = 7200,
["Chembox_BoilingPt"] = 4200,
["Chembox_CASNo"] = 15000,
["Chembox_CASNo/format"] = 15000,
["Chembox_CalcTemperatures"] = 7500,
["Chembox_ChEBI"] = 15000,
["Chembox_ChEBI/format"] = 15000,
["Chembox_ChEMBL"] = 15000,
["Chembox_ChEMBL/format"] = 15000,
["Chembox_ChemSpiderID"] = 15000,
["Chembox_ChemSpiderID/format"] = 15000,
["Chembox_CompTox"] = 15000,
["Chembox_CompTox/format"] = 15000,
["Chembox_Datapage_check"] = 16000,
["Chembox_Density"] = 5600,
["Chembox_DrugBank"] = 15000,
["Chembox_DrugBank/format"] = 15000,
["Chembox_ECHA"] = 8200,
["Chembox_ECNumber"] = 15000,
["Chembox_ECNumber/format"] = 15000,
["Chembox_Elements"] = 15000,
["Chembox_Elements/molecular_formula"] = 21000,
["Chembox_FlashPt"] = 2100,
["Chembox_Footer"] = 15000,
["Chembox_Footer/tracking"] = 15000,
["Chembox_GHS_(set)"] = 4500,
["Chembox_Hazards"] = 13000,
["Chembox_IUPHAR_ligand"] = 15000,
["Chembox_IUPHAR_ligand/format"] = 15000,
["Chembox_Identifiers"] = 15000,
["Chembox_InChI"] = 15000,
["Chembox_InChI/format"] = 15000,
["Chembox_Indexlist"] = 15000,
["Chembox_Jmol"] = 15000,
["Chembox_Jmol/format"] = 15000,
["Chembox_KEGG"] = 15000,
["Chembox_KEGG/format"] = 15000,
["Chembox_MeltingPt"] = 6600,
["Chembox_OtherCpds"] = 2100,
["Chembox_Properties"] = 15000,
["Chembox_PubChem"] = 15000,
["Chembox_PubChem/format"] = 15000,
["Chembox_RTECS"] = 15000,
["Chembox_RTECS/format"] = 15000,
["Chembox_Related"] = 4200,
["Chembox_SMILES"] = 15000,
["Chembox_SMILES/format"] = 15000,
["Chembox_SolubilityInWater"] = 4500,
["Chembox_Structure"] = 2400,
["Chembox_UNII"] = 15000,
["Chembox_UNII/format"] = 15000,
["Chembox_headerbar"] = 16000,
["Chembox_image"] = 14000,
["Chembox_image_cell"] = 14000,
["Chembox_image_sbs"] = 14000,
["Chembox_parametercheck"] = 15000,
["Chembox_setDatarow"] = 5400,
["Chembox_setHeader"] = 5400,
["Chembox_templatePar/formatPreviewMessage"] = 16000,
["Chembox_verification"] = 6900,
["Chemspidercite"] = 11000,
["Chessgames_player"] = 3800,
["Chinese"] = 3600,
["Circa"] = 465000,
["Circular_reference"] = 3900,
["Citation"] = 410000,
["Citation/make_link"] = 7800,
["Citation/styles.css"] = 52000,
["Citation_needed"] = 634000,
["Citation_needed_span"] = 3600,
["Citation_style"] = 4500,
["Cite_AV_media"] = 79000,
["Cite_AV_media_notes"] = 33000,
["Cite_Appletons'"] = 2400,
["Cite_Australian_Dictionary_of_Biography"] = 4900,
["Cite_Box_Office_Mojo"] = 2500,
["Cite_Catholic_Encyclopedia"] = 8600,
["Cite_DCB"] = 3300,
["Cite_DGRBM"] = 2200,
["Cite_DNB"] = 20000,
["Cite_EB1911"] = 26000,
["Cite_FTP"] = 2500,
["Cite_GBIF"] = 4300,
["Cite_GNIS"] = 2300,
["Cite_Gaia_DR3"] = 3100,
["Cite_Google_Maps"] = 20000,
["Cite_Hansard"] = 2700,
["Cite_IUCN"] = 70000,
["Cite_Instagram"] = 7100,
["Cite_Jewish_Encyclopedia"] = 3200,
["Cite_LCDB"] = 2000,
["Cite_Metacritic"] = 2200,
["Cite_NIE"] = 3500,
["Cite_NSW_Parliament"] = 3300,
["Cite_NSW_SHR"] = 2700,
["Cite_NatureServe"] = 2800,
["Cite_ODNB"] = 22000,
["Cite_OED"] = 2500,
["Cite_POWO"] = 5900,
["Cite_Q"] = 17000,
["Cite_QHR"] = 3100,
["Cite_QPN"] = 4100,
["Cite_Rotten_Tomatoes"] = 2800,
["Cite_Rowlett"] = 2500,
["Cite_Russian_law"] = 7800,
["Cite_Ryan"] = 3300,
["Cite_Sports-Reference"] = 55000,
["Cite_USGov"] = 13000,
["Cite_WoRMS"] = 13000,
["Cite_act"] = 3900,
["Cite_arXiv"] = 6900,
["Cite_bcgnis"] = 3700,
["Cite_book"] = 1900000,
["Cite_certification"] = 43000,
["Cite_certification/Title"] = 39000,
["Cite_certification/URL"] = 43000,
["Cite_certification/archivedate"] = 7600,
["Cite_certification/archiveurl"] = 7600,
["Cite_cgndb"] = 5300,
["Cite_comic"] = 2100,
["Cite_conference"] = 22000,
["Cite_court"] = 6700,
["Cite_dictionary"] = 3500,
["Cite_document"] = 2000,
["Cite_encyclopedia"] = 242000,
["Cite_episode"] = 19000,
["Cite_gnis"] = 35000,
["Cite_instagram"] = 3000,
["Cite_interview"] = 11000,
["Cite_iucn"] = 69000,
["Cite_journal"] = 1160000,
["Cite_legislation_UK"] = 3500,
["Cite_magazine"] = 377000,
["Cite_map"] = 60000,
["Cite_news"] = 1910000,
["Cite_newspaper_The_Times"] = 7200,
["Cite_patent"] = 7200,
["Cite_patent/authors"] = 6000,
["Cite_patent/core"] = 7500,
["Cite_peakbagger"] = 5300,
["Cite_podcast"] = 6100,
["Cite_press_release"] = 85000,
["Cite_report"] = 74000,
["Cite_rowlett"] = 2500,
["Cite_ship_register"] = 2000,
["Cite_simbad"] = 5600,
["Cite_sports-reference"] = 59000,
["Cite_taxon"] = 5300,
["Cite_tech_report"] = 3000,
["Cite_thesis"] = 49000,
["Cite_tweet"] = 48000,
["Cite_video"] = 13000,
["Cite_video_game"] = 3400,
["Cite_web"] = 5390000,
["Cite_wikisource"] = 7000,
["Cite_wikisource/make_link"] = 65000,
["Citeweb"] = 3500,
["Civil_navigation"] = 2200,
["Cjersey"] = 3000,
["Cl"] = 215000,
["Clade"] = 10000,
["Clade/styles.css"] = 10000,
["Clarification_needed"] = 2500,
["Clarify"] = 45000,
["Class"] = 40000,
["Class/colour"] = 19000,
["Class/icon"] = 21000,
["Class_mask"] = 457000,
["Classicon"] = 5200,
["Clc"] = 7400,
["Cleanup"] = 8800,
["Cleanup_reorganize"] = 2300,
["Cleanup_rewrite"] = 6900,
["Clear"] = 3740000,
["Clear_left"] = 29000,
["Clear_right"] = 2800,
["Clerk_Request"] = 2500,
["Clerk_note"] = 11000,
["Clerknote"] = 8500,
["Clickable_button"] = 1880000,
["Clickable_button_2"] = 228000,
["Closed_access"] = 5500,
["Closed_peer_review_page"] = 3100,
["Closed_rfc_bottom"] = 2200,
["Closed_rfc_top"] = 2800,
["Clr"] = 3100,
["Club_players_category"] = 9400,
["Clubplayerscat"] = 9400,
["Cmbox"] = 534000,
["Cn"] = 113000,
["Cnote2"] = 2800,
["Cnote2_Begin"] = 2900,
["Cnote2_End"] = 2900,
["Coat_of_arms"] = 2500,
["Cob"] = 14000,
["Code"] = 83000,
["Cof_family"] = 4500,
["Cof_genus"] = 5200,
["Col-1-of-2"] = 2400,
["Col-2"] = 186000,
["Col-2-of-2"] = 2300,
["Col-3"] = 11000,
["Col-4"] = 3800,
["Col-begin"] = 231000,
["Col-begin/styles.css"] = 231000,
["Col-break"] = 228000,
["Col-end"] = 230000,
["Col-float"] = 4800,
["Col-float-break"] = 4700,
["Col-float-end"] = 4800,
["Col-float/styles.css"] = 4800,
["Col-start"] = 10000,
["Col_div"] = 2200,
["Colbegin"] = 24000,
["Colend"] = 27000,
["Collapse"] = 8600,
["Collapse_bottom"] = 56000,
["Collapse_top"] = 56000,
["Collapse_top/styles.css"] = 56000,
["Collapsebottom"] = 4000,
["Collapsed_infobox_section_begin"] = 4200,
["Collapsed_infobox_section_end"] = 4300,
["Collapsetop"] = 4100,
["Collapsible_list"] = 68000,
["Collapsible_option"] = 151000,
["Colledge:_Ships_RN"] = 3000,
["College"] = 12000,
["CollegePrimaryHeader"] = 8200,
["CollegePrimaryStyle"] = 111000,
["CollegeSecondaryStyle"] = 11000,
["College_Athlete_Recruit_End"] = 2800,
["College_Athlete_Recruit_Entry"] = 2900,
["College_Athlete_Recruit_Start"] = 2900,
["College_athlete_recruit_end"] = 4900,
["College_athlete_recruit_entry"] = 5100,
["College_athlete_recruit_start"] = 5100,
["College_color_list"] = 4400,
["College_sports_team_link"] = 31000,
["Colon"] = 20000,
["Color"] = 504000,
["Color/styles.css"] = 504000,
["Color_box"] = 86000,
["Colorbox"] = 2600,
["Colorbull"] = 4600,
["Colored_link"] = 102000,
["Coloredlink"] = 2800,
["Colors"] = 3600,
["Colour"] = 5500,
["Colour_box"] = 2500,
["Coloured_link"] = 12000,
["Column"] = 4300,
["Column/styles.css"] = 4300,
["Columns-end"] = 4000,
["Columns-list"] = 125000,
["Columns-start"] = 4000,
["Comic_Book_DB"] = 3500,
["Comicbookdb"] = 3400,
["Comics-replaceability"] = 2800,
["Comics_infobox_sec/formcat"] = 3400,
["Comics_infobox_sec/genre"] = 4200,
["Comics_infobox_sec/genrecat"] = 3800,
["Comics_infobox_sec/styles.css"] = 8100,
["Comma_separated_entries"] = 521000,
["Comment"] = 7400,
["Committed_identity"] = 3200,
["Committed_identity/styles.css"] = 3200,
["Commons"] = 72000,
["Commons-inline"] = 25000,
["Commons_cat"] = 45000,
["Commons_category"] = 902000,
["Commons_category-inline"] = 176000,
["Commons_category_inline"] = 5700,
["Commonscat"] = 60000,
["Commonscat-inline"] = 15000,
["Commonscat_inline"] = 2300,
["Commonscatinline"] = 7300,
["Compact_TOC"] = 7300,
["Compact_ToC"] = 3200,
["Compose_molecular_formula"] = 2300,
["Composition_bar"] = 13000,
["Confirmed"] = 20000,
["Confused"] = 3200,
["Confusing"] = 2400,
["CongBio"] = 9400,
["CongLinks"] = 4800,
["Connected_contributor"] = 21000,
["Connected_contributor_(paid)"] = 9800,
["Constellation_navbox"] = 9900,
["Container"] = 14000,
["Container_cat"] = 9100,
["Container_category"] = 84000,
["Containercat"] = 2800,
["Contains_special_characters"] = 5200,
["Contains_special_characters/core"] = 5200,
["Contains_special_characters/styles.css"] = 5200,
["Content_category"] = 7900,
["Contentious_topics/Additional_restrictions.json"] = 21000,
["Contentious_topics/Arab-Israeli_editnotice"] = 6800,
["Contentious_topics/Arab-Israeli_talk_notice"] = 6100,
["Contentious_topics/Category_database.json"] = 21000,
["Contentious_topics/Restrictions_definition.json"] = 21000,
["Contentious_topics/Standard_set.json"] = 21000,
["Contentious_topics/list"] = 29000,
["Contentious_topics/page_restriction_editnotice_base"] = 7300,
["Contentious_topics/page_restriction_talk_notice"] = 2600,
["Contentious_topics/talk_notice"] = 21000,
["Context"] = 2600,
["Continent2continental"] = 45000,
["Continent_adjective_to_noun"] = 10000,
["Continental2continent"] = 22000,
["Controversial"] = 3000,
["Convert"] = 1410000,
["Convert_abbreviated"] = 165000,
["Convinfobox"] = 291000,
["Coord"] = 1400000,
["Coord_missing"] = 71000,
["Coord_missing/CheckCat"] = 70000,
["Coords"] = 6700,
["Copied"] = 22000,
["Copy_edit"] = 2200,
["Copy_to_Wikimedia_Commons"] = 85000,
["Copy_to_Wikimedia_Commons_in"] = 4100,
["Copyvios"] = 5200,
["Cospar"] = 2800,
["Cot"] = 14000,
["Count"] = 972000,
["Country2continent"] = 88000,
["Country2continental"] = 31000,
["Country2nationality"] = 35000,
["CountryPrefixThe"] = 82000,
["Country_abbreviation"] = 96000,
["Country_alias"] = 17000,
["Country_at_games_navbox"] = 5800,
["Country_at_games_navbox/below"] = 5800,
["Country_data"] = 12000,
["Country_data_AFG"] = 2600,
["Country_data_ALB"] = 7200,
["Country_data_ALG"] = 11000,
["Country_data_AND"] = 3600,
["Country_data_ANG"] = 4400,
["Country_data_ARG"] = 53000,
["Country_data_ARM"] = 8300,
["Country_data_AUS"] = 88000,
["Country_data_AUT"] = 52000,
["Country_data_AZE"] = 11000,
["Country_data_Afghanistan"] = 22000,
["Country_data_Alabama"] = 2600,
["Country_data_Alaska"] = 2100,
["Country_data_Albania"] = 36000,
["Country_data_Alberta"] = 3100,
["Country_data_Algeria"] = 48000,
["Country_data_American_Samoa"] = 2900,
["Country_data_Andorra"] = 9200,
["Country_data_Angola"] = 21000,
["Country_data_Anguilla"] = 2400,
["Country_data_Antigua_and_Barbuda"] = 6400,
["Country_data_Apulia"] = 7900,
["Country_data_Argentina"] = 155000,
["Country_data_Arizona"] = 2500,
["Country_data_Arkansas"] = 2800,
["Country_data_Armenia"] = 48000,
["Country_data_Aruba"] = 4000,
["Country_data_Australia"] = 279000,
["Country_data_Austria"] = 149000,
["Country_data_Austria-Hungary"] = 2300,
["Country_data_Azerbaijan"] = 52000,
["Country_data_BAH"] = 4600,
["Country_data_BAN"] = 4400,
["Country_data_BAR"] = 2700,
["Country_data_BDI"] = 2000,
["Country_data_BEL"] = 60000,
["Country_data_BER"] = 2500,
["Country_data_BHR"] = 5800,
["Country_data_BIH"] = 14000,
["Country_data_BLR"] = 26000,
["Country_data_BOL"] = 6600,
["Country_data_BOT"] = 3100,
["Country_data_BRA"] = 64000,
["Country_data_BUL"] = 31000,
["Country_data_Bahamas"] = 11000,
["Country_data_Bahrain"] = 22000,
["Country_data_Bangladesh"] = 35000,
["Country_data_Barbados"] = 8700,
["Country_data_Belarus"] = 92000,
["Country_data_Belgium"] = 160000,
["Country_data_Belize"] = 5100,
["Country_data_Benin"] = 8000,
["Country_data_Bermuda"] = 6300,
["Country_data_Bhutan"] = 4900,
["Country_data_Bolivia"] = 24000,
["Country_data_Bosnia_and_Herzegovina"] = 54000,
["Country_data_Botswana"] = 10000,
["Country_data_Brazil"] = 173000,
["Country_data_British_Columbia"] = 3400,
["Country_data_British_Empire"] = 2000,
["Country_data_British_Raj"] = 2500,
["Country_data_British_Virgin_Islands"] = 3300,
["Country_data_Brunei"] = 6800,
["Country_data_Bulgaria"] = 103000,
["Country_data_Burkina_Faso"] = 11000,
["Country_data_Burma"] = 2300,
["Country_data_Burundi"] = 6800,
["Country_data_CAM"] = 2500,
["Country_data_CAN"] = 68000,
["Country_data_CGO"] = 2500,
["Country_data_CHE"] = 5900,
["Country_data_CHI"] = 19000,
["Country_data_CHL"] = 2300,
["Country_data_CHN"] = 49000,
["Country_data_CIV"] = 8500,
["Country_data_CMR"] = 8800,
["Country_data_COD"] = 3500,
["Country_data_COL"] = 28000,
["Country_data_CPV"] = 2300,
["Country_data_CRC"] = 6900,
["Country_data_CRO"] = 37000,
["Country_data_CUB"] = 13000,
["Country_data_CYP"] = 10000,
["Country_data_CZE"] = 54000,
["Country_data_California"] = 6200,
["Country_data_Cambodia"] = 9800,
["Country_data_Cameroon"] = 32000,
["Country_data_Canada"] = 267000,
["Country_data_Cape_Verde"] = 7000,
["Country_data_Castile_and_León"] = 2000,
["Country_data_Catalonia"] = 3500,
["Country_data_Cayman_Islands"] = 4500,
["Country_data_Central_African_Republic"] = 5100,
["Country_data_Chad"] = 5400,
["Country_data_Chile"] = 92000,
["Country_data_China"] = 154000,
["Country_data_Chinese_Taipei"] = 39000,
["Country_data_Colombia"] = 97000,
["Country_data_Colorado"] = 5300,
["Country_data_Commonwealth_of_Independent_States"] = 2200,
["Country_data_Comoros"] = 4700,
["Country_data_Confederate_States_of_America"] = 3100,
["Country_data_Connecticut"] = 3400,
["Country_data_Cook_Islands"] = 3800,
["Country_data_Costa_Rica"] = 34000,
["Country_data_Croatia"] = 106000,
["Country_data_Cuba"] = 47000,
["Country_data_Curaçao"] = 4400,
["Country_data_Cyprus"] = 48000,
["Country_data_Czech_Republic"] = 156000,
["Country_data_Czechoslovakia"] = 35000,
["Country_data_DEN"] = 40000,
["Country_data_DEU"] = 10000,
["Country_data_DNK"] = 4400,
["Country_data_DOM"] = 8400,
["Country_data_DRC"] = 2000,
["Country_data_Delaware"] = 2700,
["Country_data_Democratic_Republic_of_the_Congo"] = 23000,
["Country_data_Denmark"] = 122000,
["Country_data_Djibouti"] = 4900,
["Country_data_Dominica"] = 4200,
["Country_data_Dominican_Republic"] = 35000,
["Country_data_ECU"] = 13000,
["Country_data_EGY"] = 15000,
["Country_data_ENG"] = 52000,
["Country_data_ESA"] = 2500,
["Country_data_ESP"] = 84000,
["Country_data_EST"] = 17000,
["Country_data_ETH"] = 4500,
["Country_data_EU"] = 2600,
["Country_data_East_Germany"] = 29000,
["Country_data_Ecuador"] = 50000,
["Country_data_Egypt"] = 67000,
["Country_data_El_Salvador"] = 23000,
["Country_data_Empire_of_Japan"] = 4400,
["Country_data_England"] = 166000,
["Country_data_Equatorial_Guinea"] = 5500,
["Country_data_Eritrea"] = 5500,
["Country_data_Estonia"] = 70000,
["Country_data_Eswatini"] = 5000,
["Country_data_Ethiopia"] = 22000,
["Country_data_Europe"] = 2700,
["Country_data_European_Union"] = 8100,
["Country_data_FIJ"] = 4500,
["Country_data_FIN"] = 40000,
["Country_data_FRA"] = 114000,
["Country_data_FRG"] = 17000,
["Country_data_FRO"] = 2200,
["Country_data_FR_Yugoslavia"] = 4400,
["Country_data_Faroe_Islands"] = 5700,
["Country_data_Federated_States_of_Micronesia"] = 2700,
["Country_data_Fiji"] = 22000,
["Country_data_Finland"] = 115000,
["Country_data_Florida"] = 5800,
["Country_data_France"] = 329000,
["Country_data_French_Polynesia"] = 3800,
["Country_data_GAB"] = 2500,
["Country_data_GAM"] = 2300,
["Country_data_GBR"] = 66000,
["Country_data_GDR"] = 11000,
["Country_data_GEO"] = 16000,
["Country_data_GER"] = 95000,
["Country_data_GHA"] = 9900,
["Country_data_GIB"] = 2100,
["Country_data_GRE"] = 29000,
["Country_data_GUA"] = 5300,
["Country_data_GUI"] = 3400,
["Country_data_GUY"] = 2500,
["Country_data_Gabon"] = 8100,
["Country_data_Gambia"] = 7600,
["Country_data_Georgia"] = 8600,
["Country_data_Georgia_(U.S._state)"] = 3200,
["Country_data_Georgia_(country)"] = 55000,
["Country_data_German_Empire"] = 5700,
["Country_data_Germany"] = 296000,
["Country_data_Ghana"] = 47000,
["Country_data_Gibraltar"] = 5100,
["Country_data_Great_Britain"] = 129000,
["Country_data_Greece"] = 107000,
["Country_data_Greenland"] = 2800,
["Country_data_Grenada"] = 5600,
["Country_data_Guadeloupe"] = 2800,
["Country_data_Guam"] = 4600,
["Country_data_Guatemala"] = 22000,
["Country_data_Guinea"] = 9300,
["Country_data_Guinea-Bissau"] = 5400,
["Country_data_Guyana"] = 7700,
["Country_data_HAI"] = 3300,
["Country_data_HKG"] = 15000,
["Country_data_HON"] = 4400,
["Country_data_HUN"] = 44000,
["Country_data_Haiti"] = 9700,
["Country_data_Hawaii"] = 2200,
["Country_data_Honduras"] = 22000,
["Country_data_Hong_Kong"] = 52000,
["Country_data_Hungary"] = 116000,
["Country_data_IDN"] = 5700,
["Country_data_INA"] = 12000,
["Country_data_IND"] = 34000,
["Country_data_IRE"] = 12000,
["Country_data_IRI"] = 6700,
["Country_data_IRL"] = 24000,
["Country_data_IRN"] = 7300,
["Country_data_IRQ"] = 4800,
["Country_data_ISL"] = 9200,
["Country_data_ISR"] = 23000,
["Country_data_ITA"] = 101000,
["Country_data_Iceland"] = 48000,
["Country_data_Idaho"] = 2200,
["Country_data_Illinois"] = 4500,
["Country_data_India"] = 264000,
["Country_data_Indiana"] = 3300,
["Country_data_Indonesia"] = 73000,
["Country_data_Iowa"] = 2400,
["Country_data_Iran"] = 165000,
["Country_data_Iraq"] = 23000,
["Country_data_Ireland"] = 68000,
["Country_data_Isle_of_Man"] = 2800,
["Country_data_Israel"] = 95000,
["Country_data_Italy"] = 292000,
["Country_data_Ivory_Coast"] = 34000,
["Country_data_JAM"] = 12000,
["Country_data_JAP"] = 2200,
["Country_data_JOR"] = 4800,
["Country_data_JP"] = 8600,
["Country_data_JPN"] = 68000,
["Country_data_Jamaica"] = 46000,
["Country_data_Japan"] = 269000,
["Country_data_Jersey"] = 2500,
["Country_data_Jordan"] = 22000,
["Country_data_KAZ"] = 24000,
["Country_data_KEN"] = 10000,
["Country_data_KGZ"] = 4500,
["Country_data_KOR"] = 35000,
["Country_data_KOS"] = 3100,
["Country_data_KSA"] = 7500,
["Country_data_KUW"] = 4600,
["Country_data_Kazakhstan"] = 69000,
["Country_data_Kentucky"] = 2000,
["Country_data_Kenya"] = 35000,
["Country_data_Kingdom_of_France"] = 2200,
["Country_data_Kingdom_of_Great_Britain"] = 4600,
["Country_data_Kingdom_of_Italy"] = 4800,
["Country_data_Kiribati"] = 2600,
["Country_data_Kosovo"] = 10000,
["Country_data_Kuwait"] = 21000,
["Country_data_Kyrgyzstan"] = 11000,
["Country_data_LAO"] = 2100,
["Country_data_LAT"] = 17000,
["Country_data_LBN"] = 2900,
["Country_data_LIB"] = 2600,
["Country_data_LIE"] = 3800,
["Country_data_LIT"] = 3700,
["Country_data_LTU"] = 14000,
["Country_data_LUX"] = 12000,
["Country_data_LVA"] = 3000,
["Country_data_Laos"] = 7900,
["Country_data_Latvia"] = 56000,
["Country_data_Lebanon"] = 24000,
["Country_data_Lesotho"] = 5400,
["Country_data_Liberia"] = 7900,
["Country_data_Libya"] = 9100,
["Country_data_Liechtenstein"] = 8900,
["Country_data_Lithuania"] = 55000,
["Country_data_Louisiana"] = 2300,
["Country_data_Luxembourg"] = 50000,
["Country_data_MAC"] = 2900,
["Country_data_MAD"] = 2400,
["Country_data_MAR"] = 15000,
["Country_data_MAS"] = 13000,
["Country_data_MDA"] = 8800,
["Country_data_MEX"] = 35000,
["Country_data_MGL"] = 3500,
["Country_data_MKD"] = 8500,
["Country_data_MLI"] = 4600,
["Country_data_MLT"] = 6400,
["Country_data_MNE"] = 8500,
["Country_data_MON"] = 4700,
["Country_data_MOZ"] = 2600,
["Country_data_MRI"] = 2200,
["Country_data_MYA"] = 3400,
["Country_data_MYS"] = 4100,
["Country_data_Macau"] = 6800,
["Country_data_Macedonia"] = 4700,
["Country_data_Madagascar"] = 9600,
["Country_data_Malawi"] = 6100,
["Country_data_Malaysia"] = 73000,
["Country_data_Maldives"] = 6700,
["Country_data_Mali"] = 22000,
["Country_data_Malta"] = 33000,
["Country_data_Manitoba"] = 2800,
["Country_data_Marshall_Islands"] = 3300,
["Country_data_Martinique"] = 2900,
["Country_data_Maryland"] = 3300,
["Country_data_Massachusetts"] = 2600,
["Country_data_Mauritania"] = 5900,
["Country_data_Mauritius"] = 8400,
["Country_data_Mexico"] = 116000,
["Country_data_Michigan"] = 3800,
["Country_data_Minas_Gerais"] = 2000,
["Country_data_Minnesota"] = 3700,
["Country_data_Missouri"] = 2500,
["Country_data_Moldova"] = 35000,
["Country_data_Monaco"] = 12000,
["Country_data_Mongolia"] = 11000,
["Country_data_Montana"] = 2400,
["Country_data_Montenegro"] = 34000,
["Country_data_Montserrat"] = 2400,
["Country_data_Morocco"] = 52000,
["Country_data_Mozambique"] = 7900,
["Country_data_Myanmar"] = 24000,
["Country_data_NAM"] = 3900,
["Country_data_NED"] = 72000,
["Country_data_NEP"] = 3300,
["Country_data_NGA"] = 8600,
["Country_data_NGR"] = 9200,
["Country_data_NIR"] = 11000,
["Country_data_NLD"] = 7400,
["Country_data_NOR"] = 35000,
["Country_data_NZ"] = 3600,
["Country_data_NZL"] = 38000,
["Country_data_Namibia"] = 10000,
["Country_data_Nauru"] = 2500,
["Country_data_Nazi_Germany"] = 10000,
["Country_data_Nepal"] = 33000,
["Country_data_Netherlands"] = 266000,
["Country_data_Netherlands_Antilles"] = 2400,
["Country_data_Nevada"] = 2100,
["Country_data_New_Brunswick"] = 2600,
["Country_data_New_Caledonia"] = 3300,
["Country_data_New_Hampshire"] = 2000,
["Country_data_New_Jersey"] = 4200,
["Country_data_New_South_Wales"] = 6400,
["Country_data_New_York"] = 4200,
["Country_data_New_York_(state)"] = 6800,
["Country_data_New_Zealand"] = 121000,
["Country_data_Newfoundland_and_Labrador"] = 2700,
["Country_data_Nicaragua"] = 8900,
["Country_data_Niger"] = 6200,
["Country_data_Nigeria"] = 67000,
["Country_data_North_Carolina"] = 3500,
["Country_data_North_Korea"] = 23000,
["Country_data_North_Macedonia"] = 34000,
["Country_data_Northern_Ireland"] = 28000,
["Country_data_Northern_Mariana_Islands"] = 2800,
["Country_data_Norway"] = 119000,
["Country_data_Nova_Scotia"] = 2500,
["Country_data_OMA"] = 3200,
["Country_data_Ohio"] = 5800,
["Country_data_Oklahoma"] = 2500,
["Country_data_Oman"] = 10000,
["Country_data_Ontario"] = 3700,
["Country_data_Ottoman_Empire"] = 3100,
["Country_data_PAK"] = 9000,
["Country_data_PAN"] = 5900,
["Country_data_PAR"] = 11000,
["Country_data_PER"] = 14000,
["Country_data_PHI"] = 13000,
["Country_data_PLE"] = 2000,
["Country_data_PNG"] = 3200,
["Country_data_POL"] = 60000,
["Country_data_POR"] = 37000,
["Country_data_PRK"] = 5000,
["Country_data_PRT"] = 3600,
["Country_data_PUR"] = 8000,
["Country_data_Pakistan"] = 52000,
["Country_data_Palau"] = 2600,
["Country_data_Palestine"] = 7600,
["Country_data_Panama"] = 31000,
["Country_data_Papua_New_Guinea"] = 8400,
["Country_data_Paraguay"] = 46000,
["Country_data_Pennsylvania"] = 3600,
["Country_data_Peru"] = 66000,
["Country_data_Philippines"] = 69000,
["Country_data_Poland"] = 247000,
["Country_data_Portugal"] = 118000,
["Country_data_Prussia"] = 2800,
["Country_data_Puerto_Rico"] = 35000,
["Country_data_QAT"] = 9400,
["Country_data_Qatar"] = 33000,
["Country_data_Quebec"] = 4100,
["Country_data_Queensland"] = 2300,
["Country_data_ROM"] = 15000,
["Country_data_ROU"] = 31000,
["Country_data_RSA"] = 36000,
["Country_data_RUS"] = 68000,
["Country_data_RWA"] = 2400,
["Country_data_Republic_of_China"] = 4600,
["Country_data_Republic_of_Ireland"] = 56000,
["Country_data_Republic_of_the_Congo"] = 8200,
["Country_data_Romania"] = 115000,
["Country_data_Russia"] = 260000,
["Country_data_Russian_Empire"] = 5600,
["Country_data_Rwanda"] = 8400,
["Country_data_SAM"] = 3700,
["Country_data_SCG"] = 3000,
["Country_data_SCO"] = 29000,
["Country_data_SEN"] = 8400,
["Country_data_SER"] = 3700,
["Country_data_SGP"] = 4400,
["Country_data_SIN"] = 7400,
["Country_data_SLE"] = 2000,
["Country_data_SLO"] = 22000,
["Country_data_SLV"] = 3200,
["Country_data_SMR"] = 3500,
["Country_data_SPA"] = 5500,
["Country_data_SRB"] = 30000,
["Country_data_SRI"] = 5200,
["Country_data_SUI"] = 50000,
["Country_data_SUR"] = 2300,
["Country_data_SVK"] = 32000,
["Country_data_SVN"] = 7300,
["Country_data_SWE"] = 65000,
["Country_data_SWI"] = 5000,
["Country_data_SYR"] = 3900,
["Country_data_Saint_Kitts_and_Nevis"] = 4900,
["Country_data_Saint_Lucia"] = 5200,
["Country_data_Saint_Vincent_and_the_Grenadines"] = 5000,
["Country_data_Samoa"] = 8000,
["Country_data_San_Marino"] = 9600,
["Country_data_Saskatchewan"] = 3700,
["Country_data_Saudi_Arabia"] = 38000,
["Country_data_Scotland"] = 103000,
["Country_data_Senegal"] = 32000,
["Country_data_Serbia"] = 106000,
["Country_data_Serbia_and_Montenegro"] = 5400,
["Country_data_Seychelles"] = 5700,
["Country_data_Sierra_Leone"] = 7500,
["Country_data_Singapore"] = 51000,
["Country_data_Slovakia"] = 97000,
["Country_data_Slovenia"] = 93000,
["Country_data_Solomon_Islands"] = 4600,
["Country_data_Somalia"] = 6300,
["Country_data_South_Africa"] = 123000,
["Country_data_South_Australia"] = 2300,
["Country_data_South_Carolina"] = 3100,
["Country_data_South_Korea"] = 118000,
["Country_data_South_Sudan"] = 4800,
["Country_data_Soviet_Union"] = 78000,
["Country_data_Spain"] = 281000,
["Country_data_Sri_Lanka"] = 36000,
["Country_data_Sudan"] = 8600,
["Country_data_Suriname"] = 6700,
["Country_data_Sweden"] = 170000,
["Country_data_Switzerland"] = 154000,
["Country_data_Syria"] = 22000,
["Country_data_São_Tomé_and_Príncipe"] = 3300,
["Country_data_TAN"] = 3400,
["Country_data_TCH"] = 12000,
["Country_data_THA"] = 25000,
["Country_data_TJK"] = 2900,
["Country_data_TKM"] = 3100,
["Country_data_TOG"] = 2100,
["Country_data_TON"] = 2000,
["Country_data_TPE"] = 18000,
["Country_data_TRI"] = 5100,
["Country_data_TTO"] = 2100,
["Country_data_TUN"] = 12000,
["Country_data_TUR"] = 33000,
["Country_data_TWN"] = 2200,
["Country_data_Taiwan"] = 28000,
["Country_data_Tajikistan"] = 9700,
["Country_data_Tanzania"] = 23000,
["Country_data_Tennessee"] = 2200,
["Country_data_Texas"] = 5700,
["Country_data_Thailand"] = 98000,
["Country_data_Timor-Leste"] = 5000,
["Country_data_Togo"] = 7500,
["Country_data_Tonga"] = 6700,
["Country_data_Trinidad_and_Tobago"] = 24000,
["Country_data_Tunisia"] = 47000,
["Country_data_Turkey"] = 144000,
["Country_data_Turkmenistan"] = 8300,
["Country_data_Turks_and_Caicos_Islands"] = 2800,
["Country_data_Tuvalu"] = 2600,
["Country_data_U.S."] = 2000,
["Country_data_U.S._Virgin_Islands"] = 4900,
["Country_data_UAE"] = 11000,
["Country_data_UGA"] = 5200,
["Country_data_UK"] = 18000,
["Country_data_UKGBI"] = 3500,
["Country_data_UKR"] = 44000,
["Country_data_URS"] = 19000,
["Country_data_URU"] = 16000,
["Country_data_US"] = 5600,
["Country_data_USA"] = 150000,
["Country_data_USSR"] = 5300,
["Country_data_UZB"] = 13000,
["Country_data_Uganda"] = 23000,
["Country_data_Ukraine"] = 120000,
["Country_data_United_Arab_Emirates"] = 39000,
["Country_data_United_Kingdom"] = 163000,
["Country_data_United_Kingdom_of_Great_Britain_and_Ireland"] = 4800,
["Country_data_United_Nations"] = 4400,
["Country_data_United_States"] = 440000,
["Country_data_United_States_of_America"] = 4500,
["Country_data_Uruguay"] = 53000,
["Country_data_Uzbekistan"] = 37000,
["Country_data_VEN"] = 18000,
["Country_data_VIE"] = 7200,
["Country_data_Vanuatu"] = 5000,
["Country_data_Vatican_City"] = 2900,
["Country_data_Venezuela"] = 67000,
["Country_data_Victoria"] = 2400,
["Country_data_Vietnam"] = 48000,
["Country_data_Virginia"] = 3100,
["Country_data_WAL"] = 19000,
["Country_data_Wales"] = 69000,
["Country_data_Washington"] = 2700,
["Country_data_Washington,_D.C."] = 2200,
["Country_data_Washington_(state)"] = 3400,
["Country_data_West_Germany"] = 54000,
["Country_data_West_Indies"] = 2800,
["Country_data_Wisconsin"] = 5600,
["Country_data_Wyoming"] = 2100,
["Country_data_YUG"] = 11000,
["Country_data_Yemen"] = 8000,
["Country_data_Yugoslavia"] = 34000,
["Country_data_ZAF"] = 5400,
["Country_data_ZAM"] = 3800,
["Country_data_ZIM"] = 9100,
["Country_data_Zambia"] = 11000,
["Country_data_Zimbabwe"] = 33000,
["Country_data_none"] = 2100,
["Country_flagbio"] = 39000,
["Country_in_the_Eurovision_Song_Contest"] = 2800,
["Country_name"] = 58000,
["Country_prefix_the"] = 176000,
["Country_showdata"] = 7000,
["Country_topics"] = 25000,
["County"] = 7000,
["County_(judet)_of_Romania"] = 3300,
["Course_assignment"] = 4200,
["Course_details"] = 8300,
["Course_instructor"] = 3100,
["Cquote"] = 37000,
["Cr"] = 4900,
["Cr-rt"] = 2400,
["Create_taxonomy/link"] = 150000,
["Creative_Commons_text_attribution_notice"] = 6300,
["Cref2"] = 2800,
["Cricinfo"] = 24000,
["Cricket_squad2_coach"] = 2300,
["Cricket_squad2_player"] = 3100,
["Cricketarchive"] = 3000,
["Croatian_Census_2021"] = 4200,
["Cross"] = 4000,
["Crossreference"] = 2800,
["Crossreference/styles.css"] = 2800,
["Cs1_config"] = 13000,
["Cslist"] = 3700,
["Cslist/styles.css"] = 3700,
["Csv"] = 75000,
["Currency"] = 5300,
["Current_events"] = 9400,
["Current_events/styles.css"] = 9400,
["Currentdate"] = 24000,
["Cvt"] = 165000,
["Cycling_Archives"] = 4300,
["Cycling_data_DAT"] = 2000,
["Cycling_data_LTD"] = 2400,
["Cycling_data_MOV_men"] = 2300,
["Cycling_data_SOQ"] = 2200,
["Cycling_data_TVL"] = 2400,
["Cycling_data_UEX"] = 2300,
["Cycling_team_link"] = 14000,
["Module:CFB_schedule"] = 29000,
["Module:CS1_identifiers"] = 506000,
["Module:CallAssert"] = 122000,
["Module:Canada_NTS"] = 2100,
["Module:Canada_NTS/data"] = 2100,
["Module:Canada_by_province_category_navigation"] = 9900,
["Module:Catalog_lookup_link"] = 61000,
["Module:Category_described_in_year"] = 6400,
["Module:Category_described_in_year/config"] = 6400,
["Module:Category_disambiguation"] = 2700,
["Module:Category_handler"] = 4970000,
["Module:Category_handler/blacklist"] = 4970000,
["Module:Category_handler/config"] = 4970000,
["Module:Category_handler/data"] = 4970000,
["Module:Category_handler/shared"] = 4970000,
["Module:Category_main_article"] = 221000,
["Module:Category_more_if_exists"] = 49000,
["Module:Category_pair"] = 7000,
["Module:Category_see_also"] = 55000,
["Module:Category_series_navigation"] = 595000,
["Module:Category_series_navigation/styles.css"] = 595000,
["Module:Celestial_object_quadrangle"] = 2100,
["Module:Chart"] = 2900,
["Module:Chart/Default_colors"] = 2900,
["Module:Check_DYK_hook"] = 125000,
["Module:Check_blp_parameter"] = 2900000,
["Module:Check_for_conflicting_parameters"] = 4740000,
["Module:Check_for_deprecated_parameters"] = 199000,
["Module:Check_for_unknown_parameters"] = 23300000,
["Module:Check_height"] = 152000,
["Module:Check_isxn"] = 16000,
["Module:Check_winner_by_scores"] = 16000,
["Module:Checkuser"] = 90000,
["Module:Chem2"] = 11000,
["Module:Chem2/styles.css"] = 11000,
["Module:Citation/CS1"] = 6510000,
["Module:Citation/CS1/COinS"] = 6510000,
["Module:Citation/CS1/Configuration"] = 6630000,
["Module:Citation/CS1/Date_validation"] = 6510000,
["Module:Citation/CS1/Identifiers"] = 6630000,
["Module:Citation/CS1/Suggestions"] = 26000,
["Module:Citation/CS1/Utilities"] = 6630000,
["Module:Citation/CS1/Whitelist"] = 6510000,
["Module:Citation/CS1/styles.css"] = 6630000,
["Module:Citation_mode"] = 49000,
["Module:Cite"] = 52000,
["Module:Cite/config"] = 69000,
["Module:Cite_IUCN"] = 70000,
["Module:Cite_Q"] = 17000,
["Module:Cite_Q/config"] = 17000,
["Module:Cite_taxon"] = 54000,
["Module:Cite_tweet"] = 48000,
["Module:Clade"] = 10000,
["Module:Class"] = 62000,
["Module:Class/definition.json"] = 62000,
["Module:Class/styles.css"] = 40000,
["Module:Class_mask"] = 457000,
["Module:Clickable_button"] = 1880000,
["Module:Collapsible_list"] = 70000,
["Module:College_color"] = 137000,
["Module:College_color/data"] = 137000,
["Module:Color_contrast"] = 569000,
["Module:Color_contrast/colors"] = 572000,
["Module:Commons_link"] = 306000,
["Module:Compact_list"] = 2000,
["Module:Complex_date"] = 47000,
["Module:Conservation_status"] = 88000,
["Module:Contentious_topics/talk_notice"] = 21000,
["Module:Convert"] = 1510000,
["Module:Convert/data"] = 1510000,
["Module:Convert/helper"] = 13000,
["Module:Convert/text"] = 1510000,
["Module:Convert/wikidata"] = 2700,
["Module:Convert/wikidata/data"] = 2700,
["Module:ConvertIB"] = 782000,
["Module:ConvertIB/data"] = 259000,
["Module:ConvertNumeric"] = 20000,
["Module:Convert_character_width"] = 2800,
["Module:Convert_character_width/data"] = 2800,
["Module:Coordinates"] = 1410000,
["Module:Coordinates/styles.css"] = 1410000,
["Module:Copied"] = 43000,
["Module:Country2nationality"] = 97000,
["Module:CountryAdjectiveDemonym"] = 115000,
["Module:CountryAdjectiveDemonym/Adjectives"] = 115000,
["Module:CountryAdjectiveDemonym/Demonyms"] = 115000,
["Module:CountryAdjectiveDemonym/The"] = 115000,
["Module:CountryData"] = 473000,
["Module:CountryData/cacheA"] = 172000,
["Module:CountryData/cacheB"] = 87000,
["Module:CountryData/cacheC"] = 62000,
["Module:CountryData/cacheD"] = 59000,
["Module:CountryData/cacheE"] = 40000,
["Module:CountryData/cacheF"] = 28000,
["Module:CountryData/cacheG"] = 29000,
["Module:CountryData/cacheH"] = 19000,
["Module:CountryData/cacheI"] = 18000,
["Module:CountryData/cacheJ"] = 11000,
["Module:CountryData/cacheK"] = 12000,
["Module:CountryData/summary"] = 473000,
["Module:Country_adjective"] = 4600,
["Module:Country_alias"] = 61000,
["Module:Country_alias/data"] = 62000,
["Module:Cslist"] = 3700,
["Module:Currency"] = 5400,
["Module:Currency/Presentation"] = 5400,
}
34557nxcf30vow7kf9e9lwq0v8mbin5
Cotabato do Sul
0
8260
73081
2026-07-07T14:14:55Z
Exec8
6243
.
73081
wikitext
text/x-wiki
[[File:{{PH wikidata|image_map}}|280px|right]]
'''{{PH wikidata|name}}''', ofisialmente '''Provínsia {{PH wikidata|name}}''', maka provínsia ida iha rejiaun {{PH wikidata|province}}, {{PH wikidata|country}}. Tuir sensus ikus liu {{wikidata|qualifier|single|P1082|P585}} nian, nia iha populasaun ema {{PH wikidata|population_total}}. Ida-ne'e iha área rai nian ho {{PH wikidata|area}} kilómetru kuadradu. Ida-ne'e dezignadu ho kódigu área telefone {{PH wikidata|area_code}}. Ninia kapitál maka {{wikidata|property|P36}}.
Ida-ne'e kompostu hosi sidade sira no munisípiu sira:
<ul>{{wikidata|properties|linked|P150|format=<li>%p</li>}}</ul>
==Referénsia sira==
{{Reflist}}
{{Cotabato do Sul}}
{{Soccsksargen}}
[[Kategoria:Provínsia sira Filipina nian]]
h3p5gaapd5zol33rhxnri8sauma3n7j
Template:Cotabato do Sul
10
8261
73082
2026-07-07T14:16:28Z
Exec8
6243
.
73082
wikitext
text/x-wiki
{{Navbox
|name = South Cotabato
|title = Provínsia {{wikidata|label|linked|Q13882}}
|state = {{{state|autocollapse}}}
|listclass = hlist
|group1 = Munisípiu
|list1 =
* {{wikidata|label|linked|Q173870}} <!-- Banga -->
* {{wikidata|label|linked|Q173898}} <!-- Lake Sebu -->
* {{wikidata|label|linked|Q173922}} <!-- Norala -->
* {{wikidata|label|linked|Q173944}} <!-- Polomolok -->
* {{wikidata|label|linked|Q173965}} <!-- Santo Niño -->
* {{wikidata|label|linked|Q173986}} <!-- Surallah -->
* {{wikidata|label|linked|Q174018}} <!-- Tampakan -->
* {{wikidata|label|linked|Q174039}} <!-- Tantangan -->
* {{wikidata|label|linked|Q174003}} <!-- T'boli -->
* {{wikidata|label|linked|Q174055}} <!-- Tupi -->
|group2 = Sidade
|list2 =
* {{wikidata|label|linked|Q594275}} <!--General Santos--
* {{wikidata|label|linked|Q542154}} <!--Koronadal -->
}}<noinclude>
{{collapsible option}}
[[Kategoria:Kaixa Navegasaun sira hosi Provínsia sira iha Filipina]]
</noinclude>
fybbt9ngwhzcdfcnjla2j86qmqdoz38
73083
73082
2026-07-07T14:16:56Z
Exec8
6243
73083
wikitext
text/x-wiki
{{Navbox
|name = Cotabato do Sul
|title = Provínsia {{wikidata|label|linked|Q13882}}
|state = {{{state|autocollapse}}}
|listclass = hlist
|group1 = Munisípiu
|list1 =
* {{wikidata|label|linked|Q173870}} <!-- Banga -->
* {{wikidata|label|linked|Q173898}} <!-- Lake Sebu -->
* {{wikidata|label|linked|Q173922}} <!-- Norala -->
* {{wikidata|label|linked|Q173944}} <!-- Polomolok -->
* {{wikidata|label|linked|Q173965}} <!-- Santo Niño -->
* {{wikidata|label|linked|Q173986}} <!-- Surallah -->
* {{wikidata|label|linked|Q174018}} <!-- Tampakan -->
* {{wikidata|label|linked|Q174039}} <!-- Tantangan -->
* {{wikidata|label|linked|Q174003}} <!-- T'boli -->
* {{wikidata|label|linked|Q174055}} <!-- Tupi -->
|group2 = Sidade
|list2 =
* {{wikidata|label|linked|Q594275}} <!--General Santos--
* {{wikidata|label|linked|Q542154}} <!--Koronadal -->
}}<noinclude>
{{collapsible option}}
[[Kategoria:Kaixa Navegasaun sira hosi Provínsia sira iha Filipina]]
</noinclude>
nb1khdxpwcrx1i54658dq0wlfbyy3ls
73086
73083
2026-07-07T14:28:59Z
Exec8
6243
.
73086
wikitext
text/x-wiki
{{Navbox
|name = Cotabato do Sul
|title = Provínsia {{wikidata|label|linked|Q13882}}
|above = '''{{wikidata|property|linked|Q13882|P36}}''' (kapitál)
|state = {{{state|autocollapse}}}
|listclass = hlist
|group1 = Munisípiu
|list1 =
* {{wikidata|label|linked|Q173870}} <!-- Banga -->
* {{wikidata|label|linked|Q173898}} <!-- Lake Sebu -->
* {{wikidata|label|linked|Q173922}} <!-- Norala -->
* {{wikidata|label|linked|Q173944}} <!-- Polomolok -->
* {{wikidata|label|linked|Q173965}} <!-- Santo Niño -->
* {{wikidata|label|linked|Q173986}} <!-- Surallah -->
* {{wikidata|label|linked|Q174018}} <!-- Tampakan -->
* {{wikidata|label|linked|Q174039}} <!-- Tantangan -->
* {{wikidata|label|linked|Q174003}} <!-- T'boli -->
* {{wikidata|label|linked|Q174055}} <!-- Tupi -->
|group2 = Sidade
|list2 =
* {{wikidata|label|linked|Q594275}} <!--General Santos--
* {{wikidata|label|linked|Q542154}} <!--Koronadal -->
}}<noinclude>
{{collapsible option}}
[[Kategoria:Kaixa Navegasaun sira hosi Provínsia sira iha Filipina]]
</noinclude>
5fu4p3nyceq582pp622phz8l7k4znil
Leyte do Sul
0
8262
73084
2026-07-07T14:19:11Z
Exec8
6243
.
73084
wikitext
text/x-wiki
[[File:{{PH wikidata|image_map}}|280px|right]]
'''{{PH wikidata|name}}''', ofisialmente '''Provínsia {{PH wikidata|name}}''', maka provínsia ida iha rejiaun {{PH wikidata|province}}, {{PH wikidata|country}}. Tuir sensus ikus liu {{wikidata|qualifier|single|P1082|P585}} nian, nia iha populasaun ema {{PH wikidata|population_total}}. Ida-ne'e iha área rai nian ho {{PH wikidata|area}} kilómetru kuadradu. Ida-ne'e dezignadu ho kódigu área telefone {{PH wikidata|area_code}}. Ninia kapitál maka {{wikidata|property|P36}}.
Ida-ne'e kompostu hosi sidade sira no munisípiu sira:
<ul>{{wikidata|properties|linked|P150|format=<li>%p</li>}}</ul>
==Referénsia sira==
{{Reflist}}
{{Leyte do Sul}}
{{Vissaias Orientais}}
[[Kategoria:Provínsia sira Filipina nian]]
lbyzbtukv7pqn5cfdf4xkolxk7bvjok
Template:Leyte do Sul
10
8263
73085
2026-07-07T14:21:03Z
Exec8
6243
.
73085
wikitext
text/x-wiki
{{Navbox
|name = Leyte do Sul
|title = Provínsia {{wikidata|label|linked|Q13884}}
|state = {{{state|autocollapse}}}
|above = '''{{wikidata|property|linked|Q13884|P36}}''' (kapitál)
|listclass = hlist
|image =
|group1 = Munisípiu
|list1 =
* {{wikidata|label|linked|Q173608}} <!-- Anahawan -->
* {{wikidata|label|linked|Q173622}} <!-- Bontoc -->
* {{wikidata|label|linked|Q173632}} <!-- Hinunangan -->
* {{wikidata|label|linked|Q173641}} <!-- Hinundayan -->
* {{wikidata|label|linked|Q173655}} <!-- Libagon -->
* {{wikidata|label|linked|Q173665}} <!-- Liloan -->
* {{wikidata|label|linked|Q173678}} <!-- Limasawa -->
* {{wikidata|label|linked|Q173688}} <!-- Macrohon -->
* {{wikidata|label|linked|Q173701}} <!-- Malitbog -->
* {{wikidata|label|linked|Q173713}} <!-- Padre Burgos -->
* {{wikidata|label|linked|Q173723}} <!-- Pintuyan -->
* {{wikidata|label|linked|Q173735}} <!-- Saint Bernard -->
* {{wikidata|label|linked|Q173745}} <!-- San Francisco -->
* {{wikidata|label|linked|Q173754}} <!-- San Juan -->
* {{wikidata|label|linked|Q173763}} <!-- San Ricardo -->
* {{wikidata|label|linked|Q173774}} <!-- Silago -->
* {{wikidata|label|linked|Q173792}} <!-- Sogod -->
* {{wikidata|label|linked|Q173811}} <!-- Tomas Oppus -->
|group2 = Sidade
|list2 =
* {{wikidata|label|linked|Q1025387}} <!--Maasin -->
}}<noinclude>
{{collapsible option}}
[[Kategoria:Kaixa Navegasaun sira hosi Provínsia sira iha Filipina]]
</noinclude>
k9wzrkjdxhr75jg3vtqk376o92vzl14
Sultan Kudarat
0
8264
73087
2026-07-07T14:32:03Z
Exec8
6243
.
73087
wikitext
text/x-wiki
[[File:{{PH wikidata|image_map}}|280px|right]]
'''{{PH wikidata|name}}''', ofisialmente '''Provínsia {{PH wikidata|name}}''', maka provínsia ida iha rejiaun {{PH wikidata|province}}, {{PH wikidata|country}}. Tuir sensus ikus liu {{wikidata|qualifier|single|P1082|P585}} nian, nia iha populasaun ema {{PH wikidata|population_total}}. Ida-ne'e iha área rai nian ho {{PH wikidata|area}} kilómetru kuadradu. Ida-ne'e dezignadu ho kódigu área telefone {{PH wikidata|area_code}}. Ninia kapitál maka {{wikidata|property|P36}}.
Ida-ne'e kompostu hosi sidade sira no munisípiu sira:
<ul>{{wikidata|properties|linked|P150|format=<li>%p</li>}}</ul>
==Referénsia sira==
{{Reflist}}
{{Sultan Kudarat}}
{{Soccsksargen}}
[[Kategoria:Provínsia sira Filipina nian]]
dhv1ew3wbskm601ow4w9yuytq4uvrce
Template:Sultan Kudarat
10
8265
73088
2026-07-07T14:34:18Z
Exec8
6243
.
73088
wikitext
text/x-wiki
{{Navbox
|name = Sultan Kudarat
|title = Provínsia {{wikidata|label|linked|Q13885}}
|state = {{{state|autocollapse}}}
|above = '''{{wikidata|property|linked|Q13885|P36}}''' (kapitál)
|listclass = hlist
|group1 = Munisípiu
|list1 =
* {{wikidata|label|linked|Q173393}} <!-- Bagumbayan -->
* {{wikidata|label|linked|Q173404}} <!-- Columbio -->
* {{wikidata|label|linked|Q173414}} <!-- Esperanza -->
* {{wikidata|label|linked|Q173428}} <!-- Isulan -->
* {{wikidata|label|linked|Q173438}} <!-- Kalamansig -->
* {{wikidata|label|linked|Q173449}} <!-- Lambayong -->
* {{wikidata|label|linked|Q173460}} <!-- Lebak -->
* {{wikidata|label|linked|Q173468}} <!-- Lutayan -->
* {{wikidata|label|linked|Q173479}} <!-- Palimbang -->
* {{wikidata|label|linked|Q137813}} <!-- President Quirino -->
* {{wikidata|label|linked|Q173556}} <!-- Senator Ninoy Aquino -->
|group2 = Sidade
|list2 =
* {{wikidata|label|linked|Q173575}} <!--Tacurong -->
}}<noinclude>
{{collapsible option}}
[[Kategoria:Kaixa Navegasaun sira hosi Provínsia sira iha Filipina]]
</noinclude>
kdn6abbiapj7edj7vzppnpnqg76ovc3
Sulu
0
8266
73089
2026-07-07T15:04:11Z
Exec8
6243
.
73089
wikitext
text/x-wiki
[[File:{{PH wikidata|image_map}}|280px|right]]
'''{{PH wikidata|name}}''', ofisialmente '''Provínsia {{PH wikidata|name}}''', maka provínsia ida iha rejiaun {{PH wikidata|province}}, {{PH wikidata|country}}. Tuir sensus ikus liu {{wikidata|qualifier|single|P1082|P585}} nian, nia iha populasaun ema {{PH wikidata|population_total}}. Ida-ne'e iha área rai nian ho {{PH wikidata|area}} kilómetru kuadradu. Ida-ne'e dezignadu ho kódigu área telefone {{PH wikidata|area_code}}. Ninia kapitál maka {{wikidata|property|P36}}.
Ida-ne'e kompostu hosi sidade sira no munisípiu sira:
<ul>{{wikidata|properties|linked|P150|format=<li>%p</li>}}</ul>
==Referénsia sira==
{{Reflist}}
{{Sulu}}
{{Península de Zamboanga}}
[[Kategoria:Provínsia sira Filipina nian]]
a7xx8awa4gjxfv48u21z6duku7bz7c4
Template:Sulu
10
8267
73090
2026-07-07T15:05:37Z
Exec8
6243
.
73090
wikitext
text/x-wiki
{{Navbox
|name = Sulu
|title = Provínsia {{wikidata|label|linked|Q13887}}
|state = {{{state|autocollapse}}}
|above = '''{{wikidata|property|linked|Q13887|P36}}''' (kapitál)
|listclass = hlist
|group1 = Munisípiu
|list1 =
* {{wikidata|label|linked|Q155970}} <!-- Banguingui -->
* {{wikidata|label|linked|Q155983}} <!-- Hadji Panglima Tahil -->
* {{wikidata|label|linked|Q156008}} <!-- Indanan -->
* {{wikidata|label|linked|Q156024}} <!-- Jolo -->
* {{wikidata|label|linked|Q156042}} <!-- Kalingalan Caluang -->
* {{wikidata|label|linked|Q156055}} <!-- Lugus -->
* {{wikidata|label|linked|Q156071}} <!-- Luuk -->
* {{wikidata|label|linked|Q156090}} <!-- Maimbung -->
* {{wikidata|label|linked|Q156126}} <!-- Omar -->
* {{wikidata|label|linked|Q156107}} <!-- Panamao (old) -->
* {{wikidata|label|linked|Q156159}} <!-- Pandami -->
* {{wikidata|label|linked|Q156180}} <!-- Panglima Estino -->
* {{wikidata|label|linked|Q156195}} <!-- Pangutaran -->
* {{wikidata|label|linked|Q156208}} <!-- Parang -->
* {{wikidata|label|linked|Q156225}} <!-- Pata -->
* {{wikidata|label|linked|Q156244}} <!-- Patikul -->
* {{wikidata|label|linked|Q156263}} <!-- Siasi -->
* {{wikidata|label|linked|Q156285}} <!-- Talipao -->
* {{wikidata|label|linked|Q156302}} <!-- Tapul -->
}}<noinclude>
{{collapsible option}}
[[Kategoria:Kaixa Navegasaun sira hosi Provínsia sira iha Filipina]]
</noinclude>
t92wzsads8c3qvqnra5ke1j0wbd90vj
Shakira
0
8268
73091
2026-07-08T14:06:37Z
~2026-38913-33
11643
Pájina foun: '[[Imajen:2023-11-16_Gala_de_los_Latin_Grammy,_03_(cropped)02.jpg|direita|miniaturadaimagem|Shakira (2023)]] '''Shakira Isabel Mebarak Ripoll''', moris iha loron 2 Fevereiru 1977 iha Barranquilla ([[Kolómbia]]), ne’e kantadora. Nia mós kanta iha lian Españoil no Inglés.<ref>https://variety.com/2021/music/news/shakira-laundry-service-album-anniversary-interview-1235111293/</ref>'
73091
wikitext
text/x-wiki
[[Imajen:2023-11-16_Gala_de_los_Latin_Grammy,_03_(cropped)02.jpg|direita|miniaturadaimagem|Shakira (2023)]]
'''Shakira Isabel Mebarak Ripoll''', moris iha loron 2 Fevereiru 1977 iha Barranquilla ([[Kolómbia]]), ne’e kantadora. Nia mós kanta iha lian Españoil no Inglés.<ref>https://variety.com/2021/music/news/shakira-laundry-service-album-anniversary-interview-1235111293/</ref>
rk26ycrld57i5u3lu8z3kgfsjlz67xk
Template:Fact
10
8270
73097
2025-01-04T20:47:46Z
en>Primefac
0
/* top */ replace template
73097
wikitext
text/x-wiki
#REDIRECT [[Template:Citation needed]]
{{rcat shell|1=
{{R from move}}
}}
gdexitweah0f7uxu6heev03friu98p9
73098
73097
2026-07-08T19:28:35Z
Robertsky
10424
1 versaun husi [[:en:Template:Fact]]
73097
wikitext
text/x-wiki
#REDIRECT [[Template:Citation needed]]
{{rcat shell|1=
{{R from move}}
}}
gdexitweah0f7uxu6heev03friu98p9
Template:Citation needed
10
8271
73099
2026-02-23T02:30:12Z
en>HouseBlaster
0
substcheck
73099
wikitext
text/x-wiki
{{<includeonly>safesubst:</includeonly>#invoke:Unsubst||date=__DATE__ |$B=
{{Fix
|name = {{{name|Citation needed}}}
|subst = <includeonly>{{subst:substcheck}}</includeonly>
|link = Wikipedia:Citation needed
|text = citation needed
|class = Template-Fact
|title = {{{reason|This claim needs references to reliable sources.}}}
|date = {{{date|}}}
|cat = [[Category:All articles with unsourced statements]]
|cat-date = Category:Articles with unsourced statements
}}{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages containing citation needed template with unsupported parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Citation needed]] with unknown parameter "_VALUE_"|ignoreblank=y| date | name | reason }}}}<noinclude>
{{Documentation}}
</noinclude>
5cjhtinitp9zonw13w8hz3hqgoelqnj
73100
73099
2026-07-08T19:28:35Z
Robertsky
10424
1 versaun husi [[:en:Template:Citation_needed]]
73099
wikitext
text/x-wiki
{{<includeonly>safesubst:</includeonly>#invoke:Unsubst||date=__DATE__ |$B=
{{Fix
|name = {{{name|Citation needed}}}
|subst = <includeonly>{{subst:substcheck}}</includeonly>
|link = Wikipedia:Citation needed
|text = citation needed
|class = Template-Fact
|title = {{{reason|This claim needs references to reliable sources.}}}
|date = {{{date|}}}
|cat = [[Category:All articles with unsourced statements]]
|cat-date = Category:Articles with unsourced statements
}}{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages containing citation needed template with unsupported parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Citation needed]] with unknown parameter "_VALUE_"|ignoreblank=y| date | name | reason }}}}<noinclude>
{{Documentation}}
</noinclude>
5cjhtinitp9zonw13w8hz3hqgoelqnj
Template:Talk other
10
8272
73101
2022-02-04T21:51:58Z
en>MSGJ
0
remove comment
73101
wikitext
text/x-wiki
{{#switch:
<!--If no or empty "demospace" parameter then detect namespace-->
{{#if:{{{demospace|}}}
| {{lc: {{{demospace}}} }} <!--Use lower case "demospace"-->
| {{#ifeq:{{NAMESPACE}}|{{TALKSPACE}}
| talk
| other
}}
}}
| talk = {{{1|}}}
| other
| #default = {{{2|}}}
}}<!--End switch--><noinclude>
{{documentation}}
</noinclude>
jp99kuih528b90wq2so1nbhkt480jzw
73102
73101
2026-07-08T19:28:35Z
Robertsky
10424
1 versaun husi [[:en:Template:Talk_other]]
73101
wikitext
text/x-wiki
{{#switch:
<!--If no or empty "demospace" parameter then detect namespace-->
{{#if:{{{demospace|}}}
| {{lc: {{{demospace}}} }} <!--Use lower case "demospace"-->
| {{#ifeq:{{NAMESPACE}}|{{TALKSPACE}}
| talk
| other
}}
}}
| talk = {{{1|}}}
| other
| #default = {{{2|}}}
}}<!--End switch--><noinclude>
{{documentation}}
</noinclude>
jp99kuih528b90wq2so1nbhkt480jzw
Template:Redirect template
10
8273
73103
2025-08-11T23:33:23Z
en>Pppery
0
Changed protection settings for "[[Template:Redirect template]]": [[WP:High-risk templates|High-risk template or module]] ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
73103
wikitext
text/x-wiki
{{#invoke:Redirect template|main}}<noinclude>
{{Documentation}}</noinclude>
1cl28dcwjsrtge5hedu653jwub1cll3
73104
73103
2026-07-08T19:28:35Z
Robertsky
10424
1 versaun husi [[:en:Template:Redirect_template]]
73103
wikitext
text/x-wiki
{{#invoke:Redirect template|main}}<noinclude>
{{Documentation}}</noinclude>
1cl28dcwjsrtge5hedu653jwub1cll3
Módulo:Redirect template
828
8274
73105
2025-08-11T23:33:36Z
en>Pppery
0
Changed protection settings for "[[Module:Redirect template]]" ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
73105
Scribunto
text/plain
require('strict')
local p = {}
-- key is beginning of arg name. value is table with namespace number and link
-- alternatively, a function taking the namespace number and returning a validity
-- can be used
local namespaceCategories = {
all = { function() return true end },
main = { 0, '[[WP:Mainspace|main]]' },
help = { 12, '[[WP:Help namespace|help]]' },
portal = { 100, '[[WP:Portal|portal]]' },
mos = { 126, '[[WP:MOS namespace|MOS]]' },
talk = { function(n) return n > 0 and n%2 == 1 end, '[[Help:Talk pages|talk]]' },
template = { 10, '[[WP:Template namespace|template]]' },
wikipedia = { 4, '[[WP:Project namespace|Wikipedia project]]' },
category = { 14, '[[WP:Categorization|category]]' },
user = { 2, '[[WP:User pages|user]]' },
draft = { 118, '[[WP:Drafts|draft]]' },
}
-- remove whitespaces from beginning and end of args
local function valueFunc(key, val)
if type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val == '' then
return nil
end
end
return val
end
local function getPrettyName(args)
for k in pairs(namespaceCategories) do
if args[k .. ' category'] then
return string.format("'''[[:Category:%s|%s]]''': ", args[k .. ' category'], args.name)
end
end
return string.format("'''%s''': ", args.name)
end
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {wrappers = 'Template:Redirect template', valueFunc = valueFunc})
local namespace = mw.title.getCurrentTitle().namespace
--- XXX: this is a HORRIBLE HACK. kill it with fire as soon as https://phabricator.wikimedia.org/T14974 is fixed
--- [[phab:T14974]] was previously known as [[bugzilla:12974]] https://bugzilla.wikimedia.org/show_bug.cgi?id=12974
local beCompatibleWithBug14974 = args.info and (args.info:find('^[:;#*]', 1) == 1 or args.info:find('{|', 1, true) == 1) and '\n' or ' '
local content = string.format('\n<div class="rcat %s">\n*%sThis is a redirect%s%s.%s%s\n</div>',
args.id and ('rcat-' .. string.gsub(args.id, ' ', '_')) or '',
args.name and getPrettyName(args) or '',
args.from and (' from ' .. args.from) or '',
args.to and (' to ' .. args.to) or '',
args.info and beCompatibleWithBug14974 or '',
args.info or ''
)
for k,v in pairs(namespaceCategories) do
if args[k .. ' category'] then
if type(v[1]) == 'function' and v[1](namespace) or v[1] == namespace then
if args.sortkey then
content = content .. string.format('[[Category:%s|%s]]', args[k .. ' category'], args.sortkey)
else
content = content .. string.format('[[Category:%s]]', args[k .. ' category'])
end
elseif args['other category'] then
if args.sortkey then
content = content .. string.format('[[Category:%s|%s]]', args['other category'], args.sortkey)
else
content = content .. string.format('[[Category:%s]]', args['other category'])
end
else
content = content .. frame:expandTemplate{title = 'Incorrect redirect template', args = {v[2]}}
end
end
end
if namespace == 0 then
local yesno = require('Module:Yesno')
if yesno(args.printworthy) == true then
return content .. '[[Category:Printworthy redirects]]'
elseif yesno(args.printworthy) == false then
return content .. '[[Category:Unprintworthy redirects]]'
end
end
return content
end
return p
7vajdchxsgtfzfo0bbnl18pwnlasddx
73106
73105
2026-07-08T19:28:35Z
Robertsky
10424
1 versaun husi [[:en:Module:Redirect_template]]
73105
Scribunto
text/plain
require('strict')
local p = {}
-- key is beginning of arg name. value is table with namespace number and link
-- alternatively, a function taking the namespace number and returning a validity
-- can be used
local namespaceCategories = {
all = { function() return true end },
main = { 0, '[[WP:Mainspace|main]]' },
help = { 12, '[[WP:Help namespace|help]]' },
portal = { 100, '[[WP:Portal|portal]]' },
mos = { 126, '[[WP:MOS namespace|MOS]]' },
talk = { function(n) return n > 0 and n%2 == 1 end, '[[Help:Talk pages|talk]]' },
template = { 10, '[[WP:Template namespace|template]]' },
wikipedia = { 4, '[[WP:Project namespace|Wikipedia project]]' },
category = { 14, '[[WP:Categorization|category]]' },
user = { 2, '[[WP:User pages|user]]' },
draft = { 118, '[[WP:Drafts|draft]]' },
}
-- remove whitespaces from beginning and end of args
local function valueFunc(key, val)
if type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val == '' then
return nil
end
end
return val
end
local function getPrettyName(args)
for k in pairs(namespaceCategories) do
if args[k .. ' category'] then
return string.format("'''[[:Category:%s|%s]]''': ", args[k .. ' category'], args.name)
end
end
return string.format("'''%s''': ", args.name)
end
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {wrappers = 'Template:Redirect template', valueFunc = valueFunc})
local namespace = mw.title.getCurrentTitle().namespace
--- XXX: this is a HORRIBLE HACK. kill it with fire as soon as https://phabricator.wikimedia.org/T14974 is fixed
--- [[phab:T14974]] was previously known as [[bugzilla:12974]] https://bugzilla.wikimedia.org/show_bug.cgi?id=12974
local beCompatibleWithBug14974 = args.info and (args.info:find('^[:;#*]', 1) == 1 or args.info:find('{|', 1, true) == 1) and '\n' or ' '
local content = string.format('\n<div class="rcat %s">\n*%sThis is a redirect%s%s.%s%s\n</div>',
args.id and ('rcat-' .. string.gsub(args.id, ' ', '_')) or '',
args.name and getPrettyName(args) or '',
args.from and (' from ' .. args.from) or '',
args.to and (' to ' .. args.to) or '',
args.info and beCompatibleWithBug14974 or '',
args.info or ''
)
for k,v in pairs(namespaceCategories) do
if args[k .. ' category'] then
if type(v[1]) == 'function' and v[1](namespace) or v[1] == namespace then
if args.sortkey then
content = content .. string.format('[[Category:%s|%s]]', args[k .. ' category'], args.sortkey)
else
content = content .. string.format('[[Category:%s]]', args[k .. ' category'])
end
elseif args['other category'] then
if args.sortkey then
content = content .. string.format('[[Category:%s|%s]]', args['other category'], args.sortkey)
else
content = content .. string.format('[[Category:%s]]', args['other category'])
end
else
content = content .. frame:expandTemplate{title = 'Incorrect redirect template', args = {v[2]}}
end
end
end
if namespace == 0 then
local yesno = require('Module:Yesno')
if yesno(args.printworthy) == true then
return content .. '[[Category:Printworthy redirects]]'
elseif yesno(args.printworthy) == false then
return content .. '[[Category:Unprintworthy redirects]]'
end
end
return content
end
return p
7vajdchxsgtfzfo0bbnl18pwnlasddx
Template:Portal
10
8275
73107
2024-11-25T21:42:43Z
en>Pppery
0
Changed protection settings for "[[Template:Portal]]": [[WP:High-risk templates|High-risk template or module]]: Up to full due to 9 million transclusions - the image modules are split by letter and can stay TPE ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
73107
wikitext
text/x-wiki
<includeonly>{{#invoke:Portal|portal}}</includeonly><noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata -->
</noinclude>
eu0a2ons0y70cfblniy3kcxuib58bvt
73108
73107
2026-07-08T19:28:35Z
Robertsky
10424
1 versaun husi [[:en:Template:Portal]]
73107
wikitext
text/x-wiki
<includeonly>{{#invoke:Portal|portal}}</includeonly><noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata -->
</noinclude>
eu0a2ons0y70cfblniy3kcxuib58bvt
Módulo:Portal
828
8276
73109
2025-05-24T18:07:03Z
en>Pppery
0
Reapply fixed version
73109
Scribunto
text/plain
--[==[ This module is a Lua implementation of the old {{Portal}} template. As of February 2019 it is used on nearly 7,900,000 articles.
-- Please take care when updating it! It outputs two functions: p.portal, which generates a list of portals, and p.image, which
-- produces the image name for an individual portal.
-- The portal image data is kept in submodules of [[Module:Portal/images]], listed below:
-- [[Module:Portal/images/a]] - for portal names beginning with "A".
-- [[Module:Portal/images/b]] - for portal names beginning with "B".
-- [[Module:Portal/images/c]] - for portal names beginning with "C".
-- [[Module:Portal/images/d]] - for portal names beginning with "D".
-- [[Module:Portal/images/e]] - for portal names beginning with "E".
-- [[Module:Portal/images/f]] - for portal names beginning with "F".
-- [[Module:Portal/images/g]] - for portal names beginning with "G".
-- [[Module:Portal/images/h]] - for portal names beginning with "H".
-- [[Module:Portal/images/i]] - for portal names beginning with "I".
-- [[Module:Portal/images/j]] - for portal names beginning with "J".
-- [[Module:Portal/images/k]] - for portal names beginning with "K".
-- [[Module:Portal/images/l]] - for portal names beginning with "L".
-- [[Module:Portal/images/m]] - for portal names beginning with "M".
-- [[Module:Portal/images/n]] - for portal names beginning with "N".
-- [[Module:Portal/images/o]] - for portal names beginning with "O".
-- [[Module:Portal/images/p]] - for portal names beginning with "P".
-- [[Module:Portal/images/q]] - for portal names beginning with "Q".
-- [[Module:Portal/images/r]] - for portal names beginning with "R".
-- [[Module:Portal/images/s]] - for portal names beginning with "S".
-- [[Module:Portal/images/t]] - for portal names beginning with "T".
-- [[Module:Portal/images/u]] - for portal names beginning with "U".
-- [[Module:Portal/images/v]] - for portal names beginning with "V".
-- [[Module:Portal/images/w]] - for portal names beginning with "W".
-- [[Module:Portal/images/x]] - for portal names beginning with "X".
-- [[Module:Portal/images/y]] - for portal names beginning with "Y".
-- [[Module:Portal/images/z]] - for portal names beginning with "Z".
-- [[Module:Portal/images/other]] - for portal names beginning with any other letters. This includes numbers,
-- letters with diacritics, and letters in non-Latin alphabets.
-- [[Module:Portal/images/aliases]] - for adding aliases for existing portal names. Use this page for variations
-- in spelling and diacritics, etc., no matter what letter the portal begins with.
--
-- The images data pages are separated by the first letter to reduce server load when images are added, changed, or removed.
-- Previously all the images were on one data page at [[Module:Portal/images]], but this had the disadvantage that all
-- 5,000,000 pages using this module needed to be refreshed every time an image was added or removed.
]==]
local p = {}
-- determine whether we're being called from a sandbox
local isSandbox = mw.getCurrentFrame():getTitle():find('sandbox', 1, true)
local sandbox = isSandbox and '/sandbox' or ''
local function sandboxVersion(s)
return isSandbox and s..'-sand' or s
end
local templatestyles = 'Module:Portal'..sandbox..'/styles.css'
local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')
-- List of non-talk namespaces which should not be tracked (Talk pages are never tracked)
local badNamespaces = {'user','template','draft','wikipedia'}
-- Check whether to do tracking in this namespace
-- Returns true unless the page is one of the banned namespaces
local function checkTracking(title)
local thisPage = title or mw.title.getCurrentTitle()
if thisPage.isTalkPage then
return false
end
local ns = thisPage.nsText:lower()
for _, v in ipairs(badNamespaces) do
if ns == v then
return false
end
end
return true
end
local function matchImagePage(s)
-- Finds the appropriate image subpage given a lower-case
-- portal name plus the first letter of that portal name.
if type(s) ~= 'string' or #s < 1 then return end
local firstLetter = mw.ustring.sub(s, 1, 1)
local imagePage
if mw.ustring.find(firstLetter, '^[a-z]') then
imagePage = 'Module:Portal/images/' .. firstLetter .. sandbox
else
imagePage = 'Module:Portal/images/other' .. sandbox
end
return mw.loadData(imagePage)[s]
end
local function getAlias(s)
-- Gets an alias from the image alias data page.
local aliasData = mw.loadData('Module:Portal/images/aliases'..sandbox)
for portal, aliases in pairs(aliasData) do
for _, alias in ipairs(aliases) do
if alias == s then
return portal
end
end
end
end
local defaultImage = 'Portal-puzzle.svg|link=|alt='
local function getImageName(s)
-- Gets the image name for a given string.
if type(s) ~= 'string' or #s < 1 then
return defaultImage
end
s = mw.ustring.lower(s)
local image = matchImagePage(s) or matchImagePage(getAlias(s)) or defaultImage
image = mw.ustring.gsub(image,'^File:','') --- strip mistaken leading File: or Image:
image = mw.ustring.gsub(image,'^Image:','')
return image
end
local function exists(title)
local success, exists = pcall(function() return title.exists end)
-- If success = false, then we're out of expensive parser function calls and can't check whether it exists
-- in that case, don't throw a Lua error
return not success or exists
end
-- Function to check argument portals for errors, generate tracking categories if needed
-- Function first checks for too few/many portals provided
-- Then checks the portal list to purge any portals that don't exist
-- Arguments:
-- portals: raw list of portals
-- args.tracking: is tracking requested? (will not track on bad titles or namespaces)
-- args.redlinks: should redlinks be displayed?
-- args.minPortals: minimum number of portal arguments
-- args.maxPortals: maximum number of portal arguments
-- Returns:
-- portals = list of portals, with redlinks purged (if args.redlinks=false)
-- trackingCat = possible tracking category
-- errorMsg = error message
function p._checkPortals(portals, args)
local trackingCat = ''
local errMsg = nil
-- Tracking is on by default.
-- It is disabled if any of the following is true
-- 1/ the parameter "tracking" is set to 'no, 'n', or 'false'
-- 2/ the current page fails the namespace or pagename tests
local trackingEnabled = args.tracking and checkTracking()
args.minPortals = args.minPortals or 1
args.maxPortals = args.maxPortals or -1
-- check for too few portals
if #portals < args.minPortals then
errMsg = 'please specify at least '..args.minPortals..' portal'..(args.minPortals > 1 and 's' or '')
trackingCat = (trackingEnabled and '[[Category:Portal templates with too few portals]]' or '')
return portals, trackingCat, errMsg
end
-- check for too many portals
if args.maxPortals >= 0 and #portals > args.maxPortals then
errMsg = 'too many portals (maximum = '..args.maxPortals..')'
trackingCat = (trackingEnabled and '[[Category:Portal templates with too many portals]]' or '')
return portals, trackingCat, errMsg
end
if not args.redlinks or trackingEnabled then
-- make new list of portals that exist
local existingPortals = {}
for _, portal in ipairs(portals) do
local portalTitle = mw.title.new(portal,"Portal")
-- if portal exists, put it into list
if portalTitle and exists(portalTitle) then
table.insert(existingPortals,portal)
-- otherwise set tracking cat
elseif trackingEnabled then
trackingCat = "[[Category:Portal templates with redlinked portals]]"
end
end
-- If redlinks is off, use portal list purged of redlinks
portals = args.redlinks and portals or existingPortals
-- if nothing left after purge, set tracking cat
if #portals == 0 and trackingEnabled then
trackingCat = trackingCat.."[[Category:Pages with empty portal template]]"
end
end
return portals, trackingCat, errMsg
end
local function portalBox(args)
return mw.html.create('ul')
:attr('role', 'navigation')
:attr('aria-label', 'Portals')
:addClass('noprint')
:addClass(args.error and '' or sandboxVersion('portalbox'))
:addClass(args.border and sandboxVersion('portalborder') or '')
:addClass(sandboxVersion(args.left and 'portalleft' or 'portalright'))
:css('margin', args.margin or nil)
:newline()
end
local function fillBox(root, contents)
for _, item in ipairs(contents) do
local entry = root:tag('li')
entry:addClass(sandboxVersion('portalbox-entry'))
local image = entry:tag('span')
image:addClass(sandboxVersion('portalbox-image'))
image:wikitext(item[1])
local link = entry:tag('span')
link:addClass(sandboxVersion('portalbox-link'))
link:wikitext(item[2])
end
return root
end
local function noviewer(portalImage)
-- Function to add noviewer class to filespec for portalImage
local portalImage, hasClass = mw.ustring.gsub(portalImage, "class%s*=[^%|]+", "%0 noviewer")
if hasClass == 0 then
portalImage = portalImage.."|class=noviewer"
end
return portalImage
end
function p._portal(portals, args)
-- This function builds the portal box used by the {{portal}} template.
-- Normalize all arguments
if args.redlinks == 'include' then args.redlinks = true end
args.addBreak = args['break']
for key, default in pairs({left=false,tracking=true,nominimum=false,
redlinks=false,addBreak=false,border=true}) do
if args[key] == nil then args[key] = default end
args[key] = yesno(args[key], default)
end
local root = portalBox(args)
local trackingCat = ''
local errMsg = nil
args.minPortals = args.nominimum and 0 or 1
args.maxPortals = -1
portals, trackingCat, errMsg = p._checkPortals(portals, args)
root:wikitext(trackingCat)
-- if error message, put it in the box and return
if errMsg then
if args.border then -- suppress error message when border=no
args.error = true -- recreate box without fancy formatting
root = portalBox(args)
root:wikitext(trackingCat)
local errTag = root:tag('strong')
errTag:addClass('error')
errTag:css('padding','0.2em')
errTag:wikitext('Error: '..errMsg)
end
return tostring(root)
end
-- if no portals (and no error), just return tracking category
if #portals == 0 then
return trackingCat
end
local contents = {}
-- Display the portals specified in the positional arguments.
local defaultUsed = nil
for _, portal in ipairs(portals) do
local portalImage = getImageName(portal)
if portalImage == defaultImage then
defaultUsed = portal
else
portalImage = noviewer(portalImage)
end
local image = string.format('[[File:%s|32x28px]]',
portalImage)
local link = string.format('[[Portal:%s|%s%sportal]]',
portal, portal, args.addBreak and '<br />' or ' ')
table.insert(contents, {image, link})
end
if defaultUsed and args.tracking and checkTracking() then
local cat = string.format('[[Category:Portal templates with default image|%s]]',
defaultUsed)
root:wikitext(cat)
end
return tostring(fillBox(root, contents))
end
function p._demo(imageList, args)
for key, default in pairs({left=false,border=true}) do
if args[key] == nil then args[key] = default end
args[key] = yesno(args[key], default)
end
local root = portalBox(args)
local contents = {}
-- Display the portals specified in the positional arguments.
for _, fn in ipairs(imageList) do
local image = string.format('[[File:%s|32x28px]]',noviewer(fn))
local link = string.format('[[:File:%s|%s]]',fn,fn)
table.insert(contents,{image,link})
end
return tostring(fillBox(root,contents))
end
function p._image(portal,keep)
-- Wrapper function to allow getImageName() to be accessed through #invoke.
-- backward compatibility: if table passed, take first element
if type(portal) == 'table' then
portal = portal[1]
end
local name = getImageName(portal)
-- If keep is yes (or equivalent), then allow all metadata (like image borders) to be returned
-- also, add "noviewer" class to metadata
local keepargs = yesno(keep)
if keepargs then
return noviewer(name)
end
-- otherwise, just keep filename, plus optional category
local args = mw.text.split(name, "|", true)
local result = {args[1]} -- the filename always comes first
local category = ''
-- parse name, looking for category arguments
for i = 2,#args do
local m = mw.ustring.match(args[i], "^%s*category%s*=")
if m then
table.insert(result, args[i])
end
end
-- reassemble arguments
return table.concat(result,"|")
end
local function getAllImageTable()
-- Returns an array containing all image subpages (minus aliases) as loaded by mw.loadData.
local images = {}
for i, subpage in ipairs{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'other'} do
local imageTable = mw.loadData('Module:Portal/images/' .. subpage .. sandbox)
for portal, image in pairs(imageTable) do
local args = mw.text.split(image,"|")
images[portal] = args[1] -- just use image filename
end
end
return images
end
function p._displayAll(portals, args)
-- This function displays all portals that have portal images. This function is for maintenance purposes and should not be used in
-- articles, for two reasons: 1) there are over 1500 portals with portal images, and 2) the module doesn't record how the portal
-- names are capitalized, so the portal links may be broken.
local lang = mw.language.getContentLanguage()
portals = portals or {}
for portal in pairs(getAllImageTable()) do
table.insert(portals,lang:ucfirst(portal))
end
table.sort(portals)
args.redlinks = args.redlinks or "yes"
return p._portal(portals, args)
end
function p._imageDupes()
-- This function searches the image subpages to find duplicate images. If duplicate images exist, it is not necessarily a bad thing,
-- as different portals might just happen to choose the same image. However, this function is helpful in identifying images that
-- should be moved to a portal alias for ease of maintenance.
local exists, dupes = {}, {}
for portal, image in pairs(getAllImageTable()) do
if not exists[image] then
exists[image] = portal
else
table.insert(dupes, string.format('The image "[[:File:%s|%s]]" is used for both portals "%s" and "%s".', image, image, exists[image], portal))
end
end
if #dupes < 1 then
return 'No duplicate images found.'
else
return 'The following duplicate images were found:\n* ' .. table.concat(dupes, '\n* ')
end
end
local function processPortalArgs(args)
-- This function processes a table of arguments and returns two tables: an array of portal names for processing by ipairs, and a table of
-- the named arguments that specify style options, etc. We need to use ipairs because we want to list all the portals in the order
-- they were passed to the template, but we also want to be able to deal with positional arguments passed explicitly, for example
-- {{portal|2=Politics}}. The behaviour of ipairs is undefined if nil values are present, so we need to make sure they are all removed.
args = type(args) == 'table' and args or {}
local portals = {}
local namedArgs = {}
for k, v in pairs(args) do
if type(k) == 'number' and type(v) == 'string' then -- Make sure we have no non-string portal names.
table.insert(portals, k)
elseif type(k) ~= 'number' then
namedArgs[k] = v
end
end
table.sort(portals)
for i, v in ipairs(portals) do
portals[i] = args[v]
end
return portals, namedArgs
end
-- Entry point for sorting portals from other named arguments
function p._processPortalArgs(args)
return processPortalArgs(args)
end
function p.image(frame)
local origArgs = getArgs(frame)
local portals, args = processPortalArgs(origArgs)
return p._image(portals[1],args.border)
end
function p.demo(frame)
local args = getArgs(frame)
local styles = frame:extensionTag{ name = 'templatestyles', args = { src = templatestyles} }
return styles..p._demo(args,args)
end
local function makeWrapper(funcName)
-- Processes external arguments and sends them to the other functions.
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
-- Also: trim whitespace and remove blank arguments
local origArgs = getArgs(frame)
-- create two tables to pass to func: an array of portal names, and a table of named arguments.
local portals, args = processPortalArgs(origArgs)
local results = ''
if funcName == '_portal' or funcName == '_displayAll' then
results = frame:extensionTag{ name = 'templatestyles', args = { src = templatestyles} }
end
return results .. p[funcName](portals, args)
end
end
for _, funcName in ipairs{'portal', 'imageDupes', 'displayAll'} do
p[funcName] = makeWrapper('_' .. funcName)
end
return p
17la7cpkbw894t9i08xfqc16pd5ncik
73110
73109
2026-07-08T19:28:35Z
Robertsky
10424
1 versaun husi [[:en:Module:Portal]]
73109
Scribunto
text/plain
--[==[ This module is a Lua implementation of the old {{Portal}} template. As of February 2019 it is used on nearly 7,900,000 articles.
-- Please take care when updating it! It outputs two functions: p.portal, which generates a list of portals, and p.image, which
-- produces the image name for an individual portal.
-- The portal image data is kept in submodules of [[Module:Portal/images]], listed below:
-- [[Module:Portal/images/a]] - for portal names beginning with "A".
-- [[Module:Portal/images/b]] - for portal names beginning with "B".
-- [[Module:Portal/images/c]] - for portal names beginning with "C".
-- [[Module:Portal/images/d]] - for portal names beginning with "D".
-- [[Module:Portal/images/e]] - for portal names beginning with "E".
-- [[Module:Portal/images/f]] - for portal names beginning with "F".
-- [[Module:Portal/images/g]] - for portal names beginning with "G".
-- [[Module:Portal/images/h]] - for portal names beginning with "H".
-- [[Module:Portal/images/i]] - for portal names beginning with "I".
-- [[Module:Portal/images/j]] - for portal names beginning with "J".
-- [[Module:Portal/images/k]] - for portal names beginning with "K".
-- [[Module:Portal/images/l]] - for portal names beginning with "L".
-- [[Module:Portal/images/m]] - for portal names beginning with "M".
-- [[Module:Portal/images/n]] - for portal names beginning with "N".
-- [[Module:Portal/images/o]] - for portal names beginning with "O".
-- [[Module:Portal/images/p]] - for portal names beginning with "P".
-- [[Module:Portal/images/q]] - for portal names beginning with "Q".
-- [[Module:Portal/images/r]] - for portal names beginning with "R".
-- [[Module:Portal/images/s]] - for portal names beginning with "S".
-- [[Module:Portal/images/t]] - for portal names beginning with "T".
-- [[Module:Portal/images/u]] - for portal names beginning with "U".
-- [[Module:Portal/images/v]] - for portal names beginning with "V".
-- [[Module:Portal/images/w]] - for portal names beginning with "W".
-- [[Module:Portal/images/x]] - for portal names beginning with "X".
-- [[Module:Portal/images/y]] - for portal names beginning with "Y".
-- [[Module:Portal/images/z]] - for portal names beginning with "Z".
-- [[Module:Portal/images/other]] - for portal names beginning with any other letters. This includes numbers,
-- letters with diacritics, and letters in non-Latin alphabets.
-- [[Module:Portal/images/aliases]] - for adding aliases for existing portal names. Use this page for variations
-- in spelling and diacritics, etc., no matter what letter the portal begins with.
--
-- The images data pages are separated by the first letter to reduce server load when images are added, changed, or removed.
-- Previously all the images were on one data page at [[Module:Portal/images]], but this had the disadvantage that all
-- 5,000,000 pages using this module needed to be refreshed every time an image was added or removed.
]==]
local p = {}
-- determine whether we're being called from a sandbox
local isSandbox = mw.getCurrentFrame():getTitle():find('sandbox', 1, true)
local sandbox = isSandbox and '/sandbox' or ''
local function sandboxVersion(s)
return isSandbox and s..'-sand' or s
end
local templatestyles = 'Module:Portal'..sandbox..'/styles.css'
local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')
-- List of non-talk namespaces which should not be tracked (Talk pages are never tracked)
local badNamespaces = {'user','template','draft','wikipedia'}
-- Check whether to do tracking in this namespace
-- Returns true unless the page is one of the banned namespaces
local function checkTracking(title)
local thisPage = title or mw.title.getCurrentTitle()
if thisPage.isTalkPage then
return false
end
local ns = thisPage.nsText:lower()
for _, v in ipairs(badNamespaces) do
if ns == v then
return false
end
end
return true
end
local function matchImagePage(s)
-- Finds the appropriate image subpage given a lower-case
-- portal name plus the first letter of that portal name.
if type(s) ~= 'string' or #s < 1 then return end
local firstLetter = mw.ustring.sub(s, 1, 1)
local imagePage
if mw.ustring.find(firstLetter, '^[a-z]') then
imagePage = 'Module:Portal/images/' .. firstLetter .. sandbox
else
imagePage = 'Module:Portal/images/other' .. sandbox
end
return mw.loadData(imagePage)[s]
end
local function getAlias(s)
-- Gets an alias from the image alias data page.
local aliasData = mw.loadData('Module:Portal/images/aliases'..sandbox)
for portal, aliases in pairs(aliasData) do
for _, alias in ipairs(aliases) do
if alias == s then
return portal
end
end
end
end
local defaultImage = 'Portal-puzzle.svg|link=|alt='
local function getImageName(s)
-- Gets the image name for a given string.
if type(s) ~= 'string' or #s < 1 then
return defaultImage
end
s = mw.ustring.lower(s)
local image = matchImagePage(s) or matchImagePage(getAlias(s)) or defaultImage
image = mw.ustring.gsub(image,'^File:','') --- strip mistaken leading File: or Image:
image = mw.ustring.gsub(image,'^Image:','')
return image
end
local function exists(title)
local success, exists = pcall(function() return title.exists end)
-- If success = false, then we're out of expensive parser function calls and can't check whether it exists
-- in that case, don't throw a Lua error
return not success or exists
end
-- Function to check argument portals for errors, generate tracking categories if needed
-- Function first checks for too few/many portals provided
-- Then checks the portal list to purge any portals that don't exist
-- Arguments:
-- portals: raw list of portals
-- args.tracking: is tracking requested? (will not track on bad titles or namespaces)
-- args.redlinks: should redlinks be displayed?
-- args.minPortals: minimum number of portal arguments
-- args.maxPortals: maximum number of portal arguments
-- Returns:
-- portals = list of portals, with redlinks purged (if args.redlinks=false)
-- trackingCat = possible tracking category
-- errorMsg = error message
function p._checkPortals(portals, args)
local trackingCat = ''
local errMsg = nil
-- Tracking is on by default.
-- It is disabled if any of the following is true
-- 1/ the parameter "tracking" is set to 'no, 'n', or 'false'
-- 2/ the current page fails the namespace or pagename tests
local trackingEnabled = args.tracking and checkTracking()
args.minPortals = args.minPortals or 1
args.maxPortals = args.maxPortals or -1
-- check for too few portals
if #portals < args.minPortals then
errMsg = 'please specify at least '..args.minPortals..' portal'..(args.minPortals > 1 and 's' or '')
trackingCat = (trackingEnabled and '[[Category:Portal templates with too few portals]]' or '')
return portals, trackingCat, errMsg
end
-- check for too many portals
if args.maxPortals >= 0 and #portals > args.maxPortals then
errMsg = 'too many portals (maximum = '..args.maxPortals..')'
trackingCat = (trackingEnabled and '[[Category:Portal templates with too many portals]]' or '')
return portals, trackingCat, errMsg
end
if not args.redlinks or trackingEnabled then
-- make new list of portals that exist
local existingPortals = {}
for _, portal in ipairs(portals) do
local portalTitle = mw.title.new(portal,"Portal")
-- if portal exists, put it into list
if portalTitle and exists(portalTitle) then
table.insert(existingPortals,portal)
-- otherwise set tracking cat
elseif trackingEnabled then
trackingCat = "[[Category:Portal templates with redlinked portals]]"
end
end
-- If redlinks is off, use portal list purged of redlinks
portals = args.redlinks and portals or existingPortals
-- if nothing left after purge, set tracking cat
if #portals == 0 and trackingEnabled then
trackingCat = trackingCat.."[[Category:Pages with empty portal template]]"
end
end
return portals, trackingCat, errMsg
end
local function portalBox(args)
return mw.html.create('ul')
:attr('role', 'navigation')
:attr('aria-label', 'Portals')
:addClass('noprint')
:addClass(args.error and '' or sandboxVersion('portalbox'))
:addClass(args.border and sandboxVersion('portalborder') or '')
:addClass(sandboxVersion(args.left and 'portalleft' or 'portalright'))
:css('margin', args.margin or nil)
:newline()
end
local function fillBox(root, contents)
for _, item in ipairs(contents) do
local entry = root:tag('li')
entry:addClass(sandboxVersion('portalbox-entry'))
local image = entry:tag('span')
image:addClass(sandboxVersion('portalbox-image'))
image:wikitext(item[1])
local link = entry:tag('span')
link:addClass(sandboxVersion('portalbox-link'))
link:wikitext(item[2])
end
return root
end
local function noviewer(portalImage)
-- Function to add noviewer class to filespec for portalImage
local portalImage, hasClass = mw.ustring.gsub(portalImage, "class%s*=[^%|]+", "%0 noviewer")
if hasClass == 0 then
portalImage = portalImage.."|class=noviewer"
end
return portalImage
end
function p._portal(portals, args)
-- This function builds the portal box used by the {{portal}} template.
-- Normalize all arguments
if args.redlinks == 'include' then args.redlinks = true end
args.addBreak = args['break']
for key, default in pairs({left=false,tracking=true,nominimum=false,
redlinks=false,addBreak=false,border=true}) do
if args[key] == nil then args[key] = default end
args[key] = yesno(args[key], default)
end
local root = portalBox(args)
local trackingCat = ''
local errMsg = nil
args.minPortals = args.nominimum and 0 or 1
args.maxPortals = -1
portals, trackingCat, errMsg = p._checkPortals(portals, args)
root:wikitext(trackingCat)
-- if error message, put it in the box and return
if errMsg then
if args.border then -- suppress error message when border=no
args.error = true -- recreate box without fancy formatting
root = portalBox(args)
root:wikitext(trackingCat)
local errTag = root:tag('strong')
errTag:addClass('error')
errTag:css('padding','0.2em')
errTag:wikitext('Error: '..errMsg)
end
return tostring(root)
end
-- if no portals (and no error), just return tracking category
if #portals == 0 then
return trackingCat
end
local contents = {}
-- Display the portals specified in the positional arguments.
local defaultUsed = nil
for _, portal in ipairs(portals) do
local portalImage = getImageName(portal)
if portalImage == defaultImage then
defaultUsed = portal
else
portalImage = noviewer(portalImage)
end
local image = string.format('[[File:%s|32x28px]]',
portalImage)
local link = string.format('[[Portal:%s|%s%sportal]]',
portal, portal, args.addBreak and '<br />' or ' ')
table.insert(contents, {image, link})
end
if defaultUsed and args.tracking and checkTracking() then
local cat = string.format('[[Category:Portal templates with default image|%s]]',
defaultUsed)
root:wikitext(cat)
end
return tostring(fillBox(root, contents))
end
function p._demo(imageList, args)
for key, default in pairs({left=false,border=true}) do
if args[key] == nil then args[key] = default end
args[key] = yesno(args[key], default)
end
local root = portalBox(args)
local contents = {}
-- Display the portals specified in the positional arguments.
for _, fn in ipairs(imageList) do
local image = string.format('[[File:%s|32x28px]]',noviewer(fn))
local link = string.format('[[:File:%s|%s]]',fn,fn)
table.insert(contents,{image,link})
end
return tostring(fillBox(root,contents))
end
function p._image(portal,keep)
-- Wrapper function to allow getImageName() to be accessed through #invoke.
-- backward compatibility: if table passed, take first element
if type(portal) == 'table' then
portal = portal[1]
end
local name = getImageName(portal)
-- If keep is yes (or equivalent), then allow all metadata (like image borders) to be returned
-- also, add "noviewer" class to metadata
local keepargs = yesno(keep)
if keepargs then
return noviewer(name)
end
-- otherwise, just keep filename, plus optional category
local args = mw.text.split(name, "|", true)
local result = {args[1]} -- the filename always comes first
local category = ''
-- parse name, looking for category arguments
for i = 2,#args do
local m = mw.ustring.match(args[i], "^%s*category%s*=")
if m then
table.insert(result, args[i])
end
end
-- reassemble arguments
return table.concat(result,"|")
end
local function getAllImageTable()
-- Returns an array containing all image subpages (minus aliases) as loaded by mw.loadData.
local images = {}
for i, subpage in ipairs{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'other'} do
local imageTable = mw.loadData('Module:Portal/images/' .. subpage .. sandbox)
for portal, image in pairs(imageTable) do
local args = mw.text.split(image,"|")
images[portal] = args[1] -- just use image filename
end
end
return images
end
function p._displayAll(portals, args)
-- This function displays all portals that have portal images. This function is for maintenance purposes and should not be used in
-- articles, for two reasons: 1) there are over 1500 portals with portal images, and 2) the module doesn't record how the portal
-- names are capitalized, so the portal links may be broken.
local lang = mw.language.getContentLanguage()
portals = portals or {}
for portal in pairs(getAllImageTable()) do
table.insert(portals,lang:ucfirst(portal))
end
table.sort(portals)
args.redlinks = args.redlinks or "yes"
return p._portal(portals, args)
end
function p._imageDupes()
-- This function searches the image subpages to find duplicate images. If duplicate images exist, it is not necessarily a bad thing,
-- as different portals might just happen to choose the same image. However, this function is helpful in identifying images that
-- should be moved to a portal alias for ease of maintenance.
local exists, dupes = {}, {}
for portal, image in pairs(getAllImageTable()) do
if not exists[image] then
exists[image] = portal
else
table.insert(dupes, string.format('The image "[[:File:%s|%s]]" is used for both portals "%s" and "%s".', image, image, exists[image], portal))
end
end
if #dupes < 1 then
return 'No duplicate images found.'
else
return 'The following duplicate images were found:\n* ' .. table.concat(dupes, '\n* ')
end
end
local function processPortalArgs(args)
-- This function processes a table of arguments and returns two tables: an array of portal names for processing by ipairs, and a table of
-- the named arguments that specify style options, etc. We need to use ipairs because we want to list all the portals in the order
-- they were passed to the template, but we also want to be able to deal with positional arguments passed explicitly, for example
-- {{portal|2=Politics}}. The behaviour of ipairs is undefined if nil values are present, so we need to make sure they are all removed.
args = type(args) == 'table' and args or {}
local portals = {}
local namedArgs = {}
for k, v in pairs(args) do
if type(k) == 'number' and type(v) == 'string' then -- Make sure we have no non-string portal names.
table.insert(portals, k)
elseif type(k) ~= 'number' then
namedArgs[k] = v
end
end
table.sort(portals)
for i, v in ipairs(portals) do
portals[i] = args[v]
end
return portals, namedArgs
end
-- Entry point for sorting portals from other named arguments
function p._processPortalArgs(args)
return processPortalArgs(args)
end
function p.image(frame)
local origArgs = getArgs(frame)
local portals, args = processPortalArgs(origArgs)
return p._image(portals[1],args.border)
end
function p.demo(frame)
local args = getArgs(frame)
local styles = frame:extensionTag{ name = 'templatestyles', args = { src = templatestyles} }
return styles..p._demo(args,args)
end
local function makeWrapper(funcName)
-- Processes external arguments and sends them to the other functions.
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
-- Also: trim whitespace and remove blank arguments
local origArgs = getArgs(frame)
-- create two tables to pass to func: an array of portal names, and a table of named arguments.
local portals, args = processPortalArgs(origArgs)
local results = ''
if funcName == '_portal' or funcName == '_displayAll' then
results = frame:extensionTag{ name = 'templatestyles', args = { src = templatestyles} }
end
return results .. p[funcName](portals, args)
end
end
for _, funcName in ipairs{'portal', 'imageDupes', 'displayAll'} do
p[funcName] = makeWrapper('_' .. funcName)
end
return p
17la7cpkbw894t9i08xfqc16pd5ncik
Módulo:Portal/styles.css
828
8277
73111
2025-01-01T17:48:08Z
en>Pppery
0
Remove clear/float per request
73111
sanitized-css
text/css
/* {{pp-template}} */
.portalbox {
padding: 0; /* Timeless adds padding */
margin: 0.5em 0;
display: table;
box-sizing: border-box;
max-width: 175px;
list-style: none;
}
.portalborder {
border: 1px solid var(--border-color-base, #a2a9b1);
padding: 0.1em;
background: var(--background-color-neutral-subtle, #f8f9fa);
}
.portalbox-entry {
display: table-row;
font-size: 85%;
line-height: 110%;
height: 1.9em; /* sets min height */
font-style: italic;
font-weight: bold;
}
.portalbox-image {
display: table-cell;
padding: 0.2em;
vertical-align: middle;
text-align: center;
}
.portalbox-link {
display: table-cell;
padding: 0.2em 0.2em 0.2em 0.3em;
vertical-align: middle;
}
@media (min-width: 720px) {
.portalleft {
margin: 0.5em 1em 0.5em 0
}
.portalright {
clear: right;
float: right;
margin: 0.5em 0 0.5em 1em
}
}
kwqvjnqjtrebuh82iwdn017nx1z3x83
73112
73111
2026-07-08T19:28:35Z
Robertsky
10424
1 versaun husi [[:en:Module:Portal/styles.css]]
73111
sanitized-css
text/css
/* {{pp-template}} */
.portalbox {
padding: 0; /* Timeless adds padding */
margin: 0.5em 0;
display: table;
box-sizing: border-box;
max-width: 175px;
list-style: none;
}
.portalborder {
border: 1px solid var(--border-color-base, #a2a9b1);
padding: 0.1em;
background: var(--background-color-neutral-subtle, #f8f9fa);
}
.portalbox-entry {
display: table-row;
font-size: 85%;
line-height: 110%;
height: 1.9em; /* sets min height */
font-style: italic;
font-weight: bold;
}
.portalbox-image {
display: table-cell;
padding: 0.2em;
vertical-align: middle;
text-align: center;
}
.portalbox-link {
display: table-cell;
padding: 0.2em 0.2em 0.2em 0.3em;
vertical-align: middle;
}
@media (min-width: 720px) {
.portalleft {
margin: 0.5em 1em 0.5em 0
}
.portalright {
clear: right;
float: right;
margin: 0.5em 0 0.5em 1em
}
}
kwqvjnqjtrebuh82iwdn017nx1z3x83
Template:Tmbox
10
8278
73117
2013-10-20T12:46:44Z
en>Mr. Stradivarius
0
switch to Lua version
73117
wikitext
text/x-wiki
{{#invoke:Message box|tmbox}}<noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
jcav8pdjkvcwg8gc4m0b4gox7yjnxku
73118
73117
2026-07-08T19:28:36Z
Robertsky
10424
1 versaun husi [[:en:Template:Tmbox]]
73117
wikitext
text/x-wiki
{{#invoke:Message box|tmbox}}<noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
jcav8pdjkvcwg8gc4m0b4gox7yjnxku
Template:Fix
10
8279
73119
2025-09-14T16:45:46Z
en>Ahecht
0
Reduce [[WP:PEIS]]
73119
wikitext
text/x-wiki
{{#switch:{{{subst|¬}}}
|¬={{#invoke:Category handler|main
|template=[[Category:Templates needing substitution checking]]
|nocat={{{nocat|<noinclude>true</noinclude>}}}
}}
|SUBST=[[Category:Pages with incorrectly substituted templates]]
}}{{#invoke:Category handler|main
|main={{Fix/category
|cat-date={{{cat-date|}}}
|cat={{{cat|}}}
|cat-date2={{{cat-date2|}}}
|cat2={{{cat2|}}}
|cat-date3={{{cat-date3|}}}
|cat3={{{cat3|}}}
|date={{{date|}}}
}}
|template={{#if:{{{name|}}}|{{#ifeq:{{{name}}}|{{ROOTPAGENAME}}||{{#if:{{{date|}}}||[[Category:Templates including undated clean-up tags]]}}}}}}
|subpage=no
}}{{#if:{{{text|}}}
|<sup class="noprint Inline-Template {{{class|}}}" style="white-space:nowrap;">[<i>{{#if:{{{pre-text|}}}
|{{{pre-text}}} 
}}[[{{{link|Wikipedia:Cleanup}}}|<span title="{{#invoke:string|replace|source={{delink|1={{{title|{{{link|Wikipedia:Cleanup}}}}}}{{#if:{{{date|}}}| ({{{date}}})}}}}|pattern=" |replace=" |plain=true}}">{{{text|}}}</span>]]{{#if:{{{post-text|}}}
| {{{post-text}}}
}}</i>]</sup>|{{{special|}}}
}}{{#invoke:Check for unknown parameters|check|unknown=[[Category:Pages using Template:Fix with unknown parameters|_VALUE_{{PAGENAME}}]]|preview=Page using [[Template:Fix]] with unknown parameter "_VALUE_"|ignoreblank=y| cat | cat-date | cat-date2 | cat-date3 | cat2 | cat3 | class | date | link | name | nocat | post-text | pre-text | special | subst | text | title }}<noinclude>
{{Documentation}}
<!-- Add cats and interwikis to the /doc subpage, not here! -->
</noinclude>
jwz6zae1wne77hdp52ah3ko3sqik945
73120
73119
2026-07-08T19:28:36Z
Robertsky
10424
1 versaun husi [[:en:Template:Fix]]
73119
wikitext
text/x-wiki
{{#switch:{{{subst|¬}}}
|¬={{#invoke:Category handler|main
|template=[[Category:Templates needing substitution checking]]
|nocat={{{nocat|<noinclude>true</noinclude>}}}
}}
|SUBST=[[Category:Pages with incorrectly substituted templates]]
}}{{#invoke:Category handler|main
|main={{Fix/category
|cat-date={{{cat-date|}}}
|cat={{{cat|}}}
|cat-date2={{{cat-date2|}}}
|cat2={{{cat2|}}}
|cat-date3={{{cat-date3|}}}
|cat3={{{cat3|}}}
|date={{{date|}}}
}}
|template={{#if:{{{name|}}}|{{#ifeq:{{{name}}}|{{ROOTPAGENAME}}||{{#if:{{{date|}}}||[[Category:Templates including undated clean-up tags]]}}}}}}
|subpage=no
}}{{#if:{{{text|}}}
|<sup class="noprint Inline-Template {{{class|}}}" style="white-space:nowrap;">[<i>{{#if:{{{pre-text|}}}
|{{{pre-text}}} 
}}[[{{{link|Wikipedia:Cleanup}}}|<span title="{{#invoke:string|replace|source={{delink|1={{{title|{{{link|Wikipedia:Cleanup}}}}}}{{#if:{{{date|}}}| ({{{date}}})}}}}|pattern=" |replace=" |plain=true}}">{{{text|}}}</span>]]{{#if:{{{post-text|}}}
| {{{post-text}}}
}}</i>]</sup>|{{{special|}}}
}}{{#invoke:Check for unknown parameters|check|unknown=[[Category:Pages using Template:Fix with unknown parameters|_VALUE_{{PAGENAME}}]]|preview=Page using [[Template:Fix]] with unknown parameter "_VALUE_"|ignoreblank=y| cat | cat-date | cat-date2 | cat-date3 | cat2 | cat3 | class | date | link | name | nocat | post-text | pre-text | special | subst | text | title }}<noinclude>
{{Documentation}}
<!-- Add cats and interwikis to the /doc subpage, not here! -->
</noinclude>
jwz6zae1wne77hdp52ah3ko3sqik945
Template:•
10
8280
73121
2010-12-31T13:24:53Z
en>Edokter
0
linebreak
73121
wikitext
text/x-wiki
• <noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
3diprp27xdy1zadctv5ihmsgdumdr4i
73122
73121
2026-07-08T19:28:36Z
Robertsky
10424
1 versaun husi [[:en:Template:•]]
73121
wikitext
text/x-wiki
• <noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
3diprp27xdy1zadctv5ihmsgdumdr4i
Template:Fix/category
10
8281
73123
2024-02-17T04:48:53Z
en>Pppery
0
Changed protection settings for "[[Template:Fix/category]]": Restore to full per parent ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
73123
wikitext
text/x-wiki
<noinclude>{{pp-template|small=yes}}</noinclude>{{{cat|[[Category:All pages needing cleanup]]}}}{{#if:{{{cat-date|}}}
|[[{{{cat-date}}} {{#if:{{{date|}}}
|from {{{date}}}
}}]]{{#if:{{{date|}}}
|{{#ifexist:{{{cat-date}}} from {{{date}}}|
|[[Category:Articles with invalid date parameter in template]]
}}
}}
}}{{#if:{{{cat2|}}}|{{{cat2}}}}}{{#if:{{{cat-date2|}}}
|[[{{{cat-date2}}} {{#if:{{{date|}}}
|from {{{date}}}
}}]]{{#if:{{{date|}}}
|{{#ifexist:{{{cat-date2}}} from {{{date}}}|
|[[Category:Articles with invalid date parameter in template]]
}}
}}
}}{{#if:{{{cat3|}}}|{{{cat3}}}}}{{#if:{{{cat-date3|}}}
|[[{{{cat-date3}}} {{#if:{{{date|}}}
|from {{{date}}}
}}]]{{#if:{{{date|}}}
|{{#ifexist:{{{cat-date3}}} from {{{date}}}|
|[[Category:Articles with invalid date parameter in template]]
}}
}}
}}
gpikm5p2yggfosi6w5maxtx5my3u9im
73124
73123
2026-07-08T19:28:36Z
Robertsky
10424
1 versaun husi [[:en:Template:Fix/category]]
73123
wikitext
text/x-wiki
<noinclude>{{pp-template|small=yes}}</noinclude>{{{cat|[[Category:All pages needing cleanup]]}}}{{#if:{{{cat-date|}}}
|[[{{{cat-date}}} {{#if:{{{date|}}}
|from {{{date}}}
}}]]{{#if:{{{date|}}}
|{{#ifexist:{{{cat-date}}} from {{{date}}}|
|[[Category:Articles with invalid date parameter in template]]
}}
}}
}}{{#if:{{{cat2|}}}|{{{cat2}}}}}{{#if:{{{cat-date2|}}}
|[[{{{cat-date2}}} {{#if:{{{date|}}}
|from {{{date}}}
}}]]{{#if:{{{date|}}}
|{{#ifexist:{{{cat-date2}}} from {{{date}}}|
|[[Category:Articles with invalid date parameter in template]]
}}
}}
}}{{#if:{{{cat3|}}}|{{{cat3}}}}}{{#if:{{{cat-date3|}}}
|[[{{{cat-date3}}} {{#if:{{{date|}}}
|from {{{date}}}
}}]]{{#if:{{{date|}}}
|{{#ifexist:{{{cat-date3}}} from {{{date}}}|
|[[Category:Articles with invalid date parameter in template]]
}}
}}
}}
gpikm5p2yggfosi6w5maxtx5my3u9im
Template:S-end
10
8282
73125
2023-11-06T02:10:48Z
en>JPxG
0
whitespace
73125
wikitext
text/x-wiki
|}<noinclude>
{{documentation}}</noinclude>
ecbqhaur9r6m8ddfnwjqztn0uqt0tjy
73126
73125
2026-07-08T19:28:36Z
Robertsky
10424
1 versaun husi [[:en:Template:S-end]]
73125
wikitext
text/x-wiki
|}<noinclude>
{{documentation}}</noinclude>
ecbqhaur9r6m8ddfnwjqztn0uqt0tjy
Template:,
10
8283
73127
2024-09-02T11:01:06Z
en>Xaosflux
0
shell
73127
wikitext
text/x-wiki
#REDIRECT [[Template:·]]
{{Redirect category shell| {{R from template shortcut}} }}
1sdqdcz2nc8ct4alxh6sgv2m2whflng
73128
73127
2026-07-08T19:28:36Z
Robertsky
10424
1 versaun husi [[:en:Template:,]]
73127
wikitext
text/x-wiki
#REDIRECT [[Template:·]]
{{Redirect category shell| {{R from template shortcut}} }}
1sdqdcz2nc8ct4alxh6sgv2m2whflng
Template:·
10
8284
73129
2023-11-06T02:10:31Z
en>JPxG
0
whitespace
73129
wikitext
text/x-wiki
<b>·</b> <noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
0w5dz70jwjamx1tkvworvek14872nxq
73130
73129
2026-07-08T19:28:36Z
Robertsky
10424
1 versaun husi [[:en:Template:·]]
73129
wikitext
text/x-wiki
<b>·</b> <noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
0w5dz70jwjamx1tkvworvek14872nxq
Módulo:Ustring
828
8285
73131
2024-02-17T04:51:51Z
en>Pppery
0
Changed protection settings for "[[Module:Ustring]]": Used by fully protected [[Template:Str rightc]] -> [[Template:New page DYM]] -> [[Template:No article text]] (-> [[WP:CASC]]) ([Edit=Require administrator access] (indefinite))
73131
Scribunto
text/plain
require('strict')
return setmetatable({}, {
__index = function(t, k)
local what = mw.ustring[k]
if type(what) ~= "function" then
return what
end
return function(frame)
local fargs = frame.args
local fargsused = { tag = true }
local args = {}
local str_i = 1
while fargs['s' .. str_i] do
fargsused['s' .. str_i] = true
args[str_i] = fargs['s' .. str_i]
str_i = str_i + 1
end
for i, v in ipairs(fargs) do
fargsused[i] = true
args[i + str_i - 1] = tonumber(v) or v:gsub("^\\", "", 1)
end
if not fargs.tag then
return (what(unpack(args))) -- Outside parens truncate to first result avoiding tail call
end
local tagargs = {}
for x, y in pairs(fargs) do
if not fargsused[x] then tagargs[x] = y end
end
return frame:extensionTag{name = fargs.tag, content = what(unpack(args)), args = tagargs}
end
end
})
q73rk2udpmef4q7lysdwfx86s1654ks
73132
73131
2026-07-08T19:28:37Z
Robertsky
10424
1 versaun husi [[:en:Module:Ustring]]
73131
Scribunto
text/plain
require('strict')
return setmetatable({}, {
__index = function(t, k)
local what = mw.ustring[k]
if type(what) ~= "function" then
return what
end
return function(frame)
local fargs = frame.args
local fargsused = { tag = true }
local args = {}
local str_i = 1
while fargs['s' .. str_i] do
fargsused['s' .. str_i] = true
args[str_i] = fargs['s' .. str_i]
str_i = str_i + 1
end
for i, v in ipairs(fargs) do
fargsused[i] = true
args[i + str_i - 1] = tonumber(v) or v:gsub("^\\", "", 1)
end
if not fargs.tag then
return (what(unpack(args))) -- Outside parens truncate to first result avoiding tail call
end
local tagargs = {}
for x, y in pairs(fargs) do
if not fargsused[x] then tagargs[x] = y end
end
return frame:extensionTag{name = fargs.tag, content = what(unpack(args)), args = tagargs}
end
end
})
q73rk2udpmef4q7lysdwfx86s1654ks
Módulo:Template parameter value
828
8286
73133
2025-10-23T15:11:46Z
en>MSGJ
0
small fix
73133
Scribunto
text/plain
local p = {}
local PrepareText = require("Module:Wikitext Parsing").PrepareText
local function getTitle(title)
local success, titleObj = pcall(mw.title.new, title)
if success then return titleObj
else return nil end
end
-- Finds all templates in the given string, including nested templates
-- Templates are returned in position order, e.g. "<a<b>>" returns {"<a<b>>", "<b>"}
local function matchAllTemplates(str)
local matchLayers = {{}}
local unfinished = {}
local position = 1
local lastClosedLayer = 1
while true do
local nextOpen = string.find(str, "{{", position, true)
local nextClose = string.find(str, "}}", position, true)
if nextOpen and (not nextClose or nextOpen < nextClose) then
unfinished[#unfinished+1] = nextOpen
if not matchLayers[#unfinished] then
matchLayers[#unfinished] = {}
end
position = nextOpen + 2
elseif nextClose then
local lenLayers = #unfinished
if lenLayers > 0 then
local matches = matchLayers[lenLayers]
matches[#matches+1] = string.sub(str, unfinished[lenLayers], nextClose + 1)
unfinished[lenLayers] = nil
-- Ensure templates are ordered by their starting position, not their ending position
if lenLayers < lastClosedLayer then
local children = matchLayers[lenLayers+1]
for i = 1, #children do
matches[#matches+1] = children[i]
children[i] = nil
end
end
lastClosedLayer = lenLayers
end
position = nextClose + 2
else
break
end
end
-- Check for any uncaught matches caused by bad input strings
for i = #matchLayers, 2, -1 do
local cur, parent = matchLayers[i], matchLayers[i-1]
for i = 1, #cur do
parent[#parent+1] = cur[i]
end
end
return matchLayers[1]
end
--Forked version of getParameters from [[Module:Transcluder]] with extra features removed
local function escapeString(str)
return string.gsub(str, '[%^%$%(%)%.%[%]%*%+%-%?%%]', '%%%0')
end
local function getParameters(template)
local parameters, parameterOrder = {}, {}
local params = string.match(template, '{{[^|}]-|(.*)}}')
if params then
local count = 0
-- Temporarily replace pipes in subtemplates and wikilinks to avoid chaos
for subtemplate in string.gmatch(params, '{%b{}}') do
params = string.gsub(params, escapeString(subtemplate), string.gsub(subtemplate, ".", {["%"]="%%", ["|"]="@@:@@", ["="]="@@_@@"}) )
end
for wikilink in string.gmatch(params, '%[%b[]%]') do
params = string.gsub(params, escapeString(wikilink), string.gsub(wikilink, ".", {["%"]="%%", ["|"]="@@:@@", ["="]="@@_@@"}) )
end
for parameter in mw.text.gsplit(params, '|') do
local parts = mw.text.split(parameter, '=')
local key = mw.text.trim(parts[1])
local value
if #parts == 1 then
value = key
count = count + 1
key = tostring(count)
else
value = mw.text.trim(table.concat(parts, '=', 2))
end
value = string.gsub(string.gsub(value, '@@:@@', '|'), '@@_@@', '=')
key = string.gsub(string.gsub(key, '@@:@@', '|'), '@@_@@', '=')
table.insert(parameterOrder, key)
parameters[key] = value
end
end
return parameters, parameterOrder
end
-- Returns a table containing parameters and a table with the order in which each of their values were found.
-- Since this considers all subtemplates, a single parameter is expected to have multiple values.
-- E.g. {{ABC|X={{DEF|X=Value|Y=Other value}}{{ABC|X=Yes}}|Y=P}}
-- Would return {X={"{{DEF|X=Value|Y=Other value}}", "Value", "Yes"}, Y={"Other value", "P"}}
local function getAllParameters(template, ignore_blank, only_subtemplates)
local parameterTree = setmetatable({}, {
__index = function(self,key)
rawset(self,key,{})
return rawget(self,key)
end
})
local params, paramOrder = getParameters(template)
for _,key in ipairs(paramOrder) do
local value = params[key]
if not ignore_blank or value ~= "" then
if not only_subtemplates then
table.insert(parameterTree[key], value) --Insert the initial value into the tree
end
for subtemplate in string.gmatch(value, "{%b{}}") do --And now check for subvalues
local subparams = getAllParameters(subtemplate, ignore_blank)
for subkey,subset in next,subparams do
for _,subvalue in ipairs(subset) do
table.insert(parameterTree[subkey], subvalue) --And add any we find to our tree
end
end
end
end
end
return parameterTree
end
--Module entry point. Returns a success boolean and either the target template or why it failed
function p.getTemplate(page, templates, options)
if not templates then --Required parameters
return false, "Missing required parameter 'templates'"
end
options = options or {}
local template_index = tonumber(options.template_index) or 1
local treat_as_regex = options.treat_as_regex or false
if type(templates) == "string" then
-- TODO: Find a good way to allow specifying multiple templates via template invocation
-- (Modules can just provide a table so no concerns there)
-- Comma splitting is a bad idea (lots of templates have a comma in their name)
templates = {templates}
end
local title = getTitle(page)
if title == nil then
return false, "Requested title doesn't exist"
end
local content = PrepareText(title:getContent() or "")
local sanitisedTemplates = {}
for i,template in pairs(templates) do
if not treat_as_regex then
template = escapeString(template)
end
local firstLetter = string.sub(template, 1, 1)
local firstUpper, firstLower = firstLetter:upper(), firstLetter:lower()
if firstUpper ~= firstLower then
template = "[" .. firstUpper .. firstLower .. "]" .. string.sub(template, 2)
end
sanitisedTemplates[i] = template
end
local foundTemplates = 0
local foundTemplate
for _,template in next,matchAllTemplates(content) do
for _,wantedTemplate in pairs(sanitisedTemplates) do
if string.match(template, "^{{%s*"..wantedTemplate.."%s*[|}]") then
foundTemplate = template
foundTemplates = foundTemplates + 1
if foundTemplates == template_index then --Found our wanted template
return true, foundTemplate
end
end
end
end
if foundTemplates > 0 and template_index == -1 then
return true, foundTemplate
end
return false, "No valid template found"
end
--Module entry point. Returns a success boolean and either the target parameter's value or why it failed
function p.getParameter(page, templates, parameter, options)
if not (templates and parameter) then --Required parameters
return false, "Missing required parameters 'templates' and 'parameter'"
end
parameter = tostring(parameter) --Force consistency
options = options or {}
local success, text = p.getTemplate(page, templates, options)
if not success then
return success, text
else
local parameter_index = tonumber(options.parameter_index) or 1
local ignore_subtemplates = options.ignore_subtemplates or false
local only_subtemplates = options.only_subtemplates or false
local ignore_blank = options.ignore_blank or false
local value
if ignore_subtemplates then
value = getParameters(text)[parameter] or ""
else
local params = getAllParameters(text, ignore_blank, only_subtemplates)
value = params[parameter][parameter_index] or ""
end
value = string.gsub(value, "</?%a*include%a*>", "")
value = mw.text.trim(value) --technically wrong in some cases but not a big issue
return true, mw.text.decode(value) --decode due to PrepareText
end
end
--Template entry point. Returns either "yes" or nothing depending on if the wanted template is found
--Will return error text if no template is provided
function p.hasTemplate(frame)
local args = require('Module:Arguments').getArgs(frame)
local yesno = require("Module:Yesno")
local page = args[1] or args.page
local template = args[2] or args.template
local template_index = tonumber(args[3] or args.N) or 1
if not template or template == "" then
return '<span class="error">No template provided for hasTemplate</span>'
end
local follow = yesno(args.follow) or false
if follow then
page = require("Module:Redirect").luaMain(page)
end
local options = {
template_index = template_index,
treat_as_regex = yesno(args.treat_as_regex) or false,
}
local success, _ = p.getTemplate(page, template, options)
return success and "yes" or ""
end
--Template entry point for getParameter. Returns an empty string upon failure
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {
wrappers = 'Template:Template parameter value'
})
local yesno = require("Module:Yesno")
local options = {
template_index = args[3] or args.template_index,
parameter_index = args[5] or args.parameter_index,
ignore_subtemplates = yesno(args.ignore_subtemplates or args.ist) or false,
only_subtemplates = yesno(args.only_subtemplates) or false,
ignore_blank = yesno(args.ignore_blank) or false,
treat_as_regex = yesno(args.treat_as_regex) or false,
}
local page = args[1] or args.page
local template = args[2] or args.template
local parameter = args[4] or args.parameter
local success, result = p.getParameter(page, template, parameter, options)
if not success then
return ""
else
if args.dontprocess then
return result
else
return frame:preprocess(result)
end
end
end
--Backwards compatability
p.getValue = p.getParameter
--Potentially useful module entry points
p.matchAllTemplates = matchAllTemplates
p.getParameters = getParameters
p.getAllParameters = getAllParameters
return p
qcu6s0a4s2aopltlyjoecozilae3mds
73134
73133
2026-07-08T19:28:37Z
Robertsky
10424
1 versaun husi [[:en:Module:Template_parameter_value]]
73133
Scribunto
text/plain
local p = {}
local PrepareText = require("Module:Wikitext Parsing").PrepareText
local function getTitle(title)
local success, titleObj = pcall(mw.title.new, title)
if success then return titleObj
else return nil end
end
-- Finds all templates in the given string, including nested templates
-- Templates are returned in position order, e.g. "<a<b>>" returns {"<a<b>>", "<b>"}
local function matchAllTemplates(str)
local matchLayers = {{}}
local unfinished = {}
local position = 1
local lastClosedLayer = 1
while true do
local nextOpen = string.find(str, "{{", position, true)
local nextClose = string.find(str, "}}", position, true)
if nextOpen and (not nextClose or nextOpen < nextClose) then
unfinished[#unfinished+1] = nextOpen
if not matchLayers[#unfinished] then
matchLayers[#unfinished] = {}
end
position = nextOpen + 2
elseif nextClose then
local lenLayers = #unfinished
if lenLayers > 0 then
local matches = matchLayers[lenLayers]
matches[#matches+1] = string.sub(str, unfinished[lenLayers], nextClose + 1)
unfinished[lenLayers] = nil
-- Ensure templates are ordered by their starting position, not their ending position
if lenLayers < lastClosedLayer then
local children = matchLayers[lenLayers+1]
for i = 1, #children do
matches[#matches+1] = children[i]
children[i] = nil
end
end
lastClosedLayer = lenLayers
end
position = nextClose + 2
else
break
end
end
-- Check for any uncaught matches caused by bad input strings
for i = #matchLayers, 2, -1 do
local cur, parent = matchLayers[i], matchLayers[i-1]
for i = 1, #cur do
parent[#parent+1] = cur[i]
end
end
return matchLayers[1]
end
--Forked version of getParameters from [[Module:Transcluder]] with extra features removed
local function escapeString(str)
return string.gsub(str, '[%^%$%(%)%.%[%]%*%+%-%?%%]', '%%%0')
end
local function getParameters(template)
local parameters, parameterOrder = {}, {}
local params = string.match(template, '{{[^|}]-|(.*)}}')
if params then
local count = 0
-- Temporarily replace pipes in subtemplates and wikilinks to avoid chaos
for subtemplate in string.gmatch(params, '{%b{}}') do
params = string.gsub(params, escapeString(subtemplate), string.gsub(subtemplate, ".", {["%"]="%%", ["|"]="@@:@@", ["="]="@@_@@"}) )
end
for wikilink in string.gmatch(params, '%[%b[]%]') do
params = string.gsub(params, escapeString(wikilink), string.gsub(wikilink, ".", {["%"]="%%", ["|"]="@@:@@", ["="]="@@_@@"}) )
end
for parameter in mw.text.gsplit(params, '|') do
local parts = mw.text.split(parameter, '=')
local key = mw.text.trim(parts[1])
local value
if #parts == 1 then
value = key
count = count + 1
key = tostring(count)
else
value = mw.text.trim(table.concat(parts, '=', 2))
end
value = string.gsub(string.gsub(value, '@@:@@', '|'), '@@_@@', '=')
key = string.gsub(string.gsub(key, '@@:@@', '|'), '@@_@@', '=')
table.insert(parameterOrder, key)
parameters[key] = value
end
end
return parameters, parameterOrder
end
-- Returns a table containing parameters and a table with the order in which each of their values were found.
-- Since this considers all subtemplates, a single parameter is expected to have multiple values.
-- E.g. {{ABC|X={{DEF|X=Value|Y=Other value}}{{ABC|X=Yes}}|Y=P}}
-- Would return {X={"{{DEF|X=Value|Y=Other value}}", "Value", "Yes"}, Y={"Other value", "P"}}
local function getAllParameters(template, ignore_blank, only_subtemplates)
local parameterTree = setmetatable({}, {
__index = function(self,key)
rawset(self,key,{})
return rawget(self,key)
end
})
local params, paramOrder = getParameters(template)
for _,key in ipairs(paramOrder) do
local value = params[key]
if not ignore_blank or value ~= "" then
if not only_subtemplates then
table.insert(parameterTree[key], value) --Insert the initial value into the tree
end
for subtemplate in string.gmatch(value, "{%b{}}") do --And now check for subvalues
local subparams = getAllParameters(subtemplate, ignore_blank)
for subkey,subset in next,subparams do
for _,subvalue in ipairs(subset) do
table.insert(parameterTree[subkey], subvalue) --And add any we find to our tree
end
end
end
end
end
return parameterTree
end
--Module entry point. Returns a success boolean and either the target template or why it failed
function p.getTemplate(page, templates, options)
if not templates then --Required parameters
return false, "Missing required parameter 'templates'"
end
options = options or {}
local template_index = tonumber(options.template_index) or 1
local treat_as_regex = options.treat_as_regex or false
if type(templates) == "string" then
-- TODO: Find a good way to allow specifying multiple templates via template invocation
-- (Modules can just provide a table so no concerns there)
-- Comma splitting is a bad idea (lots of templates have a comma in their name)
templates = {templates}
end
local title = getTitle(page)
if title == nil then
return false, "Requested title doesn't exist"
end
local content = PrepareText(title:getContent() or "")
local sanitisedTemplates = {}
for i,template in pairs(templates) do
if not treat_as_regex then
template = escapeString(template)
end
local firstLetter = string.sub(template, 1, 1)
local firstUpper, firstLower = firstLetter:upper(), firstLetter:lower()
if firstUpper ~= firstLower then
template = "[" .. firstUpper .. firstLower .. "]" .. string.sub(template, 2)
end
sanitisedTemplates[i] = template
end
local foundTemplates = 0
local foundTemplate
for _,template in next,matchAllTemplates(content) do
for _,wantedTemplate in pairs(sanitisedTemplates) do
if string.match(template, "^{{%s*"..wantedTemplate.."%s*[|}]") then
foundTemplate = template
foundTemplates = foundTemplates + 1
if foundTemplates == template_index then --Found our wanted template
return true, foundTemplate
end
end
end
end
if foundTemplates > 0 and template_index == -1 then
return true, foundTemplate
end
return false, "No valid template found"
end
--Module entry point. Returns a success boolean and either the target parameter's value or why it failed
function p.getParameter(page, templates, parameter, options)
if not (templates and parameter) then --Required parameters
return false, "Missing required parameters 'templates' and 'parameter'"
end
parameter = tostring(parameter) --Force consistency
options = options or {}
local success, text = p.getTemplate(page, templates, options)
if not success then
return success, text
else
local parameter_index = tonumber(options.parameter_index) or 1
local ignore_subtemplates = options.ignore_subtemplates or false
local only_subtemplates = options.only_subtemplates or false
local ignore_blank = options.ignore_blank or false
local value
if ignore_subtemplates then
value = getParameters(text)[parameter] or ""
else
local params = getAllParameters(text, ignore_blank, only_subtemplates)
value = params[parameter][parameter_index] or ""
end
value = string.gsub(value, "</?%a*include%a*>", "")
value = mw.text.trim(value) --technically wrong in some cases but not a big issue
return true, mw.text.decode(value) --decode due to PrepareText
end
end
--Template entry point. Returns either "yes" or nothing depending on if the wanted template is found
--Will return error text if no template is provided
function p.hasTemplate(frame)
local args = require('Module:Arguments').getArgs(frame)
local yesno = require("Module:Yesno")
local page = args[1] or args.page
local template = args[2] or args.template
local template_index = tonumber(args[3] or args.N) or 1
if not template or template == "" then
return '<span class="error">No template provided for hasTemplate</span>'
end
local follow = yesno(args.follow) or false
if follow then
page = require("Module:Redirect").luaMain(page)
end
local options = {
template_index = template_index,
treat_as_regex = yesno(args.treat_as_regex) or false,
}
local success, _ = p.getTemplate(page, template, options)
return success and "yes" or ""
end
--Template entry point for getParameter. Returns an empty string upon failure
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {
wrappers = 'Template:Template parameter value'
})
local yesno = require("Module:Yesno")
local options = {
template_index = args[3] or args.template_index,
parameter_index = args[5] or args.parameter_index,
ignore_subtemplates = yesno(args.ignore_subtemplates or args.ist) or false,
only_subtemplates = yesno(args.only_subtemplates) or false,
ignore_blank = yesno(args.ignore_blank) or false,
treat_as_regex = yesno(args.treat_as_regex) or false,
}
local page = args[1] or args.page
local template = args[2] or args.template
local parameter = args[4] or args.parameter
local success, result = p.getParameter(page, template, parameter, options)
if not success then
return ""
else
if args.dontprocess then
return result
else
return frame:preprocess(result)
end
end
end
--Backwards compatability
p.getValue = p.getParameter
--Potentially useful module entry points
p.matchAllTemplates = matchAllTemplates
p.getParameters = getParameters
p.getAllParameters = getAllParameters
return p
qcu6s0a4s2aopltlyjoecozilae3mds
Template:File other
10
8287
73135
2010-10-04T14:41:22Z
en>WOSlinker
0
remove {{pp-template}}
73135
wikitext
text/x-wiki
{{#switch:
<!--If no or empty "demospace" parameter then detect namespace-->
{{#if:{{{demospace|}}}
| {{lc: {{{demospace}}} }} <!--Use lower case "demospace"-->
| {{#ifeq:{{NAMESPACE}}|{{ns:6}}
| file
| other
}}
}}
| file
| image = {{{1|}}}
| other
| #default = {{{2|}}}
}}<!--End switch--><noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
19tqbvmuftf9lvu4r4wqwlcotcme99a
73136
73135
2026-07-08T19:28:37Z
Robertsky
10424
1 versaun husi [[:en:Template:File_other]]
73135
wikitext
text/x-wiki
{{#switch:
<!--If no or empty "demospace" parameter then detect namespace-->
{{#if:{{{demospace|}}}
| {{lc: {{{demospace}}} }} <!--Use lower case "demospace"-->
| {{#ifeq:{{NAMESPACE}}|{{ns:6}}
| file
| other
}}
}}
| file
| image = {{{1|}}}
| other
| #default = {{{2|}}}
}}<!--End switch--><noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
19tqbvmuftf9lvu4r4wqwlcotcme99a
Template:Bullet
10
8288
73137
2025-01-04T20:45:47Z
en>Primefac
0
/* top */ replace template
73137
wikitext
text/x-wiki
#REDIRECT [[Template:•]]
{{R protected}}
[[Category:Character-substitution templates]]
[[Category:Inline spacing templates]]
[[Category:Typing-aid templates]]
gj4seoroq9bjzi8xtd1uqtn5ip7e0gq
73138
73137
2026-07-08T19:28:37Z
Robertsky
10424
1 versaun husi [[:en:Template:Bullet]]
73137
wikitext
text/x-wiki
#REDIRECT [[Template:•]]
{{R protected}}
[[Category:Character-substitution templates]]
[[Category:Inline spacing templates]]
[[Category:Typing-aid templates]]
gj4seoroq9bjzi8xtd1uqtn5ip7e0gq
Template:Bull
10
8289
73139
2025-01-04T20:46:47Z
en>Primefac
0
/* top */ replace template
73139
wikitext
text/x-wiki
#REDIRECT [[Template:•]]
{{R protected}}
[[Category:Wikipedia formatting templates]]
6t3vanthdbsav9fwwn0288fqao5yo7o
73140
73139
2026-07-08T19:28:37Z
Robertsky
10424
1 versaun husi [[:en:Template:Bull]]
73139
wikitext
text/x-wiki
#REDIRECT [[Template:•]]
{{R protected}}
[[Category:Wikipedia formatting templates]]
6t3vanthdbsav9fwwn0288fqao5yo7o
Template:Check talk
10
8290
73141
2022-07-15T05:35:08Z
en>Izno
0
-double bold
73141
wikitext
text/x-wiki
{{category handler
| talk = <!--Don't show on talk pages-->
| template = <!--Don't show on templates-->
| other =
<strong class="error">''This [[Help:Template|template]] is misplaced. It belongs on the [[Help:Talk page|talk page]]:'' [[{{TALKPAGENAME}}]].</strong>[[Category:Pages with templates in the wrong namespace]]
| nocat = {{{nocat|}}} <!--So "nocat=true" works-->
| category2 = {{{category|¬}}} <!--So "category =" works-->
| page = {{{page|}}} <!--For testing-->
}}<noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
rjr3gk03wqd5edvuz4hjnhfthz8yj3l
73142
73141
2026-07-08T19:28:37Z
Robertsky
10424
1 versaun husi [[:en:Template:Check_talk]]
73141
wikitext
text/x-wiki
{{category handler
| talk = <!--Don't show on talk pages-->
| template = <!--Don't show on templates-->
| other =
<strong class="error">''This [[Help:Template|template]] is misplaced. It belongs on the [[Help:Talk page|talk page]]:'' [[{{TALKPAGENAME}}]].</strong>[[Category:Pages with templates in the wrong namespace]]
| nocat = {{{nocat|}}} <!--So "nocat=true" works-->
| category2 = {{{category|¬}}} <!--So "category =" works-->
| page = {{{page|}}} <!--For testing-->
}}<noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
rjr3gk03wqd5edvuz4hjnhfthz8yj3l
Template:Ns0
10
8291
73143
2018-02-20T15:44:55Z
en>Xaosflux
0
{{Rcat shell|{{R with history}}{{R from template shortcut}}}} requested on talk
73143
wikitext
text/x-wiki
#REDIRECT [[Template:Main other]]
{{Rcat shell|{{R with history}}{{R from template shortcut}}}}
gybu6zu4ujxrpyyuxw1bssm8mym0j8n
73144
73143
2026-07-08T19:28:37Z
Robertsky
10424
1 versaun husi [[:en:Template:Ns0]]
73143
wikitext
text/x-wiki
#REDIRECT [[Template:Main other]]
{{Rcat shell|{{R with history}}{{R from template shortcut}}}}
gybu6zu4ujxrpyyuxw1bssm8mym0j8n
Template:Image other
10
8292
73145
2019-03-05T14:22:01Z
en>Xaosflux
0
Changed protection level for "[[Template:Image other]]": Pages alread protected from [[Wikipedia:Cascade-protected items/content]] ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
73145
wikitext
text/x-wiki
#redirect [[Template:File other]]
{{R from move}}
qk12zukwyewm7iobg6lglhb6vjftt35
73146
73145
2026-07-08T19:28:37Z
Robertsky
10424
1 versaun husi [[:en:Template:Image_other]]
73145
wikitext
text/x-wiki
#redirect [[Template:File other]]
{{R from move}}
qk12zukwyewm7iobg6lglhb6vjftt35
Template:*
10
8293
73147
2008-05-09T08:57:01Z
en>MDP23
0
Protected Template:*: high useage [edit=sysop:move=sysop]
73147
wikitext
text/x-wiki
#REDIRECT [[Template:•]]
h6sqi3qr02z599weo8o6trnou2x37xl
73148
73147
2026-07-08T19:28:37Z
Robertsky
10424
1 versaun husi [[:en:Template:*]]
73147
wikitext
text/x-wiki
#REDIRECT [[Template:•]]
h6sqi3qr02z599weo8o6trnou2x37xl
Módulo:IPAddress
828
8294
73149
2023-02-14T03:16:49Z
en>Trialpears
0
Add isIpV4Range and isIpV6Range
73149
Scribunto
text/plain
local p = {}
function p._isIpV6(s)
local dcolon, groups
if type(s) ~= "string"
or s:len() == 0
or s:find("[^:%x]") -- only colon and hex digits are legal chars
or s:find("^:[^:]") -- can begin or end with :: but not with single :
or s:find("[^:]:$")
or s:find(":::")
then
return false
end
s, dcolon = s:gsub("::", ":")
if dcolon > 1 then return false end -- at most one ::
s = s:gsub("^:?", ":") -- prepend : if needed, upper
s, groups = s:gsub(":%x%x?%x?%x?", "") -- remove valid groups, and count them
return ( (dcolon == 1 and groups < 8) or (dcolon == 0 and groups == 8) )
and ( s:len() == 0 or (dcolon == 1 and s == ":") ) -- might be one dangling : if original ended with ::
end
function p._isIpV4(s)
local function legal(n) return (tonumber(n) or 256) < 256 and not n:match("^0%d") end
if type(s) ~= "string" then return false end
local p1, p2, p3, p4 = s:match("^(%d+)%.(%d+)%.(%d+)%.(%d+)$")
return legal(p1) and legal(p2) and legal(p3) and legal(p4)
end
function p._isIp(s)
return p._isIpV4(s) and "4" or p._isIpV6(s) and "6"
end
function p._isIpV4Range(s)
return p._isIpV4(s:gsub("/%d+$", "")) and (p._isIpOrRange(s) == 'range')
end
function p._isIpV6Range(s)
return p._isIpV6(s:gsub("/%d+$", "")) and (p._isIpOrRange(s) == 'range')
end
function p._isIpOrRange(s)
local modip = require('Module:IP')
local success, ip = pcall(modip.IPAddress.new, s)
if success then
return 'ip'
end
success, ip = pcall(modip.Subnet.new, s)
if success then
return 'range'
end
return ''
end
local function input(frame)
-- Return input parameter after replacing any of following directional markers.
-- LRM : LEFT-TO-RIGHT MARK (U+200E) : hex e2 80 8e = 226 128 142
-- LRE : LEFT-TO-RIGHT EMBEDDING (U+202A) : hex e2 80 aa = 226 128 170
-- PDF : POP DIRECTIONAL FORMATTING (U+202C) : hex e2 80 ac = 226 128 172
-- This is required for MediaWiki:Blockedtext message.
return (frame.args[1] or ''):gsub('\226\128[\142\170\172]', ' ') -- replace LRM, LRE, PDF with space delimiter
end
function p.isIpV6(frame) return p._isIpV6(input(frame)) and "1" or "0" end
function p.isIpV4(frame) return p._isIpV4(input(frame)) and "1" or "0" end
function p.isIpV6Range(frame) return p._isIpV6Range(input(frame)) and "1" or "0" end
function p.isIpV4Range(frame) return p._isIpV4Range(input(frame)) and "1" or "0" end
function p.isIp(frame) return p._isIp(input(frame)) or "" end
function p.isIpOrRange(frame)
-- {{#invoke:IPAddress|isIpOrRange|x}} → 'ip' (IPv4/IPv6) or 'range' (CIDR IPv4/IPv6) or '' (invalid)
return p._isIpOrRange(input(frame))
end
return p
ntj9gllchcgi5w6zano5pptox6m73mb
73150
73149
2026-07-08T19:28:37Z
Robertsky
10424
1 versaun husi [[:en:Module:IPAddress]]
73149
Scribunto
text/plain
local p = {}
function p._isIpV6(s)
local dcolon, groups
if type(s) ~= "string"
or s:len() == 0
or s:find("[^:%x]") -- only colon and hex digits are legal chars
or s:find("^:[^:]") -- can begin or end with :: but not with single :
or s:find("[^:]:$")
or s:find(":::")
then
return false
end
s, dcolon = s:gsub("::", ":")
if dcolon > 1 then return false end -- at most one ::
s = s:gsub("^:?", ":") -- prepend : if needed, upper
s, groups = s:gsub(":%x%x?%x?%x?", "") -- remove valid groups, and count them
return ( (dcolon == 1 and groups < 8) or (dcolon == 0 and groups == 8) )
and ( s:len() == 0 or (dcolon == 1 and s == ":") ) -- might be one dangling : if original ended with ::
end
function p._isIpV4(s)
local function legal(n) return (tonumber(n) or 256) < 256 and not n:match("^0%d") end
if type(s) ~= "string" then return false end
local p1, p2, p3, p4 = s:match("^(%d+)%.(%d+)%.(%d+)%.(%d+)$")
return legal(p1) and legal(p2) and legal(p3) and legal(p4)
end
function p._isIp(s)
return p._isIpV4(s) and "4" or p._isIpV6(s) and "6"
end
function p._isIpV4Range(s)
return p._isIpV4(s:gsub("/%d+$", "")) and (p._isIpOrRange(s) == 'range')
end
function p._isIpV6Range(s)
return p._isIpV6(s:gsub("/%d+$", "")) and (p._isIpOrRange(s) == 'range')
end
function p._isIpOrRange(s)
local modip = require('Module:IP')
local success, ip = pcall(modip.IPAddress.new, s)
if success then
return 'ip'
end
success, ip = pcall(modip.Subnet.new, s)
if success then
return 'range'
end
return ''
end
local function input(frame)
-- Return input parameter after replacing any of following directional markers.
-- LRM : LEFT-TO-RIGHT MARK (U+200E) : hex e2 80 8e = 226 128 142
-- LRE : LEFT-TO-RIGHT EMBEDDING (U+202A) : hex e2 80 aa = 226 128 170
-- PDF : POP DIRECTIONAL FORMATTING (U+202C) : hex e2 80 ac = 226 128 172
-- This is required for MediaWiki:Blockedtext message.
return (frame.args[1] or ''):gsub('\226\128[\142\170\172]', ' ') -- replace LRM, LRE, PDF with space delimiter
end
function p.isIpV6(frame) return p._isIpV6(input(frame)) and "1" or "0" end
function p.isIpV4(frame) return p._isIpV4(input(frame)) and "1" or "0" end
function p.isIpV6Range(frame) return p._isIpV6Range(input(frame)) and "1" or "0" end
function p.isIpV4Range(frame) return p._isIpV4Range(input(frame)) and "1" or "0" end
function p.isIp(frame) return p._isIp(input(frame)) or "" end
function p.isIpOrRange(frame)
-- {{#invoke:IPAddress|isIpOrRange|x}} → 'ip' (IPv4/IPv6) or 'range' (CIDR IPv4/IPv6) or '' (invalid)
return p._isIpOrRange(input(frame))
end
return p
ntj9gllchcgi5w6zano5pptox6m73mb
Template:(
10
8295
73151
2015-11-13T02:17:23Z
en>Fuhghettaboutit
0
Changed protection level of Template:(: when I changed this to add template editors, I didn't realize it had cascding protection—so all my change did was make it appear as if it could be edited by them ([Edit=Allow only administrators] (indefinite) [...
73151
wikitext
text/x-wiki
{<noinclude>
{{documentation}}
</noinclude>
bo68003d0rx5gzaxu8kxrb3a6qyoyjo
73152
73151
2026-07-08T19:28:37Z
Robertsky
10424
1 versaun husi [[:en:Template:(]]
73151
wikitext
text/x-wiki
{<noinclude>
{{documentation}}
</noinclude>
bo68003d0rx5gzaxu8kxrb3a6qyoyjo
Template:)
10
8296
73153
2015-11-13T02:17:23Z
en>Fuhghettaboutit
0
Changed protection level of Template:): when I changed this to add template editors, I didn't realize it had cascding protection—so all my change did was make it appear as if it could be edited by them ([Edit=Allow only administrators] (indefinite) [...
73153
wikitext
text/x-wiki
}<noinclude>
{{documentation}}
</noinclude>
trjzkxjnoc4j3s8syx7lt7qs0fnlhua
73154
73153
2026-07-08T19:28:37Z
Robertsky
10424
1 versaun husi [[:en:Template:)]]
73153
wikitext
text/x-wiki
}<noinclude>
{{documentation}}
</noinclude>
trjzkxjnoc4j3s8syx7lt7qs0fnlhua
Template:T1
10
8297
73155
2022-01-01T05:36:39Z
en>Xaosflux
0
{{Rcat shell|{{R from template shortcut}}}}
73155
wikitext
text/x-wiki
#REDIRECT [[Template:Template link]]
{{Rcat shell|{{R from template shortcut}}}}
agft1wgq288u2uoq25oey2z7oz8m2sa
73156
73155
2026-07-08T19:28:37Z
Robertsky
10424
1 versaun husi [[:en:Template:T1]]
73155
wikitext
text/x-wiki
#REDIRECT [[Template:Template link]]
{{Rcat shell|{{R from template shortcut}}}}
agft1wgq288u2uoq25oey2z7oz8m2sa
Template:Cmbox
10
8298
73157
2015-10-03T16:01:17Z
en>NeilN
0
Changed protection level of Template:Cmbox: per request at [[WP:RFPP]] ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))
73157
wikitext
text/x-wiki
{{#invoke:Message box|cmbox}}<noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
2wg1g94nws2nefrz0o1pxm105lovzoz
73158
73157
2026-07-08T19:28:37Z
Robertsky
10424
1 versaun husi [[:en:Template:Cmbox]]
73157
wikitext
text/x-wiki
{{#invoke:Message box|cmbox}}<noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
2wg1g94nws2nefrz0o1pxm105lovzoz
Template:Template
10
8299
73159
2023-02-08T16:11:22Z
en>Xaosflux
0
Reverted edits by [[Special:Contribs/Xaosflux|Xaosflux]] ([[User talk:Xaosflux|talk]]) to last version by Redrose64
73159
wikitext
text/x-wiki
#REDIRECT [[Template:Template link]]
te1inh9ax8xh2nrs3tami8k408z67tj
73160
73159
2026-07-08T19:28:38Z
Robertsky
10424
1 versaun husi [[:en:Template:Template]]
73159
wikitext
text/x-wiki
#REDIRECT [[Template:Template link]]
te1inh9ax8xh2nrs3tami8k408z67tj
Template:Fmbox
10
8300
73161
2025-01-09T04:15:30Z
en>Alison
0
Undid revision [[Special:Diff/1268309819|1268309819]] by [[Special:Contributions/Alison|Alison]] ([[User talk:Alison|talk]]) - oops! Wrong wiki :o
73161
wikitext
text/x-wiki
{{#invoke:Message box|fmbox|plainlinks={{{plainlinks|yes}}}}}<noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
oieddw57hf0pjq1rxypu544i15g9gwn
73162
73161
2026-07-08T19:28:38Z
Robertsky
10424
1 versaun husi [[:en:Template:Fmbox]]
73161
wikitext
text/x-wiki
{{#invoke:Message box|fmbox|plainlinks={{{plainlinks|yes}}}}}<noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
oieddw57hf0pjq1rxypu544i15g9gwn
Template:End box
10
8301
73163
2010-05-21T16:06:44Z
en>PeterSymonds
0
per request, duplicates
73163
wikitext
text/x-wiki
#REDIRECT [[Template:S-end]]
6zgr70p74rgvq3lhhh6a5dbtr7n08rs
73164
73163
2026-07-08T19:28:38Z
Robertsky
10424
1 versaun husi [[:en:Template:End_box]]
73163
wikitext
text/x-wiki
#REDIRECT [[Template:S-end]]
6zgr70p74rgvq3lhhh6a5dbtr7n08rs
Módulo:IP
828
8302
73165
2022-10-22T09:07:04Z
en>WOSlinker
0
use require('strict') instead of require('Module:No globals')
73165
Scribunto
text/plain
-- IP library
-- This library contains classes for working with IP addresses and IP ranges.
-- Load modules
require('strict')
local bit32 = require('bit32')
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local checkTypeMulti = libraryUtil.checkTypeMulti
local makeCheckSelfFunction = libraryUtil.makeCheckSelfFunction
-- Constants
local V4 = 'IPv4'
local V6 = 'IPv6'
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function makeValidationFunction(className, isObjectFunc)
-- Make a function for validating a specific object.
return function (methodName, argIdx, arg)
if not isObjectFunc(arg) then
error(string.format(
"bad argument #%d to '%s' (not a valid %s object)",
argIdx, methodName, className
), 3)
end
end
end
--------------------------------------------------------------------------------
-- Collection class
-- This is a table used to hold items.
--------------------------------------------------------------------------------
local Collection = {}
Collection.__index = Collection
function Collection:add(item)
if item ~= nil then
self.n = self.n + 1
self[self.n] = item
end
end
function Collection:join(sep)
return table.concat(self, sep)
end
function Collection:remove(pos)
if self.n > 0 and (pos == nil or (0 < pos and pos <= self.n)) then
self.n = self.n - 1
return table.remove(self, pos)
end
end
function Collection:sort(comp)
table.sort(self, comp)
end
function Collection:deobjectify()
-- Turns the collection into a plain array without any special properties
-- or methods.
self.n = nil
setmetatable(self, nil)
end
function Collection.new()
return setmetatable({n = 0}, Collection)
end
--------------------------------------------------------------------------------
-- RawIP class
-- Numeric representation of an IPv4 or IPv6 address. Used internally.
-- A RawIP object is constructed by adding data to a Collection object and
-- then giving it a new metatable. This is to avoid the memory overhead of
-- copying the data to a new table.
--------------------------------------------------------------------------------
local RawIP = {}
RawIP.__index = RawIP
-- Constructors
function RawIP.newFromIPv4(ipStr)
-- Return a RawIP object if ipStr is a valid IPv4 string. Otherwise,
-- return nil.
-- This representation is for compatibility with IPv6 addresses.
local octets = Collection.new()
local s = ipStr:match('^%s*(.-)%s*$') .. '.'
for item in s:gmatch('(.-)%.') do
octets:add(item)
end
if octets.n == 4 then
for i, s in ipairs(octets) do
if s:match('^%d+$') then
local num = tonumber(s)
if 0 <= num and num <= 255 then
if num > 0 and s:match('^0') then
-- A redundant leading zero is for an IP in octal.
return nil
end
octets[i] = num
else
return nil
end
else
return nil
end
end
local parts = Collection.new()
for i = 1, 3, 2 do
parts:add(octets[i] * 256 + octets[i+1])
end
return setmetatable(parts, RawIP)
end
return nil
end
function RawIP.newFromIPv6(ipStr)
-- Return a RawIP object if ipStr is a valid IPv6 string. Otherwise,
-- return nil.
ipStr = ipStr:match('^%s*(.-)%s*$')
local _, n = ipStr:gsub(':', ':')
if n < 7 then
ipStr = ipStr:gsub('::', string.rep(':', 9 - n))
end
local parts = Collection.new()
for item in (ipStr .. ':'):gmatch('(.-):') do
parts:add(item)
end
if parts.n == 8 then
for i, s in ipairs(parts) do
if s == '' then
parts[i] = 0
else
if s:match('^%x+$') then
local num = tonumber(s, 16)
if num and 0 <= num and num <= 65535 then
parts[i] = num
else
return nil
end
else
return nil
end
end
end
return setmetatable(parts, RawIP)
end
return nil
end
function RawIP.newFromIP(ipStr)
-- Return a new RawIP object from either an IPv4 string or an IPv6
-- string. If ipStr is not a valid IPv4 or IPv6 string, then return
-- nil.
return RawIP.newFromIPv4(ipStr) or RawIP.newFromIPv6(ipStr)
end
-- Methods
function RawIP:getVersion()
-- Return a string with the version of the IP protocol we are using.
return self.n == 2 and V4 or V6
end
function RawIP:isIPv4()
-- Return true if this is an IPv4 representation, and false otherwise.
return self.n == 2
end
function RawIP:isIPv6()
-- Return true if this is an IPv6 representation, and false otherwise.
return self.n == 8
end
function RawIP:getBitLength()
-- Return the bit length of the IP address.
return self.n * 16
end
function RawIP:getAdjacent(previous)
-- Return a RawIP object for an adjacent IP address. If previous is true
-- then the previous IP is returned; otherwise the next IP is returned.
-- Will wraparound:
-- next 255.255.255.255 → 0.0.0.0
-- ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff → ::
-- previous 0.0.0.0 → 255.255.255.255
-- :: → ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
local result = Collection.new()
result.n = self.n
local carry = previous and 0xffff or 1
for i = self.n, 1, -1 do
local sum = self[i] + carry
if sum >= 0x10000 then
carry = previous and 0x10000 or 1
sum = sum - 0x10000
else
carry = previous and 0xffff or 0
end
result[i] = sum
end
return setmetatable(result, RawIP)
end
function RawIP:getPrefix(bitLength)
-- Return a RawIP object for the prefix of the current IP Address with a
-- bit length of bitLength.
local result = Collection.new()
result.n = self.n
for i = 1, self.n do
if bitLength > 0 then
if bitLength >= 16 then
result[i] = self[i]
bitLength = bitLength - 16
else
result[i] = bit32.replace(self[i], 0, 0, 16 - bitLength)
bitLength = 0
end
else
result[i] = 0
end
end
return setmetatable(result, RawIP)
end
function RawIP:getHighestHost(bitLength)
-- Return a RawIP object for the highest IP with the prefix of length
-- bitLength. In other words, the network (the most-significant bits)
-- is the same as the current IP's, but the host bits (the
-- least-significant bits) are all set to 1.
local bits = self.n * 16
local width
if bitLength <= 0 then
width = bits
elseif bitLength >= bits then
width = 0
else
width = bits - bitLength
end
local result = Collection.new()
result.n = self.n
for i = self.n, 1, -1 do
if width > 0 then
if width >= 16 then
result[i] = 0xffff
width = width - 16
else
result[i] = bit32.replace(self[i], 0xffff, 0, width)
width = 0
end
else
result[i] = self[i]
end
end
return setmetatable(result, RawIP)
end
function RawIP:_makeIPv6String()
-- Return an IPv6 string representation of the object. Behavior is
-- undefined if the current object is IPv4.
local z1, z2 -- indices of run of zeroes to be displayed as "::"
local zstart, zcount
for i = 1, 9 do
-- Find left-most occurrence of longest run of two or more zeroes.
if i < 9 and self[i] == 0 then
if zstart then
zcount = zcount + 1
else
zstart = i
zcount = 1
end
else
if zcount and zcount > 1 then
if not z1 or zcount > z2 - z1 + 1 then
z1 = zstart
z2 = zstart + zcount - 1
end
end
zstart = nil
zcount = nil
end
end
local parts = Collection.new()
for i = 1, 8 do
if z1 and z1 <= i and i <= z2 then
if i == z1 then
if z1 == 1 or z2 == 8 then
if z1 == 1 and z2 == 8 then
return '::'
end
parts:add(':')
else
parts:add('')
end
end
else
parts:add(string.format('%x', self[i]))
end
end
return parts:join(':')
end
function RawIP:_makeIPv4String()
-- Return an IPv4 string representation of the object. Behavior is
-- undefined if the current object is IPv6.
local parts = Collection.new()
for i = 1, 2 do
local w = self[i]
parts:add(math.floor(w / 256))
parts:add(w % 256)
end
return parts:join('.')
end
function RawIP:__tostring()
-- Return a string equivalent to given IP address (IPv4 or IPv6).
if self.n == 2 then
return self:_makeIPv4String()
else
return self:_makeIPv6String()
end
end
function RawIP:__lt(obj)
if self.n == obj.n then
for i = 1, self.n do
if self[i] ~= obj[i] then
return self[i] < obj[i]
end
end
return false
end
return self.n < obj.n
end
function RawIP:__eq(obj)
if self.n == obj.n then
for i = 1, self.n do
if self[i] ~= obj[i] then
return false
end
end
return true
end
return false
end
--------------------------------------------------------------------------------
-- Initialize private methods available to IPAddress and Subnet
--------------------------------------------------------------------------------
-- Both IPAddress and Subnet need access to each others' private constructor
-- functions. IPAddress must be able to make Subnet objects from CIDR strings
-- and from RawIP objects, and Subnet must be able to make IPAddress objects
-- from IP strings and from RawIP objects. These constructors must all be
-- private to ensure correct error levels and to stop other modules from having
-- to worry about RawIP objects. Because they are private, they must be
-- initialized here.
local makeIPAddress, makeIPAddressFromRaw, makeSubnet, makeSubnetFromRaw
-- Objects need to be able to validate other objects that they are passed
-- as input, so initialize those functions here as well.
local validateCollection, validateIPAddress, validateSubnet
--------------------------------------------------------------------------------
-- IPAddress class
-- Represents a single IPv4 or IPv6 address.
--------------------------------------------------------------------------------
local IPAddress = {}
do
-- dataKey is a unique key to access objects' internal data. This is needed
-- to access the RawIP objects contained in other IPAddress objects so that
-- they can be compared with the current object's RawIP object. This data
-- is not available to other classes or other modules.
local dataKey = {}
-- Private static methods
local function isIPAddressObject(val)
return type(val) == 'table' and val[dataKey] ~= nil
end
validateIPAddress = makeValidationFunction('IPAddress', isIPAddressObject)
-- Metamethods that don't need upvalues
local function ipEquals(ip1, ip2)
return ip1[dataKey].rawIP == ip2[dataKey].rawIP
end
local function ipLessThan(ip1, ip2)
return ip1[dataKey].rawIP < ip2[dataKey].rawIP
end
local function concatIP(ip, val)
return tostring(ip) .. tostring(val)
end
local function ipToString(ip)
return ip:getIP()
end
-- Constructors
makeIPAddressFromRaw = function (rawIP)
-- Constructs a new IPAddress object from a rawIP object. This function
-- is for internal use; it is called by IPAddress.new and from other
-- IPAddress methods, and should be available to the Subnet class, but
-- should not be available to other modules.
assert(type(rawIP) == 'table', 'rawIP was type ' .. type(rawIP) .. '; expected type table')
-- Set up structure
local obj = {}
local data = {}
data.rawIP = rawIP
-- A function to check whether methods are called with a valid self
-- parameter.
local checkSelf = makeCheckSelfFunction(
'IP',
'ipAddress',
obj,
'IPAddress object'
)
-- Public methods
function obj:getIP()
checkSelf(self, 'getIP')
return tostring(data.rawIP)
end
function obj:getVersion()
checkSelf(self, 'getVersion')
return data.rawIP:getVersion()
end
function obj:isIPv4()
checkSelf(self, 'isIPv4')
return data.rawIP:isIPv4()
end
function obj:isIPv6()
checkSelf(self, 'isIPv6')
return data.rawIP:isIPv6()
end
function obj:isInCollection(collection)
checkSelf(self, 'isInCollection')
validateCollection('isInCollection', 1, collection)
return collection:containsIP(self)
end
function obj:isInSubnet(subnet)
checkSelf(self, 'isInSubnet')
local tp = type(subnet)
if tp == 'string' then
subnet = makeSubnet(subnet)
elseif tp == 'table' then
validateSubnet('isInSubnet', 1, subnet)
else
checkTypeMulti('isInSubnet', 1, subnet, {'string', 'table'})
end
return subnet:containsIP(self)
end
function obj:getSubnet(bitLength)
checkSelf(self, 'getSubnet')
checkType('getSubnet', 1, bitLength, 'number')
if bitLength < 0
or bitLength > data.rawIP:getBitLength()
or bitLength ~= math.floor(bitLength)
then
error(string.format(
"bad argument #1 to 'getSubnet' (must be an integer between 0 and %d)",
data.rawIP:getBitLength()
), 2)
end
return makeSubnetFromRaw(data.rawIP, bitLength)
end
function obj:getNextIP()
checkSelf(self, 'getNextIP')
return makeIPAddressFromRaw(data.rawIP:getAdjacent())
end
function obj:getPreviousIP()
checkSelf(self, 'getPreviousIP')
return makeIPAddressFromRaw(data.rawIP:getAdjacent(true))
end
-- Metamethods
return setmetatable(obj, {
__eq = ipEquals,
__lt = ipLessThan,
__concat = concatIP,
__tostring = ipToString,
__index = function (self, key)
-- If any code knows the unique data key, allow it to access
-- the data table.
if key == dataKey then
return data
end
end,
__metatable = false, -- don't allow access to the metatable
})
end
makeIPAddress = function (ip)
local rawIP = RawIP.newFromIP(ip)
if not rawIP then
error(string.format("'%s' is an invalid IP address", ip), 3)
end
return makeIPAddressFromRaw(rawIP)
end
function IPAddress.new(ip)
checkType('IPAddress.new', 1, ip, 'string')
return makeIPAddress(ip)
end
end
--------------------------------------------------------------------------------
-- Subnet class
-- Represents a block of IPv4 or IPv6 addresses.
--------------------------------------------------------------------------------
local Subnet = {}
do
-- uniqueKey is a unique, private key used to test whether a given object
-- is a Subnet object.
local uniqueKey = {}
-- Metatable
local mt = {
__index = function (self, key)
if key == uniqueKey then
return true
end
end,
__eq = function (self, obj)
return self:getCIDR() == obj:getCIDR()
end,
__concat = function (self, obj)
return tostring(self) .. tostring(obj)
end,
__tostring = function (self)
return self:getCIDR()
end,
__metatable = false
}
-- Private static methods
local function isSubnetObject(val)
-- Return true if val is a Subnet object, and false otherwise.
return type(val) == 'table' and val[uniqueKey] ~= nil
end
-- Function to validate subnet objects.
-- Params:
-- methodName (string) - the name of the method being validated
-- argIdx (number) - the position of the argument in the argument list
-- arg - the argument to be validated
validateSubnet = makeValidationFunction('Subnet', isSubnetObject)
-- Constructors
makeSubnetFromRaw = function (rawIP, bitLength)
-- Set up structure
local obj = setmetatable({}, mt)
local data = {
rawIP = rawIP,
bitLength = bitLength,
}
-- A function to check whether methods are called with a valid self
-- parameter.
local checkSelf = makeCheckSelfFunction(
'IP',
'subnet',
obj,
'Subnet object'
)
-- Public methods
function obj:getPrefix()
checkSelf(self, 'getPrefix')
if not data.prefix then
data.prefix = makeIPAddressFromRaw(
data.rawIP:getPrefix(data.bitLength)
)
end
return data.prefix
end
function obj:getHighestIP()
checkSelf(self, 'getHighestIP')
if not data.highestIP then
data.highestIP = makeIPAddressFromRaw(
data.rawIP:getHighestHost(data.bitLength)
)
end
return data.highestIP
end
function obj:getBitLength()
checkSelf(self, 'getBitLength')
return data.bitLength
end
function obj:getCIDR()
checkSelf(self, 'getCIDR')
return string.format(
'%s/%d',
tostring(self:getPrefix()), self:getBitLength()
)
end
function obj:getVersion()
checkSelf(self, 'getVersion')
return data.rawIP:getVersion()
end
function obj:isIPv4()
checkSelf(self, 'isIPv4')
return data.rawIP:isIPv4()
end
function obj:isIPv6()
checkSelf(self, 'isIPv6')
return data.rawIP:isIPv6()
end
function obj:containsIP(ip)
checkSelf(self, 'containsIP')
local tp = type(ip)
if tp == 'string' then
ip = makeIPAddress(ip)
elseif tp == 'table' then
validateIPAddress('containsIP', 1, ip)
else
checkTypeMulti('containsIP', 1, ip, {'string', 'table'})
end
if self:getVersion() == ip:getVersion() then
return self:getPrefix() <= ip and ip <= self:getHighestIP()
end
return false
end
function obj:overlapsCollection(collection)
checkSelf(self, 'overlapsCollection')
validateCollection('overlapsCollection', 1, collection)
return collection:overlapsSubnet(self)
end
function obj:overlapsSubnet(subnet)
checkSelf(self, 'overlapsSubnet')
local tp = type(subnet)
if tp == 'string' then
subnet = makeSubnet(subnet)
elseif tp == 'table' then
validateSubnet('overlapsSubnet', 1, subnet)
else
checkTypeMulti('overlapsSubnet', 1, subnet, {'string', 'table'})
end
if self:getVersion() == subnet:getVersion() then
return (
subnet:getHighestIP() >= self:getPrefix() and
subnet:getPrefix() <= self:getHighestIP()
)
end
return false
end
function obj:walk()
checkSelf(self, 'walk')
local started
local current = self:getPrefix()
local highest = self:getHighestIP()
return function ()
if not started then
started = true
return current
end
if current < highest then
current = current:getNextIP()
return current
end
end
end
return obj
end
makeSubnet = function (cidr)
-- Return a Subnet object from a CIDR string. If the CIDR string is
-- invalid, throw an error.
local lhs, rhs = cidr:match('^%s*(.-)/(%d+)%s*$')
if lhs then
local bits = lhs:find(':', 1, true) and 128 or 32
local n = tonumber(rhs)
if n and n <= bits and (n == 0 or not rhs:find('^0')) then
-- The right-hand side is a number between 0 and 32 (for IPv4)
-- or 0 and 128 (for IPv6) and doesn't have any leading zeroes.
local base = RawIP.newFromIP(lhs)
if base then
-- The left-hand side is a valid IP address.
local prefix = base:getPrefix(n)
if base == prefix then
-- The left-hand side is the lowest IP in the subnet.
return makeSubnetFromRaw(prefix, n)
end
end
end
end
error(string.format("'%s' is an invalid CIDR string", cidr), 3)
end
function Subnet.new(cidr)
checkType('Subnet.new', 1, cidr, 'string')
return makeSubnet(cidr)
end
end
--------------------------------------------------------------------------------
-- Ranges class
-- Holds a list of IPAdress pairs representing contiguous IP ranges.
--------------------------------------------------------------------------------
local Ranges = Collection.new()
Ranges.__index = Ranges
function Ranges.new()
return setmetatable({}, Ranges)
end
function Ranges:add(ip1, ip2)
validateIPAddress('add', 1, ip1)
if ip2 ~= nil then
validateIPAddress('add', 2, ip2)
if ip1 > ip2 then
error('The first IP must be less than or equal to the second', 2)
end
end
Collection.add(self, {ip1, ip2 or ip1})
end
function Ranges:merge()
self:sort(
function (lhs, rhs)
-- Sort by second value, then first.
if lhs[2] == rhs[2] then
return lhs[1] < rhs[1]
end
return lhs[2] < rhs[2]
end
)
local pos = self.n
while pos > 1 do
for i = pos - 1, 1, -1 do
local ip1 = self[i][2]
local ip2 = ip1:getNextIP()
if ip2 < ip1 then
ip2 = ip1 -- don't wrap around
end
if self[pos][1] > ip2 then
break
end
ip1 = self[i][1]
ip2 = self[pos][1]
self[i] = {ip1 > ip2 and ip2 or ip1, self[pos][2]}
self:remove(pos)
pos = pos - 1
if pos <= 1 then
break
end
end
pos = pos - 1
end
end
--------------------------------------------------------------------------------
-- IPCollection class
-- Holds a list of IP addresses/subnets. Used internally.
-- Each address/subnet has the same version (either IPv4 or IPv6).
--------------------------------------------------------------------------------
local IPCollection = {}
IPCollection.__index = IPCollection
function IPCollection.new(version)
assert(
version == V4 or version == V6,
'IPCollection.new called with an invalid version'
)
local obj = {
version = version, -- V4 or V6
addresses = Collection.new(), -- valid IP addresses
subnets = Collection.new(), -- valid subnets
omitted = Collection.new(), -- not-quite valid strings
}
return obj
end
function IPCollection:getVersion()
-- Return a string with the IP version of addresses in this collection.
return self.version
end
function IPCollection:_store(hit, stripColons)
local maker, location
if hit:find('/', 1, true) then
maker = Subnet.new
location = self.subnets
else
maker = IPAddress.new
location = self.addresses
end
local success, obj = pcall(maker, hit)
if success then
location:add(obj)
else
if stripColons then
local colons, hit = hit:match('^(:*)(.*)')
if colons ~= '' then
self:_store(hit)
return
end
end
self.omitted:add(hit)
end
end
function IPCollection:_assertVersion(version, msg)
if self.version ~= version then
error(msg, 3)
end
end
function IPCollection:addIP(ip)
local tp = type(ip)
if tp == 'string' then
ip = makeIPAddress(ip)
elseif tp == 'table' then
validateIPAddress('addIP', 1, ip)
else
checkTypeMulti('addIP', 1, ip, {'string', 'table'})
end
self:_assertVersion(ip:getVersion(), 'addIP called with incorrect IP version')
self.addresses:add(ip)
return self
end
function IPCollection:addSubnet(subnet)
local tp = type(subnet)
if tp == 'string' then
subnet = makeSubnet(subnet)
elseif tp == 'table' then
validateSubnet('addSubnet', 1, subnet)
else
checkTypeMulti('addSubnet', 1, subnet, {'string', 'table'})
end
self:_assertVersion(subnet:getVersion(), 'addSubnet called with incorrect subnet version')
self.subnets:add(subnet)
return self
end
function IPCollection:containsIP(ip)
-- Return true, obj if ip is in this collection,
-- where obj is the first IPAddress or Subnet with the ip.
-- Otherwise, return false.
local tp = type(ip)
if tp == 'string' then
ip = makeIPAddress(ip)
elseif tp == 'table' then
validateIPAddress('containsIP', 1, ip)
else
checkTypeMulti('containsIP', 1, ip, {'string', 'table'})
end
if self:getVersion() == ip:getVersion() then
for _, item in ipairs(self.addresses) do
if item == ip then
return true, item
end
end
for _, item in ipairs(self.subnets) do
if item:containsIP(ip) then
return true, item
end
end
end
return false
end
function IPCollection:getRanges()
-- Return a sorted table of IP pairs equivalent to the collection.
-- Each IP pair is a table representing a contiguous range of
-- IP addresses from pair[1] to pair[2] inclusive (IPAddress objects).
local ranges = Ranges.new()
for _, item in ipairs(self.addresses) do
ranges:add(item)
end
for _, item in ipairs(self.subnets) do
ranges:add(item:getPrefix(), item:getHighestIP())
end
ranges:merge()
ranges:deobjectify()
return ranges
end
function IPCollection:overlapsSubnet(subnet)
-- Return true, obj if subnet overlaps this collection,
-- where obj is the first IPAddress or Subnet overlapping the subnet.
-- Otherwise, return false.
local tp = type(subnet)
if tp == 'string' then
subnet = makeSubnet(subnet)
elseif tp == 'table' then
validateSubnet('overlapsSubnet', 1, subnet)
else
checkTypeMulti('overlapsSubnet', 1, subnet, {'string', 'table'})
end
if self:getVersion() == subnet:getVersion() then
for _, item in ipairs(self.addresses) do
if subnet:containsIP(item) then
return true, item
end
end
for _, item in ipairs(self.subnets) do
if subnet:overlapsSubnet(item) then
return true, item
end
end
end
return false
end
--------------------------------------------------------------------------------
-- IPv4Collection class
-- Holds a list of IPv4 addresses/subnets.
--------------------------------------------------------------------------------
local IPv4Collection = setmetatable({}, IPCollection)
IPv4Collection.__index = IPv4Collection
function IPv4Collection.new()
return setmetatable(IPCollection.new(V4), IPv4Collection)
end
function IPv4Collection:addFromString(text)
-- Extract any IPv4 addresses or CIDR subnets from given text.
checkType('addFromString', 1, text, 'string')
text = text:gsub('[:!"#&\'()+,%-;<=>?[%]_{|}]', ' ')
for hit in text:gmatch('%S+') do
if hit:match('^%d+%.%d+[%.%d/]+$') then
local _, n = hit:gsub('%.', '.')
if n >= 3 then
self:_store(hit)
end
end
end
return self
end
--------------------------------------------------------------------------------
-- IPv6Collection class
-- Holds a list of IPv6 addresses/subnets.
--------------------------------------------------------------------------------
local IPv6Collection = setmetatable({}, IPCollection)
IPv6Collection.__index = IPv6Collection
do
-- Private static methods
local function isCollectionObject(val)
-- Return true if val is probably derived from an IPCollection object,
-- otherwise return false.
if type(val) == 'table' then
local mt = getmetatable(val)
if mt == IPv4Collection or mt == IPv6Collection then
return true
end
end
return false
end
validateCollection = makeValidationFunction('IPCollection', isCollectionObject)
function IPv6Collection.new()
return setmetatable(IPCollection.new(V6), IPv6Collection)
end
function IPv6Collection:addFromString(text)
-- Extract any IPv6 addresses or CIDR subnets from given text.
-- Want to accept all valid IPv6 despite the fact that addresses used
-- are unlikely to start with ':'.
-- Also want to be able to parse arbitrary wikitext which might use
-- colons for indenting.
-- Therefore, if an address at the start of a line is valid, use it;
-- otherwise strip any leading colons and try again.
checkType('addFromString', 1, text, 'string')
for line in string.gmatch(text .. '\n', '[\t ]*(.-)[\t\r ]*\n') do
line = line:gsub('[!"#&\'()+,%-;<=>?[%]_{|}]', ' ')
for position, hit in line:gmatch('()(%S+)') do
local ip = hit:match('^([:%x]+)/?%d*$')
if ip then
local _, n = ip:gsub(':', ':')
if n >= 2 then
self:_store(hit, position == 1)
end
end
end
end
return self
end
end
return {
IPAddress = IPAddress,
Subnet = Subnet,
IPv4Collection = IPv4Collection,
IPv6Collection = IPv6Collection,
}
4w39co69exnm7uhqtjiyj7mfhjsv3zc
73166
73165
2026-07-08T19:28:38Z
Robertsky
10424
1 versaun husi [[:en:Module:IP]]
73165
Scribunto
text/plain
-- IP library
-- This library contains classes for working with IP addresses and IP ranges.
-- Load modules
require('strict')
local bit32 = require('bit32')
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local checkTypeMulti = libraryUtil.checkTypeMulti
local makeCheckSelfFunction = libraryUtil.makeCheckSelfFunction
-- Constants
local V4 = 'IPv4'
local V6 = 'IPv6'
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function makeValidationFunction(className, isObjectFunc)
-- Make a function for validating a specific object.
return function (methodName, argIdx, arg)
if not isObjectFunc(arg) then
error(string.format(
"bad argument #%d to '%s' (not a valid %s object)",
argIdx, methodName, className
), 3)
end
end
end
--------------------------------------------------------------------------------
-- Collection class
-- This is a table used to hold items.
--------------------------------------------------------------------------------
local Collection = {}
Collection.__index = Collection
function Collection:add(item)
if item ~= nil then
self.n = self.n + 1
self[self.n] = item
end
end
function Collection:join(sep)
return table.concat(self, sep)
end
function Collection:remove(pos)
if self.n > 0 and (pos == nil or (0 < pos and pos <= self.n)) then
self.n = self.n - 1
return table.remove(self, pos)
end
end
function Collection:sort(comp)
table.sort(self, comp)
end
function Collection:deobjectify()
-- Turns the collection into a plain array without any special properties
-- or methods.
self.n = nil
setmetatable(self, nil)
end
function Collection.new()
return setmetatable({n = 0}, Collection)
end
--------------------------------------------------------------------------------
-- RawIP class
-- Numeric representation of an IPv4 or IPv6 address. Used internally.
-- A RawIP object is constructed by adding data to a Collection object and
-- then giving it a new metatable. This is to avoid the memory overhead of
-- copying the data to a new table.
--------------------------------------------------------------------------------
local RawIP = {}
RawIP.__index = RawIP
-- Constructors
function RawIP.newFromIPv4(ipStr)
-- Return a RawIP object if ipStr is a valid IPv4 string. Otherwise,
-- return nil.
-- This representation is for compatibility with IPv6 addresses.
local octets = Collection.new()
local s = ipStr:match('^%s*(.-)%s*$') .. '.'
for item in s:gmatch('(.-)%.') do
octets:add(item)
end
if octets.n == 4 then
for i, s in ipairs(octets) do
if s:match('^%d+$') then
local num = tonumber(s)
if 0 <= num and num <= 255 then
if num > 0 and s:match('^0') then
-- A redundant leading zero is for an IP in octal.
return nil
end
octets[i] = num
else
return nil
end
else
return nil
end
end
local parts = Collection.new()
for i = 1, 3, 2 do
parts:add(octets[i] * 256 + octets[i+1])
end
return setmetatable(parts, RawIP)
end
return nil
end
function RawIP.newFromIPv6(ipStr)
-- Return a RawIP object if ipStr is a valid IPv6 string. Otherwise,
-- return nil.
ipStr = ipStr:match('^%s*(.-)%s*$')
local _, n = ipStr:gsub(':', ':')
if n < 7 then
ipStr = ipStr:gsub('::', string.rep(':', 9 - n))
end
local parts = Collection.new()
for item in (ipStr .. ':'):gmatch('(.-):') do
parts:add(item)
end
if parts.n == 8 then
for i, s in ipairs(parts) do
if s == '' then
parts[i] = 0
else
if s:match('^%x+$') then
local num = tonumber(s, 16)
if num and 0 <= num and num <= 65535 then
parts[i] = num
else
return nil
end
else
return nil
end
end
end
return setmetatable(parts, RawIP)
end
return nil
end
function RawIP.newFromIP(ipStr)
-- Return a new RawIP object from either an IPv4 string or an IPv6
-- string. If ipStr is not a valid IPv4 or IPv6 string, then return
-- nil.
return RawIP.newFromIPv4(ipStr) or RawIP.newFromIPv6(ipStr)
end
-- Methods
function RawIP:getVersion()
-- Return a string with the version of the IP protocol we are using.
return self.n == 2 and V4 or V6
end
function RawIP:isIPv4()
-- Return true if this is an IPv4 representation, and false otherwise.
return self.n == 2
end
function RawIP:isIPv6()
-- Return true if this is an IPv6 representation, and false otherwise.
return self.n == 8
end
function RawIP:getBitLength()
-- Return the bit length of the IP address.
return self.n * 16
end
function RawIP:getAdjacent(previous)
-- Return a RawIP object for an adjacent IP address. If previous is true
-- then the previous IP is returned; otherwise the next IP is returned.
-- Will wraparound:
-- next 255.255.255.255 → 0.0.0.0
-- ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff → ::
-- previous 0.0.0.0 → 255.255.255.255
-- :: → ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
local result = Collection.new()
result.n = self.n
local carry = previous and 0xffff or 1
for i = self.n, 1, -1 do
local sum = self[i] + carry
if sum >= 0x10000 then
carry = previous and 0x10000 or 1
sum = sum - 0x10000
else
carry = previous and 0xffff or 0
end
result[i] = sum
end
return setmetatable(result, RawIP)
end
function RawIP:getPrefix(bitLength)
-- Return a RawIP object for the prefix of the current IP Address with a
-- bit length of bitLength.
local result = Collection.new()
result.n = self.n
for i = 1, self.n do
if bitLength > 0 then
if bitLength >= 16 then
result[i] = self[i]
bitLength = bitLength - 16
else
result[i] = bit32.replace(self[i], 0, 0, 16 - bitLength)
bitLength = 0
end
else
result[i] = 0
end
end
return setmetatable(result, RawIP)
end
function RawIP:getHighestHost(bitLength)
-- Return a RawIP object for the highest IP with the prefix of length
-- bitLength. In other words, the network (the most-significant bits)
-- is the same as the current IP's, but the host bits (the
-- least-significant bits) are all set to 1.
local bits = self.n * 16
local width
if bitLength <= 0 then
width = bits
elseif bitLength >= bits then
width = 0
else
width = bits - bitLength
end
local result = Collection.new()
result.n = self.n
for i = self.n, 1, -1 do
if width > 0 then
if width >= 16 then
result[i] = 0xffff
width = width - 16
else
result[i] = bit32.replace(self[i], 0xffff, 0, width)
width = 0
end
else
result[i] = self[i]
end
end
return setmetatable(result, RawIP)
end
function RawIP:_makeIPv6String()
-- Return an IPv6 string representation of the object. Behavior is
-- undefined if the current object is IPv4.
local z1, z2 -- indices of run of zeroes to be displayed as "::"
local zstart, zcount
for i = 1, 9 do
-- Find left-most occurrence of longest run of two or more zeroes.
if i < 9 and self[i] == 0 then
if zstart then
zcount = zcount + 1
else
zstart = i
zcount = 1
end
else
if zcount and zcount > 1 then
if not z1 or zcount > z2 - z1 + 1 then
z1 = zstart
z2 = zstart + zcount - 1
end
end
zstart = nil
zcount = nil
end
end
local parts = Collection.new()
for i = 1, 8 do
if z1 and z1 <= i and i <= z2 then
if i == z1 then
if z1 == 1 or z2 == 8 then
if z1 == 1 and z2 == 8 then
return '::'
end
parts:add(':')
else
parts:add('')
end
end
else
parts:add(string.format('%x', self[i]))
end
end
return parts:join(':')
end
function RawIP:_makeIPv4String()
-- Return an IPv4 string representation of the object. Behavior is
-- undefined if the current object is IPv6.
local parts = Collection.new()
for i = 1, 2 do
local w = self[i]
parts:add(math.floor(w / 256))
parts:add(w % 256)
end
return parts:join('.')
end
function RawIP:__tostring()
-- Return a string equivalent to given IP address (IPv4 or IPv6).
if self.n == 2 then
return self:_makeIPv4String()
else
return self:_makeIPv6String()
end
end
function RawIP:__lt(obj)
if self.n == obj.n then
for i = 1, self.n do
if self[i] ~= obj[i] then
return self[i] < obj[i]
end
end
return false
end
return self.n < obj.n
end
function RawIP:__eq(obj)
if self.n == obj.n then
for i = 1, self.n do
if self[i] ~= obj[i] then
return false
end
end
return true
end
return false
end
--------------------------------------------------------------------------------
-- Initialize private methods available to IPAddress and Subnet
--------------------------------------------------------------------------------
-- Both IPAddress and Subnet need access to each others' private constructor
-- functions. IPAddress must be able to make Subnet objects from CIDR strings
-- and from RawIP objects, and Subnet must be able to make IPAddress objects
-- from IP strings and from RawIP objects. These constructors must all be
-- private to ensure correct error levels and to stop other modules from having
-- to worry about RawIP objects. Because they are private, they must be
-- initialized here.
local makeIPAddress, makeIPAddressFromRaw, makeSubnet, makeSubnetFromRaw
-- Objects need to be able to validate other objects that they are passed
-- as input, so initialize those functions here as well.
local validateCollection, validateIPAddress, validateSubnet
--------------------------------------------------------------------------------
-- IPAddress class
-- Represents a single IPv4 or IPv6 address.
--------------------------------------------------------------------------------
local IPAddress = {}
do
-- dataKey is a unique key to access objects' internal data. This is needed
-- to access the RawIP objects contained in other IPAddress objects so that
-- they can be compared with the current object's RawIP object. This data
-- is not available to other classes or other modules.
local dataKey = {}
-- Private static methods
local function isIPAddressObject(val)
return type(val) == 'table' and val[dataKey] ~= nil
end
validateIPAddress = makeValidationFunction('IPAddress', isIPAddressObject)
-- Metamethods that don't need upvalues
local function ipEquals(ip1, ip2)
return ip1[dataKey].rawIP == ip2[dataKey].rawIP
end
local function ipLessThan(ip1, ip2)
return ip1[dataKey].rawIP < ip2[dataKey].rawIP
end
local function concatIP(ip, val)
return tostring(ip) .. tostring(val)
end
local function ipToString(ip)
return ip:getIP()
end
-- Constructors
makeIPAddressFromRaw = function (rawIP)
-- Constructs a new IPAddress object from a rawIP object. This function
-- is for internal use; it is called by IPAddress.new and from other
-- IPAddress methods, and should be available to the Subnet class, but
-- should not be available to other modules.
assert(type(rawIP) == 'table', 'rawIP was type ' .. type(rawIP) .. '; expected type table')
-- Set up structure
local obj = {}
local data = {}
data.rawIP = rawIP
-- A function to check whether methods are called with a valid self
-- parameter.
local checkSelf = makeCheckSelfFunction(
'IP',
'ipAddress',
obj,
'IPAddress object'
)
-- Public methods
function obj:getIP()
checkSelf(self, 'getIP')
return tostring(data.rawIP)
end
function obj:getVersion()
checkSelf(self, 'getVersion')
return data.rawIP:getVersion()
end
function obj:isIPv4()
checkSelf(self, 'isIPv4')
return data.rawIP:isIPv4()
end
function obj:isIPv6()
checkSelf(self, 'isIPv6')
return data.rawIP:isIPv6()
end
function obj:isInCollection(collection)
checkSelf(self, 'isInCollection')
validateCollection('isInCollection', 1, collection)
return collection:containsIP(self)
end
function obj:isInSubnet(subnet)
checkSelf(self, 'isInSubnet')
local tp = type(subnet)
if tp == 'string' then
subnet = makeSubnet(subnet)
elseif tp == 'table' then
validateSubnet('isInSubnet', 1, subnet)
else
checkTypeMulti('isInSubnet', 1, subnet, {'string', 'table'})
end
return subnet:containsIP(self)
end
function obj:getSubnet(bitLength)
checkSelf(self, 'getSubnet')
checkType('getSubnet', 1, bitLength, 'number')
if bitLength < 0
or bitLength > data.rawIP:getBitLength()
or bitLength ~= math.floor(bitLength)
then
error(string.format(
"bad argument #1 to 'getSubnet' (must be an integer between 0 and %d)",
data.rawIP:getBitLength()
), 2)
end
return makeSubnetFromRaw(data.rawIP, bitLength)
end
function obj:getNextIP()
checkSelf(self, 'getNextIP')
return makeIPAddressFromRaw(data.rawIP:getAdjacent())
end
function obj:getPreviousIP()
checkSelf(self, 'getPreviousIP')
return makeIPAddressFromRaw(data.rawIP:getAdjacent(true))
end
-- Metamethods
return setmetatable(obj, {
__eq = ipEquals,
__lt = ipLessThan,
__concat = concatIP,
__tostring = ipToString,
__index = function (self, key)
-- If any code knows the unique data key, allow it to access
-- the data table.
if key == dataKey then
return data
end
end,
__metatable = false, -- don't allow access to the metatable
})
end
makeIPAddress = function (ip)
local rawIP = RawIP.newFromIP(ip)
if not rawIP then
error(string.format("'%s' is an invalid IP address", ip), 3)
end
return makeIPAddressFromRaw(rawIP)
end
function IPAddress.new(ip)
checkType('IPAddress.new', 1, ip, 'string')
return makeIPAddress(ip)
end
end
--------------------------------------------------------------------------------
-- Subnet class
-- Represents a block of IPv4 or IPv6 addresses.
--------------------------------------------------------------------------------
local Subnet = {}
do
-- uniqueKey is a unique, private key used to test whether a given object
-- is a Subnet object.
local uniqueKey = {}
-- Metatable
local mt = {
__index = function (self, key)
if key == uniqueKey then
return true
end
end,
__eq = function (self, obj)
return self:getCIDR() == obj:getCIDR()
end,
__concat = function (self, obj)
return tostring(self) .. tostring(obj)
end,
__tostring = function (self)
return self:getCIDR()
end,
__metatable = false
}
-- Private static methods
local function isSubnetObject(val)
-- Return true if val is a Subnet object, and false otherwise.
return type(val) == 'table' and val[uniqueKey] ~= nil
end
-- Function to validate subnet objects.
-- Params:
-- methodName (string) - the name of the method being validated
-- argIdx (number) - the position of the argument in the argument list
-- arg - the argument to be validated
validateSubnet = makeValidationFunction('Subnet', isSubnetObject)
-- Constructors
makeSubnetFromRaw = function (rawIP, bitLength)
-- Set up structure
local obj = setmetatable({}, mt)
local data = {
rawIP = rawIP,
bitLength = bitLength,
}
-- A function to check whether methods are called with a valid self
-- parameter.
local checkSelf = makeCheckSelfFunction(
'IP',
'subnet',
obj,
'Subnet object'
)
-- Public methods
function obj:getPrefix()
checkSelf(self, 'getPrefix')
if not data.prefix then
data.prefix = makeIPAddressFromRaw(
data.rawIP:getPrefix(data.bitLength)
)
end
return data.prefix
end
function obj:getHighestIP()
checkSelf(self, 'getHighestIP')
if not data.highestIP then
data.highestIP = makeIPAddressFromRaw(
data.rawIP:getHighestHost(data.bitLength)
)
end
return data.highestIP
end
function obj:getBitLength()
checkSelf(self, 'getBitLength')
return data.bitLength
end
function obj:getCIDR()
checkSelf(self, 'getCIDR')
return string.format(
'%s/%d',
tostring(self:getPrefix()), self:getBitLength()
)
end
function obj:getVersion()
checkSelf(self, 'getVersion')
return data.rawIP:getVersion()
end
function obj:isIPv4()
checkSelf(self, 'isIPv4')
return data.rawIP:isIPv4()
end
function obj:isIPv6()
checkSelf(self, 'isIPv6')
return data.rawIP:isIPv6()
end
function obj:containsIP(ip)
checkSelf(self, 'containsIP')
local tp = type(ip)
if tp == 'string' then
ip = makeIPAddress(ip)
elseif tp == 'table' then
validateIPAddress('containsIP', 1, ip)
else
checkTypeMulti('containsIP', 1, ip, {'string', 'table'})
end
if self:getVersion() == ip:getVersion() then
return self:getPrefix() <= ip and ip <= self:getHighestIP()
end
return false
end
function obj:overlapsCollection(collection)
checkSelf(self, 'overlapsCollection')
validateCollection('overlapsCollection', 1, collection)
return collection:overlapsSubnet(self)
end
function obj:overlapsSubnet(subnet)
checkSelf(self, 'overlapsSubnet')
local tp = type(subnet)
if tp == 'string' then
subnet = makeSubnet(subnet)
elseif tp == 'table' then
validateSubnet('overlapsSubnet', 1, subnet)
else
checkTypeMulti('overlapsSubnet', 1, subnet, {'string', 'table'})
end
if self:getVersion() == subnet:getVersion() then
return (
subnet:getHighestIP() >= self:getPrefix() and
subnet:getPrefix() <= self:getHighestIP()
)
end
return false
end
function obj:walk()
checkSelf(self, 'walk')
local started
local current = self:getPrefix()
local highest = self:getHighestIP()
return function ()
if not started then
started = true
return current
end
if current < highest then
current = current:getNextIP()
return current
end
end
end
return obj
end
makeSubnet = function (cidr)
-- Return a Subnet object from a CIDR string. If the CIDR string is
-- invalid, throw an error.
local lhs, rhs = cidr:match('^%s*(.-)/(%d+)%s*$')
if lhs then
local bits = lhs:find(':', 1, true) and 128 or 32
local n = tonumber(rhs)
if n and n <= bits and (n == 0 or not rhs:find('^0')) then
-- The right-hand side is a number between 0 and 32 (for IPv4)
-- or 0 and 128 (for IPv6) and doesn't have any leading zeroes.
local base = RawIP.newFromIP(lhs)
if base then
-- The left-hand side is a valid IP address.
local prefix = base:getPrefix(n)
if base == prefix then
-- The left-hand side is the lowest IP in the subnet.
return makeSubnetFromRaw(prefix, n)
end
end
end
end
error(string.format("'%s' is an invalid CIDR string", cidr), 3)
end
function Subnet.new(cidr)
checkType('Subnet.new', 1, cidr, 'string')
return makeSubnet(cidr)
end
end
--------------------------------------------------------------------------------
-- Ranges class
-- Holds a list of IPAdress pairs representing contiguous IP ranges.
--------------------------------------------------------------------------------
local Ranges = Collection.new()
Ranges.__index = Ranges
function Ranges.new()
return setmetatable({}, Ranges)
end
function Ranges:add(ip1, ip2)
validateIPAddress('add', 1, ip1)
if ip2 ~= nil then
validateIPAddress('add', 2, ip2)
if ip1 > ip2 then
error('The first IP must be less than or equal to the second', 2)
end
end
Collection.add(self, {ip1, ip2 or ip1})
end
function Ranges:merge()
self:sort(
function (lhs, rhs)
-- Sort by second value, then first.
if lhs[2] == rhs[2] then
return lhs[1] < rhs[1]
end
return lhs[2] < rhs[2]
end
)
local pos = self.n
while pos > 1 do
for i = pos - 1, 1, -1 do
local ip1 = self[i][2]
local ip2 = ip1:getNextIP()
if ip2 < ip1 then
ip2 = ip1 -- don't wrap around
end
if self[pos][1] > ip2 then
break
end
ip1 = self[i][1]
ip2 = self[pos][1]
self[i] = {ip1 > ip2 and ip2 or ip1, self[pos][2]}
self:remove(pos)
pos = pos - 1
if pos <= 1 then
break
end
end
pos = pos - 1
end
end
--------------------------------------------------------------------------------
-- IPCollection class
-- Holds a list of IP addresses/subnets. Used internally.
-- Each address/subnet has the same version (either IPv4 or IPv6).
--------------------------------------------------------------------------------
local IPCollection = {}
IPCollection.__index = IPCollection
function IPCollection.new(version)
assert(
version == V4 or version == V6,
'IPCollection.new called with an invalid version'
)
local obj = {
version = version, -- V4 or V6
addresses = Collection.new(), -- valid IP addresses
subnets = Collection.new(), -- valid subnets
omitted = Collection.new(), -- not-quite valid strings
}
return obj
end
function IPCollection:getVersion()
-- Return a string with the IP version of addresses in this collection.
return self.version
end
function IPCollection:_store(hit, stripColons)
local maker, location
if hit:find('/', 1, true) then
maker = Subnet.new
location = self.subnets
else
maker = IPAddress.new
location = self.addresses
end
local success, obj = pcall(maker, hit)
if success then
location:add(obj)
else
if stripColons then
local colons, hit = hit:match('^(:*)(.*)')
if colons ~= '' then
self:_store(hit)
return
end
end
self.omitted:add(hit)
end
end
function IPCollection:_assertVersion(version, msg)
if self.version ~= version then
error(msg, 3)
end
end
function IPCollection:addIP(ip)
local tp = type(ip)
if tp == 'string' then
ip = makeIPAddress(ip)
elseif tp == 'table' then
validateIPAddress('addIP', 1, ip)
else
checkTypeMulti('addIP', 1, ip, {'string', 'table'})
end
self:_assertVersion(ip:getVersion(), 'addIP called with incorrect IP version')
self.addresses:add(ip)
return self
end
function IPCollection:addSubnet(subnet)
local tp = type(subnet)
if tp == 'string' then
subnet = makeSubnet(subnet)
elseif tp == 'table' then
validateSubnet('addSubnet', 1, subnet)
else
checkTypeMulti('addSubnet', 1, subnet, {'string', 'table'})
end
self:_assertVersion(subnet:getVersion(), 'addSubnet called with incorrect subnet version')
self.subnets:add(subnet)
return self
end
function IPCollection:containsIP(ip)
-- Return true, obj if ip is in this collection,
-- where obj is the first IPAddress or Subnet with the ip.
-- Otherwise, return false.
local tp = type(ip)
if tp == 'string' then
ip = makeIPAddress(ip)
elseif tp == 'table' then
validateIPAddress('containsIP', 1, ip)
else
checkTypeMulti('containsIP', 1, ip, {'string', 'table'})
end
if self:getVersion() == ip:getVersion() then
for _, item in ipairs(self.addresses) do
if item == ip then
return true, item
end
end
for _, item in ipairs(self.subnets) do
if item:containsIP(ip) then
return true, item
end
end
end
return false
end
function IPCollection:getRanges()
-- Return a sorted table of IP pairs equivalent to the collection.
-- Each IP pair is a table representing a contiguous range of
-- IP addresses from pair[1] to pair[2] inclusive (IPAddress objects).
local ranges = Ranges.new()
for _, item in ipairs(self.addresses) do
ranges:add(item)
end
for _, item in ipairs(self.subnets) do
ranges:add(item:getPrefix(), item:getHighestIP())
end
ranges:merge()
ranges:deobjectify()
return ranges
end
function IPCollection:overlapsSubnet(subnet)
-- Return true, obj if subnet overlaps this collection,
-- where obj is the first IPAddress or Subnet overlapping the subnet.
-- Otherwise, return false.
local tp = type(subnet)
if tp == 'string' then
subnet = makeSubnet(subnet)
elseif tp == 'table' then
validateSubnet('overlapsSubnet', 1, subnet)
else
checkTypeMulti('overlapsSubnet', 1, subnet, {'string', 'table'})
end
if self:getVersion() == subnet:getVersion() then
for _, item in ipairs(self.addresses) do
if subnet:containsIP(item) then
return true, item
end
end
for _, item in ipairs(self.subnets) do
if subnet:overlapsSubnet(item) then
return true, item
end
end
end
return false
end
--------------------------------------------------------------------------------
-- IPv4Collection class
-- Holds a list of IPv4 addresses/subnets.
--------------------------------------------------------------------------------
local IPv4Collection = setmetatable({}, IPCollection)
IPv4Collection.__index = IPv4Collection
function IPv4Collection.new()
return setmetatable(IPCollection.new(V4), IPv4Collection)
end
function IPv4Collection:addFromString(text)
-- Extract any IPv4 addresses or CIDR subnets from given text.
checkType('addFromString', 1, text, 'string')
text = text:gsub('[:!"#&\'()+,%-;<=>?[%]_{|}]', ' ')
for hit in text:gmatch('%S+') do
if hit:match('^%d+%.%d+[%.%d/]+$') then
local _, n = hit:gsub('%.', '.')
if n >= 3 then
self:_store(hit)
end
end
end
return self
end
--------------------------------------------------------------------------------
-- IPv6Collection class
-- Holds a list of IPv6 addresses/subnets.
--------------------------------------------------------------------------------
local IPv6Collection = setmetatable({}, IPCollection)
IPv6Collection.__index = IPv6Collection
do
-- Private static methods
local function isCollectionObject(val)
-- Return true if val is probably derived from an IPCollection object,
-- otherwise return false.
if type(val) == 'table' then
local mt = getmetatable(val)
if mt == IPv4Collection or mt == IPv6Collection then
return true
end
end
return false
end
validateCollection = makeValidationFunction('IPCollection', isCollectionObject)
function IPv6Collection.new()
return setmetatable(IPCollection.new(V6), IPv6Collection)
end
function IPv6Collection:addFromString(text)
-- Extract any IPv6 addresses or CIDR subnets from given text.
-- Want to accept all valid IPv6 despite the fact that addresses used
-- are unlikely to start with ':'.
-- Also want to be able to parse arbitrary wikitext which might use
-- colons for indenting.
-- Therefore, if an address at the start of a line is valid, use it;
-- otherwise strip any leading colons and try again.
checkType('addFromString', 1, text, 'string')
for line in string.gmatch(text .. '\n', '[\t ]*(.-)[\t\r ]*\n') do
line = line:gsub('[!"#&\'()+,%-;<=>?[%]_{|}]', ' ')
for position, hit in line:gmatch('()(%S+)') do
local ip = hit:match('^([:%x]+)/?%d*$')
if ip then
local _, n = ip:gsub(':', ':')
if n >= 2 then
self:_store(hit, position == 1)
end
end
end
end
return self
end
end
return {
IPAddress = IPAddress,
Subnet = Subnet,
IPv4Collection = IPv4Collection,
IPv6Collection = IPv6Collection,
}
4w39co69exnm7uhqtjiyj7mfhjsv3zc
Template:Cite newspaper
10
8303
73167
2019-03-05T14:21:54Z
en>Xaosflux
0
Changed protection level for "[[Template:Cite newspaper]]": Pages alread protected from [[Wikipedia:Cascade-protected items/content]] ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
73167
wikitext
text/x-wiki
#REDIRECT [[Template:Cite news]]
8ggskokjo5aaw80bageqj2jd46ku8r8
73168
73167
2026-07-08T19:28:38Z
Robertsky
10424
1 versaun husi [[:en:Template:Cite_newspaper]]
73167
wikitext
text/x-wiki
#REDIRECT [[Template:Cite news]]
8ggskokjo5aaw80bageqj2jd46ku8r8
Template:)!
10
8304
73169
2023-11-06T02:11:08Z
en>JPxG
0
whitespace
73169
wikitext
text/x-wiki
]<noinclude>
{{documentation}}</noinclude>
05x8ly4kzqrmn4t2xzp01wmyex95anx
73170
73169
2026-07-08T19:28:38Z
Robertsky
10424
1 versaun husi [[:en:Template:)!]]
73169
wikitext
text/x-wiki
]<noinclude>
{{documentation}}</noinclude>
05x8ly4kzqrmn4t2xzp01wmyex95anx
Template:Str rightc
10
8305
73171
2026-06-22T12:28:40Z
en>MSGJ
0
use [[Module:str rightc]] and fix occasional errors
73171
wikitext
text/x-wiki
<includeonly>{{safesubst:#invoke:str rightc|rightc}}</includeonly><noinclude>
{{documentation}}
</noinclude>
0qv0wcxn42h7xzcrv9awc8tmuda0wtv
73172
73171
2026-07-08T19:28:38Z
Robertsky
10424
1 versaun husi [[:en:Template:Str_rightc]]
73171
wikitext
text/x-wiki
<includeonly>{{safesubst:#invoke:str rightc|rightc}}</includeonly><noinclude>
{{documentation}}
</noinclude>
0qv0wcxn42h7xzcrv9awc8tmuda0wtv
Template:New page DYM
10
8306
73173
2024-06-29T04:18:52Z
en>Pppery
0
Sync from sandbox
73173
wikitext
text/x-wiki
<!-- generates "Did you mean" links for [[MediaWiki:Noarticletext]]/[[MediaWiki:Newarticletext]] & friends
the Module:String invocations strip soft hyphens (­ 0x00AD %C2%AD etc.) from the title; see T121979, T66528
-->{{ #ifexist: {{ns:Draft}}:{{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|\}}<!-- draft page -->
| {{There is a draft for this article|{{ns:Draft}}:{{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|\}}}} <!-- {{FULLPAGENAME}} changed for {{{1}}} for testing purposes -->
}}{{ #ifexist: {{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|\}}s<!-- plural page name -->
| {{Did you mean box|{{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|\}}s}}
}}{{ #ifexist: {{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|\}})<!-- missing end parenthesis -->
| {{Did you mean box|{{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|\}})}}
}}{{ #ifexist: {{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|\}}.<!-- missing trailing full stop -->
| {{Did you mean box|{{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|\}}.}}
}}{{ #ifexist: {{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|’|'}}<!-- right single quotation mark -> keyboard apostrophe -->
| {{Did you mean box|{{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|’|'}}}}
}}
{{ #if: <!-- extra characters at the end -->
{{ #ifeq: {{str_rightc|{{{demo|{{FULLPAGENAME}}}}}|1}} | / | 1 }}<!-- trailing slash -->
| {{ #ifexist: {{str crop|{{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|\}}|1}}
| {{Did you mean/box|{{str crop|{{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|\}}|1}}}}
}}
}}{{ #ifeq: {{{demo|{{FULLPAGENAME}}}}} | {{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|\}}
|| {{ #ifexist: {{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|\}}<!-- page exists without soft hyphen(s) and/or backslash(es) -->
| {{Did you mean/box|{{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|\}}}}
}}
}}<noinclude>
{{Documentation}}
</noinclude>
omib06isqqm83kq0dhdyi7l6rh8c2zx
73174
73173
2026-07-08T19:28:38Z
Robertsky
10424
1 versaun husi [[:en:Template:New_page_DYM]]
73173
wikitext
text/x-wiki
<!-- generates "Did you mean" links for [[MediaWiki:Noarticletext]]/[[MediaWiki:Newarticletext]] & friends
the Module:String invocations strip soft hyphens (­ 0x00AD %C2%AD etc.) from the title; see T121979, T66528
-->{{ #ifexist: {{ns:Draft}}:{{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|\}}<!-- draft page -->
| {{There is a draft for this article|{{ns:Draft}}:{{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|\}}}} <!-- {{FULLPAGENAME}} changed for {{{1}}} for testing purposes -->
}}{{ #ifexist: {{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|\}}s<!-- plural page name -->
| {{Did you mean box|{{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|\}}s}}
}}{{ #ifexist: {{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|\}})<!-- missing end parenthesis -->
| {{Did you mean box|{{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|\}})}}
}}{{ #ifexist: {{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|\}}.<!-- missing trailing full stop -->
| {{Did you mean box|{{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|\}}.}}
}}{{ #ifexist: {{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|’|'}}<!-- right single quotation mark -> keyboard apostrophe -->
| {{Did you mean box|{{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|’|'}}}}
}}
{{ #if: <!-- extra characters at the end -->
{{ #ifeq: {{str_rightc|{{{demo|{{FULLPAGENAME}}}}}|1}} | / | 1 }}<!-- trailing slash -->
| {{ #ifexist: {{str crop|{{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|\}}|1}}
| {{Did you mean/box|{{str crop|{{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|\}}|1}}}}
}}
}}{{ #ifeq: {{{demo|{{FULLPAGENAME}}}}} | {{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|\}}
|| {{ #ifexist: {{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|\}}<!-- page exists without soft hyphen(s) and/or backslash(es) -->
| {{Did you mean/box|{{#invoke:String|replace|source={{#invoke:String|replace|source={{{demo|{{FULLPAGENAME}}}}}|}}|\}}}}
}}
}}<noinclude>
{{Documentation}}
</noinclude>
omib06isqqm83kq0dhdyi7l6rh8c2zx
Template:Anontools
10
8307
73175
2014-01-08T08:55:44Z
en>Mr. Stradivarius
0
Changed protection level of Template:Anontools: [[WP:High-risk templates|Highly visible template]]: used in system messages [[MediaWiki:Anontalkpagetext]] and [[MediaWiki:Sp-contributions-footer-anon]] ([Edit=Block all non-admin users] (indefinite) [Move=
73175
wikitext
text/x-wiki
{{#iferror: {{#expr:{{{1}}}}}
| {{anontools/ipv6|{{{1}}}}}
| {{anontools/ipv4|{{{1}}}}}
}}<noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
4zhn55k5hjy5fx913o7xeiolkeja21w
73176
73175
2026-07-08T19:28:38Z
Robertsky
10424
1 versaun husi [[:en:Template:Anontools]]
73175
wikitext
text/x-wiki
{{#iferror: {{#expr:{{{1}}}}}
| {{anontools/ipv6|{{{1}}}}}
| {{anontools/ipv4|{{{1}}}}}
}}<noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
4zhn55k5hjy5fx913o7xeiolkeja21w
Template:Anontools/ipv6
10
8308
73177
2025-07-30T02:20:19Z
en>Slakr
0
Undid revision [[Special:Diff/1302316968|1302316968]] by [[Special:Contributions/Slakr|Slakr]] ([[User talk:Slakr|talk]]) it's back
73177
wikitext
text/x-wiki
{{flatlist|1=
* ([https://whois-referral.toolforge.org/gateway.py?lookup=true&ip={{{1}}} WHOIS] <sup>([https://www.robtex.com/ip-lookup/{{{1}}} alt] • [https://tools.wmflabs.org/whois/gateway.py?lookup=true&ip={{{1}}} old])</sup>
* [https://whatismyipaddress.com/ip/{{{1}}} Geolocate] <sup>([https://www.iplocate.io/{{{1}}} Alternate])</sup>
* [https://ipcheck.toolforge.org/index.php?ip={{{1}}} Proxy Checker]
* [{{fullurl:Special%3ABlockList|ip={{{1}}}}} Current blocks]
* [https://xtools.wmcloud.org/ec/en.wikipedia.org/{{#ifeq:{{#invoke:IPAddress|isIpOrRange|{{{1}}}}}|range|ipr-}}{{{1}}} XTools]
* [{{#ifeq:{{#invoke:IPAddress|isIpOrRange|{{{1}}}}}|range|https://xtools.wmflabs.org/globalcontribs/ipr-|https://guc.toolforge.org/index.php?user=}}{{{1}}} Global contributions])
*([[Regional Internet registry|RIR]]s: [https://rdap.afrinic.net/rdap/ip/{{{1}}} Africa]
* [https://whois.arin.net/rest/ip/{{{1}}} America]
* [https://wq.apnic.net/apnic-bin/whois.pl?searchtext={{{1}}} Asia-Pacific]
* [https://apps.db.ripe.net/db-web-ui/query?searchtext={{{1}}} Europe]
* [https://query.milacnic.lacnic.net/search?id={{{1}}} Latin America/Caribbean])
}}<noinclude>
{{Documentation}}
</noinclude>
q7hxzbm38uz6gtmsfoqi0s6g4bhbs06
73178
73177
2026-07-08T19:28:38Z
Robertsky
10424
1 versaun husi [[:en:Template:Anontools/ipv6]]
73177
wikitext
text/x-wiki
{{flatlist|1=
* ([https://whois-referral.toolforge.org/gateway.py?lookup=true&ip={{{1}}} WHOIS] <sup>([https://www.robtex.com/ip-lookup/{{{1}}} alt] • [https://tools.wmflabs.org/whois/gateway.py?lookup=true&ip={{{1}}} old])</sup>
* [https://whatismyipaddress.com/ip/{{{1}}} Geolocate] <sup>([https://www.iplocate.io/{{{1}}} Alternate])</sup>
* [https://ipcheck.toolforge.org/index.php?ip={{{1}}} Proxy Checker]
* [{{fullurl:Special%3ABlockList|ip={{{1}}}}} Current blocks]
* [https://xtools.wmcloud.org/ec/en.wikipedia.org/{{#ifeq:{{#invoke:IPAddress|isIpOrRange|{{{1}}}}}|range|ipr-}}{{{1}}} XTools]
* [{{#ifeq:{{#invoke:IPAddress|isIpOrRange|{{{1}}}}}|range|https://xtools.wmflabs.org/globalcontribs/ipr-|https://guc.toolforge.org/index.php?user=}}{{{1}}} Global contributions])
*([[Regional Internet registry|RIR]]s: [https://rdap.afrinic.net/rdap/ip/{{{1}}} Africa]
* [https://whois.arin.net/rest/ip/{{{1}}} America]
* [https://wq.apnic.net/apnic-bin/whois.pl?searchtext={{{1}}} Asia-Pacific]
* [https://apps.db.ripe.net/db-web-ui/query?searchtext={{{1}}} Europe]
* [https://query.milacnic.lacnic.net/search?id={{{1}}} Latin America/Caribbean])
}}<noinclude>
{{Documentation}}
</noinclude>
q7hxzbm38uz6gtmsfoqi0s6g4bhbs06
Template:No article text/sister projects
10
8309
73179
2026-05-17T05:18:13Z
en>Pppery
0
-wikinews
73179
wikitext
text/x-wiki
<templatestyles src="No article text/sister projects/styles.css"/><div class="no-article-text-sister-projects" id="sisterproject">Look for '''{{#invoke:String|replace|source={{PAGENAME}}|}}''' on one of Wikipedia's [[Special:SiteMatrix|sister projects]]:
{{plainlist}}
<ul>
<li>
<div>[[File:Wiktionary-logo-v2.svg|30x30px|link=|alt=]]</div>
<div>[[wiktionary:Special:Search/{{#invoke:String|replace|source={{PAGENAME}}|}}|Wiktionary]] (dictionary)</div>
</li>
<li>
<div>[[File:Wikibooks-logo.svg|30x30px|link=|alt=]]</div>
<div>[[wikibooks:Special:Search/{{#invoke:String|replace|source={{PAGENAME}}|}}|Wikibooks]] (textbooks)</div>
</li>
<li>
<div>[[File:Wikiquote-logo.svg|30x30px|link=|alt=]]</div>
<div>[[wikiquote:Special:Search/{{#invoke:String|replace|source={{PAGENAME}}|}}|Wikiquote]] (quotations)</div>
</li>
<li>
<div>[[File:Wikisource-logo.svg|30x30px|link=|alt=]]</div>
<div>[[wikisource:Special:Search/{{#invoke:String|replace|source={{PAGENAME}}|}}|Wikisource]] (library)</div>
</li>
<li>
<div>[[File:Wikiversity logo 2017.svg|30x30px|link=|alt=]]</div>
<div>[[wikiversity:Special:Search/{{#invoke:String|replace|source={{PAGENAME}}|}}|Wikiversity]] (learning resources)</div>
</li>
<li>
<div>[[File:Commons-logo.svg|30x30px|link=|alt=]]</div>
<div>[[commons:Special:Search/{{#invoke:String|replace|source={{PAGENAME}}|}}|Commons]] (media)</div>
</li>
<li>
<div>[[File:Wikivoyage-Logo-v3-icon.svg|30x30px|link=|alt=]]</div>
<div>[[wikivoyage:Special:Search/{{#invoke:String|replace|source={{PAGENAME}}|}}|Wikivoyage]] (travel guide)</div>
</li>
<li>
<div>[[File:Wikidata-logo.svg|30x30px|link=|alt=]]</div>
<div>[[wikidata:Special:Search/{{#invoke:String|replace|source={{PAGENAME}}|}}|Wikidata]] (linked database)</div>
</li>
<li>
<div>[[File:Wikispecies-logo.svg|30x30px|link=|alt=]]</div>
<div>[[wikispecies:Special:Search/{{#invoke:String|replace|source={{PAGENAME}}|}}|Wikispecies]] (species directory)</div>
</li>
</ul>
{{endplainlist}}
</div><noinclude>
{{documentation}}
</noinclude>
trhersge1ir0gt0xmy1hox1bvzz5ye4
73180
73179
2026-07-08T19:28:38Z
Robertsky
10424
1 versaun husi [[:en:Template:No_article_text/sister_projects]]
73179
wikitext
text/x-wiki
<templatestyles src="No article text/sister projects/styles.css"/><div class="no-article-text-sister-projects" id="sisterproject">Look for '''{{#invoke:String|replace|source={{PAGENAME}}|}}''' on one of Wikipedia's [[Special:SiteMatrix|sister projects]]:
{{plainlist}}
<ul>
<li>
<div>[[File:Wiktionary-logo-v2.svg|30x30px|link=|alt=]]</div>
<div>[[wiktionary:Special:Search/{{#invoke:String|replace|source={{PAGENAME}}|}}|Wiktionary]] (dictionary)</div>
</li>
<li>
<div>[[File:Wikibooks-logo.svg|30x30px|link=|alt=]]</div>
<div>[[wikibooks:Special:Search/{{#invoke:String|replace|source={{PAGENAME}}|}}|Wikibooks]] (textbooks)</div>
</li>
<li>
<div>[[File:Wikiquote-logo.svg|30x30px|link=|alt=]]</div>
<div>[[wikiquote:Special:Search/{{#invoke:String|replace|source={{PAGENAME}}|}}|Wikiquote]] (quotations)</div>
</li>
<li>
<div>[[File:Wikisource-logo.svg|30x30px|link=|alt=]]</div>
<div>[[wikisource:Special:Search/{{#invoke:String|replace|source={{PAGENAME}}|}}|Wikisource]] (library)</div>
</li>
<li>
<div>[[File:Wikiversity logo 2017.svg|30x30px|link=|alt=]]</div>
<div>[[wikiversity:Special:Search/{{#invoke:String|replace|source={{PAGENAME}}|}}|Wikiversity]] (learning resources)</div>
</li>
<li>
<div>[[File:Commons-logo.svg|30x30px|link=|alt=]]</div>
<div>[[commons:Special:Search/{{#invoke:String|replace|source={{PAGENAME}}|}}|Commons]] (media)</div>
</li>
<li>
<div>[[File:Wikivoyage-Logo-v3-icon.svg|30x30px|link=|alt=]]</div>
<div>[[wikivoyage:Special:Search/{{#invoke:String|replace|source={{PAGENAME}}|}}|Wikivoyage]] (travel guide)</div>
</li>
<li>
<div>[[File:Wikidata-logo.svg|30x30px|link=|alt=]]</div>
<div>[[wikidata:Special:Search/{{#invoke:String|replace|source={{PAGENAME}}|}}|Wikidata]] (linked database)</div>
</li>
<li>
<div>[[File:Wikispecies-logo.svg|30x30px|link=|alt=]]</div>
<div>[[wikispecies:Special:Search/{{#invoke:String|replace|source={{PAGENAME}}|}}|Wikispecies]] (species directory)</div>
</li>
</ul>
{{endplainlist}}
</div><noinclude>
{{documentation}}
</noinclude>
trhersge1ir0gt0xmy1hox1bvzz5ye4
Template:Fmbox warning ruler
10
8310
73181
2010-10-04T14:42:16Z
en>WOSlinker
0
remove {{pp-template}}
73181
wikitext
text/x-wiki
<hr class="fmbox-warning-ruler" style="color: #BB7070; background-color: #BB7070;" /><noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
nptq4fwsstrhm4qmd7c47sxbl7s83nk
73182
73181
2026-07-08T19:28:38Z
Robertsky
10424
1 versaun husi [[:en:Template:Fmbox_warning_ruler]]
73181
wikitext
text/x-wiki
<hr class="fmbox-warning-ruler" style="color: #BB7070; background-color: #BB7070;" /><noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
nptq4fwsstrhm4qmd7c47sxbl7s83nk
Template:-!-
10
8311
73183
2015-11-13T02:17:24Z
en>Fuhghettaboutit
0
Changed protection level of Template:-!-: when I changed this to add template editors, I didn't realize it had cascding protection—so all my change did was make it appear as if it could be edited by them ([Edit=Allow only administrators] (indefinite)...
73183
wikitext
text/x-wiki
{{!}}-<noinclude>
{{documentation}}
</noinclude>
a6qh7a405qffq4qxzmlr2uj6vmvpt4j
73184
73183
2026-07-08T19:28:39Z
Robertsky
10424
1 versaun husi [[:en:Template:-!-]]
73183
wikitext
text/x-wiki
{{!}}-<noinclude>
{{documentation}}
</noinclude>
a6qh7a405qffq4qxzmlr2uj6vmvpt4j
Template:Navigation bar
10
8312
73185
2026-04-13T23:42:10Z
en>The wub
0
dark mode fixes
73185
wikitext
text/x-wiki
<div class="noprint" style="border: 1px solid var(--border-color-base, #a2a9b10); background-color: var(--background-color-neutral-subtle, #f8f9fa); font-size: 95%; clear: both; width: 94%; margin: 0.5em auto; text-align: center; color: var(--color-base, #202122);">
{{#if:{{{title<includeonly>|</includeonly>}}}|
<div style="padding: 0.2em 0; {{#if:{{{color|}}}|background-color: {{{color|}}}}}">{{{title}}}</div>
}}
<div style="font-size: 90%; width: 98%; padding: 0.2em 0.4em 0.1em; white-space: nowrap; overflow-x: scroll;">
{{{list|<noinclude>long list of items in parameter "List" - item 1 - item 2 - item 3 - item 4 - item 5 - item 6 - item 7 - item 7 - item 8 - item 9 - item 10 - item 11 - item 12 - item 13 - item 14 - item 15 - item 16 - item 17</noinclude>}}}
</div>
</div><noinclude>{{Documentation}}<!-- Add categories and interwikis to the /doc subpage, not here! --></noinclude>
lxqcucbfukp0vmsadxohjodd8mddiez
73186
73185
2026-07-08T19:28:39Z
Robertsky
10424
1 versaun husi [[:en:Template:Navigation_bar]]
73185
wikitext
text/x-wiki
<div class="noprint" style="border: 1px solid var(--border-color-base, #a2a9b10); background-color: var(--background-color-neutral-subtle, #f8f9fa); font-size: 95%; clear: both; width: 94%; margin: 0.5em auto; text-align: center; color: var(--color-base, #202122);">
{{#if:{{{title<includeonly>|</includeonly>}}}|
<div style="padding: 0.2em 0; {{#if:{{{color|}}}|background-color: {{{color|}}}}}">{{{title}}}</div>
}}
<div style="font-size: 90%; width: 98%; padding: 0.2em 0.4em 0.1em; white-space: nowrap; overflow-x: scroll;">
{{{list|<noinclude>long list of items in parameter "List" - item 1 - item 2 - item 3 - item 4 - item 5 - item 6 - item 7 - item 7 - item 8 - item 9 - item 10 - item 11 - item 12 - item 13 - item 14 - item 15 - item 16 - item 17</noinclude>}}}
</div>
</div><noinclude>{{Documentation}}<!-- Add categories and interwikis to the /doc subpage, not here! --></noinclude>
lxqcucbfukp0vmsadxohjodd8mddiez
Template:SpecialCategories/a-z
10
8313
73187
2019-03-07T16:21:33Z
en>Galobtter
0
Protected "[[Template:SpecialCategories/a-z]]": Used in system message ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
73187
wikitext
text/x-wiki
#REDIRECT [[Template:SpecialCategoryTOC/a-z]]
3yha7e4m4j7qi3v2xw6zhczdx8iiw54
73188
73187
2026-07-08T19:28:39Z
Robertsky
10424
1 versaun husi [[:en:Template:SpecialCategories/a-z]]
73187
wikitext
text/x-wiki
#REDIRECT [[Template:SpecialCategoryTOC/a-z]]
3yha7e4m4j7qi3v2xw6zhczdx8iiw54
Template:SpecialCategoryTOC
10
8314
73189
2026-04-13T23:39:53Z
en>The wub
0
remove background color on title, barely distinguishable from the rest anyway
73189
wikitext
text/x-wiki
<div class="plainlinks">{{Navigation bar
| title = <div>
<span class="plainlinks" >
{{MediaWiki:Toc}}:
[{{fullurl:{{FULLPAGENAME}}}} Top]
[{{fullurl:{{FULLPAGENAME}}|offset=0}} 0]
[{{fullurl:{{FULLPAGENAME}}|offset=1}} 1]
[{{fullurl:{{FULLPAGENAME}}|offset=2}} 2]
[{{fullurl:{{FULLPAGENAME}}|offset=3}} 3]
[{{fullurl:{{FULLPAGENAME}}|offset=4}} 4]
[{{fullurl:{{FULLPAGENAME}}|offset=5}} 5]
[{{fullurl:{{FULLPAGENAME}}|offset=6}} 6]
[{{fullurl:{{FULLPAGENAME}}|offset=7}} 7]
[{{fullurl:{{FULLPAGENAME}}|offset=8}} 8]
[{{fullurl:{{FULLPAGENAME}}|offset=9}} 9]
[{{fullurl:{{FULLPAGENAME}}|offset=A}} A]
[{{fullurl:{{FULLPAGENAME}}|offset=B}} B]
[{{fullurl:{{FULLPAGENAME}}|offset=C}} C]
[{{fullurl:{{FULLPAGENAME}}|offset=D}} D]
[{{fullurl:{{FULLPAGENAME}}|offset=E}} E]
[{{fullurl:{{FULLPAGENAME}}|offset=F}} F]
[{{fullurl:{{FULLPAGENAME}}|offset=G}} G]
[{{fullurl:{{FULLPAGENAME}}|offset=H}} H]
[{{fullurl:{{FULLPAGENAME}}|offset=I}} I]
[{{fullurl:{{FULLPAGENAME}}|offset=J}} J]
[{{fullurl:{{FULLPAGENAME}}|offset=K}} K]
[{{fullurl:{{FULLPAGENAME}}|offset=L}} L]
[{{fullurl:{{FULLPAGENAME}}|offset=M}} M]
[{{fullurl:{{FULLPAGENAME}}|offset=N}} N]
[{{fullurl:{{FULLPAGENAME}}|offset=O}} O]
[{{fullurl:{{FULLPAGENAME}}|offset=P}} P]
[{{fullurl:{{FULLPAGENAME}}|offset=Q}} Q]
[{{fullurl:{{FULLPAGENAME}}|offset=R}} R]
[{{fullurl:{{FULLPAGENAME}}|offset=S}} S]
[{{fullurl:{{FULLPAGENAME}}|offset=T}} T]
[{{fullurl:{{FULLPAGENAME}}|offset=U}} U]
[{{fullurl:{{FULLPAGENAME}}|offset=V}} V]
[{{fullurl:{{FULLPAGENAME}}|offset=W}} W]
[{{fullurl:{{FULLPAGENAME}}|offset=X}} X]
[{{fullurl:{{FULLPAGENAME}}|offset=Y}} Y]
[{{fullurl:{{FULLPAGENAME}}|offset=Z}} Z]
</span>
</div>
| list= <div style="overflow-x:scroll;overflow-y:hidden;"><span class="plainlinks">
'''A''' {{SpecialCategories/a-z|A}}
• '''B''' {{SpecialCategories/a-z|B}}
• '''C''' {{SpecialCategories/a-z|C}}
• '''D''' {{SpecialCategories/a-z|D}}
• '''E''' {{SpecialCategories/a-z|E}}
• '''F''' {{SpecialCategories/a-z|F}}
• '''G''' {{SpecialCategories/a-z|G}}
• '''H''' {{SpecialCategories/a-z|H}}
• '''I''' {{SpecialCategories/a-z|I}}
• '''J''' {{SpecialCategories/a-z|J}}
• '''K''' {{SpecialCategories/a-z|K}}
• '''L''' {{SpecialCategories/a-z|L}}
• '''M''' {{SpecialCategories/a-z|M}}
• '''N''' {{SpecialCategories/a-z|N}}
• '''O''' {{SpecialCategories/a-z|O}}
• '''P''' {{SpecialCategories/a-z|P}}
• '''Q''' {{SpecialCategories/a-z|Q}}
• '''R''' {{SpecialCategories/a-z|R}}
• '''S''' {{SpecialCategories/a-z|S}}
• '''T''' {{SpecialCategories/a-z|T}}
• '''U''' {{SpecialCategories/a-z|U}}
• '''V''' {{SpecialCategories/a-z|V}}
• '''W''' {{SpecialCategories/a-z|W}}
• '''X''' {{SpecialCategories/a-z|X}}
• '''Y''' {{SpecialCategories/a-z|Y}}
• '''Z''' {{SpecialCategories/a-z|Z}}
</span></div> }}</div><noinclude>{{documentation}}</noinclude>
gimyvn8656hqtxw3m5gkjc57ogk2klg
73190
73189
2026-07-08T19:28:39Z
Robertsky
10424
1 versaun husi [[:en:Template:SpecialCategoryTOC]]
73189
wikitext
text/x-wiki
<div class="plainlinks">{{Navigation bar
| title = <div>
<span class="plainlinks" >
{{MediaWiki:Toc}}:
[{{fullurl:{{FULLPAGENAME}}}} Top]
[{{fullurl:{{FULLPAGENAME}}|offset=0}} 0]
[{{fullurl:{{FULLPAGENAME}}|offset=1}} 1]
[{{fullurl:{{FULLPAGENAME}}|offset=2}} 2]
[{{fullurl:{{FULLPAGENAME}}|offset=3}} 3]
[{{fullurl:{{FULLPAGENAME}}|offset=4}} 4]
[{{fullurl:{{FULLPAGENAME}}|offset=5}} 5]
[{{fullurl:{{FULLPAGENAME}}|offset=6}} 6]
[{{fullurl:{{FULLPAGENAME}}|offset=7}} 7]
[{{fullurl:{{FULLPAGENAME}}|offset=8}} 8]
[{{fullurl:{{FULLPAGENAME}}|offset=9}} 9]
[{{fullurl:{{FULLPAGENAME}}|offset=A}} A]
[{{fullurl:{{FULLPAGENAME}}|offset=B}} B]
[{{fullurl:{{FULLPAGENAME}}|offset=C}} C]
[{{fullurl:{{FULLPAGENAME}}|offset=D}} D]
[{{fullurl:{{FULLPAGENAME}}|offset=E}} E]
[{{fullurl:{{FULLPAGENAME}}|offset=F}} F]
[{{fullurl:{{FULLPAGENAME}}|offset=G}} G]
[{{fullurl:{{FULLPAGENAME}}|offset=H}} H]
[{{fullurl:{{FULLPAGENAME}}|offset=I}} I]
[{{fullurl:{{FULLPAGENAME}}|offset=J}} J]
[{{fullurl:{{FULLPAGENAME}}|offset=K}} K]
[{{fullurl:{{FULLPAGENAME}}|offset=L}} L]
[{{fullurl:{{FULLPAGENAME}}|offset=M}} M]
[{{fullurl:{{FULLPAGENAME}}|offset=N}} N]
[{{fullurl:{{FULLPAGENAME}}|offset=O}} O]
[{{fullurl:{{FULLPAGENAME}}|offset=P}} P]
[{{fullurl:{{FULLPAGENAME}}|offset=Q}} Q]
[{{fullurl:{{FULLPAGENAME}}|offset=R}} R]
[{{fullurl:{{FULLPAGENAME}}|offset=S}} S]
[{{fullurl:{{FULLPAGENAME}}|offset=T}} T]
[{{fullurl:{{FULLPAGENAME}}|offset=U}} U]
[{{fullurl:{{FULLPAGENAME}}|offset=V}} V]
[{{fullurl:{{FULLPAGENAME}}|offset=W}} W]
[{{fullurl:{{FULLPAGENAME}}|offset=X}} X]
[{{fullurl:{{FULLPAGENAME}}|offset=Y}} Y]
[{{fullurl:{{FULLPAGENAME}}|offset=Z}} Z]
</span>
</div>
| list= <div style="overflow-x:scroll;overflow-y:hidden;"><span class="plainlinks">
'''A''' {{SpecialCategories/a-z|A}}
• '''B''' {{SpecialCategories/a-z|B}}
• '''C''' {{SpecialCategories/a-z|C}}
• '''D''' {{SpecialCategories/a-z|D}}
• '''E''' {{SpecialCategories/a-z|E}}
• '''F''' {{SpecialCategories/a-z|F}}
• '''G''' {{SpecialCategories/a-z|G}}
• '''H''' {{SpecialCategories/a-z|H}}
• '''I''' {{SpecialCategories/a-z|I}}
• '''J''' {{SpecialCategories/a-z|J}}
• '''K''' {{SpecialCategories/a-z|K}}
• '''L''' {{SpecialCategories/a-z|L}}
• '''M''' {{SpecialCategories/a-z|M}}
• '''N''' {{SpecialCategories/a-z|N}}
• '''O''' {{SpecialCategories/a-z|O}}
• '''P''' {{SpecialCategories/a-z|P}}
• '''Q''' {{SpecialCategories/a-z|Q}}
• '''R''' {{SpecialCategories/a-z|R}}
• '''S''' {{SpecialCategories/a-z|S}}
• '''T''' {{SpecialCategories/a-z|T}}
• '''U''' {{SpecialCategories/a-z|U}}
• '''V''' {{SpecialCategories/a-z|V}}
• '''W''' {{SpecialCategories/a-z|W}}
• '''X''' {{SpecialCategories/a-z|X}}
• '''Y''' {{SpecialCategories/a-z|Y}}
• '''Z''' {{SpecialCategories/a-z|Z}}
</span></div> }}</div><noinclude>{{documentation}}</noinclude>
gimyvn8656hqtxw3m5gkjc57ogk2klg
Template:SpecialCategoryTOC/a-z
10
8315
73191
2023-09-05T03:22:59Z
en>Pppery
0
Add documentation
73191
wikitext
text/x-wiki
[{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}a}} {{{1}}}a] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}b}} {{{1}}}b] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}c}} {{{1}}}c] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}d}} {{{1}}}d] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}e}} {{{1}}}e] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}f}} {{{1}}}f] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}g}} {{{1}}}g] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}h}} {{{1}}}h] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}i}} {{{1}}}i] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}j}} {{{1}}}j] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}k}} {{{1}}}k] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}l}} {{{1}}}l] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}m}} {{{1}}}m] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}n}} {{{1}}}n] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}o}} {{{1}}}o] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}p}} {{{1}}}p] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}q}} {{{1}}}q] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}r}} {{{1}}}r] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}s}} {{{1}}}s] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}t}} {{{1}}}t] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}u}} {{{1}}}u] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}v}} {{{1}}}v] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}w}} {{{1}}}w] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}x}} {{{1}}}x] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}y}} {{{1}}}y] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}z}} {{{1}}}z]<noinclude>{{doc}}</noinclude>
93b22cxo54ecbo46t9ym7bagpkrod5a
73192
73191
2026-07-08T19:28:39Z
Robertsky
10424
1 versaun husi [[:en:Template:SpecialCategoryTOC/a-z]]
73191
wikitext
text/x-wiki
[{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}a}} {{{1}}}a] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}b}} {{{1}}}b] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}c}} {{{1}}}c] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}d}} {{{1}}}d] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}e}} {{{1}}}e] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}f}} {{{1}}}f] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}g}} {{{1}}}g] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}h}} {{{1}}}h] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}i}} {{{1}}}i] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}j}} {{{1}}}j] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}k}} {{{1}}}k] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}l}} {{{1}}}l] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}m}} {{{1}}}m] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}n}} {{{1}}}n] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}o}} {{{1}}}o] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}p}} {{{1}}}p] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}q}} {{{1}}}q] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}r}} {{{1}}}r] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}s}} {{{1}}}s] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}t}} {{{1}}}t] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}u}} {{{1}}}u] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}v}} {{{1}}}v] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}w}} {{{1}}}w] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}x}} {{{1}}}x] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}y}} {{{1}}}y] [{{fullurl:{{FULLPAGENAME}}|offset={{{1}}}z}} {{{1}}}z]<noinclude>{{doc}}</noinclude>
93b22cxo54ecbo46t9ym7bagpkrod5a
Template:No article text
10
8316
73193
2026-07-05T18:11:51Z
en>Pppery
0
Remove purge link
73193
wikitext
text/x-wiki
<div class="mw-parser-output"><!-- don't touch this div to the left, it makes TemplateStyles vroom vroom -->
{{New page DYM}} {{fmbox
| type = system
| id = noarticletext
| image = none
| textstyle = padding: 0.6em 0.9em; <!--Large box needs more padding-->
| text = {{ #ifeq: {{ #ifeq: {{FULLPAGENAME}} | Template:No article text || {{NAMESPACE}} }} | {{ns:0}}<!--Mainspace sister project infobox-->
| {{No article text/sister projects}}
}}{{ #ifeq: {{NAMESPACE}} | {{ns:User talk}}
| '''No messages''' have been posted for this user yet.
| '''Wikipedia does not have {{ #switch: {{NAMESPACE}}
| {{ns:0}} = an article
| {{TALKSPACE}} = a [[{{ns:Help}}:Using talk pages|talk page]]
| {{ns:Category}} = a [[{{ns:Project}}:Categorization|category]]
| {{ns:Help}} = a [[{{ns:Help}}:Contents|help page]]
| {{ns:Portal}} = a [[{{ns:Project}}:Portal|portal]]
| {{ns:Template}} = a [[{{ns:Project}}:Template messages|template]]
| {{ns:User}} = a [[{{ns:Project}}:User pages|user page]]
| {{ns:Project}} = a [[{{ns:Project}}:Project namespace|project page]]
| #default = a {{NAMESPACE}} page
}} with this exact name.''' {{ #ifeq: {{#invoke:String|replace|source={{PAGENAME}}|}} | {{#invoke:String|replace|source={{SUBPAGENAME}}|}}
| {{ #switch: {{NAMESPACE}}
| {{ns:0}} = Please {{plain link|url=https://en.wikipedia.org/w/index.php?search={{urlencode:{{#titleparts:{{#invoke:String|replace|source={{PAGENAME}}|}}}}}}&title=Special%3ASearch&fulltext=1|name=search for ''{{#invoke:String|replace|source={{PAGENAME}}|}}'' in Wikipedia}} to check for alternative titles or spellings.
| {{ns:Category}} = Please browse through the [[Portal:Contents|existing categories]] to check if this category is covered under another name.
| {{ns:Help}} = Please browse through the [[{{ns:Help}}:Contents|existing help pages]] to check if this help topic is covered under another name.
| {{ns:Portal}} = Please browse through the [[{{ns:Portal}}:Contents/Portals|existing portals]] to check for similar topics.
| {{ns:Template}} = Please browse through the [[{{ns:Project}}:Template messages|existing templates]] to check if this standardized message is available under another name.
| {{ns:User}} = In general, this page should be created and edited by the user '''''[[Special:Contributions/{{#invoke:String|replace|source={{PAGENAME}}|}}|{{PAGENAME}}]]'''''. If in doubt, please verify that the user account "{{#invoke:String|replace|source={{PAGENAME}}|}}" [[Special:CentralAuth/{{PAGENAME}}|'''exists''']].
}}
| {{ #ifeq: {{{nopermission}}} | yes || Before creating this page, please see [[{{ns:Project}}:Subpages]].}}
}}
}}{{ #ifeq: {{{nopermission}}} | yes
|* {{ #switch: {{#invoke:Effective protection level|create|{{#invoke:String|replace|source={{FULLPAGENAME}}|}}}}
| sysop = This page is protected from creation, so only [[Wikipedia:Administrators|administrators]] can create it.
| interfaceadmin = Creation of this page is limited to [[Wikipedia:Interface administrators|interface administrators]].
| templateeditor = This page is template-protected from creation, so only [[Wikipedia:Template editor|template editors]] can create it.
| extendedconfirmed = This page is [[Wikipedia:Protection policy#Extended confirmed protection|extended confirmed protected]] from creation, so only [[Wikipedia:User access levels#Extendedconfirmed|extended confirmed users]] can create it.
| autoconfirmed = {{#if:{{NAMESPACE}}|This page is semi-protected from creation, so only [[WP:User access levels#Autoconfirmed users|autoconfirmed users]] can create it.|You need to [{{fullurl:Special:UserLogin|returnto={{ urlencode: {{#invoke:String|replace|source={{FULLPAGENAME}}|}} }}}} log in or create an account] and be [[WP:User access levels#Autoconfirmed users|autoconfirmed]] to create new articles. Alternatively, you can use the [[Wikipedia:Article wizard|article wizard]] to submit a draft for review, or [[{{ns:Project}}:Requested articles|request a new article]].}}
| user = You need to [{{fullurl:Special:UserLogin|returnto={{ urlencode: {{#invoke:String|replace|source={{FULLPAGENAME}}|}} }}}} log in or create an account] to create this page. {{#ifeq:{{NAMESPACE}}|{{ns:Category}}|Alternatively, you can [[Wikipedia:Articles for creation/Categories|request the creation of a new category]].}}
| #default = You cannot create this {{ #if:{{NAMESPACE}} | page | article }}. You may need to [{{fullurl:Special:UserLogin|returnto={{ urlencode: {{#invoke:String|replace|source={{FULLPAGENAME}}|}} }}}} log in or create an account] and be [[WP:User access levels#Autoconfirmed users|autoconfirmed]] to start this page. {{ #switch: {{NAMESPACE}}
| {{ns:0}} = Alternatively, you can use the [[Wikipedia:Article wizard|article wizard]], or [[{{ns:Project}}:Requested articles|add a request for it]].
| {{ns:Category}} = Alternatively, you can [[Wikipedia:Articles for creation/Categories|request the creation of a new category]].
}}
}}
|{{#ifeq:{{#invoke:Title blacklist|main|action=create|pagename={{#invoke:String|replace|source={{FULLPAGENAME}}|}}}}|templateeditor|* This page is on the title blacklist, so only [[Wikipedia:Administrators|administrators]], [[Wikipedia:Template editors|template editors]], and [[Wikipedia:Page movers|page movers]] can create it.|* ''' {{ #switch: {{NAMESPACE}}
| {{ns:3}} = {{#ifeq:{{ROOTPAGENAME}}|{{PAGENAME}}|[[Special:NewSection/{{FULLPAGENAME}}|Post a message to ''{{#invoke:String|replace|source={{PAGENAME}}|}}]]''|[[Special:Edit/{{FULLPAGENAME}}|Start the ''{{#invoke:String|replace|source={{FULLPAGENAME}}|}}'' page]] or [[Special:NewSection/{{FULLPAGENAME}}|leave a message about ''{{#invoke:String|replace|source={{SUBJECTPAGENAME}}|}}]]''}}
| {{ns:5}}
| {{ns:7}}
| {{ns:9}}
| {{ns:11}}
| {{ns:13}}
| {{ns:15}}
| {{ns:101}}
| {{ns:119}}
| {{ns:711}}
| {{ns:829}}
| {{ns:1}} = [[Special:Edit/{{FULLPAGENAME}}|Start the ''{{#invoke:String|replace|source={{FULLPAGENAME}}|}}'' page]] or [[Special:NewSection/{{FULLPAGENAME}}|leave a message about ''{{#invoke:String|replace|source={{SUBJECTPAGENAME}}|}}]]''
| #default = [[Special:Edit/{{FULLPAGENAME}}|Start the ''{{#invoke:String|replace|source={{FULLPAGENAME}}|}}'' {{ #if: {{NAMESPACE}} | page | article }}]]
}}'''{{ #if: {{NAMESPACE}}
|| , using the [[Wikipedia:Article wizard|Article Wizard]] if you wish, or [[{{ns:Project}}:Requested articles|add a request for it]]
}}.}}
}}{{ #switch: {{NAMESPACE}}
| {{ns:User talk}} =
| #default =
* {{plain link|url=https://en.wikipedia.org/w/index.php?search={{urlencode:{{#titleparts:{{#invoke:String|replace|source={{PAGENAME}}|}}}}}}&title=Special%3ASearch&fulltext=1&ns{{NAMESPACENUMBER}}=1|name=Search for "''{{#invoke:String|replace|source={{PAGENAME}}|}}''"}} in existing {{#if: {{NAMESPACE}} | pages within the {{NAMESPACE}} namespace | articles }}.
* [[{{ns:Special}}:WhatLinksHere/{{#invoke:String|replace|source={{FULLPAGENAME}}|}}|Look for pages within Wikipedia that link to this title]].
}}
<div id="noarticletext_technical">
----
'''Other reasons this message may be displayed:'''
* Titles on Wikipedia are '''[[Case sensitivity|case sensitive]]''' except for the first character; please {{plain link|url=https://en.wikipedia.org/w/index.php?search={{urlencode:{{#titleparts:{{#invoke:String|replace|source={{FULLPAGENAME}}|}}}}}}&title=Special%3ASearch&fulltext=1|name=check alternative capitalizations}} and consider adding a [[Wikipedia:Redirect|redirect]] here to the correct title.
* If the page has been deleted, [{{fullurl:Special:Log/delete|page={{#invoke:String|replace|source={{FULLPAGENAMEE}}|}}}} check the '''deletion log'''], and see [[Wikipedia:Why was the page I created deleted?|Why was the page I created deleted?]]
</div>
}}<!--End fmbox --><!--Start book box-->{{#if:{{#invoke:String|match|{{FULLPAGENAME}}|^Book:|nomatch= }}{{#invoke:String|match|{{FULLPAGENAME}}|^Book talk:|nomatch= }}|{{fmbox|type=system|text=<strong>This page may have existed as part of the former book namespace.</strong> If so it was likely moved to [[{{#invoke:String|replace|{{#invoke:String|replace|{{FULLPAGENAME}}|^Book talk:|Book:|plain=False}}|^Book:|Wikipedia:Books/archive/|plain=False}}]] before being deleted. See [[Wikipedia:Books]] for more information.}}}}<!--End book box-->
</div><noinclude>
{{documentation}}
</noinclude>
5sd8v21qafdlsa3mmuv8wm9z4lq42hc
73194
73193
2026-07-08T19:28:39Z
Robertsky
10424
1 versaun husi [[:en:Template:No_article_text]]
73193
wikitext
text/x-wiki
<div class="mw-parser-output"><!-- don't touch this div to the left, it makes TemplateStyles vroom vroom -->
{{New page DYM}} {{fmbox
| type = system
| id = noarticletext
| image = none
| textstyle = padding: 0.6em 0.9em; <!--Large box needs more padding-->
| text = {{ #ifeq: {{ #ifeq: {{FULLPAGENAME}} | Template:No article text || {{NAMESPACE}} }} | {{ns:0}}<!--Mainspace sister project infobox-->
| {{No article text/sister projects}}
}}{{ #ifeq: {{NAMESPACE}} | {{ns:User talk}}
| '''No messages''' have been posted for this user yet.
| '''Wikipedia does not have {{ #switch: {{NAMESPACE}}
| {{ns:0}} = an article
| {{TALKSPACE}} = a [[{{ns:Help}}:Using talk pages|talk page]]
| {{ns:Category}} = a [[{{ns:Project}}:Categorization|category]]
| {{ns:Help}} = a [[{{ns:Help}}:Contents|help page]]
| {{ns:Portal}} = a [[{{ns:Project}}:Portal|portal]]
| {{ns:Template}} = a [[{{ns:Project}}:Template messages|template]]
| {{ns:User}} = a [[{{ns:Project}}:User pages|user page]]
| {{ns:Project}} = a [[{{ns:Project}}:Project namespace|project page]]
| #default = a {{NAMESPACE}} page
}} with this exact name.''' {{ #ifeq: {{#invoke:String|replace|source={{PAGENAME}}|}} | {{#invoke:String|replace|source={{SUBPAGENAME}}|}}
| {{ #switch: {{NAMESPACE}}
| {{ns:0}} = Please {{plain link|url=https://en.wikipedia.org/w/index.php?search={{urlencode:{{#titleparts:{{#invoke:String|replace|source={{PAGENAME}}|}}}}}}&title=Special%3ASearch&fulltext=1|name=search for ''{{#invoke:String|replace|source={{PAGENAME}}|}}'' in Wikipedia}} to check for alternative titles or spellings.
| {{ns:Category}} = Please browse through the [[Portal:Contents|existing categories]] to check if this category is covered under another name.
| {{ns:Help}} = Please browse through the [[{{ns:Help}}:Contents|existing help pages]] to check if this help topic is covered under another name.
| {{ns:Portal}} = Please browse through the [[{{ns:Portal}}:Contents/Portals|existing portals]] to check for similar topics.
| {{ns:Template}} = Please browse through the [[{{ns:Project}}:Template messages|existing templates]] to check if this standardized message is available under another name.
| {{ns:User}} = In general, this page should be created and edited by the user '''''[[Special:Contributions/{{#invoke:String|replace|source={{PAGENAME}}|}}|{{PAGENAME}}]]'''''. If in doubt, please verify that the user account "{{#invoke:String|replace|source={{PAGENAME}}|}}" [[Special:CentralAuth/{{PAGENAME}}|'''exists''']].
}}
| {{ #ifeq: {{{nopermission}}} | yes || Before creating this page, please see [[{{ns:Project}}:Subpages]].}}
}}
}}{{ #ifeq: {{{nopermission}}} | yes
|* {{ #switch: {{#invoke:Effective protection level|create|{{#invoke:String|replace|source={{FULLPAGENAME}}|}}}}
| sysop = This page is protected from creation, so only [[Wikipedia:Administrators|administrators]] can create it.
| interfaceadmin = Creation of this page is limited to [[Wikipedia:Interface administrators|interface administrators]].
| templateeditor = This page is template-protected from creation, so only [[Wikipedia:Template editor|template editors]] can create it.
| extendedconfirmed = This page is [[Wikipedia:Protection policy#Extended confirmed protection|extended confirmed protected]] from creation, so only [[Wikipedia:User access levels#Extendedconfirmed|extended confirmed users]] can create it.
| autoconfirmed = {{#if:{{NAMESPACE}}|This page is semi-protected from creation, so only [[WP:User access levels#Autoconfirmed users|autoconfirmed users]] can create it.|You need to [{{fullurl:Special:UserLogin|returnto={{ urlencode: {{#invoke:String|replace|source={{FULLPAGENAME}}|}} }}}} log in or create an account] and be [[WP:User access levels#Autoconfirmed users|autoconfirmed]] to create new articles. Alternatively, you can use the [[Wikipedia:Article wizard|article wizard]] to submit a draft for review, or [[{{ns:Project}}:Requested articles|request a new article]].}}
| user = You need to [{{fullurl:Special:UserLogin|returnto={{ urlencode: {{#invoke:String|replace|source={{FULLPAGENAME}}|}} }}}} log in or create an account] to create this page. {{#ifeq:{{NAMESPACE}}|{{ns:Category}}|Alternatively, you can [[Wikipedia:Articles for creation/Categories|request the creation of a new category]].}}
| #default = You cannot create this {{ #if:{{NAMESPACE}} | page | article }}. You may need to [{{fullurl:Special:UserLogin|returnto={{ urlencode: {{#invoke:String|replace|source={{FULLPAGENAME}}|}} }}}} log in or create an account] and be [[WP:User access levels#Autoconfirmed users|autoconfirmed]] to start this page. {{ #switch: {{NAMESPACE}}
| {{ns:0}} = Alternatively, you can use the [[Wikipedia:Article wizard|article wizard]], or [[{{ns:Project}}:Requested articles|add a request for it]].
| {{ns:Category}} = Alternatively, you can [[Wikipedia:Articles for creation/Categories|request the creation of a new category]].
}}
}}
|{{#ifeq:{{#invoke:Title blacklist|main|action=create|pagename={{#invoke:String|replace|source={{FULLPAGENAME}}|}}}}|templateeditor|* This page is on the title blacklist, so only [[Wikipedia:Administrators|administrators]], [[Wikipedia:Template editors|template editors]], and [[Wikipedia:Page movers|page movers]] can create it.|* ''' {{ #switch: {{NAMESPACE}}
| {{ns:3}} = {{#ifeq:{{ROOTPAGENAME}}|{{PAGENAME}}|[[Special:NewSection/{{FULLPAGENAME}}|Post a message to ''{{#invoke:String|replace|source={{PAGENAME}}|}}]]''|[[Special:Edit/{{FULLPAGENAME}}|Start the ''{{#invoke:String|replace|source={{FULLPAGENAME}}|}}'' page]] or [[Special:NewSection/{{FULLPAGENAME}}|leave a message about ''{{#invoke:String|replace|source={{SUBJECTPAGENAME}}|}}]]''}}
| {{ns:5}}
| {{ns:7}}
| {{ns:9}}
| {{ns:11}}
| {{ns:13}}
| {{ns:15}}
| {{ns:101}}
| {{ns:119}}
| {{ns:711}}
| {{ns:829}}
| {{ns:1}} = [[Special:Edit/{{FULLPAGENAME}}|Start the ''{{#invoke:String|replace|source={{FULLPAGENAME}}|}}'' page]] or [[Special:NewSection/{{FULLPAGENAME}}|leave a message about ''{{#invoke:String|replace|source={{SUBJECTPAGENAME}}|}}]]''
| #default = [[Special:Edit/{{FULLPAGENAME}}|Start the ''{{#invoke:String|replace|source={{FULLPAGENAME}}|}}'' {{ #if: {{NAMESPACE}} | page | article }}]]
}}'''{{ #if: {{NAMESPACE}}
|| , using the [[Wikipedia:Article wizard|Article Wizard]] if you wish, or [[{{ns:Project}}:Requested articles|add a request for it]]
}}.}}
}}{{ #switch: {{NAMESPACE}}
| {{ns:User talk}} =
| #default =
* {{plain link|url=https://en.wikipedia.org/w/index.php?search={{urlencode:{{#titleparts:{{#invoke:String|replace|source={{PAGENAME}}|}}}}}}&title=Special%3ASearch&fulltext=1&ns{{NAMESPACENUMBER}}=1|name=Search for "''{{#invoke:String|replace|source={{PAGENAME}}|}}''"}} in existing {{#if: {{NAMESPACE}} | pages within the {{NAMESPACE}} namespace | articles }}.
* [[{{ns:Special}}:WhatLinksHere/{{#invoke:String|replace|source={{FULLPAGENAME}}|}}|Look for pages within Wikipedia that link to this title]].
}}
<div id="noarticletext_technical">
----
'''Other reasons this message may be displayed:'''
* Titles on Wikipedia are '''[[Case sensitivity|case sensitive]]''' except for the first character; please {{plain link|url=https://en.wikipedia.org/w/index.php?search={{urlencode:{{#titleparts:{{#invoke:String|replace|source={{FULLPAGENAME}}|}}}}}}&title=Special%3ASearch&fulltext=1|name=check alternative capitalizations}} and consider adding a [[Wikipedia:Redirect|redirect]] here to the correct title.
* If the page has been deleted, [{{fullurl:Special:Log/delete|page={{#invoke:String|replace|source={{FULLPAGENAMEE}}|}}}} check the '''deletion log'''], and see [[Wikipedia:Why was the page I created deleted?|Why was the page I created deleted?]]
</div>
}}<!--End fmbox --><!--Start book box-->{{#if:{{#invoke:String|match|{{FULLPAGENAME}}|^Book:|nomatch= }}{{#invoke:String|match|{{FULLPAGENAME}}|^Book talk:|nomatch= }}|{{fmbox|type=system|text=<strong>This page may have existed as part of the former book namespace.</strong> If so it was likely moved to [[{{#invoke:String|replace|{{#invoke:String|replace|{{FULLPAGENAME}}|^Book talk:|Book:|plain=False}}|^Book:|Wikipedia:Books/archive/|plain=False}}]] before being deleted. See [[Wikipedia:Books]] for more information.}}}}<!--End book box-->
</div><noinclude>
{{documentation}}
</noinclude>
5sd8v21qafdlsa3mmuv8wm9z4lq42hc
Template:Editnotice load
10
8317
73195
2025-10-07T23:23:01Z
en>Izno
0
-100% width on a div
73195
wikitext
text/x-wiki
{{#if: {{Editnotice load/content
| notice action = {{{notice action|}}}
}} | <!--
We unfortunately have to call /content twice so that the editnotice-area and clear elements
are only output if there is at least one actual edit notice. This ensures the software can determine
whether or not a page has edit notices (for the API, WikiEditor, VisualEditor and others). And to ensure
MediaWiki:Editnotice-notext gets shown when appropiate.
--><div id="editnotice-area" class="editnotice-area mw-parser-output" style="clear: both;">{{Editnotice load/content
| notice action = {{{notice action|}}}
}}<div style="clear: both;"></div></div>
}}<noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
eq6cug9b92jgf2efeawvotiedb4apok
73196
73195
2026-07-08T19:28:39Z
Robertsky
10424
1 versaun husi [[:en:Template:Editnotice_load]]
73195
wikitext
text/x-wiki
{{#if: {{Editnotice load/content
| notice action = {{{notice action|}}}
}} | <!--
We unfortunately have to call /content twice so that the editnotice-area and clear elements
are only output if there is at least one actual edit notice. This ensures the software can determine
whether or not a page has edit notices (for the API, WikiEditor, VisualEditor and others). And to ensure
MediaWiki:Editnotice-notext gets shown when appropiate.
--><div id="editnotice-area" class="editnotice-area mw-parser-output" style="clear: both;">{{Editnotice load/content
| notice action = {{{notice action|}}}
}}<div style="clear: both;"></div></div>
}}<noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
eq6cug9b92jgf2efeawvotiedb4apok
Template:Editnotice load/content
10
8318
73197
2025-10-07T23:26:05Z
en>Izno
0
-hardcoded width
73197
wikitext
text/x-wiki
<!--
Beware: The /content subpage MUST NOT output ANY content or HTML unless one or more edit notices exist so that
MediaWiki can determine whether or not to show MediaWiki:Editnotice-notext. Otherwise this will incorrectly
cause the software to think the page has an edit notice when in fact it doesn't.
-->
<!--
Namespace notice:
-->{{#ifeq: {{{notice action|}}} | view
| <!--"Viewing the source" of a protected page, don't show namespace notice-->
| {{#ifexist: Template:Editnotices/Namespace/{{#if:{{NAMESPACE}}|{{NAMESPACE}}|Main}}
| {{#if: {{Template:Editnotices/Namespace/{{#if:{{NAMESPACE}}|{{NAMESPACE}}|Main}}}} | <div class="editnotice-namespace"> {{Template:Editnotices/Namespace/{{#if:{{NAMESPACE}}|{{NAMESPACE}}|Main}}}} </div> }}
}}
}}<!--
Group and page notice:
-->{{editnotice load/core
| notice action = {{{notice action|}}}
| group allowed = {{ns has subpages}} <!--"yes" or empty string-->
| groupnotice = Template:Editnotices/Group/{{FULLROOTPAGENAME}}
| pagenotice =
<!--If on a user or user talk rootpage, then use /Editnotice,
else use normal protected notice-->
{{#ifeq: {{SUBJECTSPACE}}#{{PAGENAME}} | {{ns:User}}#{{BASEPAGENAME}}
| {{FULLPAGENAME}}/Editnotice
| Template:Editnotices/Page/{{FULLPAGENAME}}
}}
| userpage =
<!--If on a user or user talk rootpage, then "yes", else empty string-->
{{#ifeq: {{SUBJECTSPACE}}#{{PAGENAME}} | {{ns:User}}#{{BASEPAGENAME}}
| yes
}}
| ownuserpage =
<!--If on the user's own user or user talk rootpage, then "yes", else empty string. {{REVISIONUSER}} returns current user when in system messages. -->
{{#ifeq: {{SUBJECTSPACE}}#{{PAGENAME}} | {{ns:User}}#{{REVISIONUSER}}
| yes
}}
}}<noinclude>{{documentation}}</noinclude>
nyvq5as21s5pod116fo4qfuk5j8eeq4
73198
73197
2026-07-08T19:28:39Z
Robertsky
10424
1 versaun husi [[:en:Template:Editnotice_load/content]]
73197
wikitext
text/x-wiki
<!--
Beware: The /content subpage MUST NOT output ANY content or HTML unless one or more edit notices exist so that
MediaWiki can determine whether or not to show MediaWiki:Editnotice-notext. Otherwise this will incorrectly
cause the software to think the page has an edit notice when in fact it doesn't.
-->
<!--
Namespace notice:
-->{{#ifeq: {{{notice action|}}} | view
| <!--"Viewing the source" of a protected page, don't show namespace notice-->
| {{#ifexist: Template:Editnotices/Namespace/{{#if:{{NAMESPACE}}|{{NAMESPACE}}|Main}}
| {{#if: {{Template:Editnotices/Namespace/{{#if:{{NAMESPACE}}|{{NAMESPACE}}|Main}}}} | <div class="editnotice-namespace"> {{Template:Editnotices/Namespace/{{#if:{{NAMESPACE}}|{{NAMESPACE}}|Main}}}} </div> }}
}}
}}<!--
Group and page notice:
-->{{editnotice load/core
| notice action = {{{notice action|}}}
| group allowed = {{ns has subpages}} <!--"yes" or empty string-->
| groupnotice = Template:Editnotices/Group/{{FULLROOTPAGENAME}}
| pagenotice =
<!--If on a user or user talk rootpage, then use /Editnotice,
else use normal protected notice-->
{{#ifeq: {{SUBJECTSPACE}}#{{PAGENAME}} | {{ns:User}}#{{BASEPAGENAME}}
| {{FULLPAGENAME}}/Editnotice
| Template:Editnotices/Page/{{FULLPAGENAME}}
}}
| userpage =
<!--If on a user or user talk rootpage, then "yes", else empty string-->
{{#ifeq: {{SUBJECTSPACE}}#{{PAGENAME}} | {{ns:User}}#{{BASEPAGENAME}}
| yes
}}
| ownuserpage =
<!--If on the user's own user or user talk rootpage, then "yes", else empty string. {{REVISIONUSER}} returns current user when in system messages. -->
{{#ifeq: {{SUBJECTSPACE}}#{{PAGENAME}} | {{ns:User}}#{{REVISIONUSER}}
| yes
}}
}}<noinclude>{{documentation}}</noinclude>
nyvq5as21s5pod116fo4qfuk5j8eeq4
Template:Editnotice load/core
10
8319
73199
2019-09-14T21:08:20Z
en>Amalthea
0
replace NAMESPACEID with NAMESPACENUMBER -- magic work does the exact same work, if no parameter is given.
73199
wikitext
text/x-wiki
{{#switch:
{{#if: {{{group allowed|}}}
| {{#ifexist: {{{groupnotice|}}}
| {{#switch:
{{ {{{groupnotice|}}} | notice action={{{notice action|}}} }}
| -
| = <!--Notice is blank or only contains "-", don't use it-->
| #default = group
}}
}}
}}{{#ifexist: {{{pagenotice|}}}
| {{#switch:
{{ {{{pagenotice|}}} | notice action={{{notice action|}}} }}
| -
| = <!--Notice is blank or only contains "-", don't use it-->
| #default = page
}}
}}
| group =
<!--We have a group notice, but no page notice-->
<div class="editnotice-link" style="clear: both; float: right; margin: 0px 0.8em; padding: 0; line-height: 1em;"> <small>[[{{{groupnotice|}}}|Group notice]] <span class="editnotice-redlink {{#if: {{{ownuserpage|}}} || sysop-show templateeditor-show extendedmover-show }}" style="{{#if: {{{ownuserpage|}}} || display: none; }}"> [[{{{pagenotice|}}}|Page notice]]</span></small> </div>
<div class="editnotice-group" style="clear: both; width: 100%;"> {{ {{{groupnotice|}}} | notice action={{{notice action|}}} }} </div>
| page =
<!--We have a page notice, but no group notice-->
<div class="editnotice-link" style="clear: both; float: right; margin: 0px 0.8em; padding: 0; line-height: 1em;"> <small>{{#if: {{{group allowed|}}}
| <span class="editnotice-redlink sysop-show templateeditor-show extendedmover-show" style="display: none;">[[{{{groupnotice|}}}|Group notice]] </span>
}} [[{{{pagenotice|}}}|Page notice]]</small> </div>
<div {{#if: {{{userpage|}}} | id="editnotice-ns-{{NAMESPACENUMBER}}" }} class="editnotice-page" style="clear: both; width: 100%;"> {{ {{{pagenotice|}}} | notice action={{{notice action|}}} }} </div>
| grouppage =
<!--We have both a group notice and a page notice-->
<div class="editnotice-link" style="clear: both; float: right; margin: 0px 0.8em; padding: 0; line-height: 1em;"> <small>[[{{{groupnotice|}}}|Group notice]]</small> </div>
<div class="editnotice-group" style="clear: both; width: 100%;"> {{ {{{groupnotice|}}} | notice action={{{notice action|}}} }} </div>
<div class="editnotice-link" style="clear: both; float: right; margin: 0px 0.8em; padding: 0; line-height: 1em;"> <small>[[{{{pagenotice|}}}|Page notice]]</small> </div>
<div {{#if: {{{userpage|}}} | id="editnotice-ns-{{NAMESPACENUMBER}}" }} class="editnotice-page" style="clear: both; width: 100%;"> {{ {{{pagenotice|}}} | notice action={{{notice action|}}} }} </div>
| #default =
<!-- See [[Template:Editnotice_load/notext]] and [[MediaWiki:Editnotice-notext]] for the display of the red link. This must remain empty. -->
}}<noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
7en0kig348plcy4y1hgk59v2rmjhze0
73200
73199
2026-07-08T19:28:39Z
Robertsky
10424
1 versaun husi [[:en:Template:Editnotice_load/core]]
73199
wikitext
text/x-wiki
{{#switch:
{{#if: {{{group allowed|}}}
| {{#ifexist: {{{groupnotice|}}}
| {{#switch:
{{ {{{groupnotice|}}} | notice action={{{notice action|}}} }}
| -
| = <!--Notice is blank or only contains "-", don't use it-->
| #default = group
}}
}}
}}{{#ifexist: {{{pagenotice|}}}
| {{#switch:
{{ {{{pagenotice|}}} | notice action={{{notice action|}}} }}
| -
| = <!--Notice is blank or only contains "-", don't use it-->
| #default = page
}}
}}
| group =
<!--We have a group notice, but no page notice-->
<div class="editnotice-link" style="clear: both; float: right; margin: 0px 0.8em; padding: 0; line-height: 1em;"> <small>[[{{{groupnotice|}}}|Group notice]] <span class="editnotice-redlink {{#if: {{{ownuserpage|}}} || sysop-show templateeditor-show extendedmover-show }}" style="{{#if: {{{ownuserpage|}}} || display: none; }}"> [[{{{pagenotice|}}}|Page notice]]</span></small> </div>
<div class="editnotice-group" style="clear: both; width: 100%;"> {{ {{{groupnotice|}}} | notice action={{{notice action|}}} }} </div>
| page =
<!--We have a page notice, but no group notice-->
<div class="editnotice-link" style="clear: both; float: right; margin: 0px 0.8em; padding: 0; line-height: 1em;"> <small>{{#if: {{{group allowed|}}}
| <span class="editnotice-redlink sysop-show templateeditor-show extendedmover-show" style="display: none;">[[{{{groupnotice|}}}|Group notice]] </span>
}} [[{{{pagenotice|}}}|Page notice]]</small> </div>
<div {{#if: {{{userpage|}}} | id="editnotice-ns-{{NAMESPACENUMBER}}" }} class="editnotice-page" style="clear: both; width: 100%;"> {{ {{{pagenotice|}}} | notice action={{{notice action|}}} }} </div>
| grouppage =
<!--We have both a group notice and a page notice-->
<div class="editnotice-link" style="clear: both; float: right; margin: 0px 0.8em; padding: 0; line-height: 1em;"> <small>[[{{{groupnotice|}}}|Group notice]]</small> </div>
<div class="editnotice-group" style="clear: both; width: 100%;"> {{ {{{groupnotice|}}} | notice action={{{notice action|}}} }} </div>
<div class="editnotice-link" style="clear: both; float: right; margin: 0px 0.8em; padding: 0; line-height: 1em;"> <small>[[{{{pagenotice|}}}|Page notice]]</small> </div>
<div {{#if: {{{userpage|}}} | id="editnotice-ns-{{NAMESPACENUMBER}}" }} class="editnotice-page" style="clear: both; width: 100%;"> {{ {{{pagenotice|}}} | notice action={{{notice action|}}} }} </div>
| #default =
<!-- See [[Template:Editnotice_load/notext]] and [[MediaWiki:Editnotice-notext]] for the display of the red link. This must remain empty. -->
}}<noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
7en0kig348plcy4y1hgk59v2rmjhze0
Template:Anontools/ipv4
10
8320
73201
2025-07-30T02:19:57Z
en>Slakr
0
Undid revision [[Special:Diff/1302317115|1302317115]] by [[Special:Contributions/Slakr|Slakr]] ([[User talk:Slakr|talk]]) it's back
73201
wikitext
text/x-wiki
{{flatlist|1=
* ([https://whois-referral.toolforge.org/gateway.py?lookup=true&ip={{{1}}} WHOIS] <sup>([https://www.robtex.com/ip-lookup/{{{1}}} alt] • [https://tools.wmflabs.org/whois/gateway.py?lookup=true&ip={{{1}}} old])</sup>
* [https://whatismyipaddress.com/ip/{{{1}}} Geolocate] <sup>([https://www.iplocate.io/{{{1}}} Alternate])</sup>
* [https://ipcheck.toolforge.org/index.php?ip={{{1}}} Proxy Checker]
* [{{fullurl:Special%3ABlockList|ip={{{1}}}}} Current blocks]
* [https://xtools.wmcloud.org/ec/en.wikipedia.org/{{#ifeq:{{#invoke:IPAddress|isIpOrRange|{{{1}}}}}|range|ipr-}}{{urlencode:{{{1}}}|PATH}} XTools]
* [{{#ifeq:{{#invoke:IPAddress|isIpOrRange|{{{1}}}}}|range|https://xtools.wmflabs.org/globalcontribs/ipr-|https://guc.toolforge.org/index.php?user=}}{{{1}}} Global contributions])
*([[Regional Internet registry|RIR]]s: [https://rdap.afrinic.net/rdap/ip/{{{1}}} Africa]
* [https://whois.arin.net/rest/ip/{{{1}}} America]
* [https://wq.apnic.net/apnic-bin/whois.pl?searchtext={{{1}}} Asia-Pacific]
* [https://apps.db.ripe.net/db-web-ui/query?searchtext={{{1}}} Europe]
* [https://query.milacnic.lacnic.net/search?id={{{1}}} Latin America/Caribbean])
}}<noinclude>
{{Documentation|content=Please see [[Template:Anontools]] for usage instructions.}}
</noinclude>
13153fedb8ou7ly52zj6x6lkdhxalyf
73202
73201
2026-07-08T19:28:39Z
Robertsky
10424
1 versaun husi [[:en:Template:Anontools/ipv4]]
73201
wikitext
text/x-wiki
{{flatlist|1=
* ([https://whois-referral.toolforge.org/gateway.py?lookup=true&ip={{{1}}} WHOIS] <sup>([https://www.robtex.com/ip-lookup/{{{1}}} alt] • [https://tools.wmflabs.org/whois/gateway.py?lookup=true&ip={{{1}}} old])</sup>
* [https://whatismyipaddress.com/ip/{{{1}}} Geolocate] <sup>([https://www.iplocate.io/{{{1}}} Alternate])</sup>
* [https://ipcheck.toolforge.org/index.php?ip={{{1}}} Proxy Checker]
* [{{fullurl:Special%3ABlockList|ip={{{1}}}}} Current blocks]
* [https://xtools.wmcloud.org/ec/en.wikipedia.org/{{#ifeq:{{#invoke:IPAddress|isIpOrRange|{{{1}}}}}|range|ipr-}}{{urlencode:{{{1}}}|PATH}} XTools]
* [{{#ifeq:{{#invoke:IPAddress|isIpOrRange|{{{1}}}}}|range|https://xtools.wmflabs.org/globalcontribs/ipr-|https://guc.toolforge.org/index.php?user=}}{{{1}}} Global contributions])
*([[Regional Internet registry|RIR]]s: [https://rdap.afrinic.net/rdap/ip/{{{1}}} Africa]
* [https://whois.arin.net/rest/ip/{{{1}}} America]
* [https://wq.apnic.net/apnic-bin/whois.pl?searchtext={{{1}}} Asia-Pacific]
* [https://apps.db.ripe.net/db-web-ui/query?searchtext={{{1}}} Europe]
* [https://query.milacnic.lacnic.net/search?id={{{1}}} Latin America/Caribbean])
}}<noinclude>
{{Documentation|content=Please see [[Template:Anontools]] for usage instructions.}}
</noinclude>
13153fedb8ou7ly52zj6x6lkdhxalyf
Template:Script doc auto
10
8321
73203
2024-01-26T16:09:16Z
en>Pppery
0
Swap to Lua version per request
73203
wikitext
text/x-wiki
{{#invoke:Script doc auto|main}}<noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
9rx6a2fxeryilzqfckycefkvc14txm9
73204
73203
2026-07-08T19:28:39Z
Robertsky
10424
1 versaun husi [[:en:Template:Script_doc_auto]]
73203
wikitext
text/x-wiki
{{#invoke:Script doc auto|main}}<noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
9rx6a2fxeryilzqfckycefkvc14txm9
Template:Pipedash
10
8322
73205
2019-03-05T14:22:02Z
en>Xaosflux
0
Protected "[[Template:Pipedash]]": Pages alread protected from [[Wikipedia:Cascade-protected items/content]] ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
73205
wikitext
text/x-wiki
#REDIRECT [[Template:!-]]
ey0ay890faglhf0ocbjdxn6mt01zf83
73206
73205
2026-07-08T19:28:39Z
Robertsky
10424
1 versaun husi [[:en:Template:Pipedash]]
73205
wikitext
text/x-wiki
#REDIRECT [[Template:!-]]
ey0ay890faglhf0ocbjdxn6mt01zf83
Módulo:Lockbox
828
8323
73207
2024-11-10T06:48:34Z
en>Pppery
0
... I told you so! ...
73207
Scribunto
text/plain
local export = {}
-- XXX: OUTRAGEOUS ABUSE OF SCRIBUNTO API
-- Generates a transclusion without incrementing the "expensive function" count
local generate_transclusion
do
local mock_title = mw.title.new(mw.title.getCurrentTitle().id)
local getContent = mock_title.getContent
function generate_transclusion(title)
local full_text = type(title) == 'table' and title.fullText or title
rawset(mock_title, 'fullText', full_text)
getContent(mock_title)
end
end
local function make_wikitext_warning(msg)
return string.format('<strong class="error">Warning: %s.</strong>', msg)
end
function export.lock(frame)
local warnings, transclusion_list = {}, {}
-- Check if the transcluding page is cascade-protected.
--
-- Only pages transcluded from a cascade-protected page appear in
-- CASCADINGSOURCES, so normally we would not be able to tell if the lockbox
-- itself is cascade-protected. To work around this, we generate a
-- transclusion from the lockbox to itself, so that it will have an entry
-- for itself in CASCADINGSOURCES.
--
-- We cannot generate this transclusion using the title object for the
-- parent title (the lockbox), as if the lockbox is transcluded on another
-- page, we will generate a transclusion *from* the lockbox *to* that page
-- as well, and the page will be cascade-protected. Instead we generate it
-- with the title object for the current title.
--
-- When the current title is the parent title (i.e. we are rendering the
-- lockbox page), this creates the required entry in the link table in the
-- database. When the current title is the grandparent title or up (i.e. we
-- are rendering a page transcluding the lockbox), transclusions are only
-- created from the page itself, not from the lockbox, and it is not
-- cascade-protected.
--
-- This creates an extaneous self-transclusion for all pages using the
-- module, but we treat that as a necessary evil.
--[[ This entire block no longer works following https://gerrit.wikimedia.org/r/c/mediawiki/extensions/Scribunto/+/1074581
do
mw.title.getCurrentTitle():getContent() -- Generate self-transclusion
local parent_title = frame:getParent():getTitle()
if not mw.title.new(parent_title).cascadingProtection.sources[1] then
warnings[#warnings + 1] = make_wikitext_warning(string.format(
'the page "%s" is not cascade-protected',
parent_title
))
end
end
--]]
-- Generate transclusions to the templates, and build the output list.
for i, item in ipairs(frame.args) do
item = mw.text.trim(item)
local title = mw.title.new(item)
if title then
local ns = title.namespace
local prefixed_text = title.prefixedText
if ns == 0 then
-- The item had no namespace text. If the item starts with a
-- colon, assume it is a mainspace page. Otherwise, assume it is
-- a template.
if item:sub(1, 1) == ':' then
generate_transclusion(title)
table.insert(transclusion_list, '* [[' .. prefixed_text .. ']]')
else
generate_transclusion('Template:' .. prefixed_text)
table.insert(transclusion_list, '* [[Template:' .. prefixed_text .. ']]')
end
elseif ns == 6 or ns == 14 then -- File or Category namespace
generate_transclusion(title)
table.insert(transclusion_list, '* [[:' .. prefixed_text .. ']]')
else
generate_transclusion(title)
table.insert(transclusion_list, '* [[' .. prefixed_text .. ']]')
end
else
warnings[#warnings + 1] = make_wikitext_warning(string.format(
'invalid title "%s" in argument #%d',
item,
i
))
end
end
if frame.args.silent then
return ''
else
-- If there were any warnings, show them at the top. Then show the list
-- of transcluded pages.
local ret = ''
if #warnings > 0 then
if #warnings > 1 then
for i, warning in ipairs(warnings) do
warnings[i] = '* ' .. warning
end
end
ret = ret .. table.concat(warnings, '\n') .. '\n\n'
end
return ret .. table.concat(transclusion_list, '\n')
end
end
return export
swmqy8152jh6dxftfk2kjgueesogz3r
73208
73207
2026-07-08T19:28:39Z
Robertsky
10424
1 versaun husi [[:en:Module:Lockbox]]
73207
Scribunto
text/plain
local export = {}
-- XXX: OUTRAGEOUS ABUSE OF SCRIBUNTO API
-- Generates a transclusion without incrementing the "expensive function" count
local generate_transclusion
do
local mock_title = mw.title.new(mw.title.getCurrentTitle().id)
local getContent = mock_title.getContent
function generate_transclusion(title)
local full_text = type(title) == 'table' and title.fullText or title
rawset(mock_title, 'fullText', full_text)
getContent(mock_title)
end
end
local function make_wikitext_warning(msg)
return string.format('<strong class="error">Warning: %s.</strong>', msg)
end
function export.lock(frame)
local warnings, transclusion_list = {}, {}
-- Check if the transcluding page is cascade-protected.
--
-- Only pages transcluded from a cascade-protected page appear in
-- CASCADINGSOURCES, so normally we would not be able to tell if the lockbox
-- itself is cascade-protected. To work around this, we generate a
-- transclusion from the lockbox to itself, so that it will have an entry
-- for itself in CASCADINGSOURCES.
--
-- We cannot generate this transclusion using the title object for the
-- parent title (the lockbox), as if the lockbox is transcluded on another
-- page, we will generate a transclusion *from* the lockbox *to* that page
-- as well, and the page will be cascade-protected. Instead we generate it
-- with the title object for the current title.
--
-- When the current title is the parent title (i.e. we are rendering the
-- lockbox page), this creates the required entry in the link table in the
-- database. When the current title is the grandparent title or up (i.e. we
-- are rendering a page transcluding the lockbox), transclusions are only
-- created from the page itself, not from the lockbox, and it is not
-- cascade-protected.
--
-- This creates an extaneous self-transclusion for all pages using the
-- module, but we treat that as a necessary evil.
--[[ This entire block no longer works following https://gerrit.wikimedia.org/r/c/mediawiki/extensions/Scribunto/+/1074581
do
mw.title.getCurrentTitle():getContent() -- Generate self-transclusion
local parent_title = frame:getParent():getTitle()
if not mw.title.new(parent_title).cascadingProtection.sources[1] then
warnings[#warnings + 1] = make_wikitext_warning(string.format(
'the page "%s" is not cascade-protected',
parent_title
))
end
end
--]]
-- Generate transclusions to the templates, and build the output list.
for i, item in ipairs(frame.args) do
item = mw.text.trim(item)
local title = mw.title.new(item)
if title then
local ns = title.namespace
local prefixed_text = title.prefixedText
if ns == 0 then
-- The item had no namespace text. If the item starts with a
-- colon, assume it is a mainspace page. Otherwise, assume it is
-- a template.
if item:sub(1, 1) == ':' then
generate_transclusion(title)
table.insert(transclusion_list, '* [[' .. prefixed_text .. ']]')
else
generate_transclusion('Template:' .. prefixed_text)
table.insert(transclusion_list, '* [[Template:' .. prefixed_text .. ']]')
end
elseif ns == 6 or ns == 14 then -- File or Category namespace
generate_transclusion(title)
table.insert(transclusion_list, '* [[:' .. prefixed_text .. ']]')
else
generate_transclusion(title)
table.insert(transclusion_list, '* [[' .. prefixed_text .. ']]')
end
else
warnings[#warnings + 1] = make_wikitext_warning(string.format(
'invalid title "%s" in argument #%d',
item,
i
))
end
end
if frame.args.silent then
return ''
else
-- If there were any warnings, show them at the top. Then show the list
-- of transcluded pages.
local ret = ''
if #warnings > 0 then
if #warnings > 1 then
for i, warning in ipairs(warnings) do
warnings[i] = '* ' .. warning
end
end
ret = ret .. table.concat(warnings, '\n') .. '\n\n'
end
return ret .. table.concat(transclusion_list, '\n')
end
end
return export
swmqy8152jh6dxftfk2kjgueesogz3r
Template:Editnotice load/notext/core
10
8324
73209
2018-11-27T15:59:20Z
en>Xaosflux
0
class updates requested at [[Wikipedia talk:Editnotice]] - revert if any issues
73209
wikitext
text/x-wiki
{{#if: {{{group allowed|}}}
| {{#if: {{{ownuserpage|}}}
| <!--On a user's own rootpage-->
<div class="editnotice-link editnotice-redlink" style="clear: both; float: right; margin: 0px 0.8em; padding: 0; line-height: 1em;"> <small><span class="sysop-show templateeditor-show extendedmover-show" style="display: none;">[[{{{groupnotice|}}}|Group notice]] </span> [[{{{pagenotice|}}}|Page notice]]</small> </div>
| <!--On any other page, and group notices allowed-->
<div class="editnotice-link editnotice-redlink sysop-show templateeditor-show extendedmover-show" style="clear: both; float: right; margin: 0px 0.8em; padding: 0; line-height: 1em; display: none;"> <small>[[{{{groupnotice|}}}|Group notice]] [[{{{pagenotice|}}}|Page notice]]</small> </div>
}}
| <!--Group notices not allowed, so also not in user space-->
<div class="editnotice-link editnotice-redlink sysop-show templateeditor-show extendedmover-show" style="clear: both; float: right; margin: 0px 0.8em; padding: 0; line-height: 1em; display: none;"> <small>[[{{{pagenotice|}}}|Page notice]]</small> </div>
}}<noinclude>{{doc}}</noinclude>
3qul9w4tu86hodonjzn31ropvh3dysp
73210
73209
2026-07-08T19:28:39Z
Robertsky
10424
1 versaun husi [[:en:Template:Editnotice_load/notext/core]]
73209
wikitext
text/x-wiki
{{#if: {{{group allowed|}}}
| {{#if: {{{ownuserpage|}}}
| <!--On a user's own rootpage-->
<div class="editnotice-link editnotice-redlink" style="clear: both; float: right; margin: 0px 0.8em; padding: 0; line-height: 1em;"> <small><span class="sysop-show templateeditor-show extendedmover-show" style="display: none;">[[{{{groupnotice|}}}|Group notice]] </span> [[{{{pagenotice|}}}|Page notice]]</small> </div>
| <!--On any other page, and group notices allowed-->
<div class="editnotice-link editnotice-redlink sysop-show templateeditor-show extendedmover-show" style="clear: both; float: right; margin: 0px 0.8em; padding: 0; line-height: 1em; display: none;"> <small>[[{{{groupnotice|}}}|Group notice]] [[{{{pagenotice|}}}|Page notice]]</small> </div>
}}
| <!--Group notices not allowed, so also not in user space-->
<div class="editnotice-link editnotice-redlink sysop-show templateeditor-show extendedmover-show" style="clear: both; float: right; margin: 0px 0.8em; padding: 0; line-height: 1em; display: none;"> <small>[[{{{pagenotice|}}}|Page notice]]</small> </div>
}}<noinclude>{{doc}}</noinclude>
3qul9w4tu86hodonjzn31ropvh3dysp
Template:Editnotice load/notext
10
8325
73211
2023-09-05T03:19:44Z
en>Pppery
0
Documentation
73211
wikitext
text/x-wiki
<!-- Keep in sync with [[Template:Editnotice_load/content]] -->
{{Editnotice load/notext/core
| group allowed = {{ns has subpages}}
| groupnotice = Template:Editnotices/Group/{{FULLROOTPAGENAME}}
| pagenotice =
{{#ifeq: {{SUBJECTSPACE}}#{{PAGENAME}} | {{ns:User}}#{{BASEPAGENAME}}
| {{FULLPAGENAME}}/Editnotice
| Template:Editnotices/Page/{{FULLPAGENAME}}
}}
| ownuserpage =
{{#ifeq: {{SUBJECTSPACE}}#{{PAGENAME}} | {{ns:User}}#{{REVISIONUSER}}
| yes
}}
}}<noinclude>{{documentation}}</noinclude>
2moxt94ob456kun2hzz3r3m36e5ueee
73212
73211
2026-07-08T19:28:40Z
Robertsky
10424
1 versaun husi [[:en:Template:Editnotice_load/notext]]
73211
wikitext
text/x-wiki
<!-- Keep in sync with [[Template:Editnotice_load/content]] -->
{{Editnotice load/notext/core
| group allowed = {{ns has subpages}}
| groupnotice = Template:Editnotices/Group/{{FULLROOTPAGENAME}}
| pagenotice =
{{#ifeq: {{SUBJECTSPACE}}#{{PAGENAME}} | {{ns:User}}#{{BASEPAGENAME}}
| {{FULLPAGENAME}}/Editnotice
| Template:Editnotices/Page/{{FULLPAGENAME}}
}}
| ownuserpage =
{{#ifeq: {{SUBJECTSPACE}}#{{PAGENAME}} | {{ns:User}}#{{REVISIONUSER}}
| yes
}}
}}<noinclude>{{documentation}}</noinclude>
2moxt94ob456kun2hzz3r3m36e5ueee
Módulo:WikiProject banner
828
8326
73213
2026-05-29T00:42:24Z
en>Pppery
0
Add class params for task forces/notes too
73213
Scribunto
text/plain
require('strict')
local p = {}
local sandbox --= '/sandbox' -- BE SURE TO COMMENT OUT this definition when deploying to live
local cfg = mw.loadData('Module:WikiProject banner/config' .. (sandbox or ''))
local auxiliary = cfg.auxiliary_module .. (sandbox or '')
local args_module = require('Module:Arguments')
local mbox = require('Module:Message box').main
local yesno = require('Module:Yesno')
local frame = mw.getCurrentFrame()
local lang = mw.getLanguage(cfg.language)
local current_title = mw.title.getCurrentTitle()
local parameter_format = function(parameter, value)
return frame:expandTemplate{title='para', args={parameter, value or ''}}
end
local wikilink = function(link, display)
if link then
return display and '[['..link..'|'..display..']]' or '[['..link..']]'
else
return display or ''
end
end
local display_error = function(text)
local span = mw.html.create('div')
:addClass('error')
:wikitext(text)
return tostring(span)
end
local image = function(image_name, size, alt, position, class)
return image_name and '[[File:'
.. image_name
.. (size and '|' .. size or '')
.. (position and '|' .. position or '')
.. (alt and '|alt=' .. alt or '')
.. '|class=noviewer'..(class and ' '..class or '')
.. ']]'
end
local if_exists = function(target, fallback) -- function to add wikilink if target exists
local title = mw.title.new(target)
if title and title.exists then
return wikilink(target)
else
return fallback or target
end
end
local importance_mask = function(importance, scale, banner_name, pagetype, class)
---------------------------
-- Importance mask --------
---------------------------
local importance_normalised
if scale=='inline' then -- pass importance without change
importance_normalised = importance or ''
elseif scale=='subpage' then
local custom_mask = banner_name:subPageTitle('importance')
if custom_mask.exists and #custom_mask:getContent()>1 then -- pass to custom importance mask
importance_normalised = mw.text.trim(frame:expandTemplate{
title = custom_mask.prefixedText,
args = {
importance = importance,
class = class,
pagetype = pagetype
}
})
end
else -- standard importance scale
importance_normalised = cfg.importance.na
if pagetype=='article' or pagetype=='set index article' or pagetype=='redirect' or pagetype=='draft' then
local mask = cfg.importance.mask
if importance and mask[importance:lower()] then -- valid importance specified
importance_normalised = mask[importance:lower()]
elseif pagetype=='article' or pagetype=='set index article' then -- unspecified or invalid importance, use "Unknown" for articles
importance_normalised = cfg.importance.unknown
end
end
end
return importance_normalised
end
---------------------------
-- Quality class mask -----
---------------------------
p.readarticleclass = function(options, page) -- used by _main and also Module:Banner shell
page = page or current_title.prefixedText
local get_parameter_value = require('Module:Template parameter value').getParameter
local success, result = get_parameter_value(page, cfg.banner_shell.redirects, 'class', options)
return success and result
-- returns FALSE if banner shell template does not exist on page
-- returns BLANK if class parameter is not defined or is defined blank
-- otherwise returns class parameter
end
p.class_mask = function(class, title, FQS, pagetype, article)
local resolveFQSgrade = function(class)
return FQS and lang:ucfirst(class) or 'NA'
end
local out
title = title or mw.title.getCurrentTitle()
local ns = title.namespace
class = class:match('^%s*(.-)%s*$'):lower()
if pagetype=='redirect' or pagetype=='soft redirect' then
out = resolveFQSgrade('redirect')
elseif pagetype=='disambiguation page' then
out = resolveFQSgrade('disambig')
elseif article or pagetype=='article' or pagetype=='set index article' then
if pagetype=='set index article' then
out = 'List'
elseif class=='start' or class=='stub' then -- Ucfirst
out = lang:ucfirst(class)
elseif class=='b' or class=='c' or class=='fa' or class=='fl' or class=='a' or class=='ga' then -- Upper-case
out = class:upper()
elseif class=='list' or class=='sia' or class=='si' or class=='sl' then-- List
out = 'List'
else
out = '' -- unassessed
end
elseif ns==7 or ns==711 then -- File talk
if class=='fm' then
out = 'FM'
else
out = resolveFQSgrade('file')
end
else
local grade = cfg.quality.ns_to_class[ns] or 'NA'
out = resolveFQSgrade(grade)
end
return out
end
local page_assessment = function(project, class, importance) -- add PageAssessments parser function
local assessment = table.concat({project, class or '', importance or ''},'|')
frame:preprocess('{{#assessment:' .. assessment .. '}}')
end
local bubble = function(text, style)
local out = mw.html.create('span')
:addClass('wpb-header-bubbles')
:addClass(style)
:wikitext(text)
return tostring(out)
end
p._main = function(args, raw_args, demo_page, banner_name, inactive)
---------------------------
-- Initialise parameters --
---------------------------
local project = args.PROJECT or 'PROJECT'
local project_name = args.PROJECT_NAME or 'WikiProject ' .. project
local project_link = mw.title.new(args.PROJECT_LINK or 'Wikipedia:' .. project_name)
local pagetype = demo_page==true and 'article' or require('Module:Pagetype')._main({
page = demo_page,
dab = 'disambiguation page',
sia = 'set index article',
draft = 'draft'
})
local article = pagetype=='article' or pagetype=='set index article'
local rows, nested_ratings, task_forces, notes, categories, taskforce_categories = {}, {}, {}, {}, {}, {}
local add_category = function(category, key)
if category and category~='none' then
table.insert(categories, {category = category, key = key})
end
end
local parse_pt = function(text) -- function to replace _PAGETYPE_ with the actual page type
local ptype = article and 'article' or pagetype -- display "article" for articles otherwise page type
return text and text:gsub('_PAGETYPE_', ptype)
end
for arg_name, arg_value in pairs(args) do
local tf_match = mw.ustring.match(arg_name,'^tf (%d+)$')
local note_match = mw.ustring.match(arg_name,'^note (%d+)$')
if tf_match and yesno(arg_value, true) then
table.insert(task_forces, tf_match)
elseif note_match and yesno(arg_value, true) then
table.insert(notes, note_match)
else
local tf, cat = mw.ustring.match(arg_name,'^tf (%d+) cat (%d+)$')
if tf and yesno(arg_value, true) then
if not taskforce_categories[tf] then -- initialise table
taskforce_categories[tf] = {}
end
table.insert(taskforce_categories[tf], cat)
end
end
end
table.sort(task_forces, function (x, y) return tonumber(x) < tonumber(y) end)
table.sort(notes, function (x, y) return tonumber(x) < tonumber(y) end)
local assessment_category = function(cat, name)
if cat then
return cat:gsub(' articles', '') -- remove "articles" from category
else
return name or ''
end
end
local assessment_cat = assessment_category(args.ASSESSMENT_CAT, project)
---------------------------
-- Location warning -------
---------------------------
local warning = ''
if not current_title.isTalkPage and not demo_page then
local text = cfg.namespace_warning.text:format(
current_title.talkPageTitle.fullText,
parameter_format('category', 'no')
)
local sortkey = current_title.namespace==10 and cfg.namespace_warning.sortkey_on_template_page or cfg.namespace_warning.sortkey
if current_title.namespace==10 then -- on the Template namespace
text = text .. ' ' .. cfg.namespace_warning.on_template_page:format(
parameter_format('BANNER_NAME'),
current_title.prefixedText
)
end
warning = mbox('ombox', {
image = '[[File:' .. cfg.namespace_warning.image .. '|40px]]',
type = cfg.namespace_warning.type_,
text = parse_pt(text)
})
if not current_title.subjectPageTitle:inNamespace(2) then
add_category(cfg.namespace_warning.categories, sortkey)
end
end
---------------------------
-- Substitution warning ---
---------------------------
if args.substcheck=='SUBST' then
local text = cfg.subst_warning.text:format(
project_name,
'<code>{{'..banner_name.prefixedText..'}}</code>'
)
warning = warning .. mbox('ombox', {
image = '[[File:' .. cfg.subst_warning.image .. '|40px]]',
type = cfg.subst_warning.type_,
text = text,
}) .. cfg.subst_warning.categories
end
---------------------------
-- Primary image/text -----
---------------------------
local primary_image = function(image_name, size, image_class)
local cell = mw.html.create('td')
if image_name and image_name~='' then
cell:addClass('mbox-image wpb-image')
:wikitext(image(image_name, size, cfg.image.alt, nil, image_class))
else
cell:addClass('mbox-empty-cell')
end
return cell
end
local portal = args.PORTAL
local portal_box = portal and frame:expandTemplate{title='Portal', args={portal}} or ''
local main_text = portal_box .. parse_pt(args.MAIN_TEXT or cfg.main_text:format(
project_link.prefixedText,
project_name,
args.MAIN_ARTICLE and if_exists(args.MAIN_ARTICLE) or if_exists(project, project .. ' articles'),
project_link.talkPageTitle.prefixedText
))
local image_left_size = args.IMAGE_LEFT_SIZE or cfg.image.default_size
local metadata = function(class, data)
return mw.html.create('span')
:addClass(class)
:wikitext(data)
end
local text_cell = mw.html.create('td')
:addClass('mbox-text')
:wikitext(main_text)
:tag('span')
:addClass('metadata wpb-metadata')
:node(metadata('wpb-project', project))
:node(metadata('wpb-project_link', project_link.prefixedText))
:node(metadata('wpb-banner_name', banner_name.prefixedText))
:node(metadata('wpb-assessment_cat', assessment_cat))
:done()
local primary_row = mw.html.create('tr')
:node(primary_image(args.IMAGE_LEFT, image_left_size,
args.IMAGE_LEFT_CLASS or args.IMAGE_CLASS))
:node(text_cell)
:node(primary_image(args.IMAGE_RIGHT, args.IMAGE_RIGHT_SIZE or cfg.image.default_size,
args.IMAGE_RIGHT_CLASS or args.IMAGE_CLASS))
table.insert(rows, primary_row)
---------------------------
-- Banner shell checks ----
---------------------------
local title = demo_page and demo_page~=true and mw.title.new(demo_page) or current_title
local class = p.readarticleclass({ignore_subtemplates=true}, title.prefixedText)
if class then -- banner shell exists
local special_chars = '([%%%(%)%.%+%-%*%?%[%]%^%$])'
local banner_name_escaped = banner_name.text
local page_content = require('Module:Wikitext Parsing' .. (sandbox or '')).PrepareText(title:getContent()) -- get content of current page
local content_without_shell
for capture in mw.ustring.gmatch(page_content, '%b{}') do -- look for possible templates on page
for _, redirect in ipairs(cfg.banner_shell.redirects) do
if mw.ustring.find(capture, '^{{%s*' .. redirect .. '%s*[|}].*}}$') then -- found a banner shell
banner_name_escaped = banner_name_escaped:gsub(special_chars, '%%%1') -- escape each special character
capture = capture:gsub(special_chars, '%%%1')
content_without_shell = mw.ustring.gsub(page_content, capture, '') -- remove banner shell content from page content
end
if content_without_shell then break end
end
if content_without_shell then break end
end
local template_outside_shell
if content_without_shell and mw.ustring.find(content_without_shell, '{{%s*' .. banner_name_escaped .. '%s*[|}]') then -- found banner template outside of the shell
add_category(cfg.banner_shell.category.outside_shell)
end
else -- no banner shell on page
if title.namespace==3 then --User talk namespace
for _, user in ipairs(cfg.banner_shell.valid_users) do
if string.find(title.rootText, user) then
add_category(cfg.banner_shell.category.no_banner_shell)
end
end
elseif title.namespace~=2 then -- not in user namespace
add_category(cfg.banner_shell.category.no_banner_shell)
end
class = ''
end
---------------------------
-- Quality assessment -----
---------------------------
local assessment_link = args.ASSESSMENT_LINK
if not assessment_link then
local fallback = mw.title.new(project_link.prefixedText .. '/Assessment')
assessment_link = fallback.exists and fallback.prefixedText
elseif assessment_link=='no' then
assessment_link = nil
end
local check_fallbacks = function(class, category) -- function to check non-article classes and automatically fall back to NA (or other) class if category does not exist
if article or args.QUALITY_CRITERIA=='custom' then -- no fallbacks for articles or projects with custom quality scales
return class
else -- check fallbacks for non-article classes
local new_class = class
local category_exists = function(class)
local cat = mw.title.new(cfg.quality.assessment_category:format(class, category .. ' ' .. (article and 'articles' or 'pages')))
return cat.exists and #cat:getContent()>0 -- check if category exists and is not blank
end
if class=='FM' and not category_exists('FM') then
new_class = 'File' -- fall back to File-class if FM category does not exist
end
if not category_exists(new_class) then
new_class = 'NA' -- use NA for non-article pages if category does not exist
end
return new_class
end
end
if raw_args.class then -- banner gives quality ratings
class = class and p.class_mask(class, title, true, pagetype, article) -- put PIQA class through standard class mask
if args.QUALITY_CRITERIA=='custom' then -- project has opted out of standard assessment scale and uses a custom mask
local project_class
local custom_mask = banner_name:subPageTitle('class')
if custom_mask.exists and #custom_mask:getContent()>1 then
raw_args.demo_page = demo_page -- send demo_page to custom mask
project_class = mw.text.trim(frame:expandTemplate{
title = custom_mask.prefixedText,
args = raw_args
})
if project_class=='' and class and class~='' then -- if unassessed and PIQA class exists, check if it can be inherited
local new_arg_table = {}
for arg, val in pairs(raw_args) do -- construct new argument table to send to custom mask
new_arg_table[arg] = val
end
new_arg_table.class = class -- replace class with inherited class
project_class = mw.text.trim(frame:expandTemplate{
title = custom_mask.prefixedText,
args = new_arg_table
}) -- inherit project class from PIQA class normalised by custom mask
end
local category = (project_class=='' and 'Unassessed' or project_class..'-Class') .. ' ' .. assessment_cat .. ' ' .. (article and 'articles' or 'pages')
add_category(category)
if class~=project_class then -- display project class in banner
class = project_class
local rating = project_class=='' and cfg.quality.not_yet or cfg.quality.rated:format(class)
local scale = cfg.quality.project_scale:format(wikilink((assessment_link or '')..'#'..lang:ucfirst(cfg.quality.name), cfg.quality.name))
local cssClass = 'class-' .. (class=='' and 'unassessed' or class:lower())
local class_row = mw.html.create('tr')
:tag('td')
:addClass('assess'):addClass(cssClass)
:wikitext(wikilink(':Category:' .. category, class=='' and '???' or class))
:done()
:tag('td')
:addClass('mbox-text')
:attr('colspan', '2')
:wikitext(parse_pt(cfg.quality.rating:format(rating, scale)))
:done()
table.insert(rows, class_row)
table.insert(
nested_ratings,
1,
bubble(class=='' and 'Unassessed' or (class..'‑class'), cssClass)
)
end
end
else -- project uses standard PIQA assessment
class = check_fallbacks(class, assessment_cat) -- check fallbacks for non-article classes
local category = (class=='' and 'Unassessed' or (class..'-Class')) .. ' ' .. assessment_cat .. ' ' .. (article and 'articles' or 'pages')
add_category(category)
if raw_args.class~='' then -- page has a non-blank class value which is ignored
add_category(cfg.banner_shell.category.ignored_class)
end
end
end
if args.HOOK_ASSESS then
table.insert(rows, args.HOOK_ASSESS)
end
if raw_args.b1 or raw_args.b2 or raw_args.b3 or raw_args.b4 or raw_args.b5 or raw_args.b6 then
local b_checklist = require(auxiliary).b_checklist(args, raw_args, class, demo_page, assessment_link)
table.insert(rows, b_checklist)
end
---------------------------
-- Priority assessment ----
---------------------------
local importance
local importance_name = args.IMPN or (raw_args.priority and 'priority' or cfg.importance.default_name)
if raw_args.importance or raw_args.priority then -- banner gives priority ratings
importance = importance_mask(args.importance or args.priority, args.IMPORTANCE_SCALE, banner_name, pagetype, class)
local category = importance .. '-' .. importance_name .. ' ' .. assessment_cat .. ' ' .. (importance=='NA' and 'pages' or 'articles')
if importance~='NA' then -- display importance rating
local rating = importance=='Unknown' and cfg.importance.not_yet or cfg.importance.rated:format(importance, importance_name)
local scale = assessment_link
and cfg.importance.project_scale:format(assessment_link..'#'..lang:ucfirst(cfg.importance.scale:format(importance_name)), cfg.importance.scale:format(importance_name))
or cfg.importance.default_scale
local importance_rating = parse_pt(cfg.importance.rating:format(rating, scale))
local cssClass = 'import-' .. importance:lower()
local importance_row = mw.html.create('tr')
:tag('td')
:addClass('assess')
:addClass(cssClass)
:wikitext(wikilink(':Category:' .. category, importance=='Unknown' and '???' or importance))
:done()
:tag('td')
:addClass('mbox-text')
:attr('colspan', '2')
:wikitext(importance_rating)
:done()
table.insert(rows, importance_row)
if importance~='Unknown' then -- importance is not NA or Unknown
table.insert(
nested_ratings,
bubble(importance .. '‑' .. importance_name, cssClass)
)
end
end
add_category(category)
if args.QII_FORMAT then
add_category(require(auxiliary).quality_importance_insection(args, class, importance, importance_name, assessment_cat, article))
end
end
if class or importance then
page_assessment(project, class, importance)
end
if args.HOOK_IMPORTANCE then
table.insert(rows, args.HOOK_IMPORTANCE)
end
---------------------------
-- Collapsing sections ----
---------------------------
local collapse_section = function(collapse, new_rows, header)
if collapse then
local header_row = mw.html.create('tr')
:tag('th')
:attr('colspan','3')
:addClass('wpb-collapsed-head')
:wikitext(header)
:done()
local blank_row = mw.html.create('tr')
:tag('td')
:addClass('mbox-image wpb-gutter')
:css('min-width', image_left_size)
:tag('span')
:addClass('wpb-iefix')
:wikitext('/ ')
:done() --TO FIX IE
:done()
:tag('td'):done()
:tag('td'):done()
local collapsed_rows = mw.html.create('table')
:addClass('mw-collapsible mw-collapsed')
:node(header_row)
:node(blank_row)
for _, row in ipairs(new_rows) do
collapsed_rows:node(row)
end
local collapsed_section = mw.html.create('tr')
:tag('td')
:attr('colspan','3')
:addClass('wpb-collapsed-notes')
:node(collapsed_rows)
:done()
table.insert(rows, collapsed_section)
else
for _, row in ipairs(new_rows) do
table.insert(rows, row)
end
end
end
---------------------------
-- Task forces ------------
---------------------------
local nested_tf, taskforce_output = {}, {}
local tf_default_size = args.TF_SIZE or cfg.task_force.default_size
for _, k in ipairs(task_forces) do
local tf_prefix = 'TF_' .. k .. '_'
local tf_assessment_cat = assessment_category(
args[tf_prefix..'ASSESSMENT_CAT'],
args[tf_prefix..'NAME']
)
if yesno(args[tf_prefix..'QUALITY']) and class then
local tf_class = check_fallbacks(class, tf_assessment_cat)
add_category((tf_class=='' and 'Unassessed' or tf_class..'-Class') .. ' ' .. tf_assessment_cat .. ' ' .. (article and 'articles' or 'pages'))
end
local tf_importance, tf_importance_category
if raw_args['tf '..k..' importance'] then
tf_importance = importance_mask(args['tf '..k..' importance'], args.IMPORTANCE_SCALE, banner_name, pagetype, class)
if tf_importance=='Unknown' and yesno(args.INHERIT_IMPORTANCE) then
tf_importance = importance
end
tf_importance_category = tf_importance .. '-' .. importance_name .. ' ' .. tf_assessment_cat .. ' ' .. (tf_importance=='NA' and 'pages' or 'articles')
add_category(tf_importance_category)
end
if args[tf_prefix .. 'TEXT']~='none' then
local portal = args[tf_prefix..'PORTAL'] and frame:expandTemplate{
title='Portal',
args={args[tf_prefix .. 'PORTAL'], height='15', margin='0'}
} or ''
local text = ''
local tf_text = args[tf_prefix..'TEXT'] or args.TF_TEXT
if tf_text then
text = portal .. tf_text
:gsub('_NAME_', args[tf_prefix .. 'NAME'] or '')
:gsub('_LINK_', args[tf_prefix .. 'LINK'] or '')
:gsub('_IMPORTANCE_', tf_importance or '')
else
local tf_importance_text = tf_importance
and tf_importance~='NA'
and tf_importance~='Unknown'
and ' ' .. cfg.task_force.importance:format(
wikilink(':Category:' .. tf_importance_category, tf_importance .. '-' .. importance_name)
) or ''
text = portal .. cfg.task_force.text:format(
wikilink(args[tf_prefix .. 'LINK'], args[tf_prefix .. 'NAME']),
tf_importance_text
)
end
local tf_size = args[tf_prefix .. 'SIZE'] or tf_default_size
local tf_image = ''
if args[tf_prefix .. 'IMAGE'] then
tf_image = image(args[tf_prefix .. 'IMAGE'], tf_size, cfg.task_force.icon_alt, 'center', args[tf_prefix .. 'IMAGE_CLASS'])
end
local taskforce = mw.html.create('tr')
:tag('td')
:wikitext(tf_image)
:done()
:tag('td')
:addClass('mbox-text')
:attr('colspan','2')
:wikitext(parse_pt(text))
:done()
table.insert(taskforce_output, taskforce)
end
if args[tf_prefix..'HOOK'] then
table.insert(taskforce_output, args[tf_prefix..'HOOK'])
end
if args[tf_prefix..'QII_FORMAT'] then
add_category(require(auxiliary).quality_importance_insection(args, class, tf_importance, importance_name, tf_assessment_cat, article, tf_prefix))
end
if args[tf_prefix..'NAME'] then
page_assessment(project..'/'..args[tf_prefix..'NAME'], class, tf_importance)
end
if args[tf_prefix..'MAIN_CAT'] then
add_category(args[tf_prefix..'MAIN_CAT'])
end
if args[tf_prefix..'NESTED'] then
table.insert(nested_tf, wikilink(args[tf_prefix..'LINK'], args[tf_prefix..'NESTED']))
end
for _, c in ipairs(taskforce_categories[k] or {}) do-- add additional taskforce categories
add_category(args[tf_prefix..'CAT_'..c])
end
end
if args.HOOK_TF then
table.insert(taskforce_output, args.HOOK_TF)
end
local threshold = tonumber(args.TF_COLLAPSE) or (args.TF_HEADER and cfg.task_force.lower_threshold) or cfg.task_force.upper_threshold
collapse_section(
#taskforce_output > threshold,
taskforce_output,
args.TF_HEADER or cfg.task_force.header
)
---------------------------
-- Notes ------------------
---------------------------
local note_output = {}
local note_default_size = args.NOTE_SIZE or args.NOTE_1_SIZE or cfg.note.default_size
local render_note = function(note_args)--text, image_name, size, category, sort_prefix, class
local sort = note_args.sort_prefix and note_args.sort_prefix .. current_title.text
add_category(note_args.category, sort)
add_category(note_args.category2, sort)
if note_args.text then
local note_image = image(
note_args.image_name,
note_args.size or note_default_size,
cfg.note.icon_alt,
'center',
note_args.class
)
local new_note = mw.html.create('tr')
:tag('td')
:css('background', note_args.background)
:css('color', note_args.color)
:wikitext(note_image)
:done()
:tag('td')
:addClass('mbox-text')
:attr('colspan', '2')
:wikitext(parse_pt(note_args.text))
:done()
table.insert(note_output, new_note)
if note_image then
local icon = mw.html.create('span')
:addClass('wpb-header-bubbles')
:wikitext('[[File:' .. note_args.image_name .. '|' .. cfg.note.header_icon .. '|' .. parse_pt(note_args.text) .. '|alt=icon]]')
table.insert(nested_ratings, tostring(icon))
end
end
end
local auto = false
local auto_arg = args.auto and args.auto:lower()
if (auto_arg=='yes' or auto_arg=='stub') and class=='Stub' then
auto = 'stub'
elseif (auto_arg=='inherit' or auto_arg=='length') and class and class~='' then
auto = auto_arg
end
if auto then
local auto_cat = args.AUTO_ASSESS_CAT or cfg.auto.default_cat:format(project)
local auto_text = cfg.auto.assessed:format(
cfg.auto[auto], -- method of automatic assessment
parameter_format('auto')
)
local sort_prefix
if auto=='stub' then
sort_prefix = 'S'
elseif auto=='length' then
sort_prefix = 'L'
elseif auto=='inherit' then
local sort_codes = cfg.auto.sort_codes
sort_prefix = sort_codes[class] or cfg.auto.default_sort_code
end
render_note{
text = auto_text,
image_name = cfg.auto.icon,
category = auto_cat,
sort_prefix = sort_prefix
}
end
if yesno(args.attention, true) then
local attention_cat = args.ATTENTION_CAT or cfg.attention.default_cat:format(project)
render_note{
text = cfg.attention.text,
image_name = cfg.attention.icon,
category = attention_cat
}
end
if yesno(args.infobox, true) then
local infobox_cat = args.INFOBOX_CAT or cfg.infobox.default_cat:format(project)
render_note{
text = cfg.infobox.text,
image_name = cfg.infobox.icon,
category = infobox_cat
}
end
for _, k in ipairs(notes) do
local note_prefix = 'NOTE_' .. k .. '_'
render_note{
text = parse_pt(args[note_prefix..'TEXT']),
image_name = args[note_prefix..'IMAGE'],
size = args[note_prefix..'SIZE'],
category = args[note_prefix..'CAT'],
class = args[note_prefix..'IMAGE_CLASS']
}
end
if yesno(args['image-needed'], true) then
local image_needed_args = require(auxiliary).image_needed(args)
render_note(image_needed_args)
end
if yesno(args['collaboration-candidate'], true) or yesno(args['collaboration-current'], true) or yesno(args['collaboration-past'], true) then
local collaboration_args = require(auxiliary).collaboration(args, current_title)
render_note(collaboration_args.candidate)
render_note(collaboration_args.current)
render_note(collaboration_args.past)
end
if yesno(args['a class'], true) then
local a_class_args = require(auxiliary).a_class(args, lang)
render_note(a_class_args)
end
if yesno(args['peer review'], true) or yesno(args['old peer review'], true) then
local peer_review_args = require(auxiliary).peer_review(args, current_title)
render_note(peer_review_args.current)
render_note(peer_review_args.past)
end
local note_count = #note_output
if args.HOOK_NOTE then
table.insert(note_output, args.HOOK_NOTE)
local hook_collapsed = 0
if args.HOOK_COLLAPSED then
local success, result = pcall(mw.ext.ParserFunctions.expr, args.HOOK_COLLAPSED)
hook_collapsed = success and tonumber(result) or 0
if args.HOOK_COLLAPSED=='auto' then
hook_collapsed = 1
end
end
note_count = note_count + hook_collapsed
end
collapse_section(
note_count > (tonumber(args.COLLAPSED) or cfg.note.threshold),
note_output,
args.COLLAPSED_HEAD or cfg.note.header
)
---------------------------
-- Bottom text ------------
---------------------------
if args.HOOK_BOTTOM then
table.insert(rows, args.HOOK_BOTTOM)
end
if args.TODO_LINK or args.TODO_TEXT then
local todolist = require(auxiliary).todo_list(args, frame)
table.insert(rows, todolist)
end
if args.BOTTOM_TEXT then
local bottom_text = mw.html.create('tr')
:tag('td')
:attr('colspan','3')
:wikitext(parse_pt(args.BOTTOM_TEXT))
:done()
table.insert(rows, bottom_text)
end
if args.MAIN_CAT then
add_category(args.MAIN_CAT)
end
---------------------------
-- Nested display ---------
---------------------------
if args.HOOK_NESTED then
local hook_nested = args.HOOK_NESTED:gsub('^ / ', '') -- remove initial slash, will be added later
table.insert(nested_tf, hook_nested)
end
local nested_tf_str = ''
if #nested_tf>0 then
nested_tf_str = tostring(mw.html.create('span')
:addClass('wpb-nested-task-force')
:wikitext(': ' .. table.concat(nested_tf, ' / '))
)
end
local nested_ratings_str = #nested_ratings>0 and table.concat(nested_ratings, ' ') or ''
if args.HOOK_NESTED_ASSESS then
nested_ratings_str = nested_ratings_str .. tostring(mw.html.create('span')
:addClass('wpb-header-bubbles')
:wikitext(args.HOOK_NESTED_ASSESS)
)
end
local header_row = mw.html.create('tr')
:addClass('wpb-header')
:tag('td')
:addClass('wpb-header-icon')
:wikitext(image(args.IMAGE_LEFT, cfg.image.header_size, cfg.image.alt))
:done()
:tag('td')
:addClass('wpb-header-combined')
:wikitext(wikilink(project_link.prefixedText, project) .. nested_tf_str .. ' ' .. nested_ratings_str)
:done()
---------------------------
-- Prepare categories -----
---------------------------
local categories_formatted = ''
if demo_page and demo_page~=true then -- for testing purposes
local category_list = mw.html.create('ul')
for _, cat in ipairs(categories) do
local item = mw.html.create('li')
:wikitext(wikilink(':Category:' .. cat.category, cat.category))
category_list:node(item)
end
local category_box = mw.html.create('div')
:addClass('wpb-category-box')
:wikitext('Categories:')
:node(category_list)
categories_formatted = tostring(category_box)
elseif not demo_page then
local categories_linked = {}
for _, cat in ipairs(categories) do
local cat_link = wikilink('Category:' .. cat.category, cat.key)
table.insert(categories_linked, cat_link)
end
categories_formatted = table.concat(categories_linked)
end
---------------------------
-- Make banner ------------
---------------------------
local banner_rows = mw.html.create('table')
for _, row in ipairs(rows) do
banner_rows:node(row)
end
local banner = mw.html.create('table')
:addClass('tmbox tmbox-notice mw-collapsible innercollapse wpb wpb-table')
:addClass(inactive and cfg.inactive.class or nil)
:node(header_row)
:tag('tr')
:tag('td')
:addClass('mbox-text wpb-main')
:attr('colspan','2')
:node(banner_rows)
:allDone()
local tstyle = frame:extensionTag('templatestyles', '', {src='Module:Message box/tmbox.css'}) ..
frame:extensionTag ('templatestyles', '', {src = 'Module:WikiProject banner' .. (sandbox or '') .. '/styles.css'})
return warning .. tstyle .. tostring(banner) .. categories_formatted, note_count, #taskforce_output, assessment_link
end
local initialise = function(args, raw_args, inactive_status)
---------------------------
-- Initialise arguments ---
---------------------------
local parent_args = args_module.getArgs(frame, {parentOnly = true})
local category = parent_args.category or args.category or true
local demo_page = parent_args.demo_page
local config, project
if args.project then -- check for config page
project = args.project
local config_file = mw.title.new('Template:WikiProject ' .. args.project .. '/config')
if config_file.exists then
config = mw.loadJsonData(config_file.fullText)
else
return nil
end
end
local parameters, unknown_parameters = {}, ''
if config then -- use config file
args, raw_args, parameters = require(auxiliary).map_config(config, parent_args) -- map parameters from config page
args.PROJECT = project
end
local on_template_page = false
local banner_name = mw.title.new(args.BANNER_NAME or 'Template:WikiProject ' .. (args.PROJECT or 'PROJECT'))
if not demo_page then
if yesno(category, true) then
on_template_page = current_title.rootPageTitle==banner_name.rootPageTitle
else
demo_page = true
end
end
local project_name = args.PROJECT_NAME or 'WikiProject ' .. (args.PROJECT or 'PROJECT')
if banner_name.exists and not demo_page then -- check for unknown parameters
if not config then -- read template code to find valid parameters
local parameter_list = {}
for parameter in banner_name:getContent():gmatch('{{{([^|}]+)') do
parameter_list[parameter] = true
end
if parameter_list.importance==true then -- add priority as a valid alias of importance
parameter_list.priority = true
end
if args.QUALITY_CRITERIA~='custom' then -- class is unrecognised, so remove from list
parameter_list.class = false
end
parameter_list.listas = false -- remove listas even if parameter used (should be in banner shell)
for k, v in pairs(parameter_list) do
if v then
table.insert(parameters, k)
end
end
end
parameters.showblankpositional = "1"
local check_for_unknown = require('Module:Check for unknown parameters')._check
local unknowns = check_for_unknown(parameters, parent_args)
if unknowns and unknowns~='' then -- there are some unknown parameters
parameters.preview = cfg.unknown_parameters.preview:format(wikilink(banner_name.fullText))
local unknown_category = cfg.unknown_parameters.tracking:format(project_name)
if not mw.title.new(unknown_category).exists then
unknown_category = cfg.unknown_parameters.default
end
parameters.unknown = unknown_category and '[[' .. unknown_category .. '|_VALUE_]]' or ''
unknown_parameters = check_for_unknown(parameters, parent_args)
end
end
if not args.importance then -- allow priority to be used even by banners which don't support it
args.importance = parent_args.priority
end
if on_template_page then
local templatepage = require('Module:WikiProject banner/templatepage' .. (sandbox or '')).templatepage
return templatepage(args, raw_args, inactive_status, config)
else
return unknown_parameters
.. p._main(args, raw_args, demo_page, banner_name, inactive_status and true or false), nil -- nil to disregard subsequent returned values
end
end
p.main = function(frame)
local args = args_module.getArgs(frame, {frameOnly = true})
local raw_args = args_module.getArgs(frame, {frameOnly = true, removeBlanks = false})
return initialise(args, raw_args)
end
---------------------------
-- Inactive projects ------
---------------------------
p.inactive = function(frame)
local args = args_module.getArgs(frame, {frameOnly = true})
local project_name = args.PROJECT_NAME or 'WikiProject ' .. (args.PROJECT or 'PROJECT')
local project_link = mw.title.new(args.PROJECT_LINK or 'Wikipedia:' .. project_name)
local _status = cfg.inactive.status[args.PROJECT_STATUS] or cfg.inactive.default
local main_text = cfg.inactive.text:format(
project_link.prefixedText,
project_name,
_status
)
return initialise(
{
PROJECT = args.PROJECT,
BANNER_NAME = args.BANNER_NAME,
IMAGE_LEFT = cfg.inactive.image,
IMAGE_LEFT_SIZE = cfg.inactive.image_size,
MAIN_TEXT = main_text,
HOOK_NESTED_ASSESS = ' ' .. cfg.inactive.nested:format(_status),
substcheck = args.substcheck,
category = args.category
}, {
substcheck = '' -- to prevent warning on templatepage
}, _status
)
end
return p
abw38hm5fwpwrn9tv58c5xudlvtaq8w
73214
73213
2026-07-08T19:28:40Z
Robertsky
10424
1 versaun husi [[:en:Module:WikiProject_banner]]
73213
Scribunto
text/plain
require('strict')
local p = {}
local sandbox --= '/sandbox' -- BE SURE TO COMMENT OUT this definition when deploying to live
local cfg = mw.loadData('Module:WikiProject banner/config' .. (sandbox or ''))
local auxiliary = cfg.auxiliary_module .. (sandbox or '')
local args_module = require('Module:Arguments')
local mbox = require('Module:Message box').main
local yesno = require('Module:Yesno')
local frame = mw.getCurrentFrame()
local lang = mw.getLanguage(cfg.language)
local current_title = mw.title.getCurrentTitle()
local parameter_format = function(parameter, value)
return frame:expandTemplate{title='para', args={parameter, value or ''}}
end
local wikilink = function(link, display)
if link then
return display and '[['..link..'|'..display..']]' or '[['..link..']]'
else
return display or ''
end
end
local display_error = function(text)
local span = mw.html.create('div')
:addClass('error')
:wikitext(text)
return tostring(span)
end
local image = function(image_name, size, alt, position, class)
return image_name and '[[File:'
.. image_name
.. (size and '|' .. size or '')
.. (position and '|' .. position or '')
.. (alt and '|alt=' .. alt or '')
.. '|class=noviewer'..(class and ' '..class or '')
.. ']]'
end
local if_exists = function(target, fallback) -- function to add wikilink if target exists
local title = mw.title.new(target)
if title and title.exists then
return wikilink(target)
else
return fallback or target
end
end
local importance_mask = function(importance, scale, banner_name, pagetype, class)
---------------------------
-- Importance mask --------
---------------------------
local importance_normalised
if scale=='inline' then -- pass importance without change
importance_normalised = importance or ''
elseif scale=='subpage' then
local custom_mask = banner_name:subPageTitle('importance')
if custom_mask.exists and #custom_mask:getContent()>1 then -- pass to custom importance mask
importance_normalised = mw.text.trim(frame:expandTemplate{
title = custom_mask.prefixedText,
args = {
importance = importance,
class = class,
pagetype = pagetype
}
})
end
else -- standard importance scale
importance_normalised = cfg.importance.na
if pagetype=='article' or pagetype=='set index article' or pagetype=='redirect' or pagetype=='draft' then
local mask = cfg.importance.mask
if importance and mask[importance:lower()] then -- valid importance specified
importance_normalised = mask[importance:lower()]
elseif pagetype=='article' or pagetype=='set index article' then -- unspecified or invalid importance, use "Unknown" for articles
importance_normalised = cfg.importance.unknown
end
end
end
return importance_normalised
end
---------------------------
-- Quality class mask -----
---------------------------
p.readarticleclass = function(options, page) -- used by _main and also Module:Banner shell
page = page or current_title.prefixedText
local get_parameter_value = require('Module:Template parameter value').getParameter
local success, result = get_parameter_value(page, cfg.banner_shell.redirects, 'class', options)
return success and result
-- returns FALSE if banner shell template does not exist on page
-- returns BLANK if class parameter is not defined or is defined blank
-- otherwise returns class parameter
end
p.class_mask = function(class, title, FQS, pagetype, article)
local resolveFQSgrade = function(class)
return FQS and lang:ucfirst(class) or 'NA'
end
local out
title = title or mw.title.getCurrentTitle()
local ns = title.namespace
class = class:match('^%s*(.-)%s*$'):lower()
if pagetype=='redirect' or pagetype=='soft redirect' then
out = resolveFQSgrade('redirect')
elseif pagetype=='disambiguation page' then
out = resolveFQSgrade('disambig')
elseif article or pagetype=='article' or pagetype=='set index article' then
if pagetype=='set index article' then
out = 'List'
elseif class=='start' or class=='stub' then -- Ucfirst
out = lang:ucfirst(class)
elseif class=='b' or class=='c' or class=='fa' or class=='fl' or class=='a' or class=='ga' then -- Upper-case
out = class:upper()
elseif class=='list' or class=='sia' or class=='si' or class=='sl' then-- List
out = 'List'
else
out = '' -- unassessed
end
elseif ns==7 or ns==711 then -- File talk
if class=='fm' then
out = 'FM'
else
out = resolveFQSgrade('file')
end
else
local grade = cfg.quality.ns_to_class[ns] or 'NA'
out = resolveFQSgrade(grade)
end
return out
end
local page_assessment = function(project, class, importance) -- add PageAssessments parser function
local assessment = table.concat({project, class or '', importance or ''},'|')
frame:preprocess('{{#assessment:' .. assessment .. '}}')
end
local bubble = function(text, style)
local out = mw.html.create('span')
:addClass('wpb-header-bubbles')
:addClass(style)
:wikitext(text)
return tostring(out)
end
p._main = function(args, raw_args, demo_page, banner_name, inactive)
---------------------------
-- Initialise parameters --
---------------------------
local project = args.PROJECT or 'PROJECT'
local project_name = args.PROJECT_NAME or 'WikiProject ' .. project
local project_link = mw.title.new(args.PROJECT_LINK or 'Wikipedia:' .. project_name)
local pagetype = demo_page==true and 'article' or require('Module:Pagetype')._main({
page = demo_page,
dab = 'disambiguation page',
sia = 'set index article',
draft = 'draft'
})
local article = pagetype=='article' or pagetype=='set index article'
local rows, nested_ratings, task_forces, notes, categories, taskforce_categories = {}, {}, {}, {}, {}, {}
local add_category = function(category, key)
if category and category~='none' then
table.insert(categories, {category = category, key = key})
end
end
local parse_pt = function(text) -- function to replace _PAGETYPE_ with the actual page type
local ptype = article and 'article' or pagetype -- display "article" for articles otherwise page type
return text and text:gsub('_PAGETYPE_', ptype)
end
for arg_name, arg_value in pairs(args) do
local tf_match = mw.ustring.match(arg_name,'^tf (%d+)$')
local note_match = mw.ustring.match(arg_name,'^note (%d+)$')
if tf_match and yesno(arg_value, true) then
table.insert(task_forces, tf_match)
elseif note_match and yesno(arg_value, true) then
table.insert(notes, note_match)
else
local tf, cat = mw.ustring.match(arg_name,'^tf (%d+) cat (%d+)$')
if tf and yesno(arg_value, true) then
if not taskforce_categories[tf] then -- initialise table
taskforce_categories[tf] = {}
end
table.insert(taskforce_categories[tf], cat)
end
end
end
table.sort(task_forces, function (x, y) return tonumber(x) < tonumber(y) end)
table.sort(notes, function (x, y) return tonumber(x) < tonumber(y) end)
local assessment_category = function(cat, name)
if cat then
return cat:gsub(' articles', '') -- remove "articles" from category
else
return name or ''
end
end
local assessment_cat = assessment_category(args.ASSESSMENT_CAT, project)
---------------------------
-- Location warning -------
---------------------------
local warning = ''
if not current_title.isTalkPage and not demo_page then
local text = cfg.namespace_warning.text:format(
current_title.talkPageTitle.fullText,
parameter_format('category', 'no')
)
local sortkey = current_title.namespace==10 and cfg.namespace_warning.sortkey_on_template_page or cfg.namespace_warning.sortkey
if current_title.namespace==10 then -- on the Template namespace
text = text .. ' ' .. cfg.namespace_warning.on_template_page:format(
parameter_format('BANNER_NAME'),
current_title.prefixedText
)
end
warning = mbox('ombox', {
image = '[[File:' .. cfg.namespace_warning.image .. '|40px]]',
type = cfg.namespace_warning.type_,
text = parse_pt(text)
})
if not current_title.subjectPageTitle:inNamespace(2) then
add_category(cfg.namespace_warning.categories, sortkey)
end
end
---------------------------
-- Substitution warning ---
---------------------------
if args.substcheck=='SUBST' then
local text = cfg.subst_warning.text:format(
project_name,
'<code>{{'..banner_name.prefixedText..'}}</code>'
)
warning = warning .. mbox('ombox', {
image = '[[File:' .. cfg.subst_warning.image .. '|40px]]',
type = cfg.subst_warning.type_,
text = text,
}) .. cfg.subst_warning.categories
end
---------------------------
-- Primary image/text -----
---------------------------
local primary_image = function(image_name, size, image_class)
local cell = mw.html.create('td')
if image_name and image_name~='' then
cell:addClass('mbox-image wpb-image')
:wikitext(image(image_name, size, cfg.image.alt, nil, image_class))
else
cell:addClass('mbox-empty-cell')
end
return cell
end
local portal = args.PORTAL
local portal_box = portal and frame:expandTemplate{title='Portal', args={portal}} or ''
local main_text = portal_box .. parse_pt(args.MAIN_TEXT or cfg.main_text:format(
project_link.prefixedText,
project_name,
args.MAIN_ARTICLE and if_exists(args.MAIN_ARTICLE) or if_exists(project, project .. ' articles'),
project_link.talkPageTitle.prefixedText
))
local image_left_size = args.IMAGE_LEFT_SIZE or cfg.image.default_size
local metadata = function(class, data)
return mw.html.create('span')
:addClass(class)
:wikitext(data)
end
local text_cell = mw.html.create('td')
:addClass('mbox-text')
:wikitext(main_text)
:tag('span')
:addClass('metadata wpb-metadata')
:node(metadata('wpb-project', project))
:node(metadata('wpb-project_link', project_link.prefixedText))
:node(metadata('wpb-banner_name', banner_name.prefixedText))
:node(metadata('wpb-assessment_cat', assessment_cat))
:done()
local primary_row = mw.html.create('tr')
:node(primary_image(args.IMAGE_LEFT, image_left_size,
args.IMAGE_LEFT_CLASS or args.IMAGE_CLASS))
:node(text_cell)
:node(primary_image(args.IMAGE_RIGHT, args.IMAGE_RIGHT_SIZE or cfg.image.default_size,
args.IMAGE_RIGHT_CLASS or args.IMAGE_CLASS))
table.insert(rows, primary_row)
---------------------------
-- Banner shell checks ----
---------------------------
local title = demo_page and demo_page~=true and mw.title.new(demo_page) or current_title
local class = p.readarticleclass({ignore_subtemplates=true}, title.prefixedText)
if class then -- banner shell exists
local special_chars = '([%%%(%)%.%+%-%*%?%[%]%^%$])'
local banner_name_escaped = banner_name.text
local page_content = require('Module:Wikitext Parsing' .. (sandbox or '')).PrepareText(title:getContent()) -- get content of current page
local content_without_shell
for capture in mw.ustring.gmatch(page_content, '%b{}') do -- look for possible templates on page
for _, redirect in ipairs(cfg.banner_shell.redirects) do
if mw.ustring.find(capture, '^{{%s*' .. redirect .. '%s*[|}].*}}$') then -- found a banner shell
banner_name_escaped = banner_name_escaped:gsub(special_chars, '%%%1') -- escape each special character
capture = capture:gsub(special_chars, '%%%1')
content_without_shell = mw.ustring.gsub(page_content, capture, '') -- remove banner shell content from page content
end
if content_without_shell then break end
end
if content_without_shell then break end
end
local template_outside_shell
if content_without_shell and mw.ustring.find(content_without_shell, '{{%s*' .. banner_name_escaped .. '%s*[|}]') then -- found banner template outside of the shell
add_category(cfg.banner_shell.category.outside_shell)
end
else -- no banner shell on page
if title.namespace==3 then --User talk namespace
for _, user in ipairs(cfg.banner_shell.valid_users) do
if string.find(title.rootText, user) then
add_category(cfg.banner_shell.category.no_banner_shell)
end
end
elseif title.namespace~=2 then -- not in user namespace
add_category(cfg.banner_shell.category.no_banner_shell)
end
class = ''
end
---------------------------
-- Quality assessment -----
---------------------------
local assessment_link = args.ASSESSMENT_LINK
if not assessment_link then
local fallback = mw.title.new(project_link.prefixedText .. '/Assessment')
assessment_link = fallback.exists and fallback.prefixedText
elseif assessment_link=='no' then
assessment_link = nil
end
local check_fallbacks = function(class, category) -- function to check non-article classes and automatically fall back to NA (or other) class if category does not exist
if article or args.QUALITY_CRITERIA=='custom' then -- no fallbacks for articles or projects with custom quality scales
return class
else -- check fallbacks for non-article classes
local new_class = class
local category_exists = function(class)
local cat = mw.title.new(cfg.quality.assessment_category:format(class, category .. ' ' .. (article and 'articles' or 'pages')))
return cat.exists and #cat:getContent()>0 -- check if category exists and is not blank
end
if class=='FM' and not category_exists('FM') then
new_class = 'File' -- fall back to File-class if FM category does not exist
end
if not category_exists(new_class) then
new_class = 'NA' -- use NA for non-article pages if category does not exist
end
return new_class
end
end
if raw_args.class then -- banner gives quality ratings
class = class and p.class_mask(class, title, true, pagetype, article) -- put PIQA class through standard class mask
if args.QUALITY_CRITERIA=='custom' then -- project has opted out of standard assessment scale and uses a custom mask
local project_class
local custom_mask = banner_name:subPageTitle('class')
if custom_mask.exists and #custom_mask:getContent()>1 then
raw_args.demo_page = demo_page -- send demo_page to custom mask
project_class = mw.text.trim(frame:expandTemplate{
title = custom_mask.prefixedText,
args = raw_args
})
if project_class=='' and class and class~='' then -- if unassessed and PIQA class exists, check if it can be inherited
local new_arg_table = {}
for arg, val in pairs(raw_args) do -- construct new argument table to send to custom mask
new_arg_table[arg] = val
end
new_arg_table.class = class -- replace class with inherited class
project_class = mw.text.trim(frame:expandTemplate{
title = custom_mask.prefixedText,
args = new_arg_table
}) -- inherit project class from PIQA class normalised by custom mask
end
local category = (project_class=='' and 'Unassessed' or project_class..'-Class') .. ' ' .. assessment_cat .. ' ' .. (article and 'articles' or 'pages')
add_category(category)
if class~=project_class then -- display project class in banner
class = project_class
local rating = project_class=='' and cfg.quality.not_yet or cfg.quality.rated:format(class)
local scale = cfg.quality.project_scale:format(wikilink((assessment_link or '')..'#'..lang:ucfirst(cfg.quality.name), cfg.quality.name))
local cssClass = 'class-' .. (class=='' and 'unassessed' or class:lower())
local class_row = mw.html.create('tr')
:tag('td')
:addClass('assess'):addClass(cssClass)
:wikitext(wikilink(':Category:' .. category, class=='' and '???' or class))
:done()
:tag('td')
:addClass('mbox-text')
:attr('colspan', '2')
:wikitext(parse_pt(cfg.quality.rating:format(rating, scale)))
:done()
table.insert(rows, class_row)
table.insert(
nested_ratings,
1,
bubble(class=='' and 'Unassessed' or (class..'‑class'), cssClass)
)
end
end
else -- project uses standard PIQA assessment
class = check_fallbacks(class, assessment_cat) -- check fallbacks for non-article classes
local category = (class=='' and 'Unassessed' or (class..'-Class')) .. ' ' .. assessment_cat .. ' ' .. (article and 'articles' or 'pages')
add_category(category)
if raw_args.class~='' then -- page has a non-blank class value which is ignored
add_category(cfg.banner_shell.category.ignored_class)
end
end
end
if args.HOOK_ASSESS then
table.insert(rows, args.HOOK_ASSESS)
end
if raw_args.b1 or raw_args.b2 or raw_args.b3 or raw_args.b4 or raw_args.b5 or raw_args.b6 then
local b_checklist = require(auxiliary).b_checklist(args, raw_args, class, demo_page, assessment_link)
table.insert(rows, b_checklist)
end
---------------------------
-- Priority assessment ----
---------------------------
local importance
local importance_name = args.IMPN or (raw_args.priority and 'priority' or cfg.importance.default_name)
if raw_args.importance or raw_args.priority then -- banner gives priority ratings
importance = importance_mask(args.importance or args.priority, args.IMPORTANCE_SCALE, banner_name, pagetype, class)
local category = importance .. '-' .. importance_name .. ' ' .. assessment_cat .. ' ' .. (importance=='NA' and 'pages' or 'articles')
if importance~='NA' then -- display importance rating
local rating = importance=='Unknown' and cfg.importance.not_yet or cfg.importance.rated:format(importance, importance_name)
local scale = assessment_link
and cfg.importance.project_scale:format(assessment_link..'#'..lang:ucfirst(cfg.importance.scale:format(importance_name)), cfg.importance.scale:format(importance_name))
or cfg.importance.default_scale
local importance_rating = parse_pt(cfg.importance.rating:format(rating, scale))
local cssClass = 'import-' .. importance:lower()
local importance_row = mw.html.create('tr')
:tag('td')
:addClass('assess')
:addClass(cssClass)
:wikitext(wikilink(':Category:' .. category, importance=='Unknown' and '???' or importance))
:done()
:tag('td')
:addClass('mbox-text')
:attr('colspan', '2')
:wikitext(importance_rating)
:done()
table.insert(rows, importance_row)
if importance~='Unknown' then -- importance is not NA or Unknown
table.insert(
nested_ratings,
bubble(importance .. '‑' .. importance_name, cssClass)
)
end
end
add_category(category)
if args.QII_FORMAT then
add_category(require(auxiliary).quality_importance_insection(args, class, importance, importance_name, assessment_cat, article))
end
end
if class or importance then
page_assessment(project, class, importance)
end
if args.HOOK_IMPORTANCE then
table.insert(rows, args.HOOK_IMPORTANCE)
end
---------------------------
-- Collapsing sections ----
---------------------------
local collapse_section = function(collapse, new_rows, header)
if collapse then
local header_row = mw.html.create('tr')
:tag('th')
:attr('colspan','3')
:addClass('wpb-collapsed-head')
:wikitext(header)
:done()
local blank_row = mw.html.create('tr')
:tag('td')
:addClass('mbox-image wpb-gutter')
:css('min-width', image_left_size)
:tag('span')
:addClass('wpb-iefix')
:wikitext('/ ')
:done() --TO FIX IE
:done()
:tag('td'):done()
:tag('td'):done()
local collapsed_rows = mw.html.create('table')
:addClass('mw-collapsible mw-collapsed')
:node(header_row)
:node(blank_row)
for _, row in ipairs(new_rows) do
collapsed_rows:node(row)
end
local collapsed_section = mw.html.create('tr')
:tag('td')
:attr('colspan','3')
:addClass('wpb-collapsed-notes')
:node(collapsed_rows)
:done()
table.insert(rows, collapsed_section)
else
for _, row in ipairs(new_rows) do
table.insert(rows, row)
end
end
end
---------------------------
-- Task forces ------------
---------------------------
local nested_tf, taskforce_output = {}, {}
local tf_default_size = args.TF_SIZE or cfg.task_force.default_size
for _, k in ipairs(task_forces) do
local tf_prefix = 'TF_' .. k .. '_'
local tf_assessment_cat = assessment_category(
args[tf_prefix..'ASSESSMENT_CAT'],
args[tf_prefix..'NAME']
)
if yesno(args[tf_prefix..'QUALITY']) and class then
local tf_class = check_fallbacks(class, tf_assessment_cat)
add_category((tf_class=='' and 'Unassessed' or tf_class..'-Class') .. ' ' .. tf_assessment_cat .. ' ' .. (article and 'articles' or 'pages'))
end
local tf_importance, tf_importance_category
if raw_args['tf '..k..' importance'] then
tf_importance = importance_mask(args['tf '..k..' importance'], args.IMPORTANCE_SCALE, banner_name, pagetype, class)
if tf_importance=='Unknown' and yesno(args.INHERIT_IMPORTANCE) then
tf_importance = importance
end
tf_importance_category = tf_importance .. '-' .. importance_name .. ' ' .. tf_assessment_cat .. ' ' .. (tf_importance=='NA' and 'pages' or 'articles')
add_category(tf_importance_category)
end
if args[tf_prefix .. 'TEXT']~='none' then
local portal = args[tf_prefix..'PORTAL'] and frame:expandTemplate{
title='Portal',
args={args[tf_prefix .. 'PORTAL'], height='15', margin='0'}
} or ''
local text = ''
local tf_text = args[tf_prefix..'TEXT'] or args.TF_TEXT
if tf_text then
text = portal .. tf_text
:gsub('_NAME_', args[tf_prefix .. 'NAME'] or '')
:gsub('_LINK_', args[tf_prefix .. 'LINK'] or '')
:gsub('_IMPORTANCE_', tf_importance or '')
else
local tf_importance_text = tf_importance
and tf_importance~='NA'
and tf_importance~='Unknown'
and ' ' .. cfg.task_force.importance:format(
wikilink(':Category:' .. tf_importance_category, tf_importance .. '-' .. importance_name)
) or ''
text = portal .. cfg.task_force.text:format(
wikilink(args[tf_prefix .. 'LINK'], args[tf_prefix .. 'NAME']),
tf_importance_text
)
end
local tf_size = args[tf_prefix .. 'SIZE'] or tf_default_size
local tf_image = ''
if args[tf_prefix .. 'IMAGE'] then
tf_image = image(args[tf_prefix .. 'IMAGE'], tf_size, cfg.task_force.icon_alt, 'center', args[tf_prefix .. 'IMAGE_CLASS'])
end
local taskforce = mw.html.create('tr')
:tag('td')
:wikitext(tf_image)
:done()
:tag('td')
:addClass('mbox-text')
:attr('colspan','2')
:wikitext(parse_pt(text))
:done()
table.insert(taskforce_output, taskforce)
end
if args[tf_prefix..'HOOK'] then
table.insert(taskforce_output, args[tf_prefix..'HOOK'])
end
if args[tf_prefix..'QII_FORMAT'] then
add_category(require(auxiliary).quality_importance_insection(args, class, tf_importance, importance_name, tf_assessment_cat, article, tf_prefix))
end
if args[tf_prefix..'NAME'] then
page_assessment(project..'/'..args[tf_prefix..'NAME'], class, tf_importance)
end
if args[tf_prefix..'MAIN_CAT'] then
add_category(args[tf_prefix..'MAIN_CAT'])
end
if args[tf_prefix..'NESTED'] then
table.insert(nested_tf, wikilink(args[tf_prefix..'LINK'], args[tf_prefix..'NESTED']))
end
for _, c in ipairs(taskforce_categories[k] or {}) do-- add additional taskforce categories
add_category(args[tf_prefix..'CAT_'..c])
end
end
if args.HOOK_TF then
table.insert(taskforce_output, args.HOOK_TF)
end
local threshold = tonumber(args.TF_COLLAPSE) or (args.TF_HEADER and cfg.task_force.lower_threshold) or cfg.task_force.upper_threshold
collapse_section(
#taskforce_output > threshold,
taskforce_output,
args.TF_HEADER or cfg.task_force.header
)
---------------------------
-- Notes ------------------
---------------------------
local note_output = {}
local note_default_size = args.NOTE_SIZE or args.NOTE_1_SIZE or cfg.note.default_size
local render_note = function(note_args)--text, image_name, size, category, sort_prefix, class
local sort = note_args.sort_prefix and note_args.sort_prefix .. current_title.text
add_category(note_args.category, sort)
add_category(note_args.category2, sort)
if note_args.text then
local note_image = image(
note_args.image_name,
note_args.size or note_default_size,
cfg.note.icon_alt,
'center',
note_args.class
)
local new_note = mw.html.create('tr')
:tag('td')
:css('background', note_args.background)
:css('color', note_args.color)
:wikitext(note_image)
:done()
:tag('td')
:addClass('mbox-text')
:attr('colspan', '2')
:wikitext(parse_pt(note_args.text))
:done()
table.insert(note_output, new_note)
if note_image then
local icon = mw.html.create('span')
:addClass('wpb-header-bubbles')
:wikitext('[[File:' .. note_args.image_name .. '|' .. cfg.note.header_icon .. '|' .. parse_pt(note_args.text) .. '|alt=icon]]')
table.insert(nested_ratings, tostring(icon))
end
end
end
local auto = false
local auto_arg = args.auto and args.auto:lower()
if (auto_arg=='yes' or auto_arg=='stub') and class=='Stub' then
auto = 'stub'
elseif (auto_arg=='inherit' or auto_arg=='length') and class and class~='' then
auto = auto_arg
end
if auto then
local auto_cat = args.AUTO_ASSESS_CAT or cfg.auto.default_cat:format(project)
local auto_text = cfg.auto.assessed:format(
cfg.auto[auto], -- method of automatic assessment
parameter_format('auto')
)
local sort_prefix
if auto=='stub' then
sort_prefix = 'S'
elseif auto=='length' then
sort_prefix = 'L'
elseif auto=='inherit' then
local sort_codes = cfg.auto.sort_codes
sort_prefix = sort_codes[class] or cfg.auto.default_sort_code
end
render_note{
text = auto_text,
image_name = cfg.auto.icon,
category = auto_cat,
sort_prefix = sort_prefix
}
end
if yesno(args.attention, true) then
local attention_cat = args.ATTENTION_CAT or cfg.attention.default_cat:format(project)
render_note{
text = cfg.attention.text,
image_name = cfg.attention.icon,
category = attention_cat
}
end
if yesno(args.infobox, true) then
local infobox_cat = args.INFOBOX_CAT or cfg.infobox.default_cat:format(project)
render_note{
text = cfg.infobox.text,
image_name = cfg.infobox.icon,
category = infobox_cat
}
end
for _, k in ipairs(notes) do
local note_prefix = 'NOTE_' .. k .. '_'
render_note{
text = parse_pt(args[note_prefix..'TEXT']),
image_name = args[note_prefix..'IMAGE'],
size = args[note_prefix..'SIZE'],
category = args[note_prefix..'CAT'],
class = args[note_prefix..'IMAGE_CLASS']
}
end
if yesno(args['image-needed'], true) then
local image_needed_args = require(auxiliary).image_needed(args)
render_note(image_needed_args)
end
if yesno(args['collaboration-candidate'], true) or yesno(args['collaboration-current'], true) or yesno(args['collaboration-past'], true) then
local collaboration_args = require(auxiliary).collaboration(args, current_title)
render_note(collaboration_args.candidate)
render_note(collaboration_args.current)
render_note(collaboration_args.past)
end
if yesno(args['a class'], true) then
local a_class_args = require(auxiliary).a_class(args, lang)
render_note(a_class_args)
end
if yesno(args['peer review'], true) or yesno(args['old peer review'], true) then
local peer_review_args = require(auxiliary).peer_review(args, current_title)
render_note(peer_review_args.current)
render_note(peer_review_args.past)
end
local note_count = #note_output
if args.HOOK_NOTE then
table.insert(note_output, args.HOOK_NOTE)
local hook_collapsed = 0
if args.HOOK_COLLAPSED then
local success, result = pcall(mw.ext.ParserFunctions.expr, args.HOOK_COLLAPSED)
hook_collapsed = success and tonumber(result) or 0
if args.HOOK_COLLAPSED=='auto' then
hook_collapsed = 1
end
end
note_count = note_count + hook_collapsed
end
collapse_section(
note_count > (tonumber(args.COLLAPSED) or cfg.note.threshold),
note_output,
args.COLLAPSED_HEAD or cfg.note.header
)
---------------------------
-- Bottom text ------------
---------------------------
if args.HOOK_BOTTOM then
table.insert(rows, args.HOOK_BOTTOM)
end
if args.TODO_LINK or args.TODO_TEXT then
local todolist = require(auxiliary).todo_list(args, frame)
table.insert(rows, todolist)
end
if args.BOTTOM_TEXT then
local bottom_text = mw.html.create('tr')
:tag('td')
:attr('colspan','3')
:wikitext(parse_pt(args.BOTTOM_TEXT))
:done()
table.insert(rows, bottom_text)
end
if args.MAIN_CAT then
add_category(args.MAIN_CAT)
end
---------------------------
-- Nested display ---------
---------------------------
if args.HOOK_NESTED then
local hook_nested = args.HOOK_NESTED:gsub('^ / ', '') -- remove initial slash, will be added later
table.insert(nested_tf, hook_nested)
end
local nested_tf_str = ''
if #nested_tf>0 then
nested_tf_str = tostring(mw.html.create('span')
:addClass('wpb-nested-task-force')
:wikitext(': ' .. table.concat(nested_tf, ' / '))
)
end
local nested_ratings_str = #nested_ratings>0 and table.concat(nested_ratings, ' ') or ''
if args.HOOK_NESTED_ASSESS then
nested_ratings_str = nested_ratings_str .. tostring(mw.html.create('span')
:addClass('wpb-header-bubbles')
:wikitext(args.HOOK_NESTED_ASSESS)
)
end
local header_row = mw.html.create('tr')
:addClass('wpb-header')
:tag('td')
:addClass('wpb-header-icon')
:wikitext(image(args.IMAGE_LEFT, cfg.image.header_size, cfg.image.alt))
:done()
:tag('td')
:addClass('wpb-header-combined')
:wikitext(wikilink(project_link.prefixedText, project) .. nested_tf_str .. ' ' .. nested_ratings_str)
:done()
---------------------------
-- Prepare categories -----
---------------------------
local categories_formatted = ''
if demo_page and demo_page~=true then -- for testing purposes
local category_list = mw.html.create('ul')
for _, cat in ipairs(categories) do
local item = mw.html.create('li')
:wikitext(wikilink(':Category:' .. cat.category, cat.category))
category_list:node(item)
end
local category_box = mw.html.create('div')
:addClass('wpb-category-box')
:wikitext('Categories:')
:node(category_list)
categories_formatted = tostring(category_box)
elseif not demo_page then
local categories_linked = {}
for _, cat in ipairs(categories) do
local cat_link = wikilink('Category:' .. cat.category, cat.key)
table.insert(categories_linked, cat_link)
end
categories_formatted = table.concat(categories_linked)
end
---------------------------
-- Make banner ------------
---------------------------
local banner_rows = mw.html.create('table')
for _, row in ipairs(rows) do
banner_rows:node(row)
end
local banner = mw.html.create('table')
:addClass('tmbox tmbox-notice mw-collapsible innercollapse wpb wpb-table')
:addClass(inactive and cfg.inactive.class or nil)
:node(header_row)
:tag('tr')
:tag('td')
:addClass('mbox-text wpb-main')
:attr('colspan','2')
:node(banner_rows)
:allDone()
local tstyle = frame:extensionTag('templatestyles', '', {src='Module:Message box/tmbox.css'}) ..
frame:extensionTag ('templatestyles', '', {src = 'Module:WikiProject banner' .. (sandbox or '') .. '/styles.css'})
return warning .. tstyle .. tostring(banner) .. categories_formatted, note_count, #taskforce_output, assessment_link
end
local initialise = function(args, raw_args, inactive_status)
---------------------------
-- Initialise arguments ---
---------------------------
local parent_args = args_module.getArgs(frame, {parentOnly = true})
local category = parent_args.category or args.category or true
local demo_page = parent_args.demo_page
local config, project
if args.project then -- check for config page
project = args.project
local config_file = mw.title.new('Template:WikiProject ' .. args.project .. '/config')
if config_file.exists then
config = mw.loadJsonData(config_file.fullText)
else
return nil
end
end
local parameters, unknown_parameters = {}, ''
if config then -- use config file
args, raw_args, parameters = require(auxiliary).map_config(config, parent_args) -- map parameters from config page
args.PROJECT = project
end
local on_template_page = false
local banner_name = mw.title.new(args.BANNER_NAME or 'Template:WikiProject ' .. (args.PROJECT or 'PROJECT'))
if not demo_page then
if yesno(category, true) then
on_template_page = current_title.rootPageTitle==banner_name.rootPageTitle
else
demo_page = true
end
end
local project_name = args.PROJECT_NAME or 'WikiProject ' .. (args.PROJECT or 'PROJECT')
if banner_name.exists and not demo_page then -- check for unknown parameters
if not config then -- read template code to find valid parameters
local parameter_list = {}
for parameter in banner_name:getContent():gmatch('{{{([^|}]+)') do
parameter_list[parameter] = true
end
if parameter_list.importance==true then -- add priority as a valid alias of importance
parameter_list.priority = true
end
if args.QUALITY_CRITERIA~='custom' then -- class is unrecognised, so remove from list
parameter_list.class = false
end
parameter_list.listas = false -- remove listas even if parameter used (should be in banner shell)
for k, v in pairs(parameter_list) do
if v then
table.insert(parameters, k)
end
end
end
parameters.showblankpositional = "1"
local check_for_unknown = require('Module:Check for unknown parameters')._check
local unknowns = check_for_unknown(parameters, parent_args)
if unknowns and unknowns~='' then -- there are some unknown parameters
parameters.preview = cfg.unknown_parameters.preview:format(wikilink(banner_name.fullText))
local unknown_category = cfg.unknown_parameters.tracking:format(project_name)
if not mw.title.new(unknown_category).exists then
unknown_category = cfg.unknown_parameters.default
end
parameters.unknown = unknown_category and '[[' .. unknown_category .. '|_VALUE_]]' or ''
unknown_parameters = check_for_unknown(parameters, parent_args)
end
end
if not args.importance then -- allow priority to be used even by banners which don't support it
args.importance = parent_args.priority
end
if on_template_page then
local templatepage = require('Module:WikiProject banner/templatepage' .. (sandbox or '')).templatepage
return templatepage(args, raw_args, inactive_status, config)
else
return unknown_parameters
.. p._main(args, raw_args, demo_page, banner_name, inactive_status and true or false), nil -- nil to disregard subsequent returned values
end
end
p.main = function(frame)
local args = args_module.getArgs(frame, {frameOnly = true})
local raw_args = args_module.getArgs(frame, {frameOnly = true, removeBlanks = false})
return initialise(args, raw_args)
end
---------------------------
-- Inactive projects ------
---------------------------
p.inactive = function(frame)
local args = args_module.getArgs(frame, {frameOnly = true})
local project_name = args.PROJECT_NAME or 'WikiProject ' .. (args.PROJECT or 'PROJECT')
local project_link = mw.title.new(args.PROJECT_LINK or 'Wikipedia:' .. project_name)
local _status = cfg.inactive.status[args.PROJECT_STATUS] or cfg.inactive.default
local main_text = cfg.inactive.text:format(
project_link.prefixedText,
project_name,
_status
)
return initialise(
{
PROJECT = args.PROJECT,
BANNER_NAME = args.BANNER_NAME,
IMAGE_LEFT = cfg.inactive.image,
IMAGE_LEFT_SIZE = cfg.inactive.image_size,
MAIN_TEXT = main_text,
HOOK_NESTED_ASSESS = ' ' .. cfg.inactive.nested:format(_status),
substcheck = args.substcheck,
category = args.category
}, {
substcheck = '' -- to prevent warning on templatepage
}, _status
)
end
return p
abw38hm5fwpwrn9tv58c5xudlvtaq8w
Módulo:WikiProject banner/config
828
8327
73215
2026-03-02T22:23:19Z
en>MSGJ
0
add a-class color
73215
Scribunto
text/plain
return {
language = 'en',
subst_warning = {
image = 'Stop hand nuvola.svg',
type_ = 'content',
text = 'It seems that the <i>%s</i> banner has been [[Wikipedia:Substitution|substituted]] on this page instead of being [[Wikipedia:Transclusion|transcluded]]. Please undo the edit and type %s instead.',
categories = '[[Category:WikiProject banners with errors|SUBST]][[Category:Pages with incorrectly substituted templates]]'
},
namespace_warning = {
image = 'Ambox important.svg',
size = '40px',
type_ = 'content',
text = 'The WikiProject banner below should be moved to this _PAGETYPE_\'s <b>[[%s|talk page]]</b>. If this is a demonstration of the template, please set the parameter %s to prevent this page being miscategorised.',
on_template_page = 'If this message appears on the template page itself, please check that the value of the %s parameter is correctly set to <kbd>%s</kbd>.',
categories = 'WikiProject banners with errors',
sortkey = 'Location',
sortkey_on_template_page = 'Parameter'
},
image = {
default_size = '80px',
alt = 'WikiProject icon',
header_size = '35x25px'
},
main_text = 'This _PAGETYPE_ is within the scope of <b>[[%s|%s]]</b>, a collaborative effort to improve the coverage of %s on Wikipedia. If you would like to participate, please visit the project page, where you can join [[%s|the discussion]] and see a list of open tasks.',
quality = {
name = 'quality scale',
rating = 'This _PAGETYPE_ %s on %s.',
rated = 'has been rated as <b>%s-class</b>',
not_yet = 'has not yet received a rating',
not_required = 'does not require a rating',
project_scale = 'the project\'s %s',
non_article_classes = {'Template', 'File', 'Category', 'Disambig', 'Redirect', 'Portal', 'Project', 'Draft', 'FM', 'Help', 'User'},
border = '0.075em solid',
assessment_category = 'Category:%s-Class %s',
ns_to_class = { -- table that maps namespace IDs to classes
[15] = 'category', -- Category talk
[101] = 'portal', -- Portal talk
[11] = 'template', -- Template talk
[829] = 'template', -- Module talk
[5] = 'project', -- Wikipedia talk
[119] = 'draft' -- Draft talk
}
},
importance = {
rating = 'This _PAGETYPE_ has %s on the %s.',
rated = 'been rated as <b>%s-%s</b>',
not_yet = 'not yet received a rating',
default_scale = '[[Wikipedia:Content assessment#Priority assessment|importance scale]]',
project_scale = '[[%s|project\'s %s]]',
scale = '%s scale',
default_name = 'importance',
mask = {top = 'Top', high = 'High', mid = 'Mid', low = 'Low', na = 'NA', no = 'NA'},
unknown = 'Unknown',
na = 'NA'
},
task_force = {
text = 'This _PAGETYPE_ is supported by <b>%s</b>%s.',
importance = '(assessed as %s)',
header = 'Associated task forces:',-- default header for collapsed task forces if TF_COLLAPSED is defined
lower_threshold = 0,-- default threshold for collapsing task forces if TF_HEADER is defined
upper_threshold = 5,-- default threshold for collapsing task forces if TF_HEADER is not defined
icon_alt = 'Taskforce icon',
default_size = 'x25px'
},
note = {
header = 'More information:',-- default header when notes are collapsed
threshold = 2,-- default thresold for notes to collapse
icon_alt = 'Note icon',
default_size = 'x25px',
header_icon = 'x20px'
},
auto = {
assessed = 'This _PAGETYPE_ has been [[Wikipedia:Types of bots#WikiProject tagging and auto-assessment bots|automatically rated]] by a [[Wikipedia:Bots|bot]] or other tool %s. Please ensure the assessment is correct before removing the %s parameter.',
stub = 'as <b>Stub-class</b> because it uses a [[Wikipedia:Stub|stub template]]',
length = 'based on the length of the article',
inherit = 'because one or more other projects use this class',
sort_codes = {A='0', FA='1', FL='2', GA='3', B='4', C='5', Start='6', Stub='7', List='8'},
default_sort_code = '9',
default_cat = 'Automatically assessed %s articles',
icon = 'Robot icôn.svg',
},
attention = {
text = 'This _PAGETYPE_ has been marked as needing immediate attention.',
icon = 'Diamond-caution.svg',
default_cat = '%s articles needing attention',
},
infobox = {
text = 'This _PAGETYPE_ has been marked as needing an [[Wikipedia:Manual of Style/Infoboxes|infobox]].',
icon = 'Gnome-mime-text-x-credits.svg',
default_cat = '%s articles needing infoboxes',
},
auxiliary_module = 'Module:WikiProject banner/auxiliary',
b_checklist = {
image = '[[File:Bclass-checklist.svg|20px|link=Wikipedia:Content assessment/B-Class criteria|alt=B checklist|center]]',
text = 'This article has %s <b>[[%s|criteria]]</b> for B-class status:',
checked = 'been checked against the following',
not_checked = 'not yet been checked against the',
default_scale = 'Wikipedia:Content assessment/B-Class criteria',
mask = {
yes = 'y', y = 'y', ['1'] = 'y', pass = 'y', -- pass
no = 'n', n = 'n', ['0'] = 'n', fail = 'n', -- fail
na = 'x', ['n/a'] = 'x', -- not applicable
['<yes/no>'] = 'u', ['yes/no'] = 'u', ['?'] = 'u', [''] = 'u', -- unevaluated
default = 'i' -- invalid
},
icon = {
y = 'Green check',
n = 'Red x',
x = 'Tilde',
i = 'Orange exclamation mark',
u = 'Purple question mark',
},
status = {
y = 'criterion met',
n = 'criterion not met',
x = 'not applicable',
i = 'invalid parameter',
u = 'not checked',
},
criteria = {
[1] = 'Referencing and citation',
[2] = 'Coverage and accuracy',
[3] = 'Structure',
[4] = 'Grammar and style',
[5] = 'Supporting materials',
[6] = 'Accessibility'
},
syntax = {
text = 'To fill out this checklist, please [%s add] the following code to the template call:',
prompt = '| b%s<!--%s--> = <yes/no>',
max_width = 24,
assess = 'assessing the article against each criterion.'
},
},
inactive = {
image = 'People icon dead.svg',
image_size = '40px',
text = 'This _PAGETYPE_ is within the scope of [[%s|%s]], a project which is currently considered to be <b>[[WP:INACTIVEWP|%s]]</b>.',
nested = '([[WP:INACTIVEWP|%s]])',
status = {defunct = 'defunct'},
default = 'inactive',
class = 'inactive-wikiproject'
},
unknown_parameters = {
tracking = 'Category:Pages using %s with unknown parameters',
default = 'Category:WikiProject templates with unknown parameters',
preview = 'Page using %s with unknown parameter "_VALUE_"',
},
todo_list = {
default_title = 'To-do list',
edit = 'edit',
history = 'history',
watch = 'watch',
purge = 'purge',
},
image_needed = {
vowels = {
a = true,
e = true,
i = true,
o = true,
u = true
},
article = {
vowel = 'an',
consonant = 'a'
},
default_type = 'an <b>image</b> or <b>photograph</b>',
details = 'of <b>%s</b>',
help = '<b>%s</b> may be able to help!',
text = 'An editor has requested that %s%s be [[Wikipedia:Uploading images|added]] to this _PAGETYPE_.%s',
location = 'Wikipedia requested %ss in %s',
topic = 'Wikipedia requested %ss of %s',
default_image = 'Camera-photo.svg',
},
collaboration = {
default_image = 'Crystal 128 kuser.png',
default_text = 'project collaboration',
size = '30px',
candidate = 'This _PAGETYPE_ is a [[%s|candidate]] to be the %s.',
current = 'This _PAGETYPE_ is currently the %s.',
past = 'This _PAGETYPE_ was a past %s.',
},
a_class = {
text = 'This article %s an [[%s|A-Class review]].',
mask = {
pass = 'pass',
keep = 'pass',
kept = 'pass',
fail = 'fail',
demote = 'fail',
demoted = 'fail',
current = 'current'
},
status = {
pass = 'has passed',
fail = 'has failed',
current = 'is currently undergoing',
},
icon = {
pass = 'Symbol a class.svg',
fail = 'Symbol unsupport A vote.svg',
current = 'A candidate.svg'
},
category = {
pass = 'ACR_PASS_CAT',
fail = 'ACR_FAIL_CAT',
current = 'ACR_CURRENT_CAT'
},
background = '#66ffff',
color = 'black',
create_summary = 'Create A-class review discussion page'
},
peer_review = {
default_image = 'Nuvola apps kedit.png',
default_size = '30px',
current = 'This article <b>[[%s|is currently undergoing]]</b> a [[%s|peer review]].',
past = 'This article has had a [[%s|peer review]] which is <b>[[%s|now archived]]</b>.',
},
banner_shell = {
category = {
no_banner_shell = 'WikiProject banners without banner shells',
ignored_class = 'WikiProject banners with ignored class parameter',
outside_shell = 'WikiProject banners placed outside the banner shell'
},
redirects = {'WikiProject banner shell', 'WikiProject banner shell/sandbox', 'Bannershell', 'Multiple wikiprojects', 'Project shell', 'Scope shell', 'WPB', 'WPBS', 'WPBannerShell', 'WP Banner Shell', 'WP banner shell', 'WikiProjectBannerShell', 'WikiProjectBanner Shell', 'WikiProjectBanners', 'WikiProject BannerShell', 'WikiProject Banner Shell', 'WikiProject Banners', 'WikiProject Banners Shell', 'WikiProject Shell', 'WikiProject banner', 'WikiProject banner shell/redirect', 'WikiProject shell', 'WikiprojectBannerShell', 'Wikiproject banner holder', 'Wikiproject banner shell', 'Wikiprojectbanners', 'Wikiprojectbannershell', 'Wpb', 'Wpbannershell', 'Wpbsgclass', 'Article assessment', 'Wpbs'},
valid_users = {
"AlexNewArtBot",
"InceptionBot",
"SDZeroBot",
"TedderBot",
"UBX",
"WP 1.0",
}
}
}
b2bmneq8zh5izb46f1gyoo4i3rzou5k
73216
73215
2026-07-08T19:28:40Z
Robertsky
10424
1 versaun husi [[:en:Module:WikiProject_banner/config]]
73215
Scribunto
text/plain
return {
language = 'en',
subst_warning = {
image = 'Stop hand nuvola.svg',
type_ = 'content',
text = 'It seems that the <i>%s</i> banner has been [[Wikipedia:Substitution|substituted]] on this page instead of being [[Wikipedia:Transclusion|transcluded]]. Please undo the edit and type %s instead.',
categories = '[[Category:WikiProject banners with errors|SUBST]][[Category:Pages with incorrectly substituted templates]]'
},
namespace_warning = {
image = 'Ambox important.svg',
size = '40px',
type_ = 'content',
text = 'The WikiProject banner below should be moved to this _PAGETYPE_\'s <b>[[%s|talk page]]</b>. If this is a demonstration of the template, please set the parameter %s to prevent this page being miscategorised.',
on_template_page = 'If this message appears on the template page itself, please check that the value of the %s parameter is correctly set to <kbd>%s</kbd>.',
categories = 'WikiProject banners with errors',
sortkey = 'Location',
sortkey_on_template_page = 'Parameter'
},
image = {
default_size = '80px',
alt = 'WikiProject icon',
header_size = '35x25px'
},
main_text = 'This _PAGETYPE_ is within the scope of <b>[[%s|%s]]</b>, a collaborative effort to improve the coverage of %s on Wikipedia. If you would like to participate, please visit the project page, where you can join [[%s|the discussion]] and see a list of open tasks.',
quality = {
name = 'quality scale',
rating = 'This _PAGETYPE_ %s on %s.',
rated = 'has been rated as <b>%s-class</b>',
not_yet = 'has not yet received a rating',
not_required = 'does not require a rating',
project_scale = 'the project\'s %s',
non_article_classes = {'Template', 'File', 'Category', 'Disambig', 'Redirect', 'Portal', 'Project', 'Draft', 'FM', 'Help', 'User'},
border = '0.075em solid',
assessment_category = 'Category:%s-Class %s',
ns_to_class = { -- table that maps namespace IDs to classes
[15] = 'category', -- Category talk
[101] = 'portal', -- Portal talk
[11] = 'template', -- Template talk
[829] = 'template', -- Module talk
[5] = 'project', -- Wikipedia talk
[119] = 'draft' -- Draft talk
}
},
importance = {
rating = 'This _PAGETYPE_ has %s on the %s.',
rated = 'been rated as <b>%s-%s</b>',
not_yet = 'not yet received a rating',
default_scale = '[[Wikipedia:Content assessment#Priority assessment|importance scale]]',
project_scale = '[[%s|project\'s %s]]',
scale = '%s scale',
default_name = 'importance',
mask = {top = 'Top', high = 'High', mid = 'Mid', low = 'Low', na = 'NA', no = 'NA'},
unknown = 'Unknown',
na = 'NA'
},
task_force = {
text = 'This _PAGETYPE_ is supported by <b>%s</b>%s.',
importance = '(assessed as %s)',
header = 'Associated task forces:',-- default header for collapsed task forces if TF_COLLAPSED is defined
lower_threshold = 0,-- default threshold for collapsing task forces if TF_HEADER is defined
upper_threshold = 5,-- default threshold for collapsing task forces if TF_HEADER is not defined
icon_alt = 'Taskforce icon',
default_size = 'x25px'
},
note = {
header = 'More information:',-- default header when notes are collapsed
threshold = 2,-- default thresold for notes to collapse
icon_alt = 'Note icon',
default_size = 'x25px',
header_icon = 'x20px'
},
auto = {
assessed = 'This _PAGETYPE_ has been [[Wikipedia:Types of bots#WikiProject tagging and auto-assessment bots|automatically rated]] by a [[Wikipedia:Bots|bot]] or other tool %s. Please ensure the assessment is correct before removing the %s parameter.',
stub = 'as <b>Stub-class</b> because it uses a [[Wikipedia:Stub|stub template]]',
length = 'based on the length of the article',
inherit = 'because one or more other projects use this class',
sort_codes = {A='0', FA='1', FL='2', GA='3', B='4', C='5', Start='6', Stub='7', List='8'},
default_sort_code = '9',
default_cat = 'Automatically assessed %s articles',
icon = 'Robot icôn.svg',
},
attention = {
text = 'This _PAGETYPE_ has been marked as needing immediate attention.',
icon = 'Diamond-caution.svg',
default_cat = '%s articles needing attention',
},
infobox = {
text = 'This _PAGETYPE_ has been marked as needing an [[Wikipedia:Manual of Style/Infoboxes|infobox]].',
icon = 'Gnome-mime-text-x-credits.svg',
default_cat = '%s articles needing infoboxes',
},
auxiliary_module = 'Module:WikiProject banner/auxiliary',
b_checklist = {
image = '[[File:Bclass-checklist.svg|20px|link=Wikipedia:Content assessment/B-Class criteria|alt=B checklist|center]]',
text = 'This article has %s <b>[[%s|criteria]]</b> for B-class status:',
checked = 'been checked against the following',
not_checked = 'not yet been checked against the',
default_scale = 'Wikipedia:Content assessment/B-Class criteria',
mask = {
yes = 'y', y = 'y', ['1'] = 'y', pass = 'y', -- pass
no = 'n', n = 'n', ['0'] = 'n', fail = 'n', -- fail
na = 'x', ['n/a'] = 'x', -- not applicable
['<yes/no>'] = 'u', ['yes/no'] = 'u', ['?'] = 'u', [''] = 'u', -- unevaluated
default = 'i' -- invalid
},
icon = {
y = 'Green check',
n = 'Red x',
x = 'Tilde',
i = 'Orange exclamation mark',
u = 'Purple question mark',
},
status = {
y = 'criterion met',
n = 'criterion not met',
x = 'not applicable',
i = 'invalid parameter',
u = 'not checked',
},
criteria = {
[1] = 'Referencing and citation',
[2] = 'Coverage and accuracy',
[3] = 'Structure',
[4] = 'Grammar and style',
[5] = 'Supporting materials',
[6] = 'Accessibility'
},
syntax = {
text = 'To fill out this checklist, please [%s add] the following code to the template call:',
prompt = '| b%s<!--%s--> = <yes/no>',
max_width = 24,
assess = 'assessing the article against each criterion.'
},
},
inactive = {
image = 'People icon dead.svg',
image_size = '40px',
text = 'This _PAGETYPE_ is within the scope of [[%s|%s]], a project which is currently considered to be <b>[[WP:INACTIVEWP|%s]]</b>.',
nested = '([[WP:INACTIVEWP|%s]])',
status = {defunct = 'defunct'},
default = 'inactive',
class = 'inactive-wikiproject'
},
unknown_parameters = {
tracking = 'Category:Pages using %s with unknown parameters',
default = 'Category:WikiProject templates with unknown parameters',
preview = 'Page using %s with unknown parameter "_VALUE_"',
},
todo_list = {
default_title = 'To-do list',
edit = 'edit',
history = 'history',
watch = 'watch',
purge = 'purge',
},
image_needed = {
vowels = {
a = true,
e = true,
i = true,
o = true,
u = true
},
article = {
vowel = 'an',
consonant = 'a'
},
default_type = 'an <b>image</b> or <b>photograph</b>',
details = 'of <b>%s</b>',
help = '<b>%s</b> may be able to help!',
text = 'An editor has requested that %s%s be [[Wikipedia:Uploading images|added]] to this _PAGETYPE_.%s',
location = 'Wikipedia requested %ss in %s',
topic = 'Wikipedia requested %ss of %s',
default_image = 'Camera-photo.svg',
},
collaboration = {
default_image = 'Crystal 128 kuser.png',
default_text = 'project collaboration',
size = '30px',
candidate = 'This _PAGETYPE_ is a [[%s|candidate]] to be the %s.',
current = 'This _PAGETYPE_ is currently the %s.',
past = 'This _PAGETYPE_ was a past %s.',
},
a_class = {
text = 'This article %s an [[%s|A-Class review]].',
mask = {
pass = 'pass',
keep = 'pass',
kept = 'pass',
fail = 'fail',
demote = 'fail',
demoted = 'fail',
current = 'current'
},
status = {
pass = 'has passed',
fail = 'has failed',
current = 'is currently undergoing',
},
icon = {
pass = 'Symbol a class.svg',
fail = 'Symbol unsupport A vote.svg',
current = 'A candidate.svg'
},
category = {
pass = 'ACR_PASS_CAT',
fail = 'ACR_FAIL_CAT',
current = 'ACR_CURRENT_CAT'
},
background = '#66ffff',
color = 'black',
create_summary = 'Create A-class review discussion page'
},
peer_review = {
default_image = 'Nuvola apps kedit.png',
default_size = '30px',
current = 'This article <b>[[%s|is currently undergoing]]</b> a [[%s|peer review]].',
past = 'This article has had a [[%s|peer review]] which is <b>[[%s|now archived]]</b>.',
},
banner_shell = {
category = {
no_banner_shell = 'WikiProject banners without banner shells',
ignored_class = 'WikiProject banners with ignored class parameter',
outside_shell = 'WikiProject banners placed outside the banner shell'
},
redirects = {'WikiProject banner shell', 'WikiProject banner shell/sandbox', 'Bannershell', 'Multiple wikiprojects', 'Project shell', 'Scope shell', 'WPB', 'WPBS', 'WPBannerShell', 'WP Banner Shell', 'WP banner shell', 'WikiProjectBannerShell', 'WikiProjectBanner Shell', 'WikiProjectBanners', 'WikiProject BannerShell', 'WikiProject Banner Shell', 'WikiProject Banners', 'WikiProject Banners Shell', 'WikiProject Shell', 'WikiProject banner', 'WikiProject banner shell/redirect', 'WikiProject shell', 'WikiprojectBannerShell', 'Wikiproject banner holder', 'Wikiproject banner shell', 'Wikiprojectbanners', 'Wikiprojectbannershell', 'Wpb', 'Wpbannershell', 'Wpbsgclass', 'Article assessment', 'Wpbs'},
valid_users = {
"AlexNewArtBot",
"InceptionBot",
"SDZeroBot",
"TedderBot",
"UBX",
"WP 1.0",
}
}
}
b2bmneq8zh5izb46f1gyoo4i3rzou5k
Módulo:WikiProject banner/styles.css
828
8328
73217
2026-02-17T09:42:15Z
en>MSGJ
0
dark mode changes requested by [[User:Jonesey95]]
73217
sanitized-css
text/css
/* {{pp-template}} */
/* .wpb-header gets unhidden in wpbs */
.wpb-header, .wpb-metadata, .wpb-iefix {
/* TODO: Is wpb-iefix still necessary in an IE11/Edge world? */
display: none;
}
/* CSS for previous design */
.wpb-header-name {
text-align: right;
padding: 0.3em 1em 0.3em 0.3em;
width: 50%;
font-weight: bold;
}
.wpb-header-assessment {
text-align: left;
width: 50%;
padding: 0.3em;
}
/* CSS for redesign */
.wpb-header-combined {
text-align: left;
padding: 0.3em 0.3em 0.3em 0;
font-weight: bold;
}
.wpb-header-bubbles {
border-radius: .5em;
padding: 0 .3em;
margin-left: 0.5em;
white-space: nowrap;
font-weight: normal;
color: black;
}
.wpb-nested-task-force {font-weight: normal;}
.wpb-header-icon {
width: 50px;
text-align: center;
}
.wpb-category-box {
background-color: #F5F5F5;
color:var(--color-base, #202122);
border-width: 1px;
width: 500px;
}
.wpbs .wpb .wpb-main {
background-color: #FFFAEF;
color:var(--color-base, #202122);
padding: 3px 0 3px 0.7em;
}
.wpb .wpb-main {padding: 3px 5px;}
.wpbs .wpb-header {color:var(--color-base, #202122);background-color: #FFFAEF;}
.wpb-main > table {
border: none;
padding: 0;
width: 100%;
border-spacing: 0;
}
.wpb .wpb-image {padding: 2px 0;}
.wpb-collapsed-head {
text-align: left;
padding: 0.2em 2px 0.2em 0;
}
.wpb-collapsed-notes {padding: 0;}
.wpb-collapsed-notes > table {
width: 100%;
}
.wpb .wpb-gutter {padding: 2px 0 0 0;}
.wpbs .banner-shell-inner {
background-color: #f8eaba;
color:var(--color-base, #202122);
border: none;
}
.wpb-table {table-layout: fixed;}
@media (min-width: 720px) {
.wpb {
min-width: 80%;
}
}
.assess {
font-weight: bold;
text-align: center;
white-space: nowrap;
color:var(--color-base, #202122);
}
.import-top {color:var(--color-base-fixed, #202122);background-color: #FFBFFF;}
.import-high {color:var(--color-base-fixed, #202122);background-color: #FFCCFF;}
.import-mid {color:var(--color-base-fixed, #202122);background-color: #FFD9FF;}
.import-low {color:var(--color-base-fixed, #202122);background-color: #FFE7FF;}
.import-bottom {color:var(--color-base-fixed, #202122);background-color: #FFEBFF;}
.import-na {color:var(--color-base-fixed, #202122);background-color: #F5F5F5;}
.import-unknown {color:var(--color-base-fixed, #202122);background-color: #DCDCDC;}
.class-fa, .class-fl, .class-fm {color:var(--color-base-fixed, #202122);background-color: #BED3FF;}
.class-a, .class-al {color:var(--color-base-fixed, #202122);background-color: #C0FFFF;}
.class-ga {color:var(--color-base-fixed, #202122);background-color: #C0FFC0;}
.class-b, .class-bl {color:var(--color-base-fixed, #202122);background-color: #DFFFBF;}
.class-c, .class-cl {color:var(--color-base-fixed, #202122);background-color: #FFFFBE;}
.class-start {color:var(--color-base-fixed, #202122);background-color: #FFDBBF;}
.class-stub, .class-sl {color:var(--color-base-fixed, #202122);background-color: #FFC0C0;}
.class-list {color:var(--color-base-fixed, #202122);background-color: #D2C0FF;}
.class-na {color:var(--color-base-fixed, #202122);background-color: #F5F5F5;}
.class-category {color:var(--color-base-fixed, #202122);background-color: #FFDB58;}
.class-disambig {color:var(--color-base-fixed, #202122);background-color: #00FA9A;}
.class-draft {color:var(--color-base-fixed, #202122);background-color: #E7B198;}
.class-file {color:var(--color-base-fixed, #202122);background-color: #DDCCFF;}
.class-future {color:var(--color-base-fixed, #202122);background-color: #B4BBFF;}
.class-portal {color:var(--color-base-fixed, #202122);background-color: #DDB1BC;}
.class-project {color:var(--color-base-fixed, #202122);background-color: #C0C090;}
.class-redirect {color:var(--color-base-fixed, #202122);background-color: #C0C0C0;}
.class-sia {color:var(--color-base-fixed, #202122);background-color: #E9DAFF;}
.class-user {color:var(--color-base-fixed, #202122);background-color: #DDD06A;}
.class-template {color:var(--color-base-fixed, #202122);background-color: #FBCEB1;}
.class-unassessed {color:var(--color-base-fixed, #202122);background-color: #DCDCDC;}
.class-fpo {color:var(--color-base-fixed, #202122);background-color: #9cbdff;}
.class-complete {color:var(--color-base-fixed, #202122);background-color: #b2ff66;}
.class-substantial {color:var(--color-base-fixed, #202122);background-color: #ffff66;}
.class-basic {color:var(--color-base-fixed, #202122);background-color: #ffaa66;}
/* invert parenthesis on inactive WikiProject bubble */
.inactive-wikiproject .wpb-header-bubbles {
color: inherit;
}
@media screen {
html.skin-theme-clientpref-night .wpb-category-box {
/* brightness flipped */
color:var(--color-base, #202122);
background-color: #0a0a0a;
}
html.skin-theme-clientpref-night .wpbs .wpb .wpb-main,
html.skin-theme-clientpref-night .wpbs .wpb-header {
/* same hue/saturation as light */
color:var(--color-base, #202122);
background-color: #302f2d;
}
html.skin-theme-clientpref-night .wpbs .banner-shell-inner {
/* matching dark color from Module:Message box/tmbox.css */
color:var(--color-base, #202122);
background-color: #2e2505;
}
}
@media screen and ( prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .wpb-category-box {
/* brightness flipped */
color:var(--color-base, #202122);
background-color: #0a0a0a;
}
html.skin-theme-clientpref-os .wpbs .wpb .wpb-main,
html.skin-theme-clientpref-os .wpbs .wpb-header {
/* same hue/saturation as light */
color:var(--color-base, #202122);
background-color: #302f2d;
}
html.skin-theme-clientpref-os .wpbs .banner-shell-inner {
/* matching dark color from Module:Message box/tmbox.css */
color:var(--color-base, #202122);
background-color: #2e2505;
}
}
0fgs5glzrxb0zdeg55c7d2jzbtrndob
73218
73217
2026-07-08T19:28:40Z
Robertsky
10424
1 versaun husi [[:en:Module:WikiProject_banner/styles.css]]
73217
sanitized-css
text/css
/* {{pp-template}} */
/* .wpb-header gets unhidden in wpbs */
.wpb-header, .wpb-metadata, .wpb-iefix {
/* TODO: Is wpb-iefix still necessary in an IE11/Edge world? */
display: none;
}
/* CSS for previous design */
.wpb-header-name {
text-align: right;
padding: 0.3em 1em 0.3em 0.3em;
width: 50%;
font-weight: bold;
}
.wpb-header-assessment {
text-align: left;
width: 50%;
padding: 0.3em;
}
/* CSS for redesign */
.wpb-header-combined {
text-align: left;
padding: 0.3em 0.3em 0.3em 0;
font-weight: bold;
}
.wpb-header-bubbles {
border-radius: .5em;
padding: 0 .3em;
margin-left: 0.5em;
white-space: nowrap;
font-weight: normal;
color: black;
}
.wpb-nested-task-force {font-weight: normal;}
.wpb-header-icon {
width: 50px;
text-align: center;
}
.wpb-category-box {
background-color: #F5F5F5;
color:var(--color-base, #202122);
border-width: 1px;
width: 500px;
}
.wpbs .wpb .wpb-main {
background-color: #FFFAEF;
color:var(--color-base, #202122);
padding: 3px 0 3px 0.7em;
}
.wpb .wpb-main {padding: 3px 5px;}
.wpbs .wpb-header {color:var(--color-base, #202122);background-color: #FFFAEF;}
.wpb-main > table {
border: none;
padding: 0;
width: 100%;
border-spacing: 0;
}
.wpb .wpb-image {padding: 2px 0;}
.wpb-collapsed-head {
text-align: left;
padding: 0.2em 2px 0.2em 0;
}
.wpb-collapsed-notes {padding: 0;}
.wpb-collapsed-notes > table {
width: 100%;
}
.wpb .wpb-gutter {padding: 2px 0 0 0;}
.wpbs .banner-shell-inner {
background-color: #f8eaba;
color:var(--color-base, #202122);
border: none;
}
.wpb-table {table-layout: fixed;}
@media (min-width: 720px) {
.wpb {
min-width: 80%;
}
}
.assess {
font-weight: bold;
text-align: center;
white-space: nowrap;
color:var(--color-base, #202122);
}
.import-top {color:var(--color-base-fixed, #202122);background-color: #FFBFFF;}
.import-high {color:var(--color-base-fixed, #202122);background-color: #FFCCFF;}
.import-mid {color:var(--color-base-fixed, #202122);background-color: #FFD9FF;}
.import-low {color:var(--color-base-fixed, #202122);background-color: #FFE7FF;}
.import-bottom {color:var(--color-base-fixed, #202122);background-color: #FFEBFF;}
.import-na {color:var(--color-base-fixed, #202122);background-color: #F5F5F5;}
.import-unknown {color:var(--color-base-fixed, #202122);background-color: #DCDCDC;}
.class-fa, .class-fl, .class-fm {color:var(--color-base-fixed, #202122);background-color: #BED3FF;}
.class-a, .class-al {color:var(--color-base-fixed, #202122);background-color: #C0FFFF;}
.class-ga {color:var(--color-base-fixed, #202122);background-color: #C0FFC0;}
.class-b, .class-bl {color:var(--color-base-fixed, #202122);background-color: #DFFFBF;}
.class-c, .class-cl {color:var(--color-base-fixed, #202122);background-color: #FFFFBE;}
.class-start {color:var(--color-base-fixed, #202122);background-color: #FFDBBF;}
.class-stub, .class-sl {color:var(--color-base-fixed, #202122);background-color: #FFC0C0;}
.class-list {color:var(--color-base-fixed, #202122);background-color: #D2C0FF;}
.class-na {color:var(--color-base-fixed, #202122);background-color: #F5F5F5;}
.class-category {color:var(--color-base-fixed, #202122);background-color: #FFDB58;}
.class-disambig {color:var(--color-base-fixed, #202122);background-color: #00FA9A;}
.class-draft {color:var(--color-base-fixed, #202122);background-color: #E7B198;}
.class-file {color:var(--color-base-fixed, #202122);background-color: #DDCCFF;}
.class-future {color:var(--color-base-fixed, #202122);background-color: #B4BBFF;}
.class-portal {color:var(--color-base-fixed, #202122);background-color: #DDB1BC;}
.class-project {color:var(--color-base-fixed, #202122);background-color: #C0C090;}
.class-redirect {color:var(--color-base-fixed, #202122);background-color: #C0C0C0;}
.class-sia {color:var(--color-base-fixed, #202122);background-color: #E9DAFF;}
.class-user {color:var(--color-base-fixed, #202122);background-color: #DDD06A;}
.class-template {color:var(--color-base-fixed, #202122);background-color: #FBCEB1;}
.class-unassessed {color:var(--color-base-fixed, #202122);background-color: #DCDCDC;}
.class-fpo {color:var(--color-base-fixed, #202122);background-color: #9cbdff;}
.class-complete {color:var(--color-base-fixed, #202122);background-color: #b2ff66;}
.class-substantial {color:var(--color-base-fixed, #202122);background-color: #ffff66;}
.class-basic {color:var(--color-base-fixed, #202122);background-color: #ffaa66;}
/* invert parenthesis on inactive WikiProject bubble */
.inactive-wikiproject .wpb-header-bubbles {
color: inherit;
}
@media screen {
html.skin-theme-clientpref-night .wpb-category-box {
/* brightness flipped */
color:var(--color-base, #202122);
background-color: #0a0a0a;
}
html.skin-theme-clientpref-night .wpbs .wpb .wpb-main,
html.skin-theme-clientpref-night .wpbs .wpb-header {
/* same hue/saturation as light */
color:var(--color-base, #202122);
background-color: #302f2d;
}
html.skin-theme-clientpref-night .wpbs .banner-shell-inner {
/* matching dark color from Module:Message box/tmbox.css */
color:var(--color-base, #202122);
background-color: #2e2505;
}
}
@media screen and ( prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .wpb-category-box {
/* brightness flipped */
color:var(--color-base, #202122);
background-color: #0a0a0a;
}
html.skin-theme-clientpref-os .wpbs .wpb .wpb-main,
html.skin-theme-clientpref-os .wpbs .wpb-header {
/* same hue/saturation as light */
color:var(--color-base, #202122);
background-color: #302f2d;
}
html.skin-theme-clientpref-os .wpbs .banner-shell-inner {
/* matching dark color from Module:Message box/tmbox.css */
color:var(--color-base, #202122);
background-color: #2e2505;
}
}
0fgs5glzrxb0zdeg55c7d2jzbtrndob
Módulo:Disambiguation/templates
828
8329
73219
2026-02-26T17:22:58Z
en>Pppery
0
Update list
73219
Scribunto
text/plain
-- This page contains a table of all disambiguation templates and their
-- redirects. Templates names are capitalized, and the Template: prefix is
-- removed. Templates are grouped with the main template first, followed by
-- its redirects.
return {
["Disambiguation"] = true,
["Begriffsklärung"] = true,
["DAB"] = true,
["Dab"] = true,
["Dab page"] = true,
["Dabpage"] = true,
["Dbig"] = true,
["Dis"] = true,
["Disam"] = true,
["Disamb"] = true,
["Disambig"] = true,
["Disambig misspelling"] = true,
["Disambig-plants"] = true,
["Disambiguation page"] = true,
["Manual of Style disambiguation"] = true,
["Meta disambig"] = true,
["MOS disambiguation"] = true,
["MoS disambiguation"] = true,
["Portal disambig"] = true,
["Portal disambiguation"] = true,
["Project disambiguation"] = true,
["Shortcut disambig"] = true,
["Wikipedia disambiguation"] = true,
["WP disambig"] = true,
["WP-disambig"] = true,
["Airport disambiguation"] = true,
["Airport disambig"] = true,
["Biology disambiguation"] = true,
["Call sign disambiguation"] = true,
["Callsigndis"] = true,
["Caselaw disambiguation"] = true,
["Case law disambiguation"] = true,
["Chinese title disambiguation"] = true,
["Chinese title disambig"] = true,
["CJKVdab"] = true,
["Disambig-Chinese-char-title"] = true,
["Disambiguation cleanup"] = true,
["Cleanup disambig"] = true,
["Cleanup disambiguation"] = true,
["CleanupDisambig"] = true,
["Dab cleanup"] = true,
["Dab-cleanup"] = true,
["Dabclean"] = true,
["Disamb-cleanup"] = true,
["Disambcleanup"] = true,
["Disambig cleanup"] = true,
["Disambig-cleanup"] = true,
["Disambig-CU"] = true,
["Disambig-cu"] = true,
["Disambigcleanup"] = true,
["Disambiguate-cleanup"] = true,
["Disambiguation-cleanup"] = true,
["Geodis-cleanup"] = true,
["Disambiguation with potential"] = true,
["Disambiguation with possibilties"] = true,
["Genus disambiguation"] = true,
["Genus disambig"] = true,
["Greek letter organization disambiguation"] = true,
["GLO disambiguation"] = true,
["Hangul title disambiguation"] = true,
["Hospital disambiguation"] = true,
["Hospitaldis"] = true,
["Human name disambiguation"] = true,
["Bio-dab"] = true,
["Hndab"] = true,
["HNDIS"] = true,
["HnDis"] = true,
["Hndis"] = true,
["Hndisambig"] = true,
["Human name dab"] = true,
["Name list"] = true,
["Personal name"] = true,
["Personal name disambiguation"] = true,
["Human name disambiguation cleanup"] = true,
["Hndis-cleanup"] = true,
["Personal name disambiguation cleanup"] = true,
["Hurricane season disambiguation"] = true,
["Letter–number combination disambiguation"] = true,
["Letter-Number Combination Disambiguation"] = true,
["Letter-Number combination disambiguation"] = true,
["Letter-number combination disambiguation"] = true,
["Letter-NumberCombDisambig"] = true,
["Letter-NumberCombdisambig"] = true,
["Letter-NumberCombinationDisambiguation"] = true,
["LNCD"] = true,
["Mathematical disambiguation"] = true,
["Math dab"] = true,
["Math disambiguation"] = true,
["Math-dab"] = true,
["Mathdab"] = true,
["Mathematics disambiguation"] = true,
["Maths disambiguation"] = true,
["Military unit disambiguation"] = true,
["Mil-unit-dis"] = true,
["Mil-unit-disambig"] = true,
["Music disambiguation"] = true,
["Music disambig"] = true,
["Number disambiguation"] = true,
["Numberdis"] = true,
["Numdab"] = true,
["Numdisambig"] = true,
["Opus number disambiguation"] = true,
["Phonetics disambiguation"] = true,
["Place name disambiguation"] = true,
["DisambigG"] = true,
["DisambigGeo"] = true,
["Disambiggeo"] = true,
["Geo-dis"] = true,
["Geodab"] = true,
["Geodis"] = true,
["Geodisambig"] = true,
["Geographic disambiguation"] = true,
["Geographical disambiguation"] = true,
["Pnd"] = true,
["Road disambiguation"] = true,
["Roaddis"] = true,
["School disambiguation"] = true,
["School disambig"] = true,
["Schooldab"] = true,
["Schooldis"] = true,
["Species Latin name abbreviation disambiguation"] = true,
["Species Latin name disambiguation"] = true,
["LatinNameDisambig"] = true,
["Species disambiguation"] = true,
["SpeciesLatinNameDisambig"] = true,
["Station disambiguation"] = true,
["Station dab"] = true,
["Synagogue disambiguation"] = true,
["Taxonomy disambiguation"] = true,
["Template disambiguation"] = true,
["Template ambiguous"] = true,
["Template dab"] = true,
["Template disambig"] = true,
["WoO number disambiguation"] = true,
}
120emfqmecg5jbyx2n1prgswwe275a0
73220
73219
2026-07-08T19:28:40Z
Robertsky
10424
1 versaun husi [[:en:Module:Disambiguation/templates]]
73219
Scribunto
text/plain
-- This page contains a table of all disambiguation templates and their
-- redirects. Templates names are capitalized, and the Template: prefix is
-- removed. Templates are grouped with the main template first, followed by
-- its redirects.
return {
["Disambiguation"] = true,
["Begriffsklärung"] = true,
["DAB"] = true,
["Dab"] = true,
["Dab page"] = true,
["Dabpage"] = true,
["Dbig"] = true,
["Dis"] = true,
["Disam"] = true,
["Disamb"] = true,
["Disambig"] = true,
["Disambig misspelling"] = true,
["Disambig-plants"] = true,
["Disambiguation page"] = true,
["Manual of Style disambiguation"] = true,
["Meta disambig"] = true,
["MOS disambiguation"] = true,
["MoS disambiguation"] = true,
["Portal disambig"] = true,
["Portal disambiguation"] = true,
["Project disambiguation"] = true,
["Shortcut disambig"] = true,
["Wikipedia disambiguation"] = true,
["WP disambig"] = true,
["WP-disambig"] = true,
["Airport disambiguation"] = true,
["Airport disambig"] = true,
["Biology disambiguation"] = true,
["Call sign disambiguation"] = true,
["Callsigndis"] = true,
["Caselaw disambiguation"] = true,
["Case law disambiguation"] = true,
["Chinese title disambiguation"] = true,
["Chinese title disambig"] = true,
["CJKVdab"] = true,
["Disambig-Chinese-char-title"] = true,
["Disambiguation cleanup"] = true,
["Cleanup disambig"] = true,
["Cleanup disambiguation"] = true,
["CleanupDisambig"] = true,
["Dab cleanup"] = true,
["Dab-cleanup"] = true,
["Dabclean"] = true,
["Disamb-cleanup"] = true,
["Disambcleanup"] = true,
["Disambig cleanup"] = true,
["Disambig-cleanup"] = true,
["Disambig-CU"] = true,
["Disambig-cu"] = true,
["Disambigcleanup"] = true,
["Disambiguate-cleanup"] = true,
["Disambiguation-cleanup"] = true,
["Geodis-cleanup"] = true,
["Disambiguation with potential"] = true,
["Disambiguation with possibilties"] = true,
["Genus disambiguation"] = true,
["Genus disambig"] = true,
["Greek letter organization disambiguation"] = true,
["GLO disambiguation"] = true,
["Hangul title disambiguation"] = true,
["Hospital disambiguation"] = true,
["Hospitaldis"] = true,
["Human name disambiguation"] = true,
["Bio-dab"] = true,
["Hndab"] = true,
["HNDIS"] = true,
["HnDis"] = true,
["Hndis"] = true,
["Hndisambig"] = true,
["Human name dab"] = true,
["Name list"] = true,
["Personal name"] = true,
["Personal name disambiguation"] = true,
["Human name disambiguation cleanup"] = true,
["Hndis-cleanup"] = true,
["Personal name disambiguation cleanup"] = true,
["Hurricane season disambiguation"] = true,
["Letter–number combination disambiguation"] = true,
["Letter-Number Combination Disambiguation"] = true,
["Letter-Number combination disambiguation"] = true,
["Letter-number combination disambiguation"] = true,
["Letter-NumberCombDisambig"] = true,
["Letter-NumberCombdisambig"] = true,
["Letter-NumberCombinationDisambiguation"] = true,
["LNCD"] = true,
["Mathematical disambiguation"] = true,
["Math dab"] = true,
["Math disambiguation"] = true,
["Math-dab"] = true,
["Mathdab"] = true,
["Mathematics disambiguation"] = true,
["Maths disambiguation"] = true,
["Military unit disambiguation"] = true,
["Mil-unit-dis"] = true,
["Mil-unit-disambig"] = true,
["Music disambiguation"] = true,
["Music disambig"] = true,
["Number disambiguation"] = true,
["Numberdis"] = true,
["Numdab"] = true,
["Numdisambig"] = true,
["Opus number disambiguation"] = true,
["Phonetics disambiguation"] = true,
["Place name disambiguation"] = true,
["DisambigG"] = true,
["DisambigGeo"] = true,
["Disambiggeo"] = true,
["Geo-dis"] = true,
["Geodab"] = true,
["Geodis"] = true,
["Geodisambig"] = true,
["Geographic disambiguation"] = true,
["Geographical disambiguation"] = true,
["Pnd"] = true,
["Road disambiguation"] = true,
["Roaddis"] = true,
["School disambiguation"] = true,
["School disambig"] = true,
["Schooldab"] = true,
["Schooldis"] = true,
["Species Latin name abbreviation disambiguation"] = true,
["Species Latin name disambiguation"] = true,
["LatinNameDisambig"] = true,
["Species disambiguation"] = true,
["SpeciesLatinNameDisambig"] = true,
["Station disambiguation"] = true,
["Station dab"] = true,
["Synagogue disambiguation"] = true,
["Taxonomy disambiguation"] = true,
["Template disambiguation"] = true,
["Template ambiguous"] = true,
["Template dab"] = true,
["Template disambig"] = true,
["WoO number disambiguation"] = true,
}
120emfqmecg5jbyx2n1prgswwe275a0
Módulo:Title blacklist
828
8330
73221
2024-01-15T22:18:39Z
en>Pppery
0
Protected "[[Module:Title blacklist]]": [[WP:High-risk templates|High-risk template or module]] ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
73221
Scribunto
text/plain
--helper module for title blacklist
local p = {}
p.main = function(frame)
local args = frame.args
local action = args['action']
local pagename = args['pagename']
local blacklistentry = mw.ext.TitleBlacklist.test(action, pagename)
if blacklistentry then
if blacklistentry.params.autoconfirmed then
return args['autoconfirmed'] or "autoconfirmed"
else
return args['templateeditor'] or "templateeditor"
end
else return '' end
end
return p
afankphrw44jjj7gblu0ur8d52xfhu4
73222
73221
2026-07-08T19:28:40Z
Robertsky
10424
1 versaun husi [[:en:Module:Title_blacklist]]
73221
Scribunto
text/plain
--helper module for title blacklist
local p = {}
p.main = function(frame)
local args = frame.args
local action = args['action']
local pagename = args['pagename']
local blacklistentry = mw.ext.TitleBlacklist.test(action, pagename)
if blacklistentry then
if blacklistentry.params.autoconfirmed then
return args['autoconfirmed'] or "autoconfirmed"
else
return args['templateeditor'] or "templateeditor"
end
else return '' end
end
return p
afankphrw44jjj7gblu0ur8d52xfhu4
Módulo:Gadgets
828
8331
73227
2025-10-01T22:38:19Z
en>Krinkle
0
Maintenance: Fix Lua error "Lua error in Module:Gadgets at line 74: attempt to index a nil value." on Wikibooks where [[b:Wikipedia:GUS2Wiki|Wikipedia:GUS2Wiki]] is an interwiki prefix instead of a namespace. Use the "Project" alias instead, which should work everywhere. Ref [[m:User_talk:Krinkle#c-Krinkle-20251001202800-Codename_Noreste-20251001194500|discussion on Meta-Wiki]]
73227
Scribunto
text/plain
local p = {}
p.parse = function()
local text = mw.title.new('MediaWiki:Gadgets-definition'):getContent()
local lines = mw.text.split(text, '\n', false)
local repo = {}
for _, line in ipairs(lines) do
if line:sub(1, 1) == '*' then
local name, options, pages = p.parse_line(line)
if name and #pages ~= 0 then
repo[name] = { options = options, pages = pages }
end
end
end
return repo
end
p.parse_line = function(def)
local pattern = "^%*%s*(.+)%s*(%b[])%s*(.-)$"
local name, opts, pageList = string.match(def, pattern)
if name then
name = mw.text.trim(name)
end
-- Process options string into a Lua table
local options = {}
if opts then
-- Extracting the options without square brackets and trimming spaces
opts = opts:sub(2, -2):gsub("%s+", "")
for pair in opts:gmatch("%s*([^|]+)%s*|?") do
local key, value = pair:match("%s*([^=]+)%s*=%s*([^=|]+)%s*")
if key and value then
options[key:match("%s*(.-)%s*$")] = value:match("^%s*(.-)%s*$")
else
key = pair:match("%s*(.-)%s*$")
options[key] = true
end
end
end
-- Process page list into an array
local pages = {}
if pageList then
for page in pageList:gmatch("[^|]+") do
table.insert(pages, mw.text.trim(page))
end
end
return name, options, pages
end
p.get_type = function(def)
if def.options.type == 'general' or def.options.type == 'styles' then
return def.options.type
end
if def.options.dependencies ~= nil then
return 'general'
end
for _, page in ipairs(def.pages) do
if not string.match(page, '%.css$') then
return 'general'
end
end
return 'styles'
end
p.get_usage = function(name)
-- escape name for use in pattern
name = name:gsub("[%-%.%+%[%]%(%)%$%^%%%?%*]", "%%%1"):gsub("_", " ")
-- rely on [[Project:GUS2Wiki]] until [[phab:T354890]] is implemented
local _, _, count = mw.title.new('Project:GUS2Wiki'):getContent():find('\n'..name..',(%d+)')
return tonumber(count) or -1
end
return p
levponupcixi0maq7retkld8f467xna
73228
73227
2026-07-08T19:28:41Z
Robertsky
10424
1 versaun husi [[:en:Module:Gadgets]]
73227
Scribunto
text/plain
local p = {}
p.parse = function()
local text = mw.title.new('MediaWiki:Gadgets-definition'):getContent()
local lines = mw.text.split(text, '\n', false)
local repo = {}
for _, line in ipairs(lines) do
if line:sub(1, 1) == '*' then
local name, options, pages = p.parse_line(line)
if name and #pages ~= 0 then
repo[name] = { options = options, pages = pages }
end
end
end
return repo
end
p.parse_line = function(def)
local pattern = "^%*%s*(.+)%s*(%b[])%s*(.-)$"
local name, opts, pageList = string.match(def, pattern)
if name then
name = mw.text.trim(name)
end
-- Process options string into a Lua table
local options = {}
if opts then
-- Extracting the options without square brackets and trimming spaces
opts = opts:sub(2, -2):gsub("%s+", "")
for pair in opts:gmatch("%s*([^|]+)%s*|?") do
local key, value = pair:match("%s*([^=]+)%s*=%s*([^=|]+)%s*")
if key and value then
options[key:match("%s*(.-)%s*$")] = value:match("^%s*(.-)%s*$")
else
key = pair:match("%s*(.-)%s*$")
options[key] = true
end
end
end
-- Process page list into an array
local pages = {}
if pageList then
for page in pageList:gmatch("[^|]+") do
table.insert(pages, mw.text.trim(page))
end
end
return name, options, pages
end
p.get_type = function(def)
if def.options.type == 'general' or def.options.type == 'styles' then
return def.options.type
end
if def.options.dependencies ~= nil then
return 'general'
end
for _, page in ipairs(def.pages) do
if not string.match(page, '%.css$') then
return 'general'
end
end
return 'styles'
end
p.get_usage = function(name)
-- escape name for use in pattern
name = name:gsub("[%-%.%+%[%]%(%)%$%^%%%?%*]", "%%%1"):gsub("_", " ")
-- rely on [[Project:GUS2Wiki]] until [[phab:T354890]] is implemented
local _, _, count = mw.title.new('Project:GUS2Wiki'):getContent():find('\n'..name..',(%d+)')
return tonumber(count) or -1
end
return p
levponupcixi0maq7retkld8f467xna
Módulo:Script doc auto
828
8332
73229
2025-08-14T15:32:57Z
en>Ahecht
0
Support .json and .vue files
73229
Scribunto
text/plain
local MessageBox = require('Module:Message box')
local Gadgets = require('Module:Gadgets')
local Arguments = require('Module:Arguments')
local TableTools = require('Module:TableTools')
local p = {}
p.main = function(frame)
local args = Arguments.getArgs(frame)
return p.core(args.page or mw.title.getCurrentTitle().fullText)
end
p.core = function(page)
local text = ''
local content = mw.title.new(page).content
if content then
local result = content:match("/%* ({{mfd.-}})")
if result then
text = text .. mw.getCurrentFrame():preprocess(result)
end
end
local len = page:len()
if len < 4 then
-- Too short page name, do nothing more
return text
end
return p.makeMessage(page)
end
local skins = TableTools.listToSet({
'common', 'vector-2022', 'vector', 'timeless', 'minerva', 'monobook', 'modern', 'cologneblue'
})
p.gadget_text = function(name, repo)
local lang = mw.getContentLanguage()
local options = repo[name].options
local dependents = {}
if options.hidden ~= nil then
-- Find dependents
for n, c in pairs(repo) do
local deps = c.options.dependencies and
TableTools.listToSet(mw.text.split(c.options.dependencies, ',', false)) or {}
local peers = c.options.peers and
TableTools.listToSet(mw.text.split(c.options.peers, ',', false)) or {}
if deps['ext.gadget.'..name] ~= nil or peers[name] ~= nil then
table.insert(dependents, '[[Special:Gadgets#gadget-'..n..'|'..n..']]')
end
end
end
local usage = Gadgets.get_usage(name)
if usage == -1 then
usage = "an unknown number of"
else
usage = lang:formatNum(usage)
end
return 'This page is loaded as a part of the ' ..
'[[Special:Gadgets#gadget-'..name..'|'..name..']] gadget' ..
(options.hidden ~= nil and ', a hidden gadget'..
(#dependents > 0 and ' used by '..mw.text.listToText(dependents)..'.' or '.') or
(options.default ~= nil and ', <b>which is enabled by default</b>.' or
(', used by '..usage..' users. ')))
end
p.makeMessage = function(page)
local pageparts = mw.text.split(page, '.', true)
local pagetype = '.' .. pageparts[#pageparts]
local pagetypes = TableTools.listToSet({
'.js', '.css', '.json', '.vue'
})
if #pageparts<2 or pagetypes[pagetype] == nil then
return ''
end
local function listSisters(title, intro)
local output = {intro}
for sistertype in pairs(pagetypes) do
if sistertype ~= pagetype then
local sisterpage = mw.title.new(title .. sistertype)
if sisterpage.exists then
table.insert(output,
'an accompanying '..sistertype..' page at [['..sisterpage.fullText..']]'
)
end
end
end
--listToText with Oxford commas
return mw.text.listToText(output, ', ', (#output > 2) and ', and ' or ' and ') .. '.'
end
local text = ''
local basepage = mw.title.new(page:sub(0, -1 * (#pagetype + 1)))
if basepage.namespace == 2 then
if skins[basepage.subpageText] ~= nil and (pagetype == '.js' or pagetype == '.css') then
-- We are on a user skin file
local sistertype = (pagetype == '.js') and '.css' or '.js'
local sisterpage = mw.title.new(basepage.fullText .. sistertype)
text = 'The accompanying '..sistertype..' page for this skin '..
(sisterpage.exists and 'is' or 'can be added')..' at [['..sisterpage.fullText..']].'
else
-- We are on some script page, not a user skin file
if basepage.exists then
text = listSisters(basepage.fullText, 'This [[Wikipedia:User scripts|user script]] seems to have a documentation page at [['..basepage.fullText..']]')
else
text = listSisters(basepage.fullText)
text = 'Documentation for this [[Wikipedia:User scripts|user script]] can be added at [['..basepage.fullText..']]' ..
((#text > 1) and '. This user script seems to have ' or '') ..
text
end
end
elseif basepage.namespace == 8 then
if basepage.text:find('^Gadget-') ~= nil then
local gadgetRepo = Gadgets.parse()
local shortName = basepage.text:gsub('^Gadget%-', '') .. pagetype
for name, config in pairs(gadgetRepo) do
if TableTools.inArray(config.pages, shortName) then
text = text .. p.gadget_text(name, gadgetRepo)
end
end
if text ~= '' then
local sisterText = listSisters(basepage.fullText)
text = text ..
((#sisterText > 1) and (' There seems to be ' .. sisterText) or '') ..
'<br>'
end
end
end
if text ~= '' then
return mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Module:Script doc auto/styles.css' }
} .. MessageBox.main('fmbox', {
class = 'script-doc-auto-box',
id = 'mw-script-doc',
type = 'system',
image = '[[File:Template-info.svg|43x40px]]',
text = text
})
end
return ''
end
return p
ke9ql6ccvuavbieid62dw4k8y2w39gq
73230
73229
2026-07-08T19:28:41Z
Robertsky
10424
1 versaun husi [[:en:Module:Script_doc_auto]]
73229
Scribunto
text/plain
local MessageBox = require('Module:Message box')
local Gadgets = require('Module:Gadgets')
local Arguments = require('Module:Arguments')
local TableTools = require('Module:TableTools')
local p = {}
p.main = function(frame)
local args = Arguments.getArgs(frame)
return p.core(args.page or mw.title.getCurrentTitle().fullText)
end
p.core = function(page)
local text = ''
local content = mw.title.new(page).content
if content then
local result = content:match("/%* ({{mfd.-}})")
if result then
text = text .. mw.getCurrentFrame():preprocess(result)
end
end
local len = page:len()
if len < 4 then
-- Too short page name, do nothing more
return text
end
return p.makeMessage(page)
end
local skins = TableTools.listToSet({
'common', 'vector-2022', 'vector', 'timeless', 'minerva', 'monobook', 'modern', 'cologneblue'
})
p.gadget_text = function(name, repo)
local lang = mw.getContentLanguage()
local options = repo[name].options
local dependents = {}
if options.hidden ~= nil then
-- Find dependents
for n, c in pairs(repo) do
local deps = c.options.dependencies and
TableTools.listToSet(mw.text.split(c.options.dependencies, ',', false)) or {}
local peers = c.options.peers and
TableTools.listToSet(mw.text.split(c.options.peers, ',', false)) or {}
if deps['ext.gadget.'..name] ~= nil or peers[name] ~= nil then
table.insert(dependents, '[[Special:Gadgets#gadget-'..n..'|'..n..']]')
end
end
end
local usage = Gadgets.get_usage(name)
if usage == -1 then
usage = "an unknown number of"
else
usage = lang:formatNum(usage)
end
return 'This page is loaded as a part of the ' ..
'[[Special:Gadgets#gadget-'..name..'|'..name..']] gadget' ..
(options.hidden ~= nil and ', a hidden gadget'..
(#dependents > 0 and ' used by '..mw.text.listToText(dependents)..'.' or '.') or
(options.default ~= nil and ', <b>which is enabled by default</b>.' or
(', used by '..usage..' users. ')))
end
p.makeMessage = function(page)
local pageparts = mw.text.split(page, '.', true)
local pagetype = '.' .. pageparts[#pageparts]
local pagetypes = TableTools.listToSet({
'.js', '.css', '.json', '.vue'
})
if #pageparts<2 or pagetypes[pagetype] == nil then
return ''
end
local function listSisters(title, intro)
local output = {intro}
for sistertype in pairs(pagetypes) do
if sistertype ~= pagetype then
local sisterpage = mw.title.new(title .. sistertype)
if sisterpage.exists then
table.insert(output,
'an accompanying '..sistertype..' page at [['..sisterpage.fullText..']]'
)
end
end
end
--listToText with Oxford commas
return mw.text.listToText(output, ', ', (#output > 2) and ', and ' or ' and ') .. '.'
end
local text = ''
local basepage = mw.title.new(page:sub(0, -1 * (#pagetype + 1)))
if basepage.namespace == 2 then
if skins[basepage.subpageText] ~= nil and (pagetype == '.js' or pagetype == '.css') then
-- We are on a user skin file
local sistertype = (pagetype == '.js') and '.css' or '.js'
local sisterpage = mw.title.new(basepage.fullText .. sistertype)
text = 'The accompanying '..sistertype..' page for this skin '..
(sisterpage.exists and 'is' or 'can be added')..' at [['..sisterpage.fullText..']].'
else
-- We are on some script page, not a user skin file
if basepage.exists then
text = listSisters(basepage.fullText, 'This [[Wikipedia:User scripts|user script]] seems to have a documentation page at [['..basepage.fullText..']]')
else
text = listSisters(basepage.fullText)
text = 'Documentation for this [[Wikipedia:User scripts|user script]] can be added at [['..basepage.fullText..']]' ..
((#text > 1) and '. This user script seems to have ' or '') ..
text
end
end
elseif basepage.namespace == 8 then
if basepage.text:find('^Gadget-') ~= nil then
local gadgetRepo = Gadgets.parse()
local shortName = basepage.text:gsub('^Gadget%-', '') .. pagetype
for name, config in pairs(gadgetRepo) do
if TableTools.inArray(config.pages, shortName) then
text = text .. p.gadget_text(name, gadgetRepo)
end
end
if text ~= '' then
local sisterText = listSisters(basepage.fullText)
text = text ..
((#sisterText > 1) and (' There seems to be ' .. sisterText) or '') ..
'<br>'
end
end
end
if text ~= '' then
return mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Module:Script doc auto/styles.css' }
} .. MessageBox.main('fmbox', {
class = 'script-doc-auto-box',
id = 'mw-script-doc',
type = 'system',
image = '[[File:Template-info.svg|43x40px]]',
text = text
})
end
return ''
end
return p
ke9ql6ccvuavbieid62dw4k8y2w39gq
Módulo:Lockbox/doc
828
8333
73231
2024-08-29T22:12:37Z
en>Warudo
0
added missing closing tag
73231
wikitext
text/x-wiki
{{#ifeq: {{PAGENAME}}|{{ROOTPAGENAME}}|{{Cascade-protected template|page=module}}}}
This module transcludes templates whose names have been given as parameters in order to trigger cascade protection.
== Usage ==
{{#invoke:lockbox|lock<span style="color:gray">|silent=1</span>
| [[Template:X1|X1]]
| [[Template:X2|X2]]
| [[Template:X3|X3]]
| <var style="color:gray;">...</var>
}}
== See also ==
* [[Wikipedia:Cascade-protected items]]
<includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox||
<!-- Categories go here and interwikis go in Wikidata. -->
}}</includeonly><noinclude>
[[Category:Module documentation pages]]
</noinclude>
4ju4vkvyldec9lq6xtsfwyqcetqiptg
73232
73231
2026-07-08T19:29:28Z
Robertsky
10424
1 versaun husi [[:en:Module:Lockbox/doc]]
73231
wikitext
text/x-wiki
{{#ifeq: {{PAGENAME}}|{{ROOTPAGENAME}}|{{Cascade-protected template|page=module}}}}
This module transcludes templates whose names have been given as parameters in order to trigger cascade protection.
== Usage ==
{{#invoke:lockbox|lock<span style="color:gray">|silent=1</span>
| [[Template:X1|X1]]
| [[Template:X2|X2]]
| [[Template:X3|X3]]
| <var style="color:gray;">...</var>
}}
== See also ==
* [[Wikipedia:Cascade-protected items]]
<includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox||
<!-- Categories go here and interwikis go in Wikidata. -->
}}</includeonly><noinclude>
[[Category:Module documentation pages]]
</noinclude>
4ju4vkvyldec9lq6xtsfwyqcetqiptg
Template:Cite arXiv
10
8334
73233
2025-06-19T16:22:27Z
en>Headbomb
0
tweak
73233
wikitext
text/x-wiki
<noinclude>{{pp-template|small=yes}}</noinclude><includeonly>{{#ifexpr:
{{#expr:{{#if:{{{title|}}}|1|0}}*
{{#if:{{{last1|{{{last|{{{author1|{{{author|{{{vauthors|{{{surname|{{{surname1|}}}}}}}}}}}}}}}}}}}}}|1|0}}*
{{#if:{{{arxiv|{{{eprint|}}}}}}
|{{#iferror:{{#ifexpr:{{padleft:|4|{{{arxiv|{{{eprint|}}}}}}}}>0|1|0}}
|1
|{{#if:{{{class|}}}|1|0}}
}}
|0
}}
}}=0
<!-- Some parameters missing-->|{{#invoke:citation/CS1|citation|CitationClass=arxiv}} A bot will complete this citation soon. <small>[http://tools.wmflabs.org/citations/doibot.php?page={{FULLPAGENAMEE}} Click here to jump the queue]</small>{{#if:{{{nocat|}}}||{{#switch:{{lc:{{NAMESPACE}}}}||draft|template|wikipedia=[[Category:Articles with missing Cite arXiv inputs|{{PAGENAME}}]]|#default=}}}}
<!-- All parameters present-->|{{#invoke:citation/CS1|citation|CitationClass=arxiv}}
}}</includeonly><noinclude>
{{documentation}}
</noinclude>
lzbqk4zecegy2malnzt32pw0bap693m
73234
73233
2026-07-08T22:05:06Z
Robertsky
10424
1 versaun husi [[:en:Template:Cite_arXiv]]
73233
wikitext
text/x-wiki
<noinclude>{{pp-template|small=yes}}</noinclude><includeonly>{{#ifexpr:
{{#expr:{{#if:{{{title|}}}|1|0}}*
{{#if:{{{last1|{{{last|{{{author1|{{{author|{{{vauthors|{{{surname|{{{surname1|}}}}}}}}}}}}}}}}}}}}}|1|0}}*
{{#if:{{{arxiv|{{{eprint|}}}}}}
|{{#iferror:{{#ifexpr:{{padleft:|4|{{{arxiv|{{{eprint|}}}}}}}}>0|1|0}}
|1
|{{#if:{{{class|}}}|1|0}}
}}
|0
}}
}}=0
<!-- Some parameters missing-->|{{#invoke:citation/CS1|citation|CitationClass=arxiv}} A bot will complete this citation soon. <small>[http://tools.wmflabs.org/citations/doibot.php?page={{FULLPAGENAMEE}} Click here to jump the queue]</small>{{#if:{{{nocat|}}}||{{#switch:{{lc:{{NAMESPACE}}}}||draft|template|wikipedia=[[Category:Articles with missing Cite arXiv inputs|{{PAGENAME}}]]|#default=}}}}
<!-- All parameters present-->|{{#invoke:citation/CS1|citation|CitationClass=arxiv}}
}}</includeonly><noinclude>
{{documentation}}
</noinclude>
lzbqk4zecegy2malnzt32pw0bap693m
Template:Caution
10
8335
73235
2026-01-08T16:18:01Z
en>HouseBlaster
0
+{{[[TM:Editnotice EXPECTUNUSEDTEMPLATE|Editnotice EXPECTUNUSEDTEMPLATE]]}}
73235
wikitext
text/x-wiki
{{Mbox
| name = Caution
| demospace = {{{demospace|}}}
| style = {{{style|}}}
| subst = <includeonly>{{subst:substcheck}}</includeonly>
| type = style
| image = {{#if:{{{image|}}} |[[File:{{{image}}}|{{{imagesize|40px}}}|Caution|link={{{imagelink|}}}]] |[[File:Ambox warning yellow.svg|{{{imagesize|40px}}}|Caution|link={{{imagelink|}}}]]}}
| small = {{{small|}}}
| smallimage = {{#if:{{{image|}}} |[[File:{{{image}}}|{{{imagesize|40px}}}|Caution|link={{{imagelink|}}}]] |[[File:Ambox warning yellow.svg|30px|Caution|link={{{imagelink|}}}]]}}
| imageright = {{#if:{{{imageright|}}} |{{{imageright}}} |{{#if:{{{shortcut|{{{shortcut1|}}}}}} |{{Ombox/shortcut|{{{shortcut|{{{shortcut1|}}}}}}|{{{shortcut2|}}}|{{{shortcut3|}}}|{{{shortcut4|}}}|{{{shortcut5|}}}}}}} }}
| textstyle = {{{textstyle|{{{align|text-align: {{#if:{{{center|}}}|center|left}};}}}}}}
| text = {{#if:{{{header|{{{heading|{{{title|}}}}}}}}} |<div style="text-align:{{#if:{{{center|}}}|center|left}};">'''{{{header|{{{heading|{{{title|}}}}}}}}}'''</div>}}<!--
-->{{{text|{{{content|{{{reason|{{{1}}}}}}}}}}}}
}}{{Editnotice EXPECTUNUSEDTEMPLATE}}<noinclude>{{Documentation}}</noinclude>
s5y2taqjeoezacsy1lfwe91a86uw26b
73236
73235
2026-07-08T22:05:07Z
Robertsky
10424
1 versaun husi [[:en:Template:Caution]]
73235
wikitext
text/x-wiki
{{Mbox
| name = Caution
| demospace = {{{demospace|}}}
| style = {{{style|}}}
| subst = <includeonly>{{subst:substcheck}}</includeonly>
| type = style
| image = {{#if:{{{image|}}} |[[File:{{{image}}}|{{{imagesize|40px}}}|Caution|link={{{imagelink|}}}]] |[[File:Ambox warning yellow.svg|{{{imagesize|40px}}}|Caution|link={{{imagelink|}}}]]}}
| small = {{{small|}}}
| smallimage = {{#if:{{{image|}}} |[[File:{{{image}}}|{{{imagesize|40px}}}|Caution|link={{{imagelink|}}}]] |[[File:Ambox warning yellow.svg|30px|Caution|link={{{imagelink|}}}]]}}
| imageright = {{#if:{{{imageright|}}} |{{{imageright}}} |{{#if:{{{shortcut|{{{shortcut1|}}}}}} |{{Ombox/shortcut|{{{shortcut|{{{shortcut1|}}}}}}|{{{shortcut2|}}}|{{{shortcut3|}}}|{{{shortcut4|}}}|{{{shortcut5|}}}}}}} }}
| textstyle = {{{textstyle|{{{align|text-align: {{#if:{{{center|}}}|center|left}};}}}}}}
| text = {{#if:{{{header|{{{heading|{{{title|}}}}}}}}} |<div style="text-align:{{#if:{{{center|}}}|center|left}};">'''{{{header|{{{heading|{{{title|}}}}}}}}}'''</div>}}<!--
-->{{{text|{{{content|{{{reason|{{{1}}}}}}}}}}}}
}}{{Editnotice EXPECTUNUSEDTEMPLATE}}<noinclude>{{Documentation}}</noinclude>
s5y2taqjeoezacsy1lfwe91a86uw26b
Template:Pp-template
10
8336
73237
2014-08-05T17:17:27Z
en>Mr. Stradivarius
0
convert this to use [[Module:Protection banner]]; see [[Module talk:Protection banner#Proposal to convert all protection templates to use this module|here]] for details
73237
wikitext
text/x-wiki
<includeonly>{{#invoke:Protection banner|main}}</includeonly><noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
5t6lal9n9hcpwsso2obr7pcyjbg26xc
73238
73237
2026-07-08T22:05:07Z
Robertsky
10424
1 versaun husi [[:en:Template:Pp-template]]
73237
wikitext
text/x-wiki
<includeonly>{{#invoke:Protection banner|main}}</includeonly><noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
5t6lal9n9hcpwsso2obr7pcyjbg26xc
Template:Citation Style documentation/usage vertical
10
8337
73241
2023-10-10T15:15:22Z
en>Jonesey95
0
Fix [[Special:LintErrors|Linter]] errors.
73241
wikitext
text/x-wiki
{| class="wikitable"
|+ Full parameter set in vertical format
! Vertical list !! Prerequisites !! Brief instructions / notes
|- style="vertical-align:top;"
|<noinclude>
|}
</noinclude>
ml659icexg47kl1zrv3y5ba1l5n24aa
73242
73241
2026-07-08T22:05:08Z
Robertsky
10424
1 versaun husi [[:en:Template:Citation_Style_documentation/usage_vertical]]
73241
wikitext
text/x-wiki
{| class="wikitable"
|+ Full parameter set in vertical format
! Vertical list !! Prerequisites !! Brief instructions / notes
|- style="vertical-align:top;"
|<noinclude>
|}
</noinclude>
ml659icexg47kl1zrv3y5ba1l5n24aa
Template:Citation Style documentation/usage vertical end
10
8338
73243
2015-08-11T16:34:23Z
en>Izkala
0
Reverted edits by [[Special:Contribs/M777|M777]] ([[User talk:M777|talk]]) to last version by Jonesey95
73243
wikitext
text/x-wiki
|}
* If a field name is listed in the '''Prerequisites''' column, it is a prerequisite for the field to the left.
iba42liqck57p33wcbds1eq8kf39tbj
73244
73243
2026-07-08T22:05:08Z
Robertsky
10424
1 versaun husi [[:en:Template:Citation_Style_documentation/usage_vertical_end]]
73243
wikitext
text/x-wiki
|}
* If a field name is listed in the '''Prerequisites''' column, it is a prerequisite for the field to the left.
iba42liqck57p33wcbds1eq8kf39tbj
Template:Citation Style documentation/usage vertical mid
10
8339
73245
2021-05-16T12:11:40Z
en>Optakeover
0
Reverted edits by [[Special:Contributions/2601:486:281:2BB0:1474:7449:3FAE:9299|2601:486:281:2BB0:1474:7449:3FAE:9299]] ([[User talk:2601:486:281:2BB0:1474:7449:3FAE:9299|talk]]) ([[WP:HG|HG]]) (3.4.9)
73245
wikitext
text/x-wiki
| style="vertical-align:top;" |
dngspsil9irpijhjhntztbj8cw6cmxw
73246
73245
2026-07-08T22:05:08Z
Robertsky
10424
1 versaun husi [[:en:Template:Citation_Style_documentation/usage_vertical_mid]]
73245
wikitext
text/x-wiki
| style="vertical-align:top;" |
dngspsil9irpijhjhntztbj8cw6cmxw
Template:Cite arXiv/doc
10
8340
73247
2025-06-19T10:38:20Z
en>DocWatson42
0
Cleaned up [[MOS:ORDER|layout]] and other matters.
73247
wikitext
text/x-wiki
{{Distinguish|Template:Cite archive}}
{{Documentation subpage}}
{{High-use|2600}}
{{caution|arXiv contains preliminary reports that have not been peer-reviewed and hence should be used with a high degree of caution. Per [[WP:MEDRS]] and [[WP:SCIRS]], these reports should not be used to support medical or scientific claims.}}
<!-- Categories go where indicated at the bottom of this page, please; interwikis go to Wikidata (see also: [[Wikipedia:Wikidata]]) -->
{{csdoc|lua|lua=yes}}
{{csdoc|cs1|lua=yes}}
{{csdoc|lead|preprints at [[arXiv]]}} It links to the abstract at <code><nowiki>https://www.arxiv.org/abs/</nowiki></code>''eprint''.
== Usage ==
To use the template, you need only specify the '''arxiv''' or '''eprint''' parameter. Once you save the page, [[User:Citation bot|Citation bot]] will detect the citation and complete it automatically.
{{csdoc|usage}}
{{csdoc|usage common}}
<syntaxhighlight lang="wikitext" copy="1">{{cite arXiv |last= |first= |date= |title= |arxiv= |class=}}</syntaxhighlight>
{{end}}
{{csdoc|usage full}}
<syntaxhighlight lang="wikitext" copy="1">{{cite arXiv |last1= |first1= |author-link1= |last2= |first2= |author-link2= |display-authors= |author-mask1= |author-mask2= |collaboration= |name-list-style= |df= |date= |year= |title= |trans-title= |language= |page= |pages= |at= |no-pp= |arxiv= |class= |quote= |mode= |ref= |postscript=}}</syntaxhighlight>
{{end}}
{{csdoc|usage vertical common}}
<!-- Please synchronize this list with the corresponding one at the overview page [[Wikipedia:Citation templates#Examples]] -->
<syntaxhighlight lang="wikitext" copy="1">
{{cite arXiv
|last =
|first =
|date =
|title =
|arxiv =
|class =
}}
</syntaxhighlight>
{{end}}
{{csdoc|usage vertical}}
<syntaxhighlight lang="wikitext" copy="1">
{{cite arXiv
|last1 =
|first1 =
|author-link1 =
|last2 =
|first2 =
|author-link2 =
|display-authors =
|author-mask1 =
|author-mask2 =
|collaboration =
|name-list-style =
|df =
|date =
|year =
|title =
|trans-title =
|language =
|page =
|pages =
|at =
|no-pp =
|arxiv =
|class =
|quote =
|mode =
|ref =
|postscript =
}}
</syntaxhighlight>
{{csdoc|usage vertical mid}}
<pre style="margin:0px; border:none; white-space:pre;">
last1 (or an alias)
last1 (or an alias)
last1 (or an alias)
last2 (or an alias)
last2 (or an alias)
last1 (or an alias)
last1 (or an alias)
last2 (or an alias)
last1 (or an alias)
last2 (or an alias)
title
page, pages, p or pp
</pre>
{{csdoc|usage vertical mid}}
<pre style="margin:0px; border:none; white-space:pre;">
Don't link. Aliases include 'last'; 'surname1'; 'surname'; 'author1'; and 'author'
Don't link. Aliases include 'first'; 'given1'; and 'given'
Don't link. Aliases include 'author1-link'; 'author-link'; 'authorlink1'; 'author1link'; and 'authorlink'
Don't link. Similar: 'last3', etc. Aliases include 'surname2'; and 'author2'
Don't link. Similar: 'first3', etc. Aliases include 'given2'
Don't link. Similar: 'author-link3', etc. Aliases include 'author2-link'; 'authorlink2'; and 'author2link'
Number (number of authors displayed) or 'etal' (more authors)
Not for lists of cited works. Aliases include 'author1-mask'; and 'author-mask'
Aliases include 'author2-mask'
Set to 'amp' or 'ampersand' to separate the last author with ' & '; set to 'and' to separate with ' and '
Required
Aliases include 'lang'
Aliases include 'p'
Aliases include 'pp'
set to "yes" to suppress the "p." or "pp." before page numbers
Required. Aliases include 'eprint'
Aliases include 'quotation'
'cs1' or 'cs2'
</pre>
{{csdoc|usage vertical end}}
* '''Note''' that quotation marks aren't part of the parameter names or their aliases and are there to make identifying them easier for readers.
* '''title''': Title of the cited paper.
* '''arxiv''' or '''eprint''' '''(mandatory)''': arXiv/Eprint identifier, without any "arXiv:" prefix. Prior to April 2007, the identifiers included a classification, an optional two-letter subdivision, and a 7-digit YYMMNNN year, month, and sequence number of submission in that category. E.g. gr-qc/0610068 or math.GT/0309136. After April 2007, the format was changed to a simple YYMM.NNNN. Starting in [https://arxiv.org/help/arxiv_identifier January 2015], the identifier was changed to be 5 digits: YYMM.NNNNN.
* '''class''': arXiv classification, e.g. hep-th. Optional. To be used only with new-style (2007 and later) eprint identifiers that do not include the classification.
The template uses the style of {{tl|cite journal}}. Once a paper is accepted in a peer-reviewed journal, it is recommended to use one of those templates, as the peer-reviewed status of the article is important, while preserving the arXiv link in order to guarantee open access to the previous version of the article. To preserve the arXiv link, add e.g. {{para|arxiv|gr-qc/0610068}} or {{para|arxiv|math.GT/0309136}} or {{para|arxiv|YYMM.NNNN}} (following the above examples) to the {{tl|citation}} or {{tl|cite journal}} templates.
== Examples ==
{{markup2
|m=<nowiki>{{cite arXiv |last=Sparling |first=George A. J. |date=2006 |title=Spacetime is spinorial; new dimensions are timelike |eprint=gr-qc/0610068}}</nowiki>
|r={{cite arXiv |last=Sparling |first=George A. J. |date=2006 |title=Spacetime is spinorial; new dimensions are timelike |eprint=gr-qc/0610068}}
}}
{{markup2
|m=<nowiki>{{cite arXiv |last=Leinster |first=Tom |date=2007 |title=The Euler characteristic of a category as the sum of a divergent series |eprint=0707.0835 |class=math.CT}}</nowiki>
|r={{cite arXiv |last=Leinster |first=Tom |date=2007 |title=The Euler characteristic of a category as the sum of a divergent series |eprint=0707.0835 |class=math.CT}}
}}
== Parameters ==
=== Deprecated ===
{{csdoc|deprecated}}
=== Description ===
==== Authors ====
{{csdoc|author|limited_param_list=yes}}<!-- see limited list of parameters at [[Module:Citation/CS1/Whitelist]] -->
==== Date ====
{{csdoc|date|limited_param_list=yes}}<!-- see limited list of parameters at [[Module:Citation/CS1/Whitelist]] -->
==== Title ====
{{csdoc|title|title_format=quotes|link=no|limited_param_list=yes}}<!-- see limited list of parameters at [[Module:Citation/CS1/Whitelist]] -->
{{csdoc|language}}
== TemplateData ==
{{Warning |image=Stop hand nuvola.svg |This section contains configuration data used by editing tools and automated bots. Changes to this data can result in widespread and unintended effects. For more information see [[Help:Citation Style 1#TemplateData]]}}
{{TemplateData header}}
{{#invoke:cs1 documentation support|template_data_validate|{{ROOTPAGENAME}}}}
<templatedata>
{
"params": {
"arxiv": {
"aliases": [
"eprint"
],
"label": "arXiv ",
"description": "arXiv identifier without the \"arXiv:\" prefix; can include version number",
"type": "string",
"required": true,
"example": "1612.00008v1"
},
"title": {
"label": "Title",
"description": "Title of the paper cited",
"type": "string",
"suggested": true
},
"first": {
"aliases": [
"first1",
"given",
"given1"
],
"label": "First name",
"description": "First name of first author",
"type": "string",
"suggested": true
},
"last": {
"aliases": [
"last1",
"surname",
"surname1"
],
"label": "Last name",
"description": "Last name of first author",
"type": "string",
"suggested": true
},
"author": {
"aliases": [
"author1"
],
"label": "Author",
"description": "Complete name of the first author",
"type": "string"
},
"author-link": {
"aliases": [
"author-link1",
"author1-link"
],
"label": "Author's article",
"description": "Title of the Wikipedia article about the first author",
"type": "wiki-page-name"
},
"first2": {
"aliases": [
"given2"
],
"label": "Author 2's first name",
"description": "First name of second author",
"type": "string"
},
"last2": {
"aliases": [
"surname2"
],
"label": "Author 2's last name",
"description": "Last name of second author",
"type": "string"
},
"author2": {
"label": "Author 2",
"description": "Full name of second author",
"type": "string"
},
"author-link2": {
"aliases": [
"author2-link"
],
"label": "Author 2's article",
"description": "Title of Wikipedia article about the second author",
"type": "wiki-page-name"
},
"collaboration": {
"label": "collaboration",
"description": "Name of a group of authors, in addition to the ones listed in the Author parameters",
"type": "string"
},
"class": {
"label": "arXiv class",
"description": "arXiv classification, for post-2007 ids ",
"type": "string"
},
"date": {
"label": "Date",
"description": "Date of the source being cited. Use n.d. for no date, and c. for inexact dated.",
"type": "string"
},
"df": {
"label": "Date format for publication dates",
"description": "Either ymd (Year-Month-Day), dmy (Day-Month-Year), or mdy (Month-Day-Year) add -all at end to also affect access and archive dates",
"example": "dmy",
"type": "string"
},
"trans-title": {
"label": "Translated title",
"description": "English translation of title",
"type": "string"
},
"language": {
"label": "Language(s)",
"description": "Language(s) the source is written in. Separate by commas, and do not include 'and'.",
"type": "string"
}
},
"format": "{{_ |_=_}}",
"description": "Formats a citation to a paper with an arXiv id",
"paramOrder": [
"arxiv",
"class",
"author",
"first",
"last",
"first2",
"last2",
"author2",
"author-link",
"author-link2",
"title",
"collaboration",
"date",
"df",
"trans-title",
"language"
]
}
</templatedata>
== External links ==
* [https://arxiv.org Official website]
* [https://info.arxiv.org/help/arxiv_identifier.html Understanding the arXiv identifier]
{{Citation Style 1}}
<includeonly>
{{Sandbox other||
<!-- Categories go below this line, please; interwikis go to Wikidata, thank you! -->
[[Category:Citation Style 1 templates|A]]
[[Category:Mathematics source templates|{{PAGENAME}}]]
}}</includeonly>
3b49qp1mh85fnpqaa9v8szw80x6qzn8
73248
73247
2026-07-08T22:05:08Z
Robertsky
10424
1 versaun husi [[:en:Template:Cite_arXiv/doc]]
73247
wikitext
text/x-wiki
{{Distinguish|Template:Cite archive}}
{{Documentation subpage}}
{{High-use|2600}}
{{caution|arXiv contains preliminary reports that have not been peer-reviewed and hence should be used with a high degree of caution. Per [[WP:MEDRS]] and [[WP:SCIRS]], these reports should not be used to support medical or scientific claims.}}
<!-- Categories go where indicated at the bottom of this page, please; interwikis go to Wikidata (see also: [[Wikipedia:Wikidata]]) -->
{{csdoc|lua|lua=yes}}
{{csdoc|cs1|lua=yes}}
{{csdoc|lead|preprints at [[arXiv]]}} It links to the abstract at <code><nowiki>https://www.arxiv.org/abs/</nowiki></code>''eprint''.
== Usage ==
To use the template, you need only specify the '''arxiv''' or '''eprint''' parameter. Once you save the page, [[User:Citation bot|Citation bot]] will detect the citation and complete it automatically.
{{csdoc|usage}}
{{csdoc|usage common}}
<syntaxhighlight lang="wikitext" copy="1">{{cite arXiv |last= |first= |date= |title= |arxiv= |class=}}</syntaxhighlight>
{{end}}
{{csdoc|usage full}}
<syntaxhighlight lang="wikitext" copy="1">{{cite arXiv |last1= |first1= |author-link1= |last2= |first2= |author-link2= |display-authors= |author-mask1= |author-mask2= |collaboration= |name-list-style= |df= |date= |year= |title= |trans-title= |language= |page= |pages= |at= |no-pp= |arxiv= |class= |quote= |mode= |ref= |postscript=}}</syntaxhighlight>
{{end}}
{{csdoc|usage vertical common}}
<!-- Please synchronize this list with the corresponding one at the overview page [[Wikipedia:Citation templates#Examples]] -->
<syntaxhighlight lang="wikitext" copy="1">
{{cite arXiv
|last =
|first =
|date =
|title =
|arxiv =
|class =
}}
</syntaxhighlight>
{{end}}
{{csdoc|usage vertical}}
<syntaxhighlight lang="wikitext" copy="1">
{{cite arXiv
|last1 =
|first1 =
|author-link1 =
|last2 =
|first2 =
|author-link2 =
|display-authors =
|author-mask1 =
|author-mask2 =
|collaboration =
|name-list-style =
|df =
|date =
|year =
|title =
|trans-title =
|language =
|page =
|pages =
|at =
|no-pp =
|arxiv =
|class =
|quote =
|mode =
|ref =
|postscript =
}}
</syntaxhighlight>
{{csdoc|usage vertical mid}}
<pre style="margin:0px; border:none; white-space:pre;">
last1 (or an alias)
last1 (or an alias)
last1 (or an alias)
last2 (or an alias)
last2 (or an alias)
last1 (or an alias)
last1 (or an alias)
last2 (or an alias)
last1 (or an alias)
last2 (or an alias)
title
page, pages, p or pp
</pre>
{{csdoc|usage vertical mid}}
<pre style="margin:0px; border:none; white-space:pre;">
Don't link. Aliases include 'last'; 'surname1'; 'surname'; 'author1'; and 'author'
Don't link. Aliases include 'first'; 'given1'; and 'given'
Don't link. Aliases include 'author1-link'; 'author-link'; 'authorlink1'; 'author1link'; and 'authorlink'
Don't link. Similar: 'last3', etc. Aliases include 'surname2'; and 'author2'
Don't link. Similar: 'first3', etc. Aliases include 'given2'
Don't link. Similar: 'author-link3', etc. Aliases include 'author2-link'; 'authorlink2'; and 'author2link'
Number (number of authors displayed) or 'etal' (more authors)
Not for lists of cited works. Aliases include 'author1-mask'; and 'author-mask'
Aliases include 'author2-mask'
Set to 'amp' or 'ampersand' to separate the last author with ' & '; set to 'and' to separate with ' and '
Required
Aliases include 'lang'
Aliases include 'p'
Aliases include 'pp'
set to "yes" to suppress the "p." or "pp." before page numbers
Required. Aliases include 'eprint'
Aliases include 'quotation'
'cs1' or 'cs2'
</pre>
{{csdoc|usage vertical end}}
* '''Note''' that quotation marks aren't part of the parameter names or their aliases and are there to make identifying them easier for readers.
* '''title''': Title of the cited paper.
* '''arxiv''' or '''eprint''' '''(mandatory)''': arXiv/Eprint identifier, without any "arXiv:" prefix. Prior to April 2007, the identifiers included a classification, an optional two-letter subdivision, and a 7-digit YYMMNNN year, month, and sequence number of submission in that category. E.g. gr-qc/0610068 or math.GT/0309136. After April 2007, the format was changed to a simple YYMM.NNNN. Starting in [https://arxiv.org/help/arxiv_identifier January 2015], the identifier was changed to be 5 digits: YYMM.NNNNN.
* '''class''': arXiv classification, e.g. hep-th. Optional. To be used only with new-style (2007 and later) eprint identifiers that do not include the classification.
The template uses the style of {{tl|cite journal}}. Once a paper is accepted in a peer-reviewed journal, it is recommended to use one of those templates, as the peer-reviewed status of the article is important, while preserving the arXiv link in order to guarantee open access to the previous version of the article. To preserve the arXiv link, add e.g. {{para|arxiv|gr-qc/0610068}} or {{para|arxiv|math.GT/0309136}} or {{para|arxiv|YYMM.NNNN}} (following the above examples) to the {{tl|citation}} or {{tl|cite journal}} templates.
== Examples ==
{{markup2
|m=<nowiki>{{cite arXiv |last=Sparling |first=George A. J. |date=2006 |title=Spacetime is spinorial; new dimensions are timelike |eprint=gr-qc/0610068}}</nowiki>
|r={{cite arXiv |last=Sparling |first=George A. J. |date=2006 |title=Spacetime is spinorial; new dimensions are timelike |eprint=gr-qc/0610068}}
}}
{{markup2
|m=<nowiki>{{cite arXiv |last=Leinster |first=Tom |date=2007 |title=The Euler characteristic of a category as the sum of a divergent series |eprint=0707.0835 |class=math.CT}}</nowiki>
|r={{cite arXiv |last=Leinster |first=Tom |date=2007 |title=The Euler characteristic of a category as the sum of a divergent series |eprint=0707.0835 |class=math.CT}}
}}
== Parameters ==
=== Deprecated ===
{{csdoc|deprecated}}
=== Description ===
==== Authors ====
{{csdoc|author|limited_param_list=yes}}<!-- see limited list of parameters at [[Module:Citation/CS1/Whitelist]] -->
==== Date ====
{{csdoc|date|limited_param_list=yes}}<!-- see limited list of parameters at [[Module:Citation/CS1/Whitelist]] -->
==== Title ====
{{csdoc|title|title_format=quotes|link=no|limited_param_list=yes}}<!-- see limited list of parameters at [[Module:Citation/CS1/Whitelist]] -->
{{csdoc|language}}
== TemplateData ==
{{Warning |image=Stop hand nuvola.svg |This section contains configuration data used by editing tools and automated bots. Changes to this data can result in widespread and unintended effects. For more information see [[Help:Citation Style 1#TemplateData]]}}
{{TemplateData header}}
{{#invoke:cs1 documentation support|template_data_validate|{{ROOTPAGENAME}}}}
<templatedata>
{
"params": {
"arxiv": {
"aliases": [
"eprint"
],
"label": "arXiv ",
"description": "arXiv identifier without the \"arXiv:\" prefix; can include version number",
"type": "string",
"required": true,
"example": "1612.00008v1"
},
"title": {
"label": "Title",
"description": "Title of the paper cited",
"type": "string",
"suggested": true
},
"first": {
"aliases": [
"first1",
"given",
"given1"
],
"label": "First name",
"description": "First name of first author",
"type": "string",
"suggested": true
},
"last": {
"aliases": [
"last1",
"surname",
"surname1"
],
"label": "Last name",
"description": "Last name of first author",
"type": "string",
"suggested": true
},
"author": {
"aliases": [
"author1"
],
"label": "Author",
"description": "Complete name of the first author",
"type": "string"
},
"author-link": {
"aliases": [
"author-link1",
"author1-link"
],
"label": "Author's article",
"description": "Title of the Wikipedia article about the first author",
"type": "wiki-page-name"
},
"first2": {
"aliases": [
"given2"
],
"label": "Author 2's first name",
"description": "First name of second author",
"type": "string"
},
"last2": {
"aliases": [
"surname2"
],
"label": "Author 2's last name",
"description": "Last name of second author",
"type": "string"
},
"author2": {
"label": "Author 2",
"description": "Full name of second author",
"type": "string"
},
"author-link2": {
"aliases": [
"author2-link"
],
"label": "Author 2's article",
"description": "Title of Wikipedia article about the second author",
"type": "wiki-page-name"
},
"collaboration": {
"label": "collaboration",
"description": "Name of a group of authors, in addition to the ones listed in the Author parameters",
"type": "string"
},
"class": {
"label": "arXiv class",
"description": "arXiv classification, for post-2007 ids ",
"type": "string"
},
"date": {
"label": "Date",
"description": "Date of the source being cited. Use n.d. for no date, and c. for inexact dated.",
"type": "string"
},
"df": {
"label": "Date format for publication dates",
"description": "Either ymd (Year-Month-Day), dmy (Day-Month-Year), or mdy (Month-Day-Year) add -all at end to also affect access and archive dates",
"example": "dmy",
"type": "string"
},
"trans-title": {
"label": "Translated title",
"description": "English translation of title",
"type": "string"
},
"language": {
"label": "Language(s)",
"description": "Language(s) the source is written in. Separate by commas, and do not include 'and'.",
"type": "string"
}
},
"format": "{{_ |_=_}}",
"description": "Formats a citation to a paper with an arXiv id",
"paramOrder": [
"arxiv",
"class",
"author",
"first",
"last",
"first2",
"last2",
"author2",
"author-link",
"author-link2",
"title",
"collaboration",
"date",
"df",
"trans-title",
"language"
]
}
</templatedata>
== External links ==
* [https://arxiv.org Official website]
* [https://info.arxiv.org/help/arxiv_identifier.html Understanding the arXiv identifier]
{{Citation Style 1}}
<includeonly>
{{Sandbox other||
<!-- Categories go below this line, please; interwikis go to Wikidata, thank you! -->
[[Category:Citation Style 1 templates|A]]
[[Category:Mathematics source templates|{{PAGENAME}}]]
}}</includeonly>
3b49qp1mh85fnpqaa9v8szw80x6qzn8