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: &#124;$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 &#124;italic=, &#124;italics=, or &#124;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 &#124;$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 &#124;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 &#124;lit= or &#124;translation=', -- $1 is positional parameter; can be either 3 ({{lang-??}}) or 4 ({{langx}}) ['conflict_lit'] = 'conflicting: &#124;lit= and &#124;translation=', ['conflict_link'] = 'conflicting: &#124;links= and &#124;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&nbsp;ed.)', ['episode'] = 'Episode $1', ['et al'] = 'et&nbsp;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">&#124;$1=</code> / <code class="cs1-code">&#124;$2=</code> la hanesan', -- $1 is year param name; $2 is date param name ['newsgroup'] = '[[:en:Usenet newsgroup|Grupu notísia]]:&nbsp;$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'] = '§&nbsp;$1', ['sections'] = '§§&nbsp;$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.&nbsp;$2', -- $1 is sepc; bold journal style volume is in presentation{} ['vol-no'] = '$1 Vol.&nbsp;$2, no.&nbsp;$3', -- sepc, volume, issue (alternatively insert $1 after $2, but then we'd also have to change capitalization) ['issue'] = '$1 No.&nbsp;$2', -- $1 is sepc ['art'] = '$1 Art.&nbsp;$2', -- $1 is sepc; for {{cite conference}} only ['vol-art'] = '$1 Vol.&nbsp;$2, art.&nbsp;$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.&nbsp;$2", -- $1 is sepc ['pp-prefix'] = "$1 pp.&nbsp;$2", -- $1 is sepc ['j-page(s)'] = ': $1', -- same for page and pages ['sheet'] = '$1 Sheet&nbsp;$2', -- $1 is sepc ['sheets'] = '$1 Sheets&nbsp;$2', -- $1 is sepc ['j-sheet'] = ': Sheet&nbsp;$1', ['j-sheets'] = ': Sheets&nbsp;$1', ['language'] = '(in $1)', ['via'] = " &ndash; 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;">&#123;{$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;">&#123;{$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 &#8239; 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">&#124;$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'] = "&#91;''$1''&#93;", ['trans-quoted-title'] = "&#91;$1&#93;", -- 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]?%.&nbsp;', -- 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">&#124;access-date=</code> presiza <code class="cs1-code">&#124;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">&#124;$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">&#124;archive-date=</code> presiza <code class="cs1-code">&#124;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">&#124;archive-date=</code> / <code class="cs1-code">&#124;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">&#124;archive-url=</code> presiza <code class="cs1-code">&#124;archive-date=</code>', anchor = 'archive_missing_date', category = 'Erru CS1: archive-url', hidden = false }, err_archive_missing_url = { message = '<code class="cs1-code">&#124;archive-url=</code> presiza <code class="cs1-code">&#124;url=</code>', anchor = 'archive_missing_url', category = 'Erru CS1: archive-url', hidden = false }, err_archive_url = { message = '<code class="cs1-code">&#124;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">&#124;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">&#124;$1=</code> presiza <code class="cs1-code">&#124;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">&#124;arxiv=</code>', anchor = 'bad_arxiv', category = 'Erru CS1: arXiv', hidden = false }, err_bad_asin = { message = 'Verifika valór <code class="cs1-code">&#124;asin=</code>', anchor = 'bad_asin', category ='Erru CS1: ASIN', hidden = false }, err_bad_asin_tld = { message = 'Verifika valór <code class="cs1-code">&#124;asin-tld=</code>e', anchor = 'bad_asin_tld', category ='Erru CS1: ASIN TLD', hidden = false }, err_bad_bibcode = { message = 'Verifika <code class="cs1-code">&#124;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">&#124;biorxiv=</code>', anchor = 'bad_biorxiv', category = 'Erru CS1: bioRxiv', hidden = false }, err_bad_citeseerx = { message = 'Verifika valór <code class="cs1-code">&#124;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">&#124;doi=</code>', anchor = 'bad_doi', category = 'Erru CS1: DOI', hidden = false }, err_bad_hdl = { message = 'Verifika valór <code class="cs1-code">&#124;hdl=</code>', anchor = 'bad_hdl', category = 'Erru CS1: HDL', hidden = false }, err_bad_isbn = { message = 'Verifika valór <code class="cs1-code">&#124;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">&#124;ismn=</code>', anchor = 'bad_ismn', category = 'Erru CS1: ISMN', hidden = false }, err_bad_issn = { message = 'Verifika valór <code class="cs1-code">&#124;$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">&#124;jfm=</code>', anchor = 'bad_jfm', category = 'Erru CS1: JFM', hidden = false }, err_bad_jstor = { message = 'Verifika valór <code class="cs1-code">&#124;jstor=</code>', anchor = 'bad_jstor', category = 'Erru CS1: JSTOR', hidden = false }, err_bad_lccn = { message = 'Verifika valór <code class="cs1-code">&#124;lccn=</code>', anchor = 'bad_lccn', category = 'Erru CS1: LCCN', hidden = false }, err_bad_medrxiv = { message = 'Verifika valór <code class="cs1-code">&#124;medrxiv=</code>', anchor = 'bad_medrxiv', category = 'Erru CS1: medRxiv', hidden = false }, err_bad_mr = { message = 'Verifika valór <code class="cs1-code">&#124;mr=</code>', anchor = 'bad_mr', category = 'Erru CS1: MR', hidden = false }, err_bad_oclc = { message = 'Verifika valór <code class="cs1-code">&#124;oclc=</code>', anchor = 'bad_oclc', category = 'Erru CS1: OCLC', hidden = false }, err_bad_ol = { message = 'Verifika valór <code class="cs1-code">&#124;ol=</code>', anchor = 'bad_ol', category = 'Erru CS1: OL', hidden = false }, err_bad_osti = { message = 'Verifika valór <code class="cs1-code">&#124;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">&#124;$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">&#124;pmc=</code>', anchor = 'bad_pmc', category = 'Erru CS1: PMC', hidden = false }, err_bad_pmid = { message = 'Verifika valór <code class="cs1-code">&#124;pmid=</code>', anchor = 'bad_pmid', category = 'Erru CS1: PMID', hidden = false }, err_bad_rfc = { message = 'Verifika valór <code class="cs1-code">&#124;rfc=</code>', anchor = 'bad_rfc', category = 'Erru CS1: RFC', hidden = false }, err_bad_s2cid = { message = 'Verifika valór <code class="cs1-code">&#124;s2cid=</code>', anchor = 'bad_s2cid', category = 'Erru CS1: S2CID', hidden = false }, err_bad_sbn = { message = 'Verifika valór <code class="cs1-code">&#124;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">&#124;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">&#124;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">&#124;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">&#124;biorxiv=</code> presija', anchor = 'biorxiv_missing', category = 'Erru CS1: bioRxiv', -- same as bad bioRxiv hidden = false }, err_chapter_ignored = { message = '<code class="cs1-code">&#124;$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">&#124;$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">&#124;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">&#124;url=</code>', anchor = 'cite_web_url', category = 'Erru CS1: presiza URL', hidden = false }, err_class_ignored = { message = '<code class="cs1-code">&#124;class=</code> ignora', anchor = 'class_ignored', category = 'Erru CS1: class', hidden = false }, err_contributor_ignored = { message = '<code class="cs1-code">&#124;contributor=</code> ignora', anchor = 'contributor_ignored', category = 'Erru CS1: contributor', hidden = false }, err_contributor_missing_required_param = { message = '<code class="cs1-code">&#124;contributor=</code> presiza <code class="cs1-code">&#124;$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">&#124;$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">&#124;$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">&#124;$1=</code> presiza <code class="cs1-code">&#124;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">&#124;$1=</code> presiza <code class="cs1-code">&#124;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">&#124;$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">&#124;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">&#124;$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">&#124;$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">&#124;$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">&#124;$1=</code> laiha <code class="cs1-code">&#124;$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">&#124;$1=</code> presiza <code class="cs1-code">&#124;$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">&#124;$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">&#124;$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">&#124;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">&#124;$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">&#124;$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">&#124;$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">&#124;$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">&#124;$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">&#124;$1-access=</code> presiza <code class="cs1-code">&#124;$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">&#124;$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">&#124;$1=</code> ignora (<code class="cs1-code">&#124;$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">&#124;$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">&#124;$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">&#124;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">&#124;trans-$1=</code> presiza <code class="cs1-code">&#124;$1=</code> ka <code class="cs1-code">&#124;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 = '&nbsp;', 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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', 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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', 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 = '&nbsp;', 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 = '&nbsp;', 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 = '&nbsp;', 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 = '&nbsp;', 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 = '&nbsp;', 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 = '&nbsp;', }, ['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 = '&nbsp;', 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 = '&nbsp;', 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 = '&nbsp;', }, ['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 = '&nbsp;', }, } --[[--------------------------< 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&nbsp;ed.)', ['episode'] = 'Episode $1', ['et al'] = 'et&nbsp;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">&#124;$1=</code> / <code class="cs1-code">&#124;$2=</code> la hanesan', -- $1 is year param name; $2 is date param name ['newsgroup'] = '[[:en:Usenet newsgroup|Grupu notísia]]:&nbsp;$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'] = '§&nbsp;$1', ['sections'] = '§§&nbsp;$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.&nbsp;$2', -- $1 is sepc; bold journal style volume is in presentation{} ['vol-no'] = '$1 Vol.&nbsp;$2, no.&nbsp;$3', -- sepc, volume, issue (alternatively insert $1 after $2, but then we'd also have to change capitalization) ['issue'] = '$1 No.&nbsp;$2', -- $1 is sepc ['art'] = '$1 Art.&nbsp;$2', -- $1 is sepc; for {{cite conference}} only ['vol-art'] = '$1 Vol.&nbsp;$2, art.&nbsp;$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.&nbsp;$2", -- $1 is sepc ['pp-prefix'] = "$1 pp.&nbsp;$2", -- $1 is sepc ['j-page(s)'] = ': $1', -- same for page and pages ['sheet'] = '$1 Sheet&nbsp;$2', -- $1 is sepc ['sheets'] = '$1 Sheets&nbsp;$2', -- $1 is sepc ['j-sheet'] = ': Sheet&nbsp;$1', ['j-sheets'] = ': Sheets&nbsp;$1', ['language'] = '(in $1)', ['via'] = " &ndash; 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;">&#123;{$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;">&#123;{$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 &#8239; 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">&#124;$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'] = "&#91;''$1''&#93;", ['trans-quoted-title'] = "&#91;$1&#93;", -- 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]?%.&nbsp;', -- 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">&#124;access-date=</code> presiza <code class="cs1-code">&#124;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">&#124;$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">&#124;archive-date=</code> presiza <code class="cs1-code">&#124;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">&#124;archive-date=</code> / <code class="cs1-code">&#124;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">&#124;archive-url=</code> presiza <code class="cs1-code">&#124;archive-date=</code>', anchor = 'archive_missing_date', category = 'Erru CS1: archive-url', hidden = false }, err_archive_missing_url = { message = '<code class="cs1-code">&#124;archive-url=</code> presiza <code class="cs1-code">&#124;url=</code>', anchor = 'archive_missing_url', category = 'Erru CS1: archive-url', hidden = false }, err_archive_url = { message = '<code class="cs1-code">&#124;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">&#124;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">&#124;$1=</code> presiza <code class="cs1-code">&#124;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">&#124;arxiv=</code>', anchor = 'bad_arxiv', category = 'Erru CS1: arXiv', hidden = false }, err_bad_asin = { message = 'Verifika valór <code class="cs1-code">&#124;asin=</code>', anchor = 'bad_asin', category ='Erru CS1: ASIN', hidden = false }, err_bad_asin_tld = { message = 'Verifika valór <code class="cs1-code">&#124;asin-tld=</code>e', anchor = 'bad_asin_tld', category ='Erru CS1: ASIN TLD', hidden = false }, err_bad_bibcode = { message = 'Verifika <code class="cs1-code">&#124;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">&#124;biorxiv=</code>', anchor = 'bad_biorxiv', category = 'Erru CS1: bioRxiv', hidden = false }, err_bad_citeseerx = { message = 'Verifika valór <code class="cs1-code">&#124;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">&#124;doi=</code>', anchor = 'bad_doi', category = 'Erru CS1: DOI', hidden = false }, err_bad_hdl = { message = 'Verifika valór <code class="cs1-code">&#124;hdl=</code>', anchor = 'bad_hdl', category = 'Erru CS1: HDL', hidden = false }, err_bad_isbn = { message = 'Verifika valór <code class="cs1-code">&#124;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">&#124;ismn=</code>', anchor = 'bad_ismn', category = 'Erru CS1: ISMN', hidden = false }, err_bad_issn = { message = 'Verifika valór <code class="cs1-code">&#124;$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">&#124;jfm=</code>', anchor = 'bad_jfm', category = 'Erru CS1: JFM', hidden = false }, err_bad_jstor = { message = 'Verifika valór <code class="cs1-code">&#124;jstor=</code>', anchor = 'bad_jstor', category = 'Erru CS1: JSTOR', hidden = false }, err_bad_lccn = { message = 'Verifika valór <code class="cs1-code">&#124;lccn=</code>', anchor = 'bad_lccn', category = 'Erru CS1: LCCN', hidden = false }, err_bad_medrxiv = { message = 'Verifika valór <code class="cs1-code">&#124;medrxiv=</code>', anchor = 'bad_medrxiv', category = 'Erru CS1: medRxiv', hidden = false }, err_bad_mr = { message = 'Verifika valór <code class="cs1-code">&#124;mr=</code>', anchor = 'bad_mr', category = 'Erru CS1: MR', hidden = false }, err_bad_oclc = { message = 'Verifika valór <code class="cs1-code">&#124;oclc=</code>', anchor = 'bad_oclc', category = 'Erru CS1: OCLC', hidden = false }, err_bad_ol = { message = 'Verifika valór <code class="cs1-code">&#124;ol=</code>', anchor = 'bad_ol', category = 'Erru CS1: OL', hidden = false }, err_bad_osti = { message = 'Verifika valór <code class="cs1-code">&#124;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">&#124;$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">&#124;pmc=</code>', anchor = 'bad_pmc', category = 'Erru CS1: PMC', hidden = false }, err_bad_pmid = { message = 'Verifika valór <code class="cs1-code">&#124;pmid=</code>', anchor = 'bad_pmid', category = 'Erru CS1: PMID', hidden = false }, err_bad_rfc = { message = 'Verifika valór <code class="cs1-code">&#124;rfc=</code>', anchor = 'bad_rfc', category = 'Erru CS1: RFC', hidden = false }, err_bad_s2cid = { message = 'Verifika valór <code class="cs1-code">&#124;s2cid=</code>', anchor = 'bad_s2cid', category = 'Erru CS1: S2CID', hidden = false }, err_bad_sbn = { message = 'Verifika valór <code class="cs1-code">&#124;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">&#124;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">&#124;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">&#124;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">&#124;biorxiv=</code> presija', anchor = 'biorxiv_missing', category = 'Erru CS1: bioRxiv', -- same as bad bioRxiv hidden = false }, err_chapter_ignored = { message = '<code class="cs1-code">&#124;$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">&#124;$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">&#124;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">&#124;url=</code>', anchor = 'cite_web_url', category = 'Erru CS1: presiza URL', hidden = false }, err_class_ignored = { message = '<code class="cs1-code">&#124;class=</code> ignora', anchor = 'class_ignored', category = 'Erru CS1: class', hidden = false }, err_contributor_ignored = { message = '<code class="cs1-code">&#124;contributor=</code> ignora', anchor = 'contributor_ignored', category = 'Erru CS1: contributor', hidden = false }, err_contributor_missing_required_param = { message = '<code class="cs1-code">&#124;contributor=</code> presiza <code class="cs1-code">&#124;$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">&#124;$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">&#124;$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">&#124;$1=</code> presiza <code class="cs1-code">&#124;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">&#124;$1=</code> presiza <code class="cs1-code">&#124;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">&#124;$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">&#124;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">&#124;$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">&#124;$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">&#124;$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">&#124;$1=</code> laiha <code class="cs1-code">&#124;$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">&#124;$1=</code> presiza <code class="cs1-code">&#124;$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">&#124;$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">&#124;$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">&#124;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">&#124;$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">&#124;$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">&#124;$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">&#124;$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">&#124;$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">&#124;$1-access=</code> presiza <code class="cs1-code">&#124;$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">&#124;$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">&#124;$1=</code> ignora (<code class="cs1-code">&#124;$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">&#124;$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">&#124;$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">&#124;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">&#124;trans-$1=</code> presiza <code class="cs1-code">&#124;$1=</code> ka <code class="cs1-code">&#124;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 = '&nbsp;', 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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', 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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', 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 = '&nbsp;', 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 = '&nbsp;', 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 = '&nbsp;', 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 = '&nbsp;', 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 = '&nbsp;', 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 = '&nbsp;', }, ['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 = '&nbsp;', 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 = '&nbsp;', 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 = '&nbsp;', }, ['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 = '&nbsp;', }, } --[[--------------------------< 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;">&#91;<i>{{#if:{{{pre-text|}}} |{{{pre-text}}}&#32; }}[[{{{link|Wikipedia:Cleanup}}}|<span title="{{#invoke:string|replace|source={{delink|1={{{title|{{{link|Wikipedia:Cleanup}}}}}}{{#if:{{{date|}}}|&#32;({{{date}}})}}}}|pattern=" |replace=&quot; |plain=true}}">{{{text|}}}</span>]]{{#if:{{{post-text|}}} |&#32;{{{post-text}}} }}</i>&#93;</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;">&#91;<i>{{#if:{{{pre-text|}}} |{{{pre-text}}}&#32; }}[[{{{link|Wikipedia:Cleanup}}}|<span title="{{#invoke:string|replace|source={{delink|1={{{title|{{{link|Wikipedia:Cleanup}}}}}}{{#if:{{{date|}}}|&#32;({{{date}}})}}}}|pattern=" |replace=&quot; |plain=true}}">{{{text|}}}</span>]]{{#if:{{{post-text|}}} |&#32;{{{post-text}}} }}</i>&#93;</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 &nbsp;&bull;&#32;<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 &nbsp;&bull;&#32;<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 &nbsp;<b>&middot;</b>&#32;<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 &nbsp;<b>&middot;</b>&#32;<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 (&shy; 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 (&shy; 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]&nbsp;<sup>([https://www.robtex.com/ip-lookup/{{{1}}} alt]&nbsp;•&nbsp;[https://tools.wmflabs.org/whois/gateway.py?lookup=true&ip={{{1}}} old])</sup> * [https://whatismyipaddress.com/ip/{{{1}}} Geolocate]&nbsp;<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]&nbsp;<sup>([https://www.robtex.com/ip-lookup/{{{1}}} alt]&nbsp;•&nbsp;[https://tools.wmflabs.org/whois/gateway.py?lookup=true&ip={{{1}}} old])</sup> * [https://whatismyipaddress.com/ip/{{{1}}} Geolocate]&nbsp;<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 &nbsp; {{!}}-<noinclude> {{documentation}} </noinclude> a6qh7a405qffq4qxzmlr2uj6vmvpt4j 73184 73183 2026-07-08T19:28:39Z Robertsky 10424 1 versaun husi [[:en:Template:-!-]] 73183 wikitext text/x-wiki &nbsp; {{!}}-<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; }}">&nbsp; [[{{{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]] &nbsp;</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; }}">&nbsp; [[{{{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]] &nbsp;</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]&nbsp;<sup>([https://www.robtex.com/ip-lookup/{{{1}}} alt]&nbsp;•&nbsp;[https://tools.wmflabs.org/whois/gateway.py?lookup=true&ip={{{1}}} old])</sup> * [https://whatismyipaddress.com/ip/{{{1}}} Geolocate]&nbsp;<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]&nbsp;<sup>([https://www.robtex.com/ip-lookup/{{{1}}} alt]&nbsp;•&nbsp;[https://tools.wmflabs.org/whois/gateway.py?lookup=true&ip={{{1}}} old])</sup> * [https://whatismyipaddress.com/ip/{{{1}}} Geolocate]&nbsp;<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]] &nbsp;</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]] &nbsp; [[{{{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]] &nbsp;</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]] &nbsp; [[{{{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>&#123;&#123;'..banner_name.prefixedText..'&#125;&#125;</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('/&nbsp;') :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('^&#32;/ ', '') -- 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>&#123;&#123;'..banner_name.prefixedText..'&#125;&#125;</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('/&nbsp;') :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('^&#32;/ ', '') -- 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&lt;!--%s--&gt; = <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&lt;!--%s--&gt; = <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 == &#123;{#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 == &#123;{#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;"> &nbsp; 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) &nbsp; &nbsp; &nbsp; &nbsp; title &nbsp; &nbsp; &nbsp; &nbsp; page, pages, p or pp &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </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 ' &nbsp; &nbsp; &nbsp; &nbsp; Required &nbsp; Aliases include 'lang' Aliases include 'p' Aliases include 'pp' &nbsp; set to "yes" to suppress the "p." or "pp." before page numbers Required. Aliases include 'eprint' &nbsp; Aliases include 'quotation' 'cs1' or 'cs2' &nbsp; &nbsp; </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;"> &nbsp; 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) &nbsp; &nbsp; &nbsp; &nbsp; title &nbsp; &nbsp; &nbsp; &nbsp; page, pages, p or pp &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </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 ' &nbsp; &nbsp; &nbsp; &nbsp; Required &nbsp; Aliases include 'lang' Aliases include 'p' Aliases include 'pp' &nbsp; set to "yes" to suppress the "p." or "pp." before page numbers Required. Aliases include 'eprint' &nbsp; Aliases include 'quotation' 'cs1' or 'cs2' &nbsp; &nbsp; </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